From: Mikko Rasa Date: Sat, 28 Jan 2023 14:28:47 +0000 (+0200) Subject: Add components for creating lights X-Git-Url: https://git.tdb.fi/?a=commitdiff_plain;h=8327cd4725d6edbb22a1f015b31b9f8f3360e2ea;p=libs%2Fgame.git Add components for creating lights --- diff --git a/source/game/light.cpp b/source/game/light.cpp new file mode 100644 index 0000000..91db96f --- /dev/null +++ b/source/game/light.cpp @@ -0,0 +1,10 @@ +#include "light.h" + +namespace Msp::Game { + +Light::Light(Handle e, const Setup &s): + Component(e), + setup(s) +{ } + +} // namespace Msp::Game diff --git a/source/game/light.h b/source/game/light.h new file mode 100644 index 0000000..0df6a42 --- /dev/null +++ b/source/game/light.h @@ -0,0 +1,27 @@ +#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, const Setup &); + + LightType get_type() const { return setup.type; } + float get_intensity() const { return setup.intensity; } +}; + +} // namespace Msp::Game + +#endif diff --git a/source/game/resources.cpp b/source/game/resources.cpp index a4f9e76..fb8f197 100644 --- a/source/game/resources.cpp +++ b/source/game/resources.cpp @@ -11,6 +11,7 @@ namespace Msp::Game { Resources::Resources() { add_type().suffix(".camera.setup"); + add_type().suffix(".light.setup"); } diff --git a/source/game/setups.mgs b/source/game/setups.mgs index 3c36d37..6bd13bc 100644 --- a/source/game/setups.mgs +++ b/source/game/setups.mgs @@ -19,6 +19,18 @@ component Camera 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; diff --git a/source/gameview/lightemitter.cpp b/source/gameview/lightemitter.cpp new file mode 100644 index 0000000..0f78fe3 --- /dev/null +++ b/source/gameview/lightemitter.cpp @@ -0,0 +1,41 @@ +#include "lightemitter.h" +#include +#include + +namespace Msp::GameView { + +LightEmitter::LightEmitter(Game::Handle e, Game::LightType t): + Component(e) +{ + if(t==Game::LightType::DIRECTIONAL) + light = &storage.emplace(); + else + light = &storage.emplace(); +} + +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 diff --git a/source/gameview/lightemitter.h b/source/gameview/lightemitter.h new file mode 100644 index 0000000..d3e2f83 --- /dev/null +++ b/source/gameview/lightemitter.h @@ -0,0 +1,34 @@ +#ifndef MSP_GAMEVIEW_LIGHTEMITTER_H_ +#define MSP_GAMEVIEW_LIGHTEMITTER_H_ + +#include +#include +#include +#include +#include +#include +#include "mspgameview_api.h" + +namespace Msp::GameView { + +class MSPGAMEVIEW_API LightEmitter: public Game::Component +{ +private: + std::variant storage; + GL::Light *light = nullptr; + GL::Lighting *lighting = nullptr; + +public: + LightEmitter(Game::Handle, Game::LightType); + ~LightEmitter(); + + void set_lighting(GL::Lighting *); + + void set_intensity(float); + + void update_matrix(); +}; + +} // namespace Msp::GameView + +#endif diff --git a/source/gameview/renderer.cpp b/source/gameview/renderer.cpp index a123333..e6b2696 100644 --- a/source/gameview/renderer.cpp +++ b/source/gameview/renderer.cpp @@ -1,10 +1,14 @@ #include "renderer.h" #include +#include #include #include #include #include #include +#include +#include +#include "lightemitter.h" #include "meshrenderer.h" using namespace std; @@ -49,6 +53,18 @@ void Renderer::component_created(const Game::Events::ComponentCreated &event) re.mesh_renderer->set_scene(&scene); } } + + Game::Handle light = dynamic_handle_cast(event.component); + if(light) + { + RenderedEntity &re = get_rendered_entity(event.component->get_entity()); + if(!re.light_emitter) + { + re.light_emitter = Game::Owned(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 entity) @@ -103,7 +119,12 @@ void Renderer::tick(Time::TimeDelta) } 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(); } diff --git a/source/gameview/renderer.h b/source/gameview/renderer.h index 484e07c..54d1365 100644 --- a/source/gameview/renderer.h +++ b/source/gameview/renderer.h @@ -7,6 +7,8 @@ #include #include #include +#include +#include #include #include #include @@ -14,6 +16,7 @@ namespace Msp::GameView { +class LightEmitter; class MeshRenderer; class MSPGAMEVIEW_API Renderer: public Game::System @@ -23,6 +26,7 @@ private: { Game::Handle entity; Game::Owned mesh_renderer; + Game::Owned light_emitter; RenderedEntity(Game::Handle); }; @@ -31,6 +35,7 @@ private: Game::EventObserver event_observer; std::vector entities; GL::SimpleScene scene; + GL::Lighting lighting; Game::Handle active_camera; GL::Camera gl_camera; std::string current_seq_name;