bb4592ed63
Changing the mechanic of the renderer to support pipelines. One scene could have multiple pipelines. The pipelines allow for one shader, one camera, and multiple batches.
78 lines
3.4 KiB
C++
78 lines
3.4 KiB
C++
#pragma once
|
|
|
|
#include <charcoal/Batch.h>
|
|
#include <charcoal/Renderable.h>
|
|
#include <charcoal/Poseable.h>
|
|
#include "BuiltinBatch.h"
|
|
|
|
namespace charcoal
|
|
{
|
|
namespace builtin
|
|
{
|
|
// Note: If anything is changed in this file, it must also be changed in Poseable2DBatch
|
|
template <typename VertexType, typename IndexType, int orientation_attrib_offset, typename RenderableT = RenderableT<VertexType, IndexType> >
|
|
class PoseableBatch : public builtin::Batch<VertexType, IndexType, 1, RenderableT>
|
|
{
|
|
public:
|
|
PoseableBatch(
|
|
RenderableT* renderable,
|
|
int element_count
|
|
) : PoseableBatch(renderable, element_count, element_count)
|
|
{}
|
|
|
|
PoseableBatch(
|
|
RenderableT* renderable,
|
|
int element_count,
|
|
int element_render_count
|
|
) : builtin::Batch<VertexType, IndexType, 1, RenderableT>(renderable, element_render_count), m_orientation_elements(element_count)
|
|
{}
|
|
|
|
virtual ~PoseableBatch() {}
|
|
|
|
void reset_rendered() { charcoal::Batch<VertexType, IndexType, 1, RenderableT>::m_element_render_count = 0; }
|
|
|
|
void add_rendered(const Poseable& poseable) { m_orientation_elements[charcoal::Batch<VertexType, IndexType, 1, RenderableT>::m_element_render_count++] = poseable.get_orientation_matrix(); }
|
|
|
|
protected:
|
|
void setup_element_buffers()
|
|
{
|
|
glBindBuffer(GL_ARRAY_BUFFER, charcoal::Batch<VertexType, IndexType, 1, RenderableT>::m_element_buffers[0]);
|
|
glBufferData(GL_ARRAY_BUFFER, m_orientation_elements.size() * sizeof(mat4), 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_orientation_elements.size() * sizeof(mat4), NULL, GL_STREAM_DRAW);
|
|
glBufferSubData(GL_ARRAY_BUFFER, 0, m_orientation_elements.size() * sizeof(mat4), m_orientation_elements.data());
|
|
}
|
|
|
|
virtual void setup_vao_vertex() = 0;
|
|
|
|
void setup_vao() override
|
|
{
|
|
setup_vao_vertex();
|
|
|
|
glBindBuffer(GL_ARRAY_BUFFER, charcoal::Batch<VertexType, IndexType, 1, RenderableT>::m_element_buffers[0]);
|
|
|
|
glEnableVertexAttribArray(orientation_attrib_offset + 0);
|
|
glEnableVertexAttribArray(orientation_attrib_offset + 1);
|
|
glEnableVertexAttribArray(orientation_attrib_offset + 2);
|
|
glEnableVertexAttribArray(orientation_attrib_offset + 3);
|
|
|
|
glVertexAttribPointer(orientation_attrib_offset + 0, 4, GL_FLOAT, GL_FALSE, sizeof(mat4), (void*)(0 * sizeof(mat4::col_type)));
|
|
glVertexAttribPointer(orientation_attrib_offset + 1, 4, GL_FLOAT, GL_FALSE, sizeof(mat4), (void*)(1 * sizeof(mat4::col_type)));
|
|
glVertexAttribPointer(orientation_attrib_offset + 2, 4, GL_FLOAT, GL_FALSE, sizeof(mat4), (void*)(2 * sizeof(mat4::col_type)));
|
|
glVertexAttribPointer(orientation_attrib_offset + 3, 4, GL_FLOAT, GL_FALSE, sizeof(mat4), (void*)(3 * sizeof(mat4::col_type)));
|
|
|
|
glVertexAttribDivisor(orientation_attrib_offset + 0, 1); // Send the orientation data for each instance drawn
|
|
glVertexAttribDivisor(orientation_attrib_offset + 1, 1); // Send the orientation data for each instance drawn
|
|
glVertexAttribDivisor(orientation_attrib_offset + 2, 1); // Send the orientation data for each instance drawn
|
|
glVertexAttribDivisor(orientation_attrib_offset + 3, 1); // Send the orientation data for each instance drawn
|
|
}
|
|
|
|
std::vector<mat4> m_orientation_elements;
|
|
};
|
|
}
|
|
} |