#include "EditorLayer.h" #include "Utility/Serializer.h" namespace Light { EditorLayer::EditorLayer(const std::string& name, const std::vector& args) : Layer(name), m_SceneDir(args.empty() ? "" : args[0]) { m_Scene = CreateRef(); m_PropertiesPanel = CreateRef(); m_SceneHierarchyPanel = CreateRef(m_Scene, m_PropertiesPanel); m_ContentBrowserPanel = CreateRef(); m_Framebuffer = Framebuffer::Create({ 1, 1, 1 }, GraphicsContext::GetSharedContext()); if (m_SceneDir.empty()) { m_CameraEntity = m_Scene->CreateEntity("Camera"); m_CameraEntity.AddComponent(SceneCamera(), true); return; } SceneSerializer serializer(m_Scene); LT_ENGINE_ASSERT(serializer.Deserialize(m_SceneDir), "EditorLayer::EditorLayer: failed to de-serialize: ", m_SceneDir); m_CameraEntity = m_Scene->GetEntityByTag("Game Camera"); } EditorLayer::~EditorLayer() { if (!m_SceneDir.empty()) { SceneSerializer serializer(m_Scene); serializer.Serialize(m_SceneDir); } } void EditorLayer::OnUpdate(float deltaTime) { m_Scene->OnUpdate(deltaTime); m_Direction.x = Input::GetKeyboardKey(Key::A) ? -1.0f : Input::GetKeyboardKey(Key::D) ? 1.0f : 0.0f; m_Direction.y = Input::GetKeyboardKey(Key::S) ? -1.0f : Input::GetKeyboardKey(Key::W) ? 1.0f : 0.0f; auto& cameraTranslation = m_CameraEntity.GetComponent().translation; cameraTranslation += glm::vec3(m_Direction * m_Speed * deltaTime, 0.0f); if (Input::GetKeyboardKey(Key::Escape)) Application::Quit(); } void EditorLayer::OnRender() { m_Scene->OnRender(m_Framebuffer); } void EditorLayer::OnUserInterfaceUpdate() { UserInterface::DockspaceBegin(); ImGui::ShowDemoWindow(); if (ImGui::Begin("Game")) { Input::ReceiveGameEvents(ImGui::IsWindowFocused()); ImVec2 regionAvail = ImGui::GetContentRegionAvail(); if (m_AvailableContentRegionPrev != regionAvail) { m_Framebuffer->Resize({ regionAvail.x, regionAvail.y }); auto& camera = m_CameraEntity.GetComponent().camera; camera.SetViewportSize(regionAvail.x, regionAvail.y); m_AvailableContentRegionPrev = regionAvail; } if (GraphicsContext::GetGraphicsAPI() == GraphicsAPI::DirectX) ImGui::Image(m_Framebuffer->GetColorAttachment(), regionAvail); else ImGui::Image(m_Framebuffer->GetColorAttachment(), regionAvail, ImVec2(0, 1), ImVec2(1, 0)); } ImGui::End(); // panels m_SceneHierarchyPanel->OnUserInterfaceUpdate(); m_PropertiesPanel->OnUserInterfaceUpdate(); m_ContentBrowserPanel->OnUserInterfaceUpdate(); UserInterface::DockspaceEnd(); } }