-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGlObject.h
257 lines (214 loc) · 5.48 KB
/
GlObject.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
#ifndef GL_OBJECT_H
#define GL_OBJECT_H
#include"GlCamera.h"
#include"shader.h"
#include"texture.h"
#include"common.h"
/*
This is the base class for objects withing the system
*/
class GlObject {
public:
/*
Safely initializes members
*/
GlObject();
/*
Adds vertex coordinates to the object, every 9 numbers forms a triangle (xyz)(xyz)(xyz)
@param floats
The list of vertex positions to add
*/
void addVertices(const std::vector<GLfloat>& floats);
/*
Adds UV data to the object, every 6 numbers go with one of the triangles added in
addVertices (uv)(uv)(uv)
@param UVs
The list of UVs to add
*/
void addUVs(const std::vector<GLfloat>& UVs);
/*
Adds RGB colors to the object, every 9 numbers are the colors for 1 triangles added in
addVertices
@param Colors
The list of colors to add
*/
void addColors(const std::vector<GLfloat>& Colors);
/*
Adds the normal vectors to each coordinate added in addVertices
(xyz)(xyz)(xyz)
*/
void addNormals(const std::vector <GLfloat>& Normals);
/*
Adds the shader program to this object
@param vertexShader
The filename of the vertexShader glsl file
@param fragmentShader
The filename of the fragmentShader glsl file
*/
void setShader(const std::string& vertexShader, const std::string& fragmentShader);
/*
Sets the shader for the object from an existing shader
@param shader
The shader to set
*/
void setShader(Shader* shader);
/*
Adds a pointer to the camera this object will be rendered through
@param camera
The camera to render the object through
*/
void setCamera(GlCamera* camera);
/*
Sets the texture file to be used on the object
@param fileName
The filename of the image file used for the texture
*/
void setTexture(const std::string& fileName);
/*
Sets the texture for an object from an existing texture
@param texture
The texture to set
*/
void setTexture(Texture* texture);
/*
Initializes the object, should be called after assigning the vertices, uvs, normals, shaders and textures
*/
virtual void initialize();
/*
Draw this object to the buffer, should be called from within GlSystem::frame()
*/
virtual void draw() const;
/*
Passes data to the glsl shaders, this is called within GlObject::draw()
this can be overwritten to pass extra data
*/
virtual void passUniforms() const;
/*
Rotates this object in space
@param angle
The angle (in radian) to rotate the object
@param axis
The direction vector to rotate around
*/
void rotate(const GLfloat angle, const glm::vec3& axis);
/*
Translates the object is space by direction
@param direction
The vector to translate the object along
*/
void translate(const glm::vec3& direction);
/*
Resizes the object by the provided facter
@param factor
The amount to factor by , 2.0 is double size
*/
void scale(const GLfloat factor);
/*
Moves the object to the provided position
@param position
The new position for the object
*/
void position(const glm::vec3& position);
/*
Get the objects current position
@return
The objects current position
*/
glm::vec3 getPosition() const;
/*
Gets the current scaling factor for this object
@return
The scaling factor for the object
*/
GLfloat getScale() const;
/*
Reverts a position is world space to one in model space for this object
@param worldVector
The coordinates in world space to convert
@return
The coordinates relative to the model
*/
glm::vec3 worldToModel(const glm::vec3& worldVector) const;
/*
Converts a coordinate relative to the model into worldspace
@param modelVector
The coordinates realitve to the model
@return
The coordinates in world space
*/
glm::vec3 modelToWorld(const glm::vec3& modelVector) const;
/*
Gets the model matrix for this object
*/
glm::mat4 getModel() const;
/*
Releases system resources
*/
virtual ~GlObject();
protected:
/*
Array of vertex data, seperated into groups of 9 for each triangle
*/
std::vector<GLfloat> vertices;
/*
Array of color data,seperated into groups of 9 for each triangle
*/
std::vector<GLfloat> colors;
/*
Array of color data,seperated into groups of 6 for each triangle
*/
std::vector<GLfloat> uvs;
/*
Array of normal data,seperated into groups of 9 for each triangle
*/
std::vector<GLfloat> normals;
/*
The filename of the vertex shader being used
*/
std::string vertexShader;
/*
The filename of the fragment shader being used
*/
std::string fragmentShader;
/*
the filename of the image being used as texture
*/
std::string textureFile;
/*
The vertex array object this object is bound to
*/
GLuint VAO;
/*
A list of buffers that need to be cleared when the object is destroyed
*/
std::vector<GLuint> buffers;
/*
The shader used for this object
*/
Shader* shader;
/*
The camera this object is viewed through
*/
GlCamera* camera;
/*
The texture for this object
*/
Texture* texture;
/*
The Model array, mapping the vertexes into world space (exludes scale and rotation)
*/
glm::mat4 Model;
/*
The rotation matrix, seperate of the model matrix
*/
glm::mat4 rotation;
/*
The scale this object is rendered at
*/
GLfloat current_scale;
/*
The positions of this object in world space
*/
glm::vec3 current_position;
};
#endif