charcoal/OpenGLEngine/Poseable2DBatch.h
elipzer b7456401e0 Almost able to render the image
Added image scene to render an image in a scene. There is also now
a testing image that is an uber meme. Currently the problem is
that the spritebatch cannot use the offsetof macro because it is a
templated class. Possible solutions to this are changing it to be
specifyable or implemented per vertex type as the other batches
have been.
2018-10-09 11:42:17 -04:00

54 lines
1.8 KiB
C++

#pragma once
#include "Batch.h"
#include "BuiltinBatch.h"
#include "Renderable.h"
#include "Poseable2D.h"
namespace charcoal
{
namespace builtin
{
// This has to be made completely seperately in order to avoid the vtable that gets added if Poseable is abstracted between
// 2D and 3D
template <typename VertexType, typename IndexType, typename RenderableT = RenderableT<VertexType, IndexType> >
class Poseable2DBatch : public builtin::Batch<VertexType, IndexType, 1, RenderableT>
{
public:
Poseable2DBatch(
RenderableT* renderable,
int element_count
) : Poseable2DBatch(renderable, element_count, element_count)
{}
Poseable2DBatch(
RenderableT* renderable,
int element_count,
int element_render_count
) : builtin::Batch<VertexType, IndexType, 1, RenderableT>(renderable, element_render_count), m_pose_elements(element_count)
{}
virtual ~Poseable2DBatch() {}
Poseable2D& get_pose(int index) { return m_pose_elements[index]; }
const Poseable2D& get_pose(int index) const { return m_pose_elements[index]; }
protected:
void setup_element_buffers()
{
glBindBuffer(GL_ARRAY_BUFFER, charcoal::Batch<VertexType, IndexType, 1, RenderableT>::m_element_buffers[0]);
glBufferData(GL_ARRAY_BUFFER, m_pose_elements.size() * sizeof(Poseable), NULL, GL_STREAM_DRAW);
}
void update_element_buffers()
{
// TODO: There are probably better ways to do this. Should check with the old engine to see what I did there.
glBindBuffer(GL_ARRAY_BUFFER, charcoal::Batch<VertexType, IndexType, 1, RenderableT>::m_element_buffers[0]);
glBufferData(GL_ARRAY_BUFFER, m_pose_elements.size() * sizeof(Poseable), NULL, GL_STREAM_DRAW);
glBufferSubData(GL_ARRAY_BUFFER, 0, m_pose_elements.size() * sizeof(Poseable), m_pose_elements.data());
}
std::vector<Poseable2D> m_pose_elements;
};
}
}