From 98184d358fc5dc77223b6d36a8f6719c059642fa Mon Sep 17 00:00:00 2001 From: Light Date: Fri, 30 Jul 2021 12:49:48 +0430 Subject: [PATCH] DrawQuad Transform - DraqQuadImpl functions now call a non-static DrawQuadFinal function with a mat4 transform matrix --- Engine/res/Shaders/Quad/Quad_VS.glsl | 4 +- Engine/res/Shaders/Quad/Quad_VS.hlsl | 4 +- Engine/res/Shaders/Texture/Texture_VS.glsl | 4 +- Engine/res/Shaders/Texture/Texture_VS.hlsl | 4 +- Engine/src/Engine/Graphics/Renderer.cpp | 53 +++++++++++-------- Engine/src/Engine/Graphics/Renderer.h | 3 ++ .../RendererPrograms/QuadRendererProgram.cpp | 2 +- .../RendererPrograms/QuadRendererProgram.h | 2 +- .../TextureRendererProgram.cpp | 2 +- .../RendererPrograms/TextureRendererProgram.h | 2 +- 10 files changed, 45 insertions(+), 35 deletions(-) diff --git a/Engine/res/Shaders/Quad/Quad_VS.glsl b/Engine/res/Shaders/Quad/Quad_VS.glsl index 86915bd..1c5d0f9 100644 --- a/Engine/res/Shaders/Quad/Quad_VS.glsl +++ b/Engine/res/Shaders/Quad/Quad_VS.glsl @@ -1,6 +1,6 @@ #version 440 core -layout(location = 0) in vec3 a_Position; +layout(location = 0) in vec4 a_Position; layout(location = 1) in vec4 a_Color; layout(std140, binding = 0) uniform ub_ViewProjection @@ -12,6 +12,6 @@ out vec4 vso_FragmentColor; void main() { - gl_Position = viewProjection * vec4(a_Position, 1.0); + gl_Position = viewProjection * a_Position; vso_FragmentColor = a_Color; } \ No newline at end of file diff --git a/Engine/res/Shaders/Quad/Quad_VS.hlsl b/Engine/res/Shaders/Quad/Quad_VS.hlsl index 6698c5c..f4d34b3 100644 --- a/Engine/res/Shaders/Quad/Quad_VS.hlsl +++ b/Engine/res/Shaders/Quad/Quad_VS.hlsl @@ -9,10 +9,10 @@ cbuffer cv_ViewProjection : register(b0) row_major matrix viewProjection; } -VertexOut main(float3 InPosition : POSITION, float4 InColor : COLOR) +VertexOut main(float4 InPosition : POSITION, float4 InColor : COLOR) { VertexOut vso; - vso.Position = mul(float4(InPosition.x, InPosition.y, InPosition.z, 1.0), viewProjection); + vso.Position = mul(InPosition, viewProjection); vso.Color = InColor; return vso; diff --git a/Engine/res/Shaders/Texture/Texture_VS.glsl b/Engine/res/Shaders/Texture/Texture_VS.glsl index b6b0800..d2e1752 100644 --- a/Engine/res/Shaders/Texture/Texture_VS.glsl +++ b/Engine/res/Shaders/Texture/Texture_VS.glsl @@ -1,6 +1,6 @@ #version 440 core -layout(location = 0) in vec3 a_Position; +layout(location = 0) in vec4 a_Position; layout(location = 1) in vec2 a_TexCoord; layout(std140, binding = 0) uniform ub_ViewProjection @@ -12,6 +12,6 @@ out vec2 vso_TexCoord; void main() { - gl_Position = u_ViewProjection * vec4(a_Position, 1.0); + gl_Position = u_ViewProjection * a_Position; vso_TexCoord = a_TexCoord; } \ No newline at end of file diff --git a/Engine/res/Shaders/Texture/Texture_VS.hlsl b/Engine/res/Shaders/Texture/Texture_VS.hlsl index b572bfc..8fb02e1 100644 --- a/Engine/res/Shaders/Texture/Texture_VS.hlsl +++ b/Engine/res/Shaders/Texture/Texture_VS.hlsl @@ -9,10 +9,10 @@ cbuffer cb_ViewProjection : register(b0) row_major matrix viewProjection; } -VertexOut main(float3 InPosition : POSITION, float2 InTexChoord : TEXCOORD) +VertexOut main(float4 InPosition : POSITION, float2 InTexChoord : TEXCOORD) { VertexOut vso; - vso.Position = mul(float4(InPosition, 1.0), viewProjection); + vso.Position = mul(float4(InPosition), viewProjection); vso.TexChoord = InTexChoord; return vso; diff --git a/Engine/src/Engine/Graphics/Renderer.cpp b/Engine/src/Engine/Graphics/Renderer.cpp index 241c38d..99d571d 100644 --- a/Engine/src/Engine/Graphics/Renderer.cpp +++ b/Engine/src/Engine/Graphics/Renderer.cpp @@ -47,31 +47,42 @@ namespace Light { m_RenderCommand->SetViewport(0u, 0u, event.GetSize().x, event.GetSize().y); } - //======================================== DRAW_QUAD_TINT ========================================// + //======================================== DRAW_QUAD ========================================// + /* tint */ void Renderer::DrawQuadImpl(const glm::vec3& position, const glm::vec2& size, const glm::vec4& tint) + { + DrawQuadFinal(glm::translate(glm::mat4(1.0f), position) * glm::scale(glm::mat4(1.0f), { size.x, size.y, 1.0f }), + tint); + } + + /* texture */ + void Renderer::DrawQuadImpl(const glm::vec3& position, const glm::vec2& size, Ref texture) + { + DrawQuadFinal(glm::translate(glm::mat4(1.0f), position) * glm::scale(glm::mat4(1.0f), { size.x, size.y, 1.0f }), + texture); + } + //======================================== DRAW_QUAD ========================================// + + //==================== DRAW_QUAD_TINT ====================// + void Renderer::DrawQuadFinal(const glm::mat4& transform, const glm::vec4& tint) { // locals QuadRendererProgram::QuadVertexData* bufferMap = m_QuadRenderer.GetMapCurrent(); - const float xMin = position.x; - const float yMin = position.y; - const float xMax = position.x + size.x; - const float yMax = position.y + size.y; - // top left - bufferMap[0].position = { xMin, yMin, position.z }; + bufferMap[0].position = transform * glm::vec4(-0.5f, -0.5f, 0.0f, 1.0f); bufferMap[0].tint = tint; // top right - bufferMap[1].position = { xMax, yMin, position.z }; + bufferMap[1].position = transform * glm::vec4( 0.5f, -0.5f, 0.0f, 1.0f); bufferMap[1].tint = tint; // bottom right - bufferMap[2].position = { xMax, yMax, position.z }; + bufferMap[2].position = transform * glm::vec4( 0.5f, 0.5f, 0.0f, 1.0f); bufferMap[2].tint = tint; // bottom left - bufferMap[3].position = { xMin, yMax, position.z }; + bufferMap[3].position = transform * glm::vec4(-0.5f, 0.5f, 0.0f, 1.0f); bufferMap[3].tint = tint; // advance @@ -81,10 +92,10 @@ namespace Light { FlushScene(); } } - //======================================== DRAW_QUAD_TINT ========================================// + //==================== DRAW_QUAD_TINT ====================// - //============================== DRAW_QUAD_TEXTURE ==============================// - void Renderer::DrawQuadImpl(const glm::vec3& position, const glm::vec2& size, Ref texture) + //==================== DRAW_QUAD_TEXTURE ====================// + void Renderer::DrawQuadFinal(const glm::mat4& transform, Ref texture) { // #todo: implement a proper binding texture->Bind(); @@ -92,25 +103,20 @@ namespace Light { // locals TextureRendererProgram::TextureVertexData* bufferMap = m_TextureRenderer.GetMapCurrent(); - const float xMin = position.x; - const float yMin = position.y; - const float xMax = position.x + size.x; - const float yMax = position.y + size.y; - // top left - bufferMap[0].position = { xMin, yMin, position.z }; + bufferMap[0].position = transform * glm::vec4(-0.5f, -0.5f, 0.0f, 1.0f); bufferMap[0].texcoord = { 0.0f, 0.0f }; // top right - bufferMap[1].position = { xMax, yMin, position.z }; + bufferMap[1].position = transform * glm::vec4( 0.5f, -0.5f, 0.0f, 1.0f); bufferMap[1].texcoord = { 1.0f, 0.0f }; // bottom right - bufferMap[2].position = { xMax, yMax, position.z }; + bufferMap[2].position = transform * glm::vec4( 0.5f, 0.5f, 0.0f, 1.0f); bufferMap[2].texcoord = { 1.0f, 1.0f }; // bottom left - bufferMap[3].position = { xMin, yMax, position.z }; + bufferMap[3].position = transform * glm::vec4(-0.5f, 0.5f, 0.0f, 1.0f); bufferMap[3].texcoord = { 0.0f, 1.0f }; // advance @@ -120,7 +126,8 @@ namespace Light { FlushScene(); } } - //============================== DRAW_QUAD_TEXTURE ==============================// + + //==================== DRAW_QUAD_TEXTURE ====================// void Renderer::BeginFrame() { diff --git a/Engine/src/Engine/Graphics/Renderer.h b/Engine/src/Engine/Graphics/Renderer.h index ecce65b..d9aa062 100644 --- a/Engine/src/Engine/Graphics/Renderer.h +++ b/Engine/src/Engine/Graphics/Renderer.h @@ -62,6 +62,9 @@ namespace Light { void DrawQuadImpl(const glm::vec3& position, const glm::vec2& size, const glm::vec4& tint); void DrawQuadImpl(const glm::vec3& position, const glm::vec2& size, Ref texture); + void DrawQuadFinal(const glm::mat4& transform, const glm::vec4& tint); + void DrawQuadFinal(const glm::mat4& transform, Ref texture); + void BeginSceneImpl(const Ref& camera, const Ref& targetFrameBuffer = nullptr); void FlushScene(); void EndSceneImpl(); diff --git a/Engine/src/Engine/Graphics/RendererPrograms/QuadRendererProgram.cpp b/Engine/src/Engine/Graphics/RendererPrograms/QuadRendererProgram.cpp index 86bc7ad..1fb918d 100644 --- a/Engine/src/Engine/Graphics/RendererPrograms/QuadRendererProgram.cpp +++ b/Engine/src/Engine/Graphics/RendererPrograms/QuadRendererProgram.cpp @@ -26,7 +26,7 @@ namespace Light { m_Shader = ResourceManager::GetShader("LT_ENGINE_RESOURCES_QUAD_SHADER"); m_VertexBuffer = Ref(VertexBuffer::Create(nullptr, sizeof(QuadVertexData), maxVertices, sharedContext)); m_IndexBuffer = Ref(IndexBuffer::Create(nullptr, (maxVertices / 4) * 6, sharedContext)); - m_VertexLayout = Ref(VertexLayout::Create(m_VertexBuffer, m_Shader, { { "POSITION", VertexElementType::Float3 }, + m_VertexLayout = Ref(VertexLayout::Create(m_VertexBuffer, m_Shader, { { "POSITION", VertexElementType::Float4 }, { "COLOR" , VertexElementType::Float4 }}, sharedContext)); } diff --git a/Engine/src/Engine/Graphics/RendererPrograms/QuadRendererProgram.h b/Engine/src/Engine/Graphics/RendererPrograms/QuadRendererProgram.h index 41defeb..8ebe4de 100644 --- a/Engine/src/Engine/Graphics/RendererPrograms/QuadRendererProgram.h +++ b/Engine/src/Engine/Graphics/RendererPrograms/QuadRendererProgram.h @@ -22,7 +22,7 @@ namespace Light { public: struct QuadVertexData { - glm::vec3 position; + glm::vec4 position; glm::vec4 tint; }; diff --git a/Engine/src/Engine/Graphics/RendererPrograms/TextureRendererProgram.cpp b/Engine/src/Engine/Graphics/RendererPrograms/TextureRendererProgram.cpp index 04d8dad..024e932 100644 --- a/Engine/src/Engine/Graphics/RendererPrograms/TextureRendererProgram.cpp +++ b/Engine/src/Engine/Graphics/RendererPrograms/TextureRendererProgram.cpp @@ -26,7 +26,7 @@ namespace Light { m_Shader = ResourceManager::GetShader("LT_ENGINE_RESOURCES_TEXTURE_SHADER"); m_VertexBuffer = Ref(VertexBuffer::Create(nullptr, sizeof(TextureVertexData), maxVertices, sharedContext)); m_IndexBuffer = Ref(IndexBuffer::Create(nullptr, (maxVertices / 4) * 6, sharedContext)); - m_VertexLayout = Ref(VertexLayout::Create(m_VertexBuffer, m_Shader, { { "POSITION", VertexElementType::Float3 }, + m_VertexLayout = Ref(VertexLayout::Create(m_VertexBuffer, m_Shader, { { "POSITION", VertexElementType::Float4 }, { "TEXCOORD", VertexElementType::Float2 }}, sharedContext)); } diff --git a/Engine/src/Engine/Graphics/RendererPrograms/TextureRendererProgram.h b/Engine/src/Engine/Graphics/RendererPrograms/TextureRendererProgram.h index 7f7e084..2f21bff 100644 --- a/Engine/src/Engine/Graphics/RendererPrograms/TextureRendererProgram.h +++ b/Engine/src/Engine/Graphics/RendererPrograms/TextureRendererProgram.h @@ -22,7 +22,7 @@ namespace Light { public: struct TextureVertexData { - glm::vec3 position; + glm::vec4 position; glm::vec2 texcoord; };