#include #include #include #include #include #include #include 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(); if (light != nullptr) { light->SetEnabled(m_On); } // The bulb glows in the light's colour while it is on const auto* meshRenderer = object->GetComponent(); 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); } }