light/modules/mirror/src/editor_layer.cpp

151 lines
3.4 KiB
C++
Raw Normal View History

#include <asset_manager/asset_manager.hpp>
2025-07-05 13:28:41 +03:30
#include <engine/utils/serializer.hpp>
#include <input/key_codes.hpp>
2025-07-05 13:28:41 +03:30
#include <mirror/editor_layer.hpp>
#include <ui/ui.hpp>
namespace Light {
2025-07-06 15:10:34 +03:30
EditorLayer::EditorLayer(const std::string &name)
: Layer(name)
, m_scene_dir("")
, m_direction { 0.0, 0.0 }
2022-03-04 22:40:20 +03:30
{
m_scene = create_ref<Scene>();
m_properties_panel = create_ref<PropertiesPanel>();
m_sceneHierarchyPanel = create_ref<SceneHierarchyPanel>(m_scene, m_properties_panel);
m_content_browser_panel = create_ref<AssetBrowserPanel>(m_scene);
2021-09-11 11:29:44 +04:30
2025-07-06 15:10:34 +03:30
m_framebuffer = Framebuffer::create(
{
.width = 1,
.height = 1,
.samples = 1,
},
GraphicsContext::get_shared_context()
);
if (m_scene_dir.empty())
2022-03-04 22:40:20 +03:30
{
m_camera_entity = m_scene->create_entity("Camera");
2025-07-06 14:02:50 +03:30
m_camera_entity.add_component<CameraComponent>(SceneCamera(), true);
AssetManager::load_texture("Awesomeface", "data/assets/textures/awesomeface.asset");
2025-07-06 14:02:50 +03:30
auto entity = Entity { m_scene->create_entity("Awesomeface", {}) };
entity.add_component<SpriteRendererComponent>(
AssetManager::get_texture("Awesomeface"),
2025-07-05 13:28:41 +03:30
glm::vec4 { 0.0f, 1.0f, 1.0f, 1.0f }
);
2022-03-04 22:40:20 +03:30
}
else
{
2025-07-06 14:02:50 +03:30
auto serializer = SceneSerializer { m_scene };
lt_assert(serializer.deserialize(m_scene_dir), "Failed to de-serialize: {}", m_scene_dir);
// m_camera_entity = m_scene->GetEntityByTag("Game Camera");
}
2022-03-04 22:40:20 +03:30
}
2022-03-04 22:40:20 +03:30
EditorLayer::~EditorLayer()
{
if (!m_scene_dir.empty())
{
2025-07-06 14:02:50 +03:30
auto serializer = SceneSerializer { m_scene };
serializer.serialize(m_scene_dir);
}
2022-03-04 22:40:20 +03:30
}
2025-07-06 15:10:34 +03:30
void EditorLayer::on_update(float delta_time)
2022-03-04 22:40:20 +03:30
{
2025-07-06 15:10:34 +03:30
m_scene->on_update(delta_time);
2025-07-06 15:10:34 +03:30
if (Input::get_keyboard_key(Key::A))
{
m_direction.x = -1.0;
}
else if (Input::get_keyboard_key(Key::D))
{
m_direction.x = 1.0f;
}
else
{
m_direction.x = 0.0;
}
2025-07-06 15:10:34 +03:30
if (Input::get_keyboard_key(Key::S))
{
m_direction.y = -1.0;
}
else if (Input::get_keyboard_key(Key::W))
{
m_direction.y = 1.0f;
}
else
{
m_direction.y = 0.0;
}
2025-07-06 15:10:34 +03:30
auto &translation = m_camera_entity.get_component<TransformComponent>().translation;
translation += glm::vec3 { m_direction * m_speed * delta_time, 0.0f };
if (Input::get_keyboard_key(Key::Escape))
2025-07-06 15:10:34 +03:30
{
Application::quit();
2025-07-06 15:10:34 +03:30
}
2022-03-04 22:40:20 +03:30
}
void EditorLayer::on_render()
2022-03-04 22:40:20 +03:30
{
m_scene->on_render(m_framebuffer);
2022-03-04 22:40:20 +03:30
}
void EditorLayer::on_user_interface_update()
2022-03-04 22:40:20 +03:30
{
UserInterface::dockspace_begin();
2022-03-04 22:40:20 +03:30
ImGui::ShowDemoWindow();
if (ImGui::Begin("Game"))
{
Input::receive_game_events(ImGui::IsWindowFocused());
2025-07-06 15:10:34 +03:30
auto available_region = ImGui::GetContentRegionAvail();
2025-07-06 15:10:34 +03:30
if (m_available_content_region_prev != available_region)
{
2025-07-06 15:10:34 +03:30
m_framebuffer->resize({ available_region.x, available_region.y });
2025-07-06 14:02:50 +03:30
auto &camera = m_camera_entity.get_component<CameraComponent>().camera;
2025-07-06 15:10:34 +03:30
camera.set_viewport_size(
static_cast<uint32_t>(available_region.x),
static_cast<uint32_t>(available_region.y)
);
2022-03-04 22:40:20 +03:30
2025-07-06 15:10:34 +03:30
m_available_content_region_prev = available_region;
2022-03-04 22:40:20 +03:30
}
if (GraphicsContext::get_graphics_api() == GraphicsAPI::DirectX)
2025-07-06 15:10:34 +03:30
{
ImGui::Image(m_framebuffer->get_color_attachment(), available_region);
}
2022-03-04 22:40:20 +03:30
else
2025-07-06 15:10:34 +03:30
{
2025-07-05 13:28:41 +03:30
ImGui::Image(
2025-07-06 14:02:50 +03:30
m_framebuffer->get_color_attachment(),
2025-07-06 15:10:34 +03:30
available_region,
2025-07-05 13:28:41 +03:30
ImVec2(0, 1),
ImVec2(1, 0)
);
2025-07-06 15:10:34 +03:30
}
}
2022-03-04 22:40:20 +03:30
ImGui::End();
// Panels
m_sceneHierarchyPanel->on_user_interface_update();
m_properties_panel->on_user_interface_update();
m_content_browser_panel->on_user_interface_update();
2022-03-04 22:40:20 +03:30
UserInterface::dockspace_end();
2022-03-04 22:40:20 +03:30
}
2022-03-04 22:40:20 +03:30
} // namespace Light