#pragma once #include "Poseable2D.h" #include "TextureRenderable.h" #include "Poseable2DBatch.h" namespace charcoal { namespace builtin { template class SpriteBatch : public Poseable2DBatch > { // Note: This is VERY similar to builtin::textured::Batch // TODO: Use Poseable2D for each sprite's position // TODO: Have a texture // Note: Uses GL_TEXTURE0. The uniform for this texture should be set in the scene before rendering. SpriteBatch( TextureRenderable* renderable, int element_count ) : Poseable2DBatch >(renderable, element_count) {} SpriteBatch( TextureRenderable* renderable, int element_count, int element_render_count ) : Poseable2DBatch >(renderable, element_count, element_render_count) {} void preprender() const override { // Note: Uses GL_TEXTURE0. The uniform for this texture should be set in the scene. glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, charcoal::Batch >::m_p_renderable->get_texture()->get_texture()); glBindSampler(0, charcoal::Batch >::m_p_renderable->get_sampler()->get_sampler()); } protected: void setup_vao() override { glBindBuffer(GL_ARRAY_BUFFER, charcoal::Batch >::m_vertex_vbo); glEnableVertexAttribArray(0); glEnableVertexAttribArray(1); // TODO: Figure out how to do this without offsetof :( glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(VertexType), (void*)offsetof(VertexType, position)); glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(VertexType), (void*)offsetof(VertexType, uv)); glBindBuffer(GL_ARRAY_BUFFER, charcoal::Batch >::m_element_buffers[0]); glEnableVertexAttribArray(2); glEnableVertexAttribArray(3); glEnableVertexAttribArray(4); glEnableVertexAttribArray(5); glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, sizeof(Poseable2D), (void*)(0 * sizeof(vec4))); glVertexAttribPointer(3, 4, GL_FLOAT, GL_FALSE, sizeof(Poseable2D), (void*)(1 * sizeof(vec4))); glVertexAttribPointer(4, 4, GL_FLOAT, GL_FALSE, sizeof(Poseable2D), (void*)(2 * sizeof(vec4))); glVertexAttribPointer(5, 4, GL_FLOAT, GL_FALSE, sizeof(Poseable2D), (void*)(3 * sizeof(vec4))); glVertexAttribDivisor(0, 0); // Send the mesh data once glVertexAttribDivisor(1, 0); // Send the mesh data once glVertexAttribDivisor(2, 1); // Send the offset data for each instance drawn glVertexAttribDivisor(3, 1); // Send the offset data for each instance drawn glVertexAttribDivisor(4, 1); // Send the offset data for each instance drawn glVertexAttribDivisor(5, 1); // Send the offset data for each instance drawn } }; } }