From ad79aa28653a9199e0fa095eff6781303595705b Mon Sep 17 00:00:00 2001 From: Nigel Barink Date: Sat, 24 Dec 2022 02:04:51 +0100 Subject: [PATCH] Small rendering improvements - Make view and projection matrix part of the camera - Add a getter function for the camera in renderer - Take shader uniform values by const ref --- .../src/Graphics/Primitives/Camera.cpp | 22 ++++++++++++++----- YoggieEngine/src/Graphics/Primitives/Camera.h | 12 ++++++---- .../src/Graphics/Primitives/Shader.cpp | 12 +++++----- YoggieEngine/src/Graphics/Primitives/Shader.h | 12 +++++----- YoggieEngine/src/Graphics/Renderer.cpp | 16 ++++++++------ YoggieEngine/src/Graphics/Renderer.h | 4 +++- 6 files changed, 49 insertions(+), 29 deletions(-) diff --git a/YoggieEngine/src/Graphics/Primitives/Camera.cpp b/YoggieEngine/src/Graphics/Primitives/Camera.cpp index 315b351..2b3e86a 100644 --- a/YoggieEngine/src/Graphics/Primitives/Camera.cpp +++ b/YoggieEngine/src/Graphics/Primitives/Camera.cpp @@ -1,6 +1,7 @@ #include #include "Camera.h" namespace YoggieEngine { + Camera::Camera(glm::vec3 position, glm::vec3 rotation, float zoom) : Position(position), Rotation(rotation), Zoom(zoom) { @@ -8,17 +9,28 @@ namespace YoggieEngine { Right = glm::vec3(0.0f, 0.0f, 1.0f); Up = glm::vec3(0.0f, 1.0f, 0.0f); + + auto rotated_position = glm::rotate(glm::mat4(1.0f), Rotation.x, glm::vec3(1.0f, 0.0f, 0.0f)) * glm::vec4(Position, 1.0f); + ViewMatrix = glm::lookAt( + Position, + glm::vec3{ rotated_position.x, rotated_position.y , rotated_position.z } + Front, + Up); + + ProjectionMatrix = glm::perspective(glm::radians(Zoom), (800.0f / 600.0f), 0.001f, 100.0f); + } Camera::~Camera() { } - glm::mat4 Camera::GetViewMatrix() { - return glm::lookAt( + + + void Camera::Update() { + ViewMatrix = glm::lookAt( Position, - Position + Front, - Up - ); + Position + Front, + Up); } + } diff --git a/YoggieEngine/src/Graphics/Primitives/Camera.h b/YoggieEngine/src/Graphics/Primitives/Camera.h index f663be2..bf8ae9f 100644 --- a/YoggieEngine/src/Graphics/Primitives/Camera.h +++ b/YoggieEngine/src/Graphics/Primitives/Camera.h @@ -2,20 +2,24 @@ namespace YoggieEngine { class Camera { public: + Camera(glm::vec3 position, glm::vec3 rotation, float zoom); + ~Camera(); + + void Update(); + glm::vec3 Position; glm::vec3 Rotation; float Zoom; - Camera(glm::vec3 position, glm::vec3 rotation, float zoom); - ~Camera(); - - glm::mat4 GetViewMatrix(); + glm::mat4 ViewMatrix; + glm::mat4 ProjectionMatrix; private: glm::vec3 Front; glm::vec3 Right; glm::vec3 Up; + }; } diff --git a/YoggieEngine/src/Graphics/Primitives/Shader.cpp b/YoggieEngine/src/Graphics/Primitives/Shader.cpp index 7fb7505..5871578 100644 --- a/YoggieEngine/src/Graphics/Primitives/Shader.cpp +++ b/YoggieEngine/src/Graphics/Primitives/Shader.cpp @@ -101,29 +101,29 @@ namespace YoggieEngine { } - void Shader::setUniformMat4(std::string uniformName, glm::mat4 matrix4) const + void Shader::setUniformMat4(std::string uniformName, const glm::mat4& matrix4) const { glUniformMatrix4fv(glGetUniformLocation(id, uniformName.c_str()), 1, GL_FALSE, glm::value_ptr(matrix4)); } - void Shader::setUniformVec4(std::string uniformName, glm::vec4 vector4) const + void Shader::setUniformVec4(std::string uniformName, const glm::vec4& vector4) const { glUniform4fv(glGetUniformLocation(id, uniformName.c_str()), 1, glm::value_ptr(vector4)); } - void Shader::setUniformVec3(std::string uniformName, glm::vec3 vector3) const + void Shader::setUniformVec3(std::string uniformName, const glm::vec3& vector3) const { glUniform3fv(glGetUniformLocation(id, uniformName.c_str()), 1, glm::value_ptr(vector3)); } - void Shader::setUniformVec2(std::string uniformName, glm::vec2 vector2) const + void Shader::setUniformVec2(std::string uniformName,const glm::vec2& vector2) const { glUniform2fv(glGetUniformLocation(id, uniformName.c_str()), 1, glm::value_ptr(vector2)); } - void Shader::setUniformFloat(std::string uniformName, float value) const + void Shader::setUniformFloat(std::string uniformName, const float& value) const { glUniform1f(glGetUniformLocation(id, uniformName.c_str()), value); } - void Shader::setUniformInt(std::string uniformName, int value) const + void Shader::setUniformInt(std::string uniformName, const int& value) const { glUniform1i(glGetUniformLocation(id, uniformName.c_str()), value); } diff --git a/YoggieEngine/src/Graphics/Primitives/Shader.h b/YoggieEngine/src/Graphics/Primitives/Shader.h index c7a0f82..990a5ff 100644 --- a/YoggieEngine/src/Graphics/Primitives/Shader.h +++ b/YoggieEngine/src/Graphics/Primitives/Shader.h @@ -8,12 +8,12 @@ namespace YoggieEngine { public: Shader(const std::string vertexShaderPath, const std::string fragmentShaderPath); void Use() const; - void setUniformMat4(std::string uniformName, glm::mat4 matrix4)const; - void setUniformVec4(std::string uniformName, glm::vec4 vector4)const; - void setUniformVec3(std::string uniformName, glm::vec3 vector3)const; - void setUniformVec2(std::string uniformName, glm::vec2 vector2)const; - void setUniformFloat(std::string uniformName, float value)const; - void setUniformInt(std::string uniformName, int value) const; + void setUniformMat4(std::string uniformName, const glm::mat4& matrix4)const; + void setUniformVec4(std::string uniformName, const glm::vec4& vector4)const; + void setUniformVec3(std::string uniformName, const glm::vec3& vector3)const; + void setUniformVec2(std::string uniformName, const glm::vec2& vector2)const; + void setUniformFloat(std::string uniformName, const float& value)const; + void setUniformInt(std::string uniformName, const int& value) const; int id; diff --git a/YoggieEngine/src/Graphics/Renderer.cpp b/YoggieEngine/src/Graphics/Renderer.cpp index 496a619..69cc3b8 100644 --- a/YoggieEngine/src/Graphics/Renderer.cpp +++ b/YoggieEngine/src/Graphics/Renderer.cpp @@ -7,9 +7,7 @@ #include "../Graphics/Primitives/DrawCommand.h" namespace YoggieEngine { -float Angle = 0.0; -Camera cam = Camera(glm::vec3(12.0f, 0.0f, 0.0f), glm::vec3(0.0f, 0.0f, 0.0f), 90.0f); -glm::mat4 projection = glm::perspective(glm::radians(cam.Zoom), (800.0f / 600.0f), 0.001f, 100.0f); +Camera cam = Camera(glm::vec3(12.0f, 0.0f, 0.0f), glm::vec3(45.0f, 0.0f, 0.0f), 90.0f); Renderer::Renderer(RendererConfig& config) : m_framebuffer(Framebuffer(config.ScreenWidth, config.ScreenHeight)) @@ -20,6 +18,10 @@ Renderer::Renderer(RendererConfig& config) Renderer::~Renderer(){} +Camera& Renderer::getCamera() { + return cam; +} + void Renderer::Submit( Render3DComponent& renderComponent, TransformComponent& transform) { if (renderComponent.VAO == 0 || renderComponent.IBO == 0) @@ -63,7 +65,7 @@ void Renderer::Submit( Render3DComponent& renderComponent, TransformComponent& t } -void Renderer::Render() +void Renderer::Render() { glBindFramebuffer(GL_FRAMEBUFFER, m_framebuffer.GetId()); @@ -89,10 +91,10 @@ void Renderer::Render() glm::mat4 modelMatrix = glm::translate(glm::mat4(1.0f), command.transform.Position) * glm::scale(glm::mat4(1.0f), command.transform.Scale) * rotation; - command.shader.setUniformVec3("Color", glm::vec3(1.0f, 0.0f, 0.0f)); + command.shader.setUniformVec3("Color", glm::vec3(0.3f, 0.3f, 0.3f)); command.shader.setUniformMat4("M", modelMatrix); - command.shader.setUniformMat4("V", cam.GetViewMatrix()); - command.shader.setUniformMat4("P", projection); + command.shader.setUniformMat4("V", cam.ViewMatrix); + command.shader.setUniformMat4("P", cam.ProjectionMatrix); glDrawElements(GL_TRIANGLES, static_cast(command.num_elements), GL_UNSIGNED_INT, NULL); diff --git a/YoggieEngine/src/Graphics/Renderer.h b/YoggieEngine/src/Graphics/Renderer.h index 93cd63a..7a53d64 100644 --- a/YoggieEngine/src/Graphics/Renderer.h +++ b/YoggieEngine/src/Graphics/Renderer.h @@ -24,11 +24,13 @@ namespace YoggieEngine { void Submit(Render3DComponent& renderComponent, TransformComponent& transform); // Collects DrawCommands - void Render(); // Draw to screen (usingthe drawCalls + void Render(); // Draw to screen (using drawCall structs) void setCurrentFrameBuffer(const Framebuffer& fb); void setClearColor(const glm::vec3& ClearColor); + Camera& getCamera(); + private: Framebuffer m_framebuffer; glm::vec3 m_clearColor;