--- /dev/null
+#include "light.h"
+
+namespace Msp::Game {
+
+Light::Light(Handle<Entity> e, const Setup &s):
+ Component(e),
+ setup(s)
+{ }
+
+} // namespace Msp::Game
--- /dev/null
+#ifndef MSP_GAME_LIGHT_H_
+#define MSP_GAME_LIGHT_H_
+
+#include "component.h"
+#include "mspgame_api.h"
+#include "setups.h"
+
+namespace Msp::Game {
+
+class MSPGAME_API Light: public Component
+{
+public:
+ using Setup = LightSetup;
+
+private:
+ const Setup &setup;
+
+public:
+ Light(Handle<Entity>, const Setup &);
+
+ LightType get_type() const { return setup.type; }
+ float get_intensity() const { return setup.intensity; }
+};
+
+} // namespace Msp::Game
+
+#endif
Resources::Resources()
{
add_type<CameraSetup>().suffix(".camera.setup");
+ add_type<LightSetup>().suffix(".light.setup");
}
field sequence_name string;
};
+enum LightType
+{
+ value DIRECTIONAL;
+ value POINT;
+};
+
+component Light
+{
+ field type LightType { default "DIRECTIONAL"; };
+ field intensity float { default "1.0f"; };
+};
+
component MeshSource
{
field object_name string;
--- /dev/null
+#include "lightemitter.h"
+#include <msp/game/entity.h>
+#include <msp/game/transform.h>
+
+namespace Msp::GameView {
+
+LightEmitter::LightEmitter(Game::Handle<Game::Entity> e, Game::LightType t):
+ Component(e)
+{
+ if(t==Game::LightType::DIRECTIONAL)
+ light = &storage.emplace<GL::DirectionalLight>();
+ else
+ light = &storage.emplace<GL::PointLight>();
+}
+
+LightEmitter::~LightEmitter()
+{
+ if(lighting)
+ lighting->detach(*light);
+}
+
+void LightEmitter::set_lighting(GL::Lighting *l)
+{
+ if(lighting)
+ lighting->detach(*light);
+ lighting = l;
+ if(lighting)
+ lighting->attach(*light);
+}
+
+void LightEmitter::set_intensity(float i)
+{
+ light->set_color(GL::Color(i));
+}
+
+void LightEmitter::update_matrix()
+{
+ light->set_matrix(entity->get_transform()->get_world_matrix());
+}
+
+} // namespace Msp::GameView
--- /dev/null
+#ifndef MSP_GAMEVIEW_LIGHTEMITTER_H_
+#define MSP_GAMEVIEW_LIGHTEMITTER_H_
+
+#include <variant>
+#include <msp/game/component.h>
+#include <msp/game/light.h>
+#include <msp/gl/directionallight.h>
+#include <msp/gl/lighting.h>
+#include <msp/gl/pointlight.h>
+#include "mspgameview_api.h"
+
+namespace Msp::GameView {
+
+class MSPGAMEVIEW_API LightEmitter: public Game::Component
+{
+private:
+ std::variant<std::monostate, GL::DirectionalLight, GL::PointLight> storage;
+ GL::Light *light = nullptr;
+ GL::Lighting *lighting = nullptr;
+
+public:
+ LightEmitter(Game::Handle<Game::Entity>, Game::LightType);
+ ~LightEmitter();
+
+ void set_lighting(GL::Lighting *);
+
+ void set_intensity(float);
+
+ void update_matrix();
+};
+
+} // namespace Msp::GameView
+
+#endif
#include "renderer.h"
#include <msp/game/entity.h>
+#include <msp/game/light.h>
#include <msp/game/meshsource.h>
#include <msp/game/stage.h>
#include <msp/game/transform.h>
#include <msp/gl/sequencebuilder.h>
#include <msp/gl/sequencetemplate.h>
+#include <msp/gl/directionallight.h>
+#include <msp/gl/pointlight.h>
+#include "lightemitter.h"
#include "meshrenderer.h"
using namespace std;
re.mesh_renderer->set_scene(&scene);
}
}
+
+ Game::Handle<Game::Light> light = dynamic_handle_cast<Game::Light>(event.component);
+ if(light)
+ {
+ RenderedEntity &re = get_rendered_entity(event.component->get_entity());
+ if(!re.light_emitter)
+ {
+ re.light_emitter = Game::Owned<LightEmitter>(re.entity, light->get_type());
+ re.light_emitter->set_intensity(light->get_intensity());
+ re.light_emitter->set_lighting(&lighting);
+ }
+ }
}
Renderer::RenderedEntity &Renderer::get_rendered_entity(Game::Handle<Game::Entity> entity)
}
for(const RenderedEntity &e: entities)
- e.mesh_renderer->update_matrix();
+ {
+ if(e.mesh_renderer)
+ e.mesh_renderer->update_matrix();
+ if(e.light_emitter)
+ e.light_emitter->update_matrix();
+ }
view.render();
}
#include <msp/game/owned.h>
#include <msp/game/system.h>
#include <msp/gl/camera.h>
+#include <msp/gl/light.h>
+#include <msp/gl/lighting.h>
#include <msp/gl/sequence.h>
#include <msp/gl/simplescene.h>
#include <msp/gl/view.h>
namespace Msp::GameView {
+class LightEmitter;
class MeshRenderer;
class MSPGAMEVIEW_API Renderer: public Game::System
{
Game::Handle<Game::Entity> entity;
Game::Owned<MeshRenderer> mesh_renderer;
+ Game::Owned<LightEmitter> light_emitter;
RenderedEntity(Game::Handle<Game::Entity>);
};
Game::EventObserver event_observer;
std::vector<RenderedEntity> entities;
GL::SimpleScene scene;
+ GL::Lighting lighting;
Game::Handle<Game::Camera> active_camera;
GL::Camera gl_camera;
std::string current_seq_name;