49f7a3e2d7
The problem was caused by vector re-allocation. This is a similar problem to what happened with the mesh factory. It was solved by converting the texture factory to use lists instead of vectors. The reason for using lists is to prevent the need for explicit deallocation of resources and instead allow the use of a list to automatically allocate/deallocate the textures/samplers/meshes.
68 lines
3.1 KiB
C++
68 lines
3.1 KiB
C++
#pragma once
|
|
|
|
#include "Poseable2D.h"
|
|
#include "TextureRenderable.h"
|
|
#include "Poseable2DBatch.h"
|
|
|
|
namespace charcoal
|
|
{
|
|
namespace builtin
|
|
{
|
|
template <typename VertexType, typename IndexType, int position_offset, int uv_offset>
|
|
class SpriteBatch : public Poseable2DBatch<VertexType, IndexType, TextureRenderable<VertexType, IndexType> >
|
|
{
|
|
public:
|
|
// 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<VertexType, IndexType>* renderable,
|
|
int element_count
|
|
) : Poseable2DBatch<VertexType, IndexType, TextureRenderable<VertexType, IndexType> >(renderable, element_count)
|
|
{}
|
|
|
|
SpriteBatch(
|
|
TextureRenderable<VertexType, IndexType>* renderable,
|
|
int element_count,
|
|
int element_render_count
|
|
) : Poseable2DBatch<VertexType, IndexType, TextureRenderable<VertexType, IndexType> >(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<VertexType, IndexType, 1, TextureRenderable<VertexType, IndexType> >::m_p_renderable->get_texture()->get_texture());
|
|
glBindSampler(0, charcoal::Batch<VertexType, IndexType, 1, TextureRenderable<VertexType, IndexType> >::m_p_renderable->get_sampler()->get_sampler());
|
|
}
|
|
|
|
protected:
|
|
void setup_vao() override
|
|
{
|
|
glBindBuffer(GL_ARRAY_BUFFER, charcoal::Batch<VertexType, IndexType, 1, TextureRenderable<VertexType, IndexType> >::m_vertex_vbo);
|
|
glEnableVertexAttribArray(0);
|
|
glEnableVertexAttribArray(1);
|
|
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(VertexType), (void*)position_offset);
|
|
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(VertexType), (void*)uv_offset);
|
|
glBindBuffer(GL_ARRAY_BUFFER, charcoal::Batch<VertexType, IndexType, 1, TextureRenderable<VertexType, IndexType> >::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
|
|
}
|
|
};
|
|
}
|
|
}
|