diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..a6ee341
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,4 @@
+[submodule "imgui"]
+path = imgui
+url = https://github.com/ocornut/imgui.git
+branch = docking
diff --git a/LearningOpenGL.vcxproj b/LearningOpenGL.vcxproj
index b97f0e0..ac4c1ad 100644
--- a/LearningOpenGL.vcxproj
+++ b/LearningOpenGL.vcxproj
@@ -71,7 +71,7 @@
- C:\Development Projects\LearningOpenGL\Include\glm;C:\Development Projects\LearningOpenGL\Include\glfw-3.4.bin.WIN64\include;C:\Development Projects\LearningOpenGL\Include\glad\include;$(IncludePath)
+ C:\Development Projects\LearningOpenGL\imgui\backends;C:\Development Projects\LearningOpenGL\imgui;C:\Development Projects\LearningOpenGL\Include\glm;C:\Development Projects\LearningOpenGL\Include\glfw-3.4.bin.WIN64\include;C:\Development Projects\LearningOpenGL\Include\glad\include;$(IncludePath)
C:\Development Projects\LearningOpenGL\Include\glfw-3.4.bin.WIN64\lib-vc2022;$(LibraryPath)
@@ -137,10 +137,17 @@
+
+
+
+
+
+
+
diff --git a/LearningOpenGL.vcxproj.filters b/LearningOpenGL.vcxproj.filters
index fbb8a73..8612da1 100644
--- a/LearningOpenGL.vcxproj.filters
+++ b/LearningOpenGL.vcxproj.filters
@@ -25,10 +25,23 @@
+
+
+
+
Header Files
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
\ No newline at end of file
diff --git a/camera.h b/camera.h
new file mode 100644
index 0000000..a1437ba
--- /dev/null
+++ b/camera.h
@@ -0,0 +1,115 @@
+#pragma once
+#ifndef CAMERA_H
+#define CAMERA_H
+
+#include
+#include
+#include
+
+enum Camera_Movement
+{
+ FORWARD,
+ BACKWARD,
+ LEFT,
+ RIGHT
+};
+
+const float YAW = -90.0f;
+const float PITCH = 0.0f;
+const float SPEED = 2.5f;
+const float SENSITIVITY = 0.1f;
+const float ZOOM = 45.0f;
+
+class Camera
+{
+public:
+ glm::vec3 Position;
+ glm::vec3 Front;
+ glm::vec3 Up;
+ glm::vec3 Right;
+ glm::vec3 WorldUp;
+
+ float Yaw;
+ float Pitch;
+
+ float MovementSpeed;
+ float MouseSensitivity;
+ float Zoom;
+
+ Camera(
+ glm::vec3 position = glm::vec3(0.0f, 0.0f, 0.0f),
+ glm::vec3 up = glm::vec3(0.0f, 1.0f, 0.0f),
+ float yaw = YAW,
+ float pitch = PITCH)
+ :
+ Front(glm::vec3(0.0f, 0.0f, -1.0f)),
+ MovementSpeed(SPEED),
+ MouseSensitivity(SENSITIVITY),
+ Zoom(ZOOM)
+ {
+ Position = position;
+ WorldUp = up;
+ Yaw = yaw;
+ Pitch = pitch;
+ updateCameraVectors();
+ }
+
+ glm::mat4 GetViewMatrix()
+ {
+ return glm::lookAt(Position, Position + Front, Up);
+ }
+
+ void ProcessKeyboard(Camera_Movement direction, float deltaTime)
+ {
+ float velocity = MovementSpeed * deltaTime;
+ if (direction == FORWARD)
+ Position += Front * velocity;
+ if (direction == BACKWARD)
+ Position -= Front * velocity;
+ if (direction == LEFT)
+ Position -= Right * velocity;
+ if (direction == RIGHT)
+ Position += Right * velocity;
+ }
+
+ void ProcessMouseMovement(float xoffset, float yoffset, GLboolean constrainPitch = true)
+ {
+ xoffset *= MouseSensitivity;
+ yoffset *= MouseSensitivity;
+
+ Yaw += xoffset;
+ Pitch += yoffset;
+
+ if (constrainPitch)
+ {
+ if (Pitch > 89.0f)
+ Pitch = 89.0f;
+ if (Pitch < -89.0f)
+ Pitch = -89.0f;
+ }
+
+ updateCameraVectors();
+ }
+
+ void ProcessMouseScroll(float yoffset)
+ {
+ Zoom -= (float)yoffset;
+ if (Zoom < 1.0f)
+ Zoom = 1.0f;
+ if (Zoom > 45.0f)
+ Zoom = 45.0f;
+ }
+private:
+ void updateCameraVectors()
+ {
+ glm::vec3 front;
+ front.x = cos(glm::radians(Yaw)) * cos(glm::radians(Pitch));
+ front.y = sin(glm::radians(Pitch));
+ front.z = sin(glm::radians(Yaw)) * cos(glm::radians(Pitch));
+ Front = glm::normalize(front);
+ Right = glm::normalize(glm::cross(Front, WorldUp));
+ Up = glm::normalize(glm::cross(Right, Front));
+ }
+};
+
+#endif
\ No newline at end of file
diff --git a/cube.frag b/cube.frag
new file mode 100644
index 0000000..7bdc90e
--- /dev/null
+++ b/cube.frag
@@ -0,0 +1,23 @@
+#version 330 core
+out vec4 FragColor;
+
+uniform vec3 objectColor;
+uniform vec3 lightColor;
+uniform vec3 lightPos;
+
+in vec3 FragPos;
+in vec3 Normal;
+
+void main()
+{
+ float ambientStrength = 0.1f;
+ vec3 ambient = ambientStrength * lightColor;
+
+ vec3 norm = normalize(Normal);
+ vec3 lightDir = normalize(lightPos - FragPos);
+ float diff = max(dot(norm, lightDir), 0.0);
+ vec3 diffuse = diff * lightColor;
+
+ vec3 result = (ambient + diffuse) * objectColor;
+ FragColor = vec4(result, 1.0f);
+}
\ No newline at end of file
diff --git a/cube.h b/cube.h
new file mode 100644
index 0000000..07973dd
--- /dev/null
+++ b/cube.h
@@ -0,0 +1,100 @@
+#pragma once
+
+#ifndef CUBE_H
+#define CUBE_H
+
+#include
+#include
+#include
+
+class Cube
+{
+private:
+ glm::vec3 position;
+ glm::vec3 scale;
+ glm::vec3 rotation;
+ glm::vec3 color;
+
+ //const float CUBE_COLORS[24]{
+ // 1.0f, 0.0f, 0.0f,
+ // 0.0f, 1.0f, 0.0f,
+ // 0.0f, 0.0f, 1.0f,
+ // 1.0f, 1.0f, 0.0f,
+ // 0.0f, 1.0f, 1.0f,
+ // 1.0f, 0.0f, 1.0f,
+ // 1.0f, 1.0f, 1.0f,
+ // 0.0f, 0.0f, 0.0f
+ //};
+
+public:
+
+ Cube(glm::vec3 position, glm::vec3 scale, glm::vec3 rotation, glm::vec3 color)
+ {
+ this->position = position;
+ this->scale = scale;
+ this->rotation = rotation;
+ this->color = color;
+ }
+
+ //void draw(unsigned int& modelLoc, unsigned int& VAO)
+ //{
+ // glBindVertexArray(VAO);
+ // glm::mat4 model = getModelMatrix();
+ // glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model));
+ // glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, 0); // 36 indices for the cube
+ // glBindVertexArray(0);
+ //}
+
+ glm::mat4 getModelMatrix() const
+ {
+ glm::mat4 model = glm::mat4(1.0f);
+ model = glm::translate(model, position);
+ model = glm::rotate(model, glm::radians(rotation.x), glm::vec3(1, 0, 0));
+ model = glm::rotate(model, glm::radians(rotation.y), glm::vec3(0, 1, 0));
+ model = glm::rotate(model, glm::radians(rotation.z), glm::vec3(0, 0, 1));
+ model = glm::scale(model, scale);
+
+ return model;
+ }
+
+ void setPosition(glm::vec3 position)
+ {
+ this->position = position;
+ }
+
+ void setScale(glm::vec3 scale)
+ {
+ this->scale = scale;
+ }
+
+ void setRotation(glm::vec3 rotation)
+ {
+ this->rotation = rotation;
+ }
+
+ void setColor(glm::vec3 color)
+ {
+ this->color = color;
+ }
+
+ glm::vec3 getPosition() const
+ {
+ return position;
+ }
+
+ glm::vec3 getScale() const
+ {
+ return scale;
+ }
+
+ glm::vec3 getRotation() const
+ {
+ return rotation;
+ }
+
+ glm::vec3 getColor() const
+ {
+ return color;
+ }
+};
+#endif
\ No newline at end of file
diff --git a/cube.vert b/cube.vert
new file mode 100644
index 0000000..7932c9d
--- /dev/null
+++ b/cube.vert
@@ -0,0 +1,19 @@
+
+#version 330 core
+layout (location = 0) in vec3 aPos;
+layout (location = 1) in vec3 aNormal;
+
+out vec3 FragPos;
+out vec3 Normal;
+
+uniform mat4 model;
+uniform mat4 view;
+uniform mat4 projection;
+
+void main()
+{
+ FragPos = vec3(model * vec4(aPos, 1.0));
+ Normal = mat3(transpose(inverse(model))) * aNormal;
+
+ gl_Position = projection * view * vec4(FragPos, 1.0);
+}
diff --git a/cubeFactory.h b/cubeFactory.h
new file mode 100644
index 0000000..19401af
--- /dev/null
+++ b/cubeFactory.h
@@ -0,0 +1,162 @@
+#pragma once
+
+#ifndef CUBE_FACTORY_H
+#define CUBE_FACTORY_H
+
+#include
+
+#include
+#include
+#include
+#include
+#include
+
+#include
+#include
+
+class CubeFactory
+{
+private:
+ Shader shader;
+
+ unsigned int VAO, VBO, EBO;
+
+ std::list cubes;
+
+ const unsigned int CUBE_INDICES[36]{
+ 0, 1, 2, 0, 2, 3, // Front face
+ 4, 5, 6, 4, 6, 7, // Back face
+ 0, 1, 5, 0, 5, 4, // Bottom face
+ 3, 2, 6, 3, 6, 7, // Top face
+ 0, 3, 7, 0, 7, 4, // Left face
+ 1, 2, 6, 1, 6, 5 // Right face
+ };
+
+ void setupBuffers()
+ {
+ float CUBE_VERTICES[] = {
+ -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f,
+ 0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f,
+ 0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f,
+ 0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f,
+ -0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f,
+ -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f,
+
+ -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
+ 0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
+ 0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
+ 0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
+ -0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
+ -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
+
+ -0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f,
+ -0.5f, 0.5f, -0.5f, -1.0f, 0.0f, 0.0f,
+ -0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f,
+ -0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f,
+ -0.5f, -0.5f, 0.5f, -1.0f, 0.0f, 0.0f,
+ -0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f,
+
+ 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f,
+ 0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 0.0f,
+ 0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f,
+ 0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f,
+ 0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f,
+ 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f,
+
+ -0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f,
+ 0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f,
+ 0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f,
+ 0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f,
+ -0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f,
+ -0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f,
+
+ -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f,
+ 0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f,
+ 0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f,
+ 0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f,
+ -0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f,
+ -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f
+ };
+
+ glGenVertexArrays(1, &VAO);
+ glGenBuffers(1, &VBO);
+ glGenBuffers(1, &EBO);
+
+ glBindVertexArray(VAO);
+
+ glBindBuffer(GL_ARRAY_BUFFER, VBO);
+ glBufferData(GL_ARRAY_BUFFER, sizeof(CUBE_VERTICES), CUBE_VERTICES, GL_STATIC_DRAW);
+
+ //glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
+ //glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(CUBE_INDICES), CUBE_INDICES, GL_STATIC_DRAW);
+
+ glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);
+ glEnableVertexAttribArray(0);
+
+ glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3 * sizeof(float)));
+ glEnableVertexAttribArray(1);
+
+ //glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3 * sizeof(float)));
+ //glEnableVertexAttribArray(1);
+
+ glBindBuffer(GL_ARRAY_BUFFER, 0);
+ glBindVertexArray(0);
+ }
+public:
+ CubeFactory() : shader (Shader("cube.vert", "cube.frag"))
+ {
+ std::cout << "Setting up cube factory" << std::endl;
+ setupBuffers();
+ //std::cout << VAO << " " << VBO << " " << EBO << std::endl;
+ }
+
+ void clear()
+ {
+ glDeleteVertexArrays(1, &VAO);
+ glDeleteBuffers(1, &VBO);
+ glDeleteBuffers(1, &EBO);
+ }
+
+ void addCube(glm::vec3 position, glm::vec3 scale, glm::vec3 rotation, glm::vec3 color)
+ {
+ cubes.push_back(Cube(position, scale, rotation, color));
+ }
+
+ void render(glm::mat4 view, glm::mat4 projection, glm::vec3 lightPos, float deltaTime)
+ {
+ //std::cout << "Rendering cubes" << std::endl;
+ shader.use();
+ shader.setMat4("projection", projection);
+ shader.setMat4("view", view);
+ //glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ for (Cube& cube : cubes)
+ {
+ //std::cout << "Cube position: (" << cube.getColor().x << "," << cube.getColor().y << "," << cube.getColor().z << ")" << std::endl;
+ cube.setRotation(cube.getRotation() + (glm::vec3(5.0f, 10.0f, 20.0f))*deltaTime);
+ glm::mat4 model = cube.getModelMatrix();
+ glm::vec3 color = cube.getColor();
+ shader.setMat4("model", model);
+ shader.setVec3("objectColor", color);
+ shader.setVec3("lightColor", 1.0f, 1.0f, 1.0f);
+ shader.setVec3("lightPos", lightPos);
+
+ glBindVertexArray(VAO);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ glDrawArrays(GL_TRIANGLES, 0, 36);
+ //glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, 0);
+ //shader.setVec3("objectColor", 0.0f, 0.0f, 0.0f);
+ //glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ //glDrawArrays(GL_TRIANGLES, 0, 36);
+ //glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, 0);
+
+ glBindVertexArray(0);
+ }
+ }
+
+ std::list getCubes()
+ {
+ return cubes;
+ }
+};
+
+#endif
\ No newline at end of file
diff --git a/fragment.frag b/fragment.frag
index f0f2177..1b23324 100644
--- a/fragment.frag
+++ b/fragment.frag
@@ -1,8 +1,10 @@
#version 330 core
out vec4 FragColor;
-in vec3 ourColor;
+
+uniform vec3 objectColor;
+uniform vec3 lightColor;
void main()
{
- FragColor = vec4(ourColor, 1.0f);
+ FragColor = vec4(objectColor * lightColor, 1.0f);
}
\ No newline at end of file
diff --git a/imgui b/imgui
new file mode 160000
index 0000000..22503bf
--- /dev/null
+++ b/imgui
@@ -0,0 +1 @@
+Subproject commit 22503bfe75359d5d7c24e03e9fe03ffca70585cf
diff --git a/light.frag b/light.frag
new file mode 100644
index 0000000..1c649f4
--- /dev/null
+++ b/light.frag
@@ -0,0 +1,7 @@
+#version 330 core
+out vec4 FragColor;
+
+void main()
+{
+ FragColor = vec4(1.0); // set all 4 vector values to 1.0
+}
\ No newline at end of file
diff --git a/light.vert b/light.vert
new file mode 100644
index 0000000..1d74826
--- /dev/null
+++ b/light.vert
@@ -0,0 +1,12 @@
+#version 330 core
+layout (location = 0) in vec3 aPos;
+
+uniform mat4 model;
+uniform mat4 view;
+uniform mat4 projection;
+
+void main()
+{
+ gl_Position = projection * view * model * vec4(aPos, 1.0);
+}
+
diff --git a/main.cpp b/main.cpp
index 4c96477..f9fba4a 100644
--- a/main.cpp
+++ b/main.cpp
@@ -1,40 +1,49 @@
+
+#include
+#include
+
#include
#include
#include
#include
#include
-#include
-
-#include
-#include
+#include
+#include
+#include
+#include
+#include
void framebuffer_size_callback(GLFWwindow* window, int width, int height);
void processInput(GLFWwindow* window);
+void mouse_callback(GLFWwindow* window, double xpos, double ypos);
+void scroll_callback(GLFWwindow* window, double xoffset, double yoffset);
int SCR_WIDTH = 800;
int SCR_HEIGHT = 800;
-float triangleVertices[] = {
- -0.5f,-0.5f,0.0f, 1.0f,0.0f,0.0f,
- 0.5f,-0.5f,0.0f, 0.0f,1.0f,0.0f,
- 0.0f, 0.5f,0.0f, 0.0f,0.0f,1.0f
-};
+Camera camera(glm::vec3(0.0f, 0.0f, 20.0f));
+float lastX = SCR_WIDTH / 2.0f;
+float lastY = SCR_HEIGHT / 2.0f;
+bool firstMouse = true;
-float squareVertices[] = {
- -0.8f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f,
- -0.8f, 0.8f, 0.0f, 1.0f, 0.0f, 0.0f,
- -1.0f, 0.8f, 0.0f, 0.0f, 1.0f, 0.0f,
- -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f
-};
+float deltaTime = 0.0f;
+float lastFrame = 0.0f;
+float elapsedTime = 0.0f;
-unsigned int indices[] = {
- 0,1,3,
- 1,2,3
-};
+//glm::vec3 lightPos(1.2f, 1.0f, 2.0f);
-int main() {
+int main()
+{
+ IMGUI_CHECKVERSION();
+ ImGui::CreateContext();
+ ImGuiIO& io = ImGui::GetIO();
+ io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;
+ io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad;
+ io.ConfigFlags |= ImGuiConfigFlags_DockingEnable;
+
+ std::cout << "Starting GLFW context, OpenGL 3.3" << std::endl;
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
@@ -46,106 +55,128 @@ int main() {
glfwTerminate();
return -1;
}
+
glfwMakeContextCurrent(window);
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
+ glfwSetCursorPosCallback(window, mouse_callback);
+ glfwSetScrollCallback(window, scroll_callback);
+
+ glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
std::cout << "Failed to initialize GLAD" << std::endl;
return -1;
}
- Shader ourShader("vertex.vert", "fragment.frag");
+ glEnable(GL_DEPTH_TEST);
- glViewport(0, 0, SCR_WIDTH, SCR_HEIGHT);
+ std::cout << "Loaded GLFW context, OpenGL 3.3" << std::endl;
- unsigned int VAO_1, VAO_2, VBO_1, VBO_2, EBO;
- glGenVertexArrays(1, &VAO_1);
- glGenVertexArrays(1, &VAO_2);
- glGenBuffers(1, &VBO_1);
- glGenBuffers(1, &VBO_2);
- glGenBuffers(1, &EBO);
+ CubeFactory cubeFactory;
- glBindVertexArray(VAO_1);
+ float offset = 2.0f;
+ int xAmount = 10;
+ int yAmount = 10;
+ int zAmount = 10;
- glBindBuffer(GL_ARRAY_BUFFER, VBO_1);
- glBufferData(GL_ARRAY_BUFFER, sizeof(triangleVertices), triangleVertices, GL_STATIC_DRAW);
- glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);
- glEnableVertexAttribArray(0);
+ for (int x = 0; x < xAmount; x++)
+ {
+ for (int y = 0; y < yAmount; y++)
+ {
+ for (int z = 0; z < zAmount; z++)
+ {
+ glm::vec3 position = glm::vec3( (x * offset) - (xAmount * offset / 2.0f),
+ (y * offset) - (yAmount * offset / 2.0f),
+ (z * offset) - (zAmount * offset / 2.0f));
+ glm::vec3 scale = glm::vec3(1.0f, 1.0f, 1.0f);
+ glm::vec3 rotation = glm::vec3(0.0f, 0.0f, 0.0f);
+ glm::vec3 color = glm::vec3(x/10.0f, y/10.0f, z/10.0f);
- glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3 * sizeof(float)));
- glEnableVertexAttribArray(1);
+ cubeFactory.addCube(position, scale, rotation, color);
+ }
+ }
+ }
- glBindVertexArray(VAO_2);
-
- glBindBuffer(GL_ARRAY_BUFFER, VBO_2);
- glBufferData(GL_ARRAY_BUFFER, sizeof(squareVertices), squareVertices, GL_STATIC_DRAW);
-
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
- glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
-
- glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);
- glEnableVertexAttribArray(0);
-
- glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3 * sizeof(float)));
- glEnableVertexAttribArray(1);
-
- glBindBuffer(GL_ARRAY_BUFFER, 0);
- glBindVertexArray(0);
+ //std::cout << "Amount of cubes: " << cubeFactory.getCubes().size() << std::endl;
- float r = 0.0f, g = 0.0f, b = 0.0f;
+ float r = 0.05f, g = 0.05f, b = 0.05f;
+
while (!glfwWindowShouldClose(window)) {
+ //timing
+ float currentFrame = glfwGetTime();
+ deltaTime = currentFrame - lastFrame;
+ lastFrame = currentFrame;
+ elapsedTime += deltaTime;
+
//input
processInput(window);
- //rendering
- if (r < 1) {
- r = r + 0.01f;
- }
- else if (g < 1) {
- g = g + 0.01f;
- }
- else if (b < 1) {
- b = b + 0.01f;
- }
- else {
- r = 0;
- g = 0;
- b = 0;
- }
-
glClearColor(r, g, b, 1.0f);
- glClear(GL_COLOR_BUFFER_BIT);
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- //transforms
- glm::mat4 defaultTransform = glm::mat4(1.0f);
- glm::mat4 rotatedTransform = glm::rotate(defaultTransform, (float)glfwGetTime(), glm::vec3(0.0f, 0.0f, 1.0f));
+ // view/projection transformations
+ glm::mat4 projection = glm::perspective(glm::radians(camera.Zoom), (float)SCR_WIDTH / (float)SCR_HEIGHT, 0.1f, 100.0f);
+ glm::mat4 view = camera.GetViewMatrix();
- //draw
- ourShader.use();
- unsigned int transformLoc = glGetUniformLocation(ourShader.ID, "transform");
- glUniformMatrix4fv(transformLoc, 1, GL_FALSE, glm::value_ptr(rotatedTransform));
- glBindVertexArray(VAO_1);
- glDrawArrays(GL_TRIANGLES, 0, 3);
+ glm::vec3 lightPos = glm::vec3(100.2f, 100.0f, 200.0f);
- glUniformMatrix4fv(transformLoc, 1, GL_FALSE, glm::value_ptr(defaultTransform));
- glBindVertexArray(VAO_2);
- glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
+ cubeFactory.render(view, projection, lightPos, deltaTime);
//check and call
glfwSwapBuffers(window);
glfwPollEvents();
}
+ //cubeFactory.clear();
glfwTerminate();
return 0;
}
-void framebuffer_size_callback(GLFWwindow* window, int width, int height) {
+void framebuffer_size_callback(GLFWwindow* window, int width, int height)
+{
glViewport(0, 0, width, height);
}
-void processInput(GLFWwindow* window) {
+void processInput(GLFWwindow* window)
+{
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) {
glfwSetWindowShouldClose(window, true);
}
-}
\ No newline at end of file
+
+ const float cameraSpeed = 5.0f * deltaTime;
+ if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS)
+ camera.ProcessKeyboard(FORWARD, deltaTime);
+ if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS)
+ camera.ProcessKeyboard(BACKWARD, deltaTime);
+ if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS)
+ camera.ProcessKeyboard(LEFT, deltaTime);
+ if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS)
+ camera.ProcessKeyboard(RIGHT, deltaTime);
+}
+
+void mouse_callback(GLFWwindow* window, double xposIn, double yposIn)
+{
+ //std::cout << "Mouse callback" << std::endl;
+ float xpos = static_cast(xposIn);
+ float ypos = static_cast(yposIn);
+
+ if (firstMouse)
+ {
+ lastX = xpos;
+ lastY = ypos;
+ firstMouse = false;
+ }
+
+ float xoffset = xpos - lastX;
+ float yoffset = lastY - ypos;
+
+ lastX = xpos;
+ lastY = ypos;
+
+ camera.ProcessMouseMovement(xoffset, yoffset);
+}
+
+void scroll_callback(GLFWwindow* window, double xoffset, double yoffset)
+{
+ camera.ProcessMouseScroll(static_cast(yoffset));
+}
diff --git a/vertex.vert b/vertex.vert
index c6e1603..9dd5e89 100644
--- a/vertex.vert
+++ b/vertex.vert
@@ -1,13 +1,11 @@
#version 330 core
layout (location = 0) in vec3 aPos;
-layout (location = 1) in vec3 aColor;
-out vec3 ourColor;
-
-uniform mat4 transform;
+uniform mat4 model;
+uniform mat4 view;
+uniform mat4 projection;
void main()
{
- gl_Position = transform * vec4(aPos, 1.0);
- ourColor = aColor;
+ gl_Position = projection * view * model * vec4(aPos, 1.0);
}