diff --git a/src/Engine/Engine.vcxproj b/src/Engine/Engine.vcxproj
index d6d4c6e..6ef7053 100644
--- a/src/Engine/Engine.vcxproj
+++ b/src/Engine/Engine.vcxproj
@@ -138,7 +138,6 @@
-
@@ -152,6 +151,7 @@
+
diff --git a/src/Engine/Engine.vcxproj.filters b/src/Engine/Engine.vcxproj.filters
index 4e69393..bb4b653 100644
--- a/src/Engine/Engine.vcxproj.filters
+++ b/src/Engine/Engine.vcxproj.filters
@@ -27,9 +27,6 @@
Source Files
-
- Source Files
-
@@ -62,6 +59,9 @@
Header Files
+
+ Header Files
+
diff --git a/src/Engine/main.cpp b/src/Engine/main.cpp
index 09ef7c6..e9c3b9a 100644
--- a/src/Engine/main.cpp
+++ b/src/Engine/main.cpp
@@ -13,7 +13,7 @@
#include "util/camera/camera.h"
// Continue: https://learnopengl.com/Lighting/Colors
-// Chapter: Not yet started
+// Chapter: A lighting scene
//
// TODO: look at project->properties->VC++ Directories-> change everything to the Environment var
// For the "real" Nebulix Engine setup everything so it can be compiled/used with VSCode/CLion and not just VS
diff --git a/src/Engine/object/game_object.h b/src/Engine/object/game_object.h
new file mode 100644
index 0000000..84d62d1
--- /dev/null
+++ b/src/Engine/object/game_object.h
@@ -0,0 +1,110 @@
+#pragma once
+#include
+#include
+#include
+
+#include "../shaders/Shader.h"
+
+namespace Nebulix
+{
+ struct VertexAttribute
+ {
+ GLenum AttributeType = GL_FLOAT;
+ GLboolean Normalised = GL_FALSE;
+ ///
+ /// The number of elements for this attribute.
+ /// For example: 1 float value for each the x,y,z coordinate of the vertex which means this variable should be set to 3
+ ///
+ int NrOfElements = 3;
+ int Stride;
+
+ VertexAttribute(GLenum attributeType = GL_FLOAT, GLboolean normalised = GL_FALSE, int nrOfElements = 3)
+ : AttributeType{ attributeType }, Normalised{ normalised }, NrOfElements{ nrOfElements }
+ {
+ if (attributeType == GL_INT)
+ Stride = nrOfElements * sizeof(int);
+ else if (attributeType == GL_FLOAT)
+ Stride = nrOfElements * sizeof(float);
+ else if (attributeType == GL_DOUBLE)
+ Stride = nrOfElements * sizeof(double);
+ else if (attributeType == GL_BOOL)
+ Stride = nrOfElements * sizeof(bool);
+ else if (attributeType == GL_BYTE)
+ Stride = nrOfElements * sizeof(char);
+ else
+ throw std::exception("ERROR::CONSTRUCT::VERTEX_ATTRIBUTE::NOT_IMPLEMENTED");
+ }
+ };
+
+ // TODO: move the triangle stuff to a seperate mesh class and use the mesh class here
+ // (in the final engine, this mesh class will be a component and a game object will just hold a list of different components)
+ class GameObject
+ {
+ public:
+ glm::vec3 Position;
+
+ GameObject(std::vector& vertices, std::vector vertexAttributes, Shader shader)
+ : vertices{ vertices }, vertexAttributes{ vertexAttributes }, shader{shader}, Position{glm::vec3(0.0f)}
+ {
+ Init();
+ }
+ GameObject(std::vector &vertices, std::vector vertexAttributes, Shader shader, glm::vec3& position)
+ : vertices{vertices}, vertexAttributes{ vertexAttributes }, shader{ shader }, Position{position}
+ {
+ Init();
+ }
+
+ // NOTE: This method will only call "Shader.Use()" but will not set any properties.
+ // This is because I do not know the names and values of the properties. Most likely this will be possible after learning about materials
+ void Draw()
+ {
+ glBindVertexArray(vertexArray);
+
+ // TODO: Set shader matrices. Wait for materials
+ shader.Use();
+
+ //glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); // for EBOs
+ glDrawArrays(GL_TRIANGLES, 0, vertices.size()); // for VAOs
+
+ }
+
+ glm::mat4 GetModelMatrix()
+ {
+ glm::mat4 model = glm::mat4(1.0f);
+ // TODO: add properties for rotation/scale and add these to the model matrix
+ return glm::translate(model, Position);
+ }
+
+ private:
+ std::vector vertices;
+ Shader shader;
+
+ GLuint vertexBuffer, vertexArray;
+ std::vector vertexAttributes;
+
+ void Init()
+ {
+ glGenVertexArrays(1, &vertexArray);
+ glGenBuffers(1, &vertexBuffer);
+ glBindVertexArray(vertexArray);
+
+ glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
+ glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices.data(), GL_STATIC_DRAW);
+
+ int stride = 0;
+ for (size_t i = 0; i < vertexAttributes.size(); i++)
+ {
+ stride += vertexAttributes[i].Stride;
+ }
+
+ int offset = 0;
+ for (size_t i = 0; i < vertexAttributes.size(); i++)
+ {
+ VertexAttribute attr = vertexAttributes[i];
+ glVertexAttribPointer(i, attr.NrOfElements, attr.AttributeType, attr.Normalised, stride, (void*)offset);
+ glEnableVertexAttribArray(i);
+ offset += attr.Stride;
+ }
+ }
+ };
+}
diff --git a/src/Engine/util/camera/camera.cpp b/src/Engine/util/camera/camera.cpp
deleted file mode 100644
index 729cfb7..0000000
--- a/src/Engine/util/camera/camera.cpp
+++ /dev/null
@@ -1 +0,0 @@
-#include "camera.h"