2 * @file objectrenderer.cpp
3 * @brief Implements ObjectRenderer and derived classes
6 #include "objectrenderer.h"
12 * ObjectRenderer constructor
13 * Note the ShaderProgram constructor which compiles the shaders for GPU rendering (if they exist)
15 ObjectRenderer::ObjectRenderer(const ObjectType & type,
16 const char * vert_glsl_file, const char * frag_glsl_file, const char * geom_glsl_file)
17 : m_type(type), m_shader_program(), m_indexes(), m_buffer_builder(NULL)
19 m_shader_program.InitialiseShaders(vert_glsl_file, frag_glsl_file, geom_glsl_file);
20 m_shader_program.Use();
21 glUniform4f(m_shader_program.GetUniformLocation("colour"), 0,0,0,1); //TODO: Allow different colours
27 void ObjectRenderer::RenderUsingGPU()
29 if (!m_shader_program.Valid())
30 Warn("Shader is invalid (objects are of type %d)", m_type);
31 m_shader_program.Use();
33 glDrawElements(GL_LINES, m_indexes.size()*2, GL_UNSIGNED_INT, 0);
37 * Default implementation for rendering using CPU
39 void ObjectRenderer::RenderUsingCPU()
41 Error("Cannot render objects of type %d on CPU", m_type);
45 * Prepare index buffers for both CPU and GPU rendering to receive indexes (but don't add any yet!)
47 void ObjectRenderer::PrepareBuffers(unsigned max_objects)
49 if (m_buffer_builder != NULL) // We already have a BufferBuilder
51 Fatal("Has been called before, without FinaliseBuffers being called since!");
53 // Empty and reserve the indexes vector (for CPU rendering)
55 m_indexes.reserve(max_objects); //TODO: Can probably make this smaller? Or leave it out? Do we care?
57 // Initialise and resize the ibo (for GPU rendering)
58 m_ibo.SetUsage(GraphicsBuffer::BufferUsageStaticDraw);
59 m_ibo.SetType(GraphicsBuffer::BufferTypeIndex);
60 m_ibo.Resize(max_objects * 2 * sizeof(uint32_t));
61 // BufferBuilder is used to construct the ibo
62 m_buffer_builder = new BufferBuilder<uint32_t>(m_ibo.Map(false, true, true), m_ibo.GetSize()); // new matches delete in ObjectRenderer::FinaliseBuffers
67 * Add object index to the buffers for CPU and GPU rendering
69 void ObjectRenderer::AddObjectToBuffers(unsigned index)
71 if (m_buffer_builder == NULL) // No BufferBuilder!
73 Fatal("Called without calling PrepareBuffers");
75 m_buffer_builder->Add(2*index); // ibo for GPU rendering
76 m_buffer_builder->Add(2*index+1);
77 m_indexes.push_back(index); // std::vector of indices for CPU rendering
81 * Finalise the index buffers for CPU and GPU rendering
83 void ObjectRenderer::FinaliseBuffers()
85 if (m_buffer_builder == NULL) // No BufferBuilder!
87 Fatal("Called without calling PrepareBuffers");
89 // For GPU rendering, UnMap the ibo
91 // ... and delete the BufferBuilder used to create it
92 delete m_buffer_builder; // delete matches new in ObjectRenderer::PrepareBuffers
93 m_buffer_builder = NULL;
95 // Nothing is necessary for CPU rendering