instance(object)
{ }
+MeshRenderer::~MeshRenderer()
+{
+ if(scene)
+ scene->remove(instance);
+}
+
+void MeshRenderer::set_scene(GL::Scene *s)
+{
+ if(scene)
+ scene->remove(instance);
+ scene = s;
+ if(scene)
+ scene->add(instance);
+}
+
void MeshRenderer::update_matrix()
{
instance.set_matrix(entity->get_transform()->get_world_matrix());
#include <msp/game/component.h>
#include <msp/gl/objectinstance.h>
+#include <msp/gl/scene.h>
#include "mspgameview_api.h"
namespace Msp::GameView {
private:
const GL::Object &object;
GL::ObjectInstance instance;
+ GL::Scene *scene = nullptr;
public:
MeshRenderer(Game::Handle<Game::Entity>, const GL::Object &);
+ ~MeshRenderer();
- GL::ObjectInstance &get_instance() { return instance; }
+ void set_scene(GL::Scene *);
void update_matrix();
};
}
Renderer::~Renderer()
-{ }
+{
+ /* Ensure that the MeshRenderers and LightEmitters are destroyed before the
+ scene and lighting */
+ entities.clear();
+}
void Renderer::component_created(const Game::Events::ComponentCreated &event)
{
Game::Handle<Game::MeshSource> mesh_source = dynamic_handle_cast<Game::MeshSource>(event.component);
if(mesh_source)
{
- Game::Handle<Game::Entity> entity = mesh_source->get_entity();
- if(!entity->get_component<MeshRenderer>())
+ RenderedEntity &re = get_rendered_entity(event.component->get_entity());
+ if(!re.mesh_renderer)
{
- auto i = lower_bound_member(entities, entity, &RenderedEntity::entity);
const GL::Object &object = stage.get_resources().get<GL::Object>(mesh_source->get_object_name());
- i = entities.emplace(i, entity, Game::Owned<MeshRenderer>(entity, object));
- scene.add(i->mesh_renderer->get_instance());
+ re.mesh_renderer = Game::Owned<MeshRenderer>(re.entity, object);
+ re.mesh_renderer->set_scene(&scene);
}
}
}
+Renderer::RenderedEntity &Renderer::get_rendered_entity(Game::Handle<Game::Entity> entity)
+{
+ auto i = lower_bound_member(entities, entity, &RenderedEntity::entity);
+ if(i!=entities.end() && i->entity==entity)
+ return *i;
+ return *entities.emplace(i, entity);
+}
+
void Renderer::entity_destroyed(const Game::Events::EntityDestroyed &event)
{
auto i = lower_bound_member(entities, event.entity, &RenderedEntity::entity);
if(i!=entities.end() && i->entity==event.entity)
- {
- scene.remove(i->mesh_renderer->get_instance());
entities.erase(i);
- }
}
void Renderer::camera_changed(const Game::Events::CameraChanged &event)
view.render();
}
+
+Renderer::RenderedEntity::RenderedEntity(Game::Handle<Game::Entity> e):
+ entity(e)
+{ }
+
} // namespace Msp::GameView
{
Game::Handle<Game::Entity> entity;
Game::Owned<MeshRenderer> mesh_renderer;
+
+ RenderedEntity(Game::Handle<Game::Entity>);
};
GL::View &view;
private:
void component_created(const Game::Events::ComponentCreated &);
+ RenderedEntity &get_rendered_entity(Game::Handle<Game::Entity>);
void entity_destroyed(const Game::Events::EntityDestroyed &);
void camera_changed(const Game::Events::CameraChanged &);