#include #include #include #include #include #include namespace Light { TextureRendererProgram::TextureRendererProgram( unsigned int maxVertices, Ref 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) { // #todo: don't use relative path ResourceManager::load_shader( "LT_ENGINE_RESOURCES_TEXTURE_SHADER", "Assets/Shaders/Texture/Texture_VS.glsl", "Assets/Shaders/Texture/Texture_PS.glsl" ); m_shader = ResourceManager::get_shader("LT_ENGINE_RESOURCES_TEXTURE_SHADER"); m_vertex_buffer = Ref( VertexBuffer::create(nullptr, sizeof(TextureVertexData), maxVertices, sharedContext) ); m_index_buffer = Ref( IndexBuffer::create(nullptr, (maxVertices / 4) * 6, sharedContext) ); m_vertex_layout = Ref(VertexLayout::create( m_vertex_buffer, m_shader, { { "POSITION", VertexElementType::Float4 }, { "TEXCOORD", VertexElementType::Float2 } }, sharedContext )); } bool TextureRendererProgram::advance() { if (m_map_current + 4 >= m_map_end) { lt_log(warn, "'VertexBuffer' map went beyond 'MaxVertices': {}", m_max_vertices); return false; } m_map_current += 4; m_quad_count++; return true; } void TextureRendererProgram::map() { m_quad_count = 0u; m_map_current = (TextureRendererProgram::TextureVertexData *)m_vertex_buffer->map(); m_map_end = m_map_current + m_max_vertices; } void TextureRendererProgram::un_map() { m_vertex_buffer->un_map(); } void TextureRendererProgram::bind() { m_shader->bind(); m_vertex_layout->bind(); m_vertex_buffer->bind(); m_index_buffer->bind(); } } // namespace Light