Fireworks Engine  v2.0
Lightweight Sandbox Game Engine using OpenGL for additional Customisation and Quick Prototyping
renderable3d.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <vector>
4 #include <iostream>
5 
6 #include <src/graphics/shader.h>
10 #include <src/graphics/texture.h>
12 
13 namespace fireworks { namespace graphics {
14 
16  struct VertexData3D
17  {
18  glm::vec3 vertex;
19  // TODO: Use normals!
20  //glm::vec3 normal;
21  glm::vec2 uv;
22  float tid;
23  glm::vec4 color;
24 
26  : vertex(glm::vec3(0, 0, 0)), uv(glm::vec2(0, 0)), tid(0.0f), color(glm::vec4(1, 0, 1, 1))
27  {
28 
29  }
30 
31  VertexData3D(glm::vec3 vertex, glm::vec2 uv, float texID, glm::vec4 color)
32  : vertex(vertex), uv(uv), tid(texID), color(color)
33  {
34  }
35  };
36 
38  struct Transform
39  {
40  glm::vec3 position;
41  glm::vec3 rotation;
42  glm::vec3 scale;
43 
44  Transform(glm::vec3 pos = glm::vec3(0, 0, 0), glm::vec3 rot = glm::vec3(0, 0, 0), glm::vec3 scale = glm::vec3(1, 1, 1))
45  : position(pos), rotation(rot), scale(scale)
46  {
47  }
48  };
49 
51  enum class Primitive3D
52  {
53  Plane,
54  Cube,
55  UVSphere, /* UV sphere procedurally generated using rings count on the CPU side */
56  Cylinder,
57  Torus, /* UV Torus procedurally generated using preferences on the CPU side */
58  None /* If the primitive is none, then use the 3D Model for rendering the renderable*/
59  };
60 
61  class Mesh;
62 
67  {
68  public:
70  std::uint32_t objectID;
75  protected:
79  glm::vec4 m_Color;
83  mutable std::vector<glm::vec2> m_UV;
85  std::vector<VertexData3D> m_Vertices;
87  std::vector<GLushort> m_Indices;
88  private:
89  static std::uint32_t m_UniqueID;
90  public:
97  Renderable3D(Transform transform, glm::vec4 color, Primitive3D primitive3d)
98  : m_Transform(transform), m_Color(color), m_Primitive3D(primitive3d), shader(nullptr), m_Texture(nullptr)
99  {
100  objectID = ++m_UniqueID;
101  setUVDefaults();
102  }
103 
110  Renderable3D(Transform transform, glm::vec4 color, Primitive3D primitive3d, Shader* shader)
111  : m_Transform(transform), m_Color(color), m_Primitive3D(primitive3d), shader(shader), m_Texture(nullptr)
112  {
113  objectID = ++m_UniqueID;
114  setUVDefaults();
115  }
116 
123  Renderable3D(Transform transform, glm::vec4 color, Primitive3D primitive3d, Shader* shader, Texture* texture)
124  : m_Transform(transform), m_Color(color), m_Primitive3D(primitive3d), shader(shader), m_Texture(texture)
125  {
126  objectID = ++m_UniqueID;
127  shader->enable();
128  GLint texIDs[] =
129  {
130  0, 1, 2, 3, 4, 5, 6, 7,
131  8, 9, 10, 11, 12, 13, 14, 15
132  };
133  shader->setUniform1iv("textures", texIDs, 8);
134  shader->disable();
135 
136  setUVDefaults();
137  }
138 
140  Renderable3D() : m_Texture(nullptr)
141  {
142  objectID = ++m_UniqueID;
143  }
144 
145  virtual ~Renderable3D() { }
146 
148  virtual void submit(Renderer3D* renderer) const
149  {
150  renderer->submit(this);
151  }
152 
154  inline const Transform& getTransform() const { return m_Transform; }
156  inline const glm::vec4& getColor() const { return m_Color; }
158  inline const std::vector<glm::vec2>& getUV() const { return m_UV; }
160  inline const GLuint getTID() const { return m_Texture == nullptr ? 0 : m_Texture->getID(); }
162  inline const Primitive3D& gerPrimitive() const { return m_Primitive3D; }
164  inline std::vector<VertexData3D> getVerts() const { return m_Vertices; }
166  inline GLuint getVertsSize() const { return m_Vertices.size(); }
168  inline std::vector<GLushort> getInidces() const { return m_Indices; }
170  inline GLsizei getIndicesSize() const { return m_Indices.size(); }
171  private:
172  void setUVDefaults()
173  {
174  int faces;
175  if (m_Primitive3D == Primitive3D::Plane) /* Same as a Sprite */
176  {
177  faces = 1;
178  // Iterating over each face
179  for (int i = 0; i < faces; i++)
180  {
181  m_UV.push_back(glm::vec2(0, 0)); // Bottom Left
182  m_UV.push_back(glm::vec2(0, 4)); // Top Left
183  m_UV.push_back(glm::vec2(4, 4)); // Top Right
184  m_UV.push_back(glm::vec2(4, 0)); // Bottom Right
185  }
186  }
187  else if(m_Primitive3D == Primitive3D::Cube)
188  {
189  faces = 6;
190  // Iterating over each face
191  for (int i = 0; i < faces; i++)
192  {
193  // Clockwise UV coordinates for each face
194  m_UV.push_back(glm::vec2(0, 0)); // Bottom Left
195  m_UV.push_back(glm::vec2(0, 1)); // Top Left
196  m_UV.push_back(glm::vec2(1, 1)); // Top Right
197  m_UV.push_back(glm::vec2(1, 0)); // Bottom Right
198  }
199  }
200  }
201  };
202 
203 } }
const Transform & getTransform() const
Gets the reference to the transform of the renderable object.
Definition: renderable3d.h:154
The spacial orientation of an object in 3D space denoted by it&#39;s position, rotation and scale...
Definition: renderable3d.h:38
glm::vec3 position
Definition: renderable3d.h:40
std::vector< VertexData3D > m_Vertices
The vertices pool of the 3d object.
Definition: renderable3d.h:85
Transform(glm::vec3 pos=glm::vec3(0, 0, 0), glm::vec3 rot=glm::vec3(0, 0, 0), glm::vec3 scale=glm::vec3(1, 1, 1))
Definition: renderable3d.h:44
GLuint getVertsSize() const
Gets the vertices count of the 3d renderable.
Definition: renderable3d.h:166
The vertex structure of a 3D primitive.
Definition: renderable3d.h:16
The 3D mesh of a 3d renderable object.
Definition: mesh.h:15
Transform m_Transform
The transform of the object in 3D space.
Definition: renderable3d.h:77
glm::vec4 color
Definition: renderable3d.h:23
The class responsible for loading Textures.
Definition: texture.h:11
std::vector< glm::vec2 > m_UV
The texture coordinates of the 3d renderable.
Definition: renderable3d.h:83
Renderable3D()
Create a empty renderable.
Definition: renderable3d.h:140
std::vector< VertexData3D > getVerts() const
Gets vertices of the 3d renderable.
Definition: renderable3d.h:164
The Class responsible for drawing the basic 3D Renderable objects onto the screen.
Definition: renderable3d.h:66
float tid
Definition: renderable3d.h:22
virtual ~Renderable3D()
Definition: renderable3d.h:145
Shader * shader
The shader used to draw the renderable object.
Definition: renderable3d.h:72
Definition: audioclip.cpp:3
const unsigned int getID() const
Gets the ID of the texture.
Definition: texture.h:40
GLsizei getIndicesSize() const
Gets the indices count of the 3d renderable.
Definition: renderable3d.h:170
The class responsible for creating amazing shaders.
Definition: Shader.h:22
const std::vector< glm::vec2 > & getUV() const
Gets the reference to the texture coordinates of the renderable.
Definition: renderable3d.h:158
glm::vec4 m_Color
Vertex color of the renderable.
Definition: renderable3d.h:79
Texture * m_Texture
The texture used to draw the renderable object.
Definition: renderable3d.h:74
Primitive3D m_Primitive3D
The basic primitive that is being rendered, (Does not denote the primitive used to render the 3d obje...
Definition: renderable3d.h:81
void enable()
Enables the shader.
Definition: Shader.cpp:119
Renderable3D(Transform transform, glm::vec4 color, Primitive3D primitive3d)
Creates the renderable.
Definition: renderable3d.h:97
const Primitive3D & gerPrimitive() const
Gets the 3D primitive that is being rendered.
Definition: renderable3d.h:162
const glm::vec4 & getColor() const
Gets the reference to the color of the renderable object.
Definition: renderable3d.h:156
Renderable3D(Transform transform, glm::vec4 color, Primitive3D primitive3d, Shader *shader, Texture *texture)
Creates the renderable.
Definition: renderable3d.h:123
Forward declaration of the graphics::Renderable3D.
Definition: renderer3d.h:16
std::vector< GLushort > getInidces() const
Gets the indices of the 3d renderable.
Definition: renderable3d.h:168
Renderable3D(Transform transform, glm::vec4 color, Primitive3D primitive3d, Shader *shader)
Creates the renderable.
Definition: renderable3d.h:110
void disable()
Disables the shader.
Definition: Shader.cpp:124
glm::vec3 vertex
Definition: renderable3d.h:18
std::vector< GLushort > m_Indices
The indices pool of the 3d object.
Definition: renderable3d.h:87
glm::vec3 rotation
Definition: renderable3d.h:41
Primitive3D
Different types of 3D renderable primitive objects.
Definition: renderable3d.h:51
VertexData3D(glm::vec3 vertex, glm::vec2 uv, float texID, glm::vec4 color)
Definition: renderable3d.h:31
VertexData3D()
Definition: renderable3d.h:25
const GLuint getTID() const
Gets the texture ID of the texture being used by the renderable.
Definition: renderable3d.h:160
std::uint32_t objectID
The unique object ID of renderable object.
Definition: renderable3d.h:70
glm::vec2 uv
Definition: renderable3d.h:21
virtual void submit(Renderer3D *renderer) const
Virtual overload of the submit function, customize the way you can submit the renderable to the rende...
Definition: renderable3d.h:148
void setUniform1iv(const GLchar *name, int *value, GLsizei count)
Definition: Shader.cpp:94
virtual void submit(const Renderable3D *renderable)=0
Begins to submit the renderables to render queue.
glm::vec3 scale
Definition: renderable3d.h:42