Files
Destrum/lightkeeper/src/components/LightToggle.cpp
T

69 lines
1.6 KiB
C++

#include <components/LightToggle.h>
#include <destrum/Components/LightComponent.h>
#include <destrum/Components/MeshRendererComponent.h>
#include <destrum/Graphics/Renderer.h>
#include <destrum/ObjectModel/GameObject.h>
#include <destrum/Util/GameState.h>
#include <imgui.h>
LightToggle::LightToggle(GameObject& parent)
: Activatable(parent, "LightToggle")
{
}
void LightToggle::Start()
{
Apply();
}
void LightToggle::SetOn(bool on)
{
m_On = on;
Apply();
}
void LightToggle::OnActivate(GameObject&)
{
SetOn(!m_On);
}
void LightToggle::Apply()
{
GameObject* object = GetGameObject();
auto* light = object->GetComponent<LightComponent>();
if (light != nullptr) {
light->SetEnabled(m_On);
}
// The bulb glows in the light's colour while it is on
const auto* meshRenderer = object->GetComponent<MeshRendererComponent>();
if (meshRenderer == nullptr || meshRenderer->GetMaterialID() == NULL_MATERIAL_ID ||
!GameState::GetInstance().HasRenderer()) {
return;
}
GameRenderer& renderer = GameState::GetInstance().Renderer();
Material& material = renderer.getMaterialMutable(meshRenderer->GetMaterialID());
material.emissiveColor = m_On && light != nullptr ? light->GetColor() : glm::vec3{0.0f};
renderer.updateMaterialGPU(meshRenderer->GetMaterialID());
}
nlohmann::json LightToggle::Serialize() const
{
return {{"on", m_On}};
}
void LightToggle::Deserialize(const nlohmann::json& data)
{
m_On = data.value("on", m_On);
}
void LightToggle::ImGuiInspector()
{
if (bool on = m_On; ImGui::Checkbox("On", &on)) {
SetOn(on);
}
}