DrawQuad Transform
- DraqQuadImpl functions now call a non-static DrawQuadFinal function with a mat4 transform matrix
This commit is contained in:
parent
931a3a168c
commit
98184d358f
10 changed files with 45 additions and 35 deletions
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
|
|
|
@ -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> 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> texture)
|
||||
//==================== DRAW_QUAD_TEXTURE ====================//
|
||||
void Renderer::DrawQuadFinal(const glm::mat4& transform, Ref<Texture> 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()
|
||||
{
|
||||
|
|
|
@ -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> texture);
|
||||
|
||||
void DrawQuadFinal(const glm::mat4& transform, const glm::vec4& tint);
|
||||
void DrawQuadFinal(const glm::mat4& transform, Ref<Texture> texture);
|
||||
|
||||
void BeginSceneImpl(const Ref<Camera>& camera, const Ref<Framebuffer>& targetFrameBuffer = nullptr);
|
||||
void FlushScene();
|
||||
void EndSceneImpl();
|
||||
|
|
|
@ -26,7 +26,7 @@ namespace Light {
|
|||
m_Shader = ResourceManager::GetShader("LT_ENGINE_RESOURCES_QUAD_SHADER");
|
||||
m_VertexBuffer = Ref<VertexBuffer>(VertexBuffer::Create(nullptr, sizeof(QuadVertexData), maxVertices, sharedContext));
|
||||
m_IndexBuffer = Ref<IndexBuffer>(IndexBuffer::Create(nullptr, (maxVertices / 4) * 6, sharedContext));
|
||||
m_VertexLayout = Ref<VertexLayout>(VertexLayout::Create(m_VertexBuffer, m_Shader, { { "POSITION", VertexElementType::Float3 },
|
||||
m_VertexLayout = Ref<VertexLayout>(VertexLayout::Create(m_VertexBuffer, m_Shader, { { "POSITION", VertexElementType::Float4 },
|
||||
{ "COLOR" , VertexElementType::Float4 }}, sharedContext));
|
||||
}
|
||||
|
||||
|
|
|
@ -22,7 +22,7 @@ namespace Light {
|
|||
public:
|
||||
struct QuadVertexData
|
||||
{
|
||||
glm::vec3 position;
|
||||
glm::vec4 position;
|
||||
glm::vec4 tint;
|
||||
};
|
||||
|
||||
|
|
|
@ -26,7 +26,7 @@ namespace Light {
|
|||
m_Shader = ResourceManager::GetShader("LT_ENGINE_RESOURCES_TEXTURE_SHADER");
|
||||
m_VertexBuffer = Ref<VertexBuffer>(VertexBuffer::Create(nullptr, sizeof(TextureVertexData), maxVertices, sharedContext));
|
||||
m_IndexBuffer = Ref<IndexBuffer>(IndexBuffer::Create(nullptr, (maxVertices / 4) * 6, sharedContext));
|
||||
m_VertexLayout = Ref<VertexLayout>(VertexLayout::Create(m_VertexBuffer, m_Shader, { { "POSITION", VertexElementType::Float3 },
|
||||
m_VertexLayout = Ref<VertexLayout>(VertexLayout::Create(m_VertexBuffer, m_Shader, { { "POSITION", VertexElementType::Float4 },
|
||||
{ "TEXCOORD", VertexElementType::Float2 }}, sharedContext));
|
||||
}
|
||||
|
||||
|
|
|
@ -22,7 +22,7 @@ namespace Light {
|
|||
public:
|
||||
struct TextureVertexData
|
||||
{
|
||||
glm::vec3 position;
|
||||
glm::vec4 position;
|
||||
glm::vec2 texcoord;
|
||||
};
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue