#pragma once #include "IComponentEditor.h" #include "Core/IUndoManager.h" #include "UI/UI.h" #include namespace XCEngine { namespace Editor { class CameraComponentEditor : public IComponentEditor { public: const char* GetComponentTypeName() const override { return "Camera"; } const char* GetDisplayName() const override { return "Camera"; } bool Render(::XCEngine::Components::Component* component, IUndoManager* undoManager) override { auto* camera = dynamic_cast<::XCEngine::Components::CameraComponent*>(component); if (!camera) { return false; } int projectionType = static_cast(camera->GetProjectionType()); const char* projectionLabels[] = { "Perspective", "Orthographic" }; bool changed = false; if (ImGui::Combo("Projection", &projectionType, projectionLabels, 2)) { if (undoManager) { undoManager->BeginInteractiveChange("Modify Camera"); } camera->SetProjectionType(static_cast<::XCEngine::Components::CameraProjectionType>(projectionType)); changed = true; } if (camera->GetProjectionType() == ::XCEngine::Components::CameraProjectionType::Perspective) { float fieldOfView = camera->GetFieldOfView(); if (UI::DrawSliderFloat("Field Of View", fieldOfView, 1.0f, 179.0f, 100.0f, "%.1f")) { if (undoManager) { undoManager->BeginInteractiveChange("Modify Camera"); } camera->SetFieldOfView(fieldOfView); changed = true; } } else { float orthographicSize = camera->GetOrthographicSize(); if (UI::DrawFloat("Orthographic Size", orthographicSize, 100.0f, 0.1f, 0.001f)) { if (undoManager) { undoManager->BeginInteractiveChange("Modify Camera"); } camera->SetOrthographicSize(orthographicSize); changed = true; } } float nearClip = camera->GetNearClipPlane(); if (UI::DrawFloat("Near Clip", nearClip, 100.0f, 0.01f, 0.001f)) { if (undoManager) { undoManager->BeginInteractiveChange("Modify Camera"); } camera->SetNearClipPlane(nearClip); changed = true; } float farClip = camera->GetFarClipPlane(); if (UI::DrawFloat("Far Clip", farClip, 100.0f, 0.1f, nearClip + 0.001f)) { if (undoManager) { undoManager->BeginInteractiveChange("Modify Camera"); } camera->SetFarClipPlane(farClip); changed = true; } float depth = camera->GetDepth(); if (UI::DrawFloat("Depth", depth, 100.0f, 0.1f)) { if (undoManager) { undoManager->BeginInteractiveChange("Modify Camera"); } camera->SetDepth(depth); changed = true; } bool primary = camera->IsPrimary(); if (UI::DrawBool("Primary", primary)) { if (undoManager) { undoManager->BeginInteractiveChange("Modify Camera"); } camera->SetPrimary(primary); changed = true; } float clearColor[4] = { camera->GetClearColor().r, camera->GetClearColor().g, camera->GetClearColor().b, camera->GetClearColor().a }; if (UI::DrawColor4("Clear Color", clearColor)) { if (undoManager) { undoManager->BeginInteractiveChange("Modify Camera"); } camera->SetClearColor(::XCEngine::Math::Color(clearColor[0], clearColor[1], clearColor[2], clearColor[3])); changed = true; } return changed; } bool CanAddTo(::XCEngine::Components::GameObject* gameObject) const override { return gameObject && !gameObject->GetComponent<::XCEngine::Components::CameraComponent>(); } const char* GetAddDisabledReason(::XCEngine::Components::GameObject* gameObject) const override { if (!gameObject) { return "Invalid"; } return gameObject->GetComponent<::XCEngine::Components::CameraComponent>() ? "Already Added" : nullptr; } bool CanRemove(::XCEngine::Components::Component* component) const override { return CanEdit(component); } }; } // namespace Editor } // namespace XCEngine