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

82 lines
2.1 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/tinted_texture.hpp>
#include <engine/graphics/shader.hpp>
#include <engine/graphics/vertex_layout.hpp>
#include <engine/utils/resource_manager.hpp>
namespace Light {
TintedTextureRendererProgram::TintedTextureRendererProgram(
unsigned int maxVertices,
Ref<SharedContext> sharedContext
)
: m_shader(nullptr)
, m_index_buffer(nullptr)
, m_vertex_layout(nullptr)
, m_map_current(nullptr)
, m_map_end(nullptr)
, m_quad_count(0u)
, m_max_vertices(maxVertices)
2025-07-05 13:28:41 +03:30
{
// #todo: don't use relative path
ResourceManager::load_shader(
2025-07-05 13:28:41 +03:30
"LT_ENGINE_RESOURCES_TINTED_TEXTURE_SHADER",
2025-07-06 14:09:58 +03:30
"data/assets/shaders/tinted_texture/vs.glsl",
2025-07-06 14:03:04 +03:30
"data/assets/shaders/tinted_texture/ps.glsl"
2025-07-05 13:28:41 +03:30
);
m_shader = ResourceManager::get_shader("LT_ENGINE_RESOURCES_TINTED_TEXTURE_SHADER");
m_vertex_buffer = Ref<VertexBuffer>(
VertexBuffer::create(nullptr, sizeof(TintedTextureVertexData), maxVertices, sharedContext)
2025-07-05 13:28:41 +03:30
);
m_index_buffer = Ref<IndexBuffer>(
IndexBuffer::create(nullptr, (maxVertices / 4) * 6, sharedContext)
2025-07-05 13:28:41 +03:30
);
m_vertex_layout = Ref<VertexLayout>(VertexLayout::create(
m_vertex_buffer,
m_shader,
2025-07-05 13:28:41 +03:30
{ { "POSITION", VertexElementType::Float4 },
{ "TINT", VertexElementType::Float4 },
{ "TEXCOORD", VertexElementType::Float2 } },
sharedContext
));
}
2025-07-06 14:02:50 +03:30
auto TintedTextureRendererProgram::advance() -> bool
2025-07-05 13:28:41 +03:30
{
m_map_current += 4;
2025-07-05 13:28:41 +03:30
if (m_map_current >= m_map_end)
2025-07-05 13:28:41 +03:30
{
lt_log(warn, "'VertexBuffer' map went beyond 'MaxVertices': {}", m_max_vertices);
2025-07-05 13:28:41 +03:30
return false;
}
m_quad_count++;
2025-07-05 13:28:41 +03:30
return true;
}
void TintedTextureRendererProgram::map()
2025-07-05 13:28:41 +03:30
{
m_quad_count = 0u;
2025-07-05 13:28:41 +03:30
m_map_current = (TintedTextureRendererProgram::TintedTextureVertexData *)m_vertex_buffer->map();
m_map_end = m_map_current + m_max_vertices;
2025-07-05 13:28:41 +03:30
}
void TintedTextureRendererProgram::un_map()
2025-07-05 13:28:41 +03:30
{
m_vertex_buffer->un_map();
2025-07-05 13:28:41 +03:30
}
void TintedTextureRendererProgram::bind()
2025-07-05 13:28:41 +03:30
{
m_shader->bind();
m_vertex_layout->bind();
m_vertex_buffer->bind();
m_index_buffer->bind();
2025-07-05 13:28:41 +03:30
}
} // namespace Light