69 lines
1.6 KiB
C++
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);
|
|
}
|
|
}
|