light/modules/engine/src/graphics/renderer_programs/quad.cpp

77 lines
1.9 KiB
C++
Raw Normal View History

2025-07-05 13:28:41 +03:30
#include <engine/camera/camera.hpp>
#include <engine/graphics/buffers.hpp>
#include <engine/graphics/renderer_programs/quad.hpp>
#include <engine/graphics/shader.hpp>
#include <engine/graphics/vertex_layout.hpp>
#include <engine/utils/resource_manager.hpp>
namespace Light {
QuadRendererProgram::QuadRendererProgram(unsigned int maxVertices, Ref<SharedContext> sharedContext)
: m_Shader(nullptr)
, m_IndexBuffer(nullptr)
, m_VertexLayout(nullptr)
, m_MapCurrent(nullptr)
, m_MapEnd(nullptr)
, m_QuadCount(0u)
, m_MaxVertices(maxVertices)
{
// #todo: don't use relative path
ResourceManager::LoadShader(
"LT_ENGINE_RESOURCES_QUAD_SHADER",
"Assets/Shaders/Quad/Quad_VS.glsl",
"Assets/Shaders/Quad/Quad_PS.glsl"
);
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::Float4 }, { "COLOR", VertexElementType::Float4 } },
sharedContext
));
}
bool QuadRendererProgram::Advance()
{
m_MapCurrent += 4;
if (m_MapCurrent >= m_MapEnd)
{
LOG(warn, "'VertexBuffer' map went beyond 'MaxVertices': {}", m_MaxVertices);
return false;
}
m_QuadCount++;
return true;
}
void QuadRendererProgram::Map()
{
m_QuadCount = 0u;
m_MapCurrent = (QuadRendererProgram::QuadVertexData *)m_VertexBuffer->Map();
m_MapEnd = m_MapCurrent + m_MaxVertices;
}
void QuadRendererProgram::UnMap()
{
m_VertexBuffer->UnMap();
}
void QuadRendererProgram::Bind()
{
m_Shader->Bind();
m_VertexLayout->Bind();
m_VertexBuffer->Bind();
m_IndexBuffer->Bind();
}
} // namespace Light