#pragma once #include #include #include #include "BuiltinBatch.h" namespace charcoal { namespace builtin { // Note: If anything is changed in this file, it must also be changed in Poseable2DBatch template > class PoseableBatch : public builtin::Batch { 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(renderable, element_render_count), m_orientation_elements(element_count) {} virtual ~PoseableBatch() {} void reset_rendered() { charcoal::Batch::m_element_render_count = 0; } void add_rendered(const Poseable& poseable) { m_orientation_elements[charcoal::Batch::m_element_render_count++] = poseable.get_orientation_matrix(); } protected: void setup_element_buffers() { glBindBuffer(GL_ARRAY_BUFFER, charcoal::Batch::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::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::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 m_orientation_elements; }; } }