light/modules/mirror/src/editor_layer.cpp

111 lines
3.1 KiB
C++
Raw Normal View History

2025-07-05 13:28:41 +03:30
#include <engine/utils/serializer.hpp>
#include <mirror/editor_layer.hpp>
namespace Light {
EditorLayer::EditorLayer(const std::string &name): Layer(name), m_scene_dir("")
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
m_framebuffer = Framebuffer::create({ 1, 1, 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);
2025-07-06 14:09:58 +03:30
ResourceManager::load_texture("Awesomeface", "data/assets/textures/awesomeface.png");
2025-07-06 14:02:50 +03:30
auto entity = Entity { m_scene->create_entity("Awesomeface", {}) };
entity.add_component<SpriteRendererComponent>(
ResourceManager::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
}
void EditorLayer::on_update(float deltaTime)
2022-03-04 22:40:20 +03:30
{
m_scene->on_update(deltaTime);
m_direction.x = Input::get_keyboard_key(Key::A) ? -1.0f :
Input::get_keyboard_key(Key::D) ? 1.0f :
0.0f;
m_direction.y = Input::get_keyboard_key(Key::S) ? -1.0f :
Input::get_keyboard_key(Key::W) ? 1.0f :
0.0f;
2025-07-06 14:02:50 +03:30
auto &cameraTranslation = m_camera_entity.get_component<TransformComponent>().translation;
cameraTranslation += glm::vec3(m_direction * m_speed * deltaTime, 0.0f);
if (Input::get_keyboard_key(Key::Escape))
Application::quit();
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 14:02:50 +03:30
auto regionAvail = ImGui::GetContentRegionAvail();
if (m_available_content_region_prev != regionAvail)
{
m_framebuffer->resize({ regionAvail.x, regionAvail.y });
2025-07-06 14:02:50 +03:30
auto &camera = m_camera_entity.get_component<CameraComponent>().camera;
camera.set_viewport_size(regionAvail.x, regionAvail.y);
2022-03-04 22:40:20 +03:30
m_available_content_region_prev = regionAvail;
2022-03-04 22:40:20 +03:30
}
if (GraphicsContext::get_graphics_api() == GraphicsAPI::DirectX)
2025-07-06 14:02:50 +03:30
ImGui::Image(m_framebuffer->get_color_attachment(), regionAvail);
2022-03-04 22:40:20 +03:30
else
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-05 13:28:41 +03:30
regionAvail,
ImVec2(0, 1),
ImVec2(1, 0)
);
}
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