diff --git a/src/Engine/Engine.vcxproj b/src/Engine/Engine.vcxproj index 1163116..12ba5e3 100644 --- a/src/Engine/Engine.vcxproj +++ b/src/Engine/Engine.vcxproj @@ -169,6 +169,10 @@ + + + + diff --git a/src/Engine/Engine.vcxproj.filters b/src/Engine/Engine.vcxproj.filters index e908a9c..624be92 100644 --- a/src/Engine/Engine.vcxproj.filters +++ b/src/Engine/Engine.vcxproj.filters @@ -83,4 +83,8 @@ Resource Files + + + + \ No newline at end of file diff --git a/src/Engine/main.cpp b/src/Engine/main.cpp index b3ea354..ef5fe2f 100644 --- a/src/Engine/main.cpp +++ b/src/Engine/main.cpp @@ -15,8 +15,8 @@ #include "vertices.h" -// Continue: https://learnopengl.com/Lighting/Colors -// Chapter: A lighting scene +// Continue: https://learnopengl.com/Lighting/Basic-Lighting +// Chapter: Not yet started // // 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 @@ -63,7 +63,8 @@ void ProcessInput(GLFWwindow* window) cam.ProcessKeyboard(MovementDirection::RIGHT, deltaTime); if(glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS) cam.ProcessKeyboard(MovementDirection::UP, deltaTime); - if(glfwGetKey(window, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS || glfwGetKey(window, GLFW_KEY_RIGHT_SHIFT) == GLFW_PRESS) + if(glfwGetKey(window, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS || glfwGetKey(window, GLFW_KEY_RIGHT_SHIFT) == GLFW_PRESS + || glfwGetKey(window, GLFW_KEY_LEFT_CONTROL) == GLFW_PRESS) cam.ProcessKeyboard(MovementDirection::DOWN, deltaTime); } @@ -147,13 +148,17 @@ int main() }; - std::string vertexPath = "shaders/default/default.vert"; - std::string fragmentPath = "shaders/default/default.frag"; + std::string lightingVertexPath = "shaders/default/default.vert", lampVertexPath = "shaders/default/simple.vert"; + std::string lightingFragmentPath = "shaders/default/default.frag", lampFragmentPath = "shaders/default/simple.frag"; - std::unique_ptr shader; + std::shared_ptr lighting, lamp; + std::vector> allShaders = std::vector>(); try { - shader = std::make_unique(vertexPath, fragmentPath); + lighting = std::make_shared(lightingVertexPath, lightingFragmentPath); + lamp = std::make_shared(lampVertexPath, lampFragmentPath); + allShaders.push_back(lighting); + allShaders.push_back(lamp); } catch (const std::exception &e) { @@ -166,9 +171,16 @@ int main() //Texture2D containerImage("images/container.jpg"); //Texture2D faceImage("images/awesomeface.png", 0, GL_RGBA); - std::vector verts(std::begin(vertices_container), std::end(vertices_container)); - std::vector vertexAttribs = { Nebulix::VertexAttribute(), Nebulix::VertexAttribute(GL_FLOAT, GL_FALSE, 2) }; - Nebulix::GameObject cube = Nebulix::GameObject(verts, vertexAttribs); + std::vector verts(std::begin(vertices_cube), std::end(vertices_cube)); + std::vector vertexAttribs = { Nebulix::VertexAttribute() }; + Nebulix::GameObject cube(verts, vertexAttribs); + vec3 lightPosition = glm::vec3(1.2f, 1.0f, 2.0f); + Nebulix::GameObject lightBulb(verts, vertexAttribs, lightPosition, glm::vec3(0.2f)); + + std::vector allObjects = std::vector(); + allObjects.push_back(cube); + allObjects.push_back(lightBulb); + // main loop while(!glfwWindowShouldClose(window)) { @@ -176,18 +188,31 @@ int main() deltaTime = currentFrameTime - lastFrameTime; lastFrameTime = currentFrameTime; - glClearColor(0.2f, 0.3f, 0.3f, 1.0f); + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); ProcessInput(window); mat4 projectionMatrix = glm::perspective(glm::radians(cam.Fov), 800.0f / 600.0f, 0.1f, 100.0f); - shader->Use(); - shader->SetMatrix("viewMatrix", cam.GetViewMatrix()); // more or less the camera - shader->SetMatrix("projectionMatrix", projectionMatrix); - shader->SetMatrix("modelMatrix", cube.GetModelMatrix()); - cube.Draw(); + for (size_t i = 0; i < allShaders.size(); i++) + { + auto shader = allShaders[i]; + shader->Use(); + shader->SetMatrix("viewMatrix", cam.GetViewMatrix()); // more or less the camera + shader->SetMatrix("projectionMatrix", projectionMatrix); + shader->SetMatrix("modelMatrix", allObjects[i].GetModelMatrix()); + } + + lighting->Use(); + lighting->SetFloat("lightColour", 1.0f, 1.0f, 1.0f); + lighting->SetFloat("objectColour", 1.0f, 0.5f, 0.31f); + + for (size_t i = 0; i < allObjects.size(); i++) + { + allShaders[i]->Use(); + allObjects[i].Draw(); + } glfwSwapBuffers(window); glfwPollEvents(); diff --git a/src/Engine/object/game_object.h b/src/Engine/object/game_object.h index d26f5a0..025d962 100644 --- a/src/Engine/object/game_object.h +++ b/src/Engine/object/game_object.h @@ -40,14 +40,11 @@ namespace Nebulix { public: glm::vec3 Position; + glm::vec3 Scale; - GameObject(std::vector& vertices, std::vector vertexAttributes) - : vertices{ vertices }, vertexAttributes{ vertexAttributes }, Position{glm::vec3(0.0f)} - { - Init(); - } - GameObject(std::vector &vertices, std::vector vertexAttributes, glm::vec3& position) - : vertices{vertices}, vertexAttributes{ vertexAttributes }, Position{position} + GameObject(std::vector& vertices, std::vector vertexAttributes, + glm::vec3 position = glm::vec3(0.0f), glm::vec3 scale = glm::vec3(1.0f)) + : vertices{ vertices }, vertexAttributes{ vertexAttributes }, Position{position}, Scale{scale} { Init(); } @@ -57,7 +54,7 @@ namespace Nebulix glDeleteBuffers(1, &vertexBuffer); } - // NOTE: This method will only call "Shader.Use()" but will not set any properties. + // NOTE: This method will not 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() { @@ -74,7 +71,9 @@ namespace Nebulix { 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); + model = glm::translate(model, Position); + model = glm::scale(model, Scale); + return model; } private: diff --git a/src/Engine/shaders/default/default.frag b/src/Engine/shaders/default/default.frag index 3214fb3..1df68ff 100644 --- a/src/Engine/shaders/default/default.frag +++ b/src/Engine/shaders/default/default.frag @@ -1,7 +1,9 @@ #version 330 core out vec4 FragColor; +uniform vec3 lightColour, objectColour; + void main() { - FragColor = vec4(1.0); + FragColor = vec4(lightColour * objectColour, 1.0); } \ No newline at end of file diff --git a/src/Engine/shaders/default/simple.frag b/src/Engine/shaders/default/simple.frag new file mode 100644 index 0000000..ab6371f --- /dev/null +++ b/src/Engine/shaders/default/simple.frag @@ -0,0 +1,7 @@ +#version 330 core +out vec4 FragColor; + +void main() +{ + FragColor = vec4(1.0); +} \ No newline at end of file diff --git a/src/Engine/shaders/default/simple.vert b/src/Engine/shaders/default/simple.vert new file mode 100644 index 0000000..c9f0c55 --- /dev/null +++ b/src/Engine/shaders/default/simple.vert @@ -0,0 +1,12 @@ +#version 330 core +layout (location = 0) in vec3 aPos; + +uniform mat4 modelMatrix; +uniform mat4 viewMatrix; +uniform mat4 projectionMatrix; + +void main() +{ + // note that we read the multiplication from right to left + gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(aPos, 1.0); +} diff --git a/src/Engine/vertices.h b/src/Engine/vertices.h index fc1a867..a551f56 100644 --- a/src/Engine/vertices.h +++ b/src/Engine/vertices.h @@ -1,7 +1,7 @@ #pragma once -float vertices_light[] = { +float vertices_cube[] = { -0.5f, -0.5f, -0.5f, 0.5f, -0.5f, -0.5f, 0.5f, 0.5f, -0.5f,