1 module evael.graphics.Drawable;
2
3 import evael.graphics.GraphicsDevice;
4 import evael.graphics.Texture;
5 import evael.graphics.shaders.Shader;
6
7 import evael.utils.Math;
8 import evael.utils.Size;
9 import evael.utils.Rectangle;
10
11 abstract class Drawable
12 {
13 protected GraphicsDevice m_graphicsDevice;
14 protected Shader m_shader;
15 protected vec3 m_position;
16 protected vec3 m_scale;
17 protected Quaternionf m_rotation;
18 protected Size!int m_size;
19 protected Texture m_texture;
20 protected bool m_isVisible;
21
22 protected uint m_vao, m_vertexBuffer, m_indexBuffer;
23
24 /**
25 * Drawable constructor.
26 */
27 @nogc @safe
28 public this(GraphicsDevice graphicsDevice) pure nothrow
29 {
30 this.m_graphicsDevice = graphicsDevice;
31
32 this.m_position = vec3(0, 0, 0);
33 this.m_scale = vec3(1, 1, 1);
34 this.m_rotation = Quaternionf.identity;
35 this.m_isVisible = true;
36 }
37
38 @nogc @safe
39 public this(in float x = 0.0f, in float y = 0.0f, in float z = 0.0f) pure nothrow
40 {
41 auto position = vec3(x, y, z);
42 auto size = Size!int();
43
44 this(position, size);
45 }
46
47 @nogc @safe
48 public this(in float x, in float y, in float z, in Size!int size) pure nothrow
49 {
50 vec3 position = vec3(x, y, z);
51 this(position, size);
52 }
53
54 @nogc @safe
55 public this()(in ref vec3 position, in Size!int size) pure nothrow
56 {
57 this.m_position = position;
58 this.m_size = size;
59 this.m_isVisible = true;
60 this.m_scale = vec3(1, 1, 1);
61 this.m_rotation = Quaternionf.identity;
62 }
63
64 public abstract void draw(in float deltaTime, mat4 view, mat4 projection);
65
66 @nogc
67 @property nothrow
68 {
69 public GraphicsDevice graphics()
70 {
71 return this.m_graphicsDevice;
72 }
73
74 public void graphics(GraphicsDevice value)
75 {
76 this.m_graphicsDevice = value;
77 }
78
79 public ref const(vec3) position() const
80 {
81 return this.m_position;
82 }
83
84 public void position(in vec3 value)
85 {
86 this.m_position = value;
87 }
88
89 public void scale(in float value)
90 {
91 this.m_scale = vec3(value, value, value);
92 }
93
94 public ref vec3 scale()
95 {
96 return this.m_scale;
97 }
98
99 public void rotation(in Quaternionf value)
100 {
101 this.m_rotation = value;
102 }
103
104 public ref const(Size!int) size() const
105 {
106 return this.m_size;
107 }
108
109 public void size(in Size!int value)
110 {
111 this.m_size = value;
112 }
113
114 public Texture texture()
115 {
116 return this.m_texture;
117 }
118
119 public void texture(Texture value)
120 {
121 this.m_texture = value;
122 }
123
124 public bool isVisible() const
125 {
126 return this.m_isVisible;
127 }
128
129 public void isVisible(in bool value)
130 {
131 this.m_isVisible = value;
132 }
133
134 public uint vertexBuffer() const
135 {
136 return this.m_vertexBuffer;
137 }
138
139 public Shader shader()
140 {
141 return this.m_shader;
142 }
143
144 public void shader(Shader value)
145 {
146 this.m_shader = value;
147 }
148 }
149 }
150