From 38b92611be0655685c75222d3412639d7dfc8a49 Mon Sep 17 00:00:00 2001 From: Erris Date: Tue, 24 Feb 2026 15:29:29 +0100 Subject: [PATCH 1/3] extracting ui render function from the ECS components. Adding dynamic component display --- editor/include/editor.hpp | 12 +-- editor/include/editor_component.hpp | 27 ++++++ editor/include/panels/scene_hierarchy.hpp | 26 +++++- editor/src/editor_component.cpp | 86 +++++++++++++++++++ editor/src/panels/scene_hierarchy.cpp | 64 ++++++++++++-- open_engine/include/open_engine.hpp | 1 - .../include/open_engine/scene/components.hpp | 86 ++----------------- 7 files changed, 205 insertions(+), 97 deletions(-) create mode 100644 editor/include/editor_component.hpp create mode 100644 editor/src/editor_component.cpp diff --git a/editor/include/editor.hpp b/editor/include/editor.hpp index e3ccfe6..4b7722d 100755 --- a/editor/include/editor.hpp +++ b/editor/include/editor.hpp @@ -3,12 +3,6 @@ #include -#include "open_engine/events/mouse_event.hpp" -#include "open_engine/input/input_system.hpp" -#include "open_engine/input/mouse_codes.hpp" -#include "open_engine/renderer/render_command.hpp" -#include "open_engine/renderer/renderer2d.hpp" -#include "open_engine/scene/components.hpp" #include "panels/scene_hierarchy.hpp" #include @@ -94,7 +88,7 @@ namespace OpenEngine { } */ - scene_hierarchy.SetContext(scene); + scene_hierarchy.Init(scene); } void OnDetach() override @@ -364,7 +358,7 @@ namespace OpenEngine { if (!file.empty()) { scene = CreateRef(); scene->OnViewportResize((uint32_t)viewport_size.x, (uint32_t)viewport_size.y); - scene_hierarchy.SetContext(scene); + scene_hierarchy.Init(scene); SceneSerializer serializer(scene); serializer.Deserialize(file); @@ -373,7 +367,7 @@ namespace OpenEngine { if (ImGui::MenuItem("New Scene", "Ctrl+N")) { scene = CreateRef(); scene->OnViewportResize((uint32_t)viewport_size.x, (uint32_t)viewport_size.y); - scene_hierarchy.SetContext(scene); + scene_hierarchy.Init(scene); } ImGui::Separator(); if (ImGui::MenuItem("Exit")) diff --git a/editor/include/editor_component.hpp b/editor/include/editor_component.hpp new file mode 100644 index 0000000..36a5a14 --- /dev/null +++ b/editor/include/editor_component.hpp @@ -0,0 +1,27 @@ +#ifndef EDITOR_COMPONENT_HPP +#define EDITOR_COMPONENT_HPP + +#include "open_engine/scene/components.hpp" + +#include +#include + +namespace OpenEngine { + + /* + void DrawVec3Control(const char* label, glm::vec3& values, + float reset_value = 0.0f, float column_width = 100.0f, + const std::array labels = {"x", "y", "z"}); + */ + + void TagOnImGuiRender(entt::registry& registry, entt::entity entity); + + void TransformOnImGuiRender(entt::registry& registry, entt::entity entity); + + void SpriteOnImGuiRender(entt::registry& registry, entt::entity entity); + + void CameraOnImGuiRender(entt::registry& registry, entt::entity entity); + +} + +#endif // EDITOR_COMPONENT_HPP diff --git a/editor/include/panels/scene_hierarchy.hpp b/editor/include/panels/scene_hierarchy.hpp index c99533d..ac0ad1f 100644 --- a/editor/include/panels/scene_hierarchy.hpp +++ b/editor/include/panels/scene_hierarchy.hpp @@ -1,17 +1,27 @@ #ifndef SCENE_HIERARCHY_HPP #define SCENE_HIERARCHY_HPP -#include "imgui.h" +#include +#include #include namespace OpenEngine { + + using ComponentDrawer = std::function; + + struct ComponentUI { + std::string name; + std::function draw_func; + std::function remove_func; + }; + class SceneHierarchy { public: SceneHierarchy() = default; SceneHierarchy(const Ref& scene); - void SetContext(const Ref& scene); + void Init(const Ref& scene); void OnImGuiRender(); @@ -22,6 +32,7 @@ namespace OpenEngine { void DrawEntityNode(Entity& entity); void DrawComponents(Entity& entity); + /* template void DrawComponentDrawer(Entity& entity, const char* header) { @@ -62,8 +73,19 @@ namespace OpenEngine { if (component_marked_deletion) entity.RemoveComponents(); } + */ private: + template + static void RegisterDrawer(const std::string& name, std::function func) { + drawers[entt::type_id().hash()] = { + name, + func, + [](entt::registry& reg, entt::entity ent) { reg.remove(ent); } + }; + } + + inline static std::map drawers; Ref scene; Entity selected_context, renamed_entity; double last_selected_time = 10.0; diff --git a/editor/src/editor_component.cpp b/editor/src/editor_component.cpp new file mode 100644 index 0000000..5434c99 --- /dev/null +++ b/editor/src/editor_component.cpp @@ -0,0 +1,86 @@ +#include +#include + +namespace OpenEngine { + + void TagOnImGuiRender(entt::registry& registry, entt::entity entity) + { + char buffer[256]; + + auto& tag = registry.get(entity).tag; + std::memset(buffer, 0, sizeof(buffer)); + std::strncpy(buffer, tag.c_str(), sizeof(buffer)); + + if (ImGui::InputText("##tagEditor", buffer, sizeof(buffer), ImGuiInputTextFlags_EnterReturnsTrue | ImGuiInputTextFlags_AutoSelectAll) + || (!ImGui::IsItemActive() && ImGui::IsMouseClicked(0))) + tag = buffer; + }; + + void TransformOnImGuiRender(entt::registry& registry, entt::entity entity) + { + auto& transform = registry.get(entity); + DrawVec3Control("Position", transform.translation); + glm::vec3 rotation_comp = glm::degrees(transform.rotation); + DrawVec3Control("Rotation", rotation_comp); + transform.rotation = glm::radians(rotation_comp); + DrawVec3Control("Scale", transform.scale); + }; + + void SpriteOnImGuiRender(entt::registry& registry, entt::entity entity) + { + auto& sprite = registry.get(entity); + ImGui::ColorEdit4("color", glm::value_ptr(sprite.color)); + }; + + void CameraOnImGuiRender(entt::registry& registry, entt::entity entity) + { + auto& camera_comp = registry.get(entity); + auto& camera = camera_comp.camera; + ImGui::Checkbox("Is primary", &camera_comp.primary); + const char* projection_type_strings[] = {"Perspective", "Orthographic"}; + const char* current_projection_type = projection_type_strings[(int)camera.GetProjectionType()]; + + if (ImGui::BeginCombo("Projection", current_projection_type)) { + for (int i = 0; i < 2; i++) { + bool is_selected = current_projection_type == projection_type_strings[i]; + if (ImGui::Selectable(projection_type_strings[i], is_selected)) { + current_projection_type = projection_type_strings[i]; + camera.SetProjectionType((SceneCamera::ProjectionType)i); + } + + if (is_selected) + ImGui::SetItemDefaultFocus(); + } + ImGui::EndCombo(); + } + + if (camera.GetProjectionType() == SceneCamera::ProjectionType::Perspective) { + float fov = camera.GetVerticalFov(); + if (ImGui::DragFloat("Fov", &fov, 0.1f)) + camera.SetVerticalFov(fov); + + float near_clip = camera.GetPerspectiveNearClip(); + if (ImGui::DragFloat("Near clip", &near_clip, 0.1f)) + camera.SetPerspectiveNearClip(near_clip); + + float far_clip = camera.GetPerspectiveFarClip(); + if (ImGui::DragFloat("Far clip", &far_clip, 0.1f)) + camera.SetPerspectiveFarClip(far_clip); + } + else if (camera.GetProjectionType() == SceneCamera::ProjectionType::Orthographic) { + ImGui::Checkbox("Has fixed aspect ratio", &camera_comp.fixed_aspect_ratio); + float ortho_size = camera.GetOrthographicSize(); + if (ImGui::DragFloat("Orthographic size", &ortho_size, 0.1f)) + camera.SetOrthographicSize(ortho_size); + + float near_clip = camera.GetOrthographicNearClip(); + if (ImGui::DragFloat("Near clip", &near_clip, 0.1f)) + camera.SetOrthographicNearClip(near_clip); + + float far_clip = camera.GetOrthographicFarClip(); + if (ImGui::DragFloat("Far clip", &far_clip, 0.1f)) + camera.SetOrthographicFarClip(far_clip); + } + + }; +} diff --git a/editor/src/panels/scene_hierarchy.cpp b/editor/src/panels/scene_hierarchy.cpp index 5abbe89..7a23b74 100644 --- a/editor/src/panels/scene_hierarchy.cpp +++ b/editor/src/panels/scene_hierarchy.cpp @@ -1,5 +1,7 @@ #include "open_engine/scene/components.hpp" #include "open_engine/scene/entity.hpp" +#include "editor_component.hpp" + #include #include @@ -7,13 +9,20 @@ #include namespace OpenEngine { + + using ComponentDrawer = std::function; + SceneHierarchy::SceneHierarchy(const Ref& scene) : scene(scene) { } - void SceneHierarchy::SetContext(const Ref& context) + void SceneHierarchy::Init(const Ref& context) { + RegisterDrawer("Transform", &TransformOnImGuiRender); + RegisterDrawer("Sprite Renderer", &SpriteOnImGuiRender); + RegisterDrawer("Camera", &CameraOnImGuiRender); + scene = context; selected_context = {}; } @@ -184,11 +193,54 @@ namespace OpenEngine { void SceneHierarchy::DrawComponents(Entity& entity) { - if (entity.HasComponent()) - entity.GetComponents().OnImGuiRender(entity); + auto& reg = scene->GetRegistry(); + entt::entity handle = selected_context; - DrawComponentDrawer(entity, "Transform"); - DrawComponentDrawer(entity, "Sprite"); - DrawComponentDrawer(entity, "Camera"); + if (!selected_context) + return; + + entity.GetComponents(); + TagOnImGuiRender(reg, entity); + + std::vector component_to_delete; // 0 is null/invalid in entt usually + // Iterate through every component type entt knows about + for (auto [id, storage] : reg.storage()) { + if (storage.contains(handle)) { + if (drawers.contains(id)) { + bool component_marked_deletion = false; + ImVec2 region_available = ImGui::GetContentRegionAvail(); + ImGuiTreeNodeFlags tree_node_flags = ImGuiTreeNodeFlags_DefaultOpen + | ImGuiTreeNodeFlags_Framed + | ImGuiTreeNodeFlags_AllowOverlap; + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2{ 4, 4 }); + float line_height = ImGui::GetFontSize() + ImGui::GetStyle().FramePadding.y * 2.0f; + + bool opened = ImGui::TreeNodeEx((void*)(intptr_t)id, tree_node_flags, "%s", drawers[id].name.c_str()); + ImGui::SameLine(region_available.x - line_height * 0.5f); + + ImGui::PushStyleColor(ImGuiCol_Button, { 0.290f, 0.301f, 0.388f, 1.0f }); + if (ImGui::Button("...", ImVec2{ line_height, line_height })) + ImGui::OpenPopup("component_settings"); + ImGui::PopStyleColor(); + + ImGui::PopStyleVar(); + + if (ImGui::BeginPopup("component_settings")) { + if (ImGui::MenuItem("Remove component")) + component_to_delete.emplace_back(id); + + ImGui::EndPopup(); + } + + if (opened) { + drawers[id].draw_func(reg, handle); + ImGui::TreePop(); + } + } + } + } + + for (auto& id : component_to_delete) + drawers[id].remove_func(reg, entity); } } diff --git a/open_engine/include/open_engine.hpp b/open_engine/include/open_engine.hpp index b82cd3a..e3927ee 100644 --- a/open_engine/include/open_engine.hpp +++ b/open_engine/include/open_engine.hpp @@ -12,7 +12,6 @@ #include "open_engine/scene/native_scriptable_entity.hpp" #include "open_engine/scene/scene_serializer.hpp" #include "open_engine/scene/components.hpp" -#include "open_engine/scene/components.hpp" #include "open_engine/core/file_dialogs.hpp" #include "open_engine/core/time.hpp" diff --git a/open_engine/include/open_engine/scene/components.hpp b/open_engine/include/open_engine/scene/components.hpp index cfdab9c..a33e779 100644 --- a/open_engine/include/open_engine/scene/components.hpp +++ b/open_engine/include/open_engine/scene/components.hpp @@ -31,20 +31,9 @@ namespace OpenEngine { TagComponent(const TagComponent&) = default; TagComponent(const std::string& tag) : tag(tag) {} - - void OnImGuiRender(Entity& entity) - { - char buffer[256]; - std::memset(buffer, 0, sizeof(buffer)); - std::strncpy(buffer, tag.c_str(), sizeof(buffer)); - - if (ImGui::InputText("##tagEditor", buffer, sizeof(buffer), ImGuiInputTextFlags_EnterReturnsTrue | ImGuiInputTextFlags_AutoSelectAll) - || (!ImGui::IsItemActive() && ImGui::IsMouseClicked(0))) - tag = buffer; - }; }; - struct TransformComponent + struct TransformComponent { glm::vec3 translation = { 0.0f, 0.0f, 0.0f }; glm::vec3 rotation = { 0.0f, 0.0f, 0.0f }; @@ -64,18 +53,9 @@ namespace OpenEngine { return transform; }; - - void OnImGuiRender(Entity& entity) - { - DrawVec3Control("Position", translation); - glm::vec3 rotation_comp = glm::degrees(rotation); - DrawVec3Control("Rotation", rotation_comp); - rotation = glm::radians(rotation_comp); - DrawVec3Control("Scale", scale); - }; }; - struct SpriteRendererComponent + struct SpriteRendererComponent { glm::vec4 color{ 1.0f, 1.0f, 1.0f, 1.0f }; @@ -83,14 +63,9 @@ namespace OpenEngine { SpriteRendererComponent(const SpriteRendererComponent&) = default; SpriteRendererComponent(const glm::vec4& color) : color(color) {} - - void OnImGuiRender(Entity& entity) - { - ImGui::ColorEdit4("color", glm::value_ptr(color)); - }; }; - struct CameraComponent + struct CameraComponent { SceneCamera camera; bool primary = true; @@ -98,65 +73,18 @@ namespace OpenEngine { CameraComponent() = default; CameraComponent(const CameraComponent&) = default; - - void OnImGuiRender(Entity& entity) - { - ImGui::Checkbox("Is primary", &primary); - const char* projection_type_strings[] = {"Perspective", "Orthographic"}; - const char* current_projection_type = projection_type_strings[(int)camera.GetProjectionType()]; - - if (ImGui::BeginCombo("Projection", current_projection_type)) { - for (int i = 0; i < 2; i++) { - bool is_selected = current_projection_type == projection_type_strings[i]; - if (ImGui::Selectable(projection_type_strings[i], is_selected)) { - current_projection_type = projection_type_strings[i]; - camera.SetProjectionType((SceneCamera::ProjectionType)i); - } - - if (is_selected) - ImGui::SetItemDefaultFocus(); - } - ImGui::EndCombo(); - } - - if (camera.GetProjectionType() == SceneCamera::ProjectionType::Perspective) { - float fov = camera.GetVerticalFov(); - if (ImGui::DragFloat("Fov", &fov, 0.1f)) - camera.SetVerticalFov(fov); - - float near_clip = camera.GetPerspectiveNearClip(); - if (ImGui::DragFloat("Near clip", &near_clip, 0.1f)) - camera.SetPerspectiveNearClip(near_clip); - - float far_clip = camera.GetPerspectiveFarClip(); - if (ImGui::DragFloat("Far clip", &far_clip, 0.1f)) - camera.SetPerspectiveFarClip(far_clip); - } - else if (camera.GetProjectionType() == SceneCamera::ProjectionType::Orthographic) { - ImGui::Checkbox("Has fixed aspect ratio", &fixed_aspect_ratio); - float ortho_size = camera.GetOrthographicSize(); - if (ImGui::DragFloat("Orthographic size", &ortho_size, 0.1f)) - camera.SetOrthographicSize(ortho_size); - - float near_clip = camera.GetOrthographicNearClip(); - if (ImGui::DragFloat("Near clip", &near_clip, 0.1f)) - camera.SetOrthographicNearClip(near_clip); - - float far_clip = camera.GetOrthographicFarClip(); - if (ImGui::DragFloat("Far clip", &far_clip, 0.1f)) - camera.SetOrthographicFarClip(far_clip); - } - - }; }; - struct NativeScriptComponent + struct NativeScriptComponent { NativeScriptableEntity* instance = nullptr; NativeScriptableEntity* (*InstanciateScript)(); void (*DestroyInstanceScript)(NativeScriptComponent*); + void OnImGuiRender(Entity& entity) + {}; + template void Bind() { From e69764e1494e1a9f9c7ddb7139ead9b0074d782d Mon Sep 17 00:00:00 2001 From: Erris Date: Tue, 24 Feb 2026 18:10:39 +0100 Subject: [PATCH 2/3] cleanup and removing nasty segv upon entity deletion + Fixing bug where clicking an entity in the hierarchy didn't update the stats --- editor/include/editor.hpp | 7 +- editor/include/editor_component.hpp | 7 +- editor/include/panels/scene_hierarchy.hpp | 43 ---------- editor/src/editor_component.cpp | 76 ++++++++++++++++++ editor/src/panels/scene_hierarchy.cpp | 3 +- .../include/open_engine/scene/components.hpp | 17 +--- .../src/open_engine/scene/components.cpp | 79 ++----------------- open_engine/src/open_engine/scene/scene.cpp | 12 ++- 8 files changed, 96 insertions(+), 148 deletions(-) diff --git a/editor/include/editor.hpp b/editor/include/editor.hpp index 4b7722d..db4373b 100755 --- a/editor/include/editor.hpp +++ b/editor/include/editor.hpp @@ -14,7 +14,6 @@ #include #include #include - #include #include @@ -148,6 +147,7 @@ namespace OpenEngine { clicked = true; } else { clicked = false; + selected_entity = scene_hierarchy.GetSelectedEntity(); } framebuffer->Unbind(); @@ -310,7 +310,7 @@ namespace OpenEngine { glm::mat4 camera_view = editor_camera.GetViewMatrix(); auto& transform_comp = selected_entity.GetComponents(); - glm::mat4 transform = transform_comp.GetTransform(); + glm::mat4 transform = GetTransformFromComp(transform_comp); bool snap = Input::IsKeyPressed(KeyCode::LeftControl); float snap_value = 0.1f; @@ -333,7 +333,8 @@ namespace OpenEngine { transform_comp.rotation += delta_rotation; transform_comp.scale = scale; } - } + } else + guizmo_operation = -1; }; void OnImGuiRender() override diff --git a/editor/include/editor_component.hpp b/editor/include/editor_component.hpp index 36a5a14..df2beb6 100644 --- a/editor/include/editor_component.hpp +++ b/editor/include/editor_component.hpp @@ -1,18 +1,16 @@ #ifndef EDITOR_COMPONENT_HPP #define EDITOR_COMPONENT_HPP -#include "open_engine/scene/components.hpp" - +#include #include +#include #include namespace OpenEngine { - /* void DrawVec3Control(const char* label, glm::vec3& values, float reset_value = 0.0f, float column_width = 100.0f, const std::array labels = {"x", "y", "z"}); - */ void TagOnImGuiRender(entt::registry& registry, entt::entity entity); @@ -21,7 +19,6 @@ namespace OpenEngine { void SpriteOnImGuiRender(entt::registry& registry, entt::entity entity); void CameraOnImGuiRender(entt::registry& registry, entt::entity entity); - } #endif // EDITOR_COMPONENT_HPP diff --git a/editor/include/panels/scene_hierarchy.hpp b/editor/include/panels/scene_hierarchy.hpp index ac0ad1f..de15b38 100644 --- a/editor/include/panels/scene_hierarchy.hpp +++ b/editor/include/panels/scene_hierarchy.hpp @@ -32,49 +32,6 @@ namespace OpenEngine { void DrawEntityNode(Entity& entity); void DrawComponents(Entity& entity); - /* - template - void DrawComponentDrawer(Entity& entity, const char* header) - { - bool component_marked_deletion = false; - ImVec2 region_available = ImGui::GetContentRegionAvail(); - ImGuiTreeNodeFlags tree_node_flags = ImGuiTreeNodeFlags_DefaultOpen - | ImGuiTreeNodeFlags_Framed - | ImGuiTreeNodeFlags_AllowOverlap; - if (entity.HasComponent()) { - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2{ 4, 4 }); - float line_height = ImGui::GetFontSize() + ImGui::GetStyle().FramePadding.y * 2.0f; - - bool opened = ImGui::TreeNodeEx((void*)typeid(T).hash_code(), tree_node_flags, "%s", header); - ImGui::SameLine(region_available.x - line_height * 0.5f); - - ImGui::PushStyleColor(ImGuiCol_Button, { 0.290f, 0.301f, 0.388f, 1.0f }); - if (ImGui::Button("...", ImVec2{ line_height, line_height })) - ImGui::OpenPopup("component_settings"); - ImGui::PopStyleColor(); - - ImGui::PopStyleVar(); - - if (ImGui::BeginPopup("component_settings")) { - if (ImGui::MenuItem("Remove component")) - component_marked_deletion = true; - - ImGui::EndPopup(); - } - - if (opened) { - entity.GetComponents().OnImGuiRender(entity); - ImGui::TreePop(); - } - - ImGui::Separator(); - - } - if (component_marked_deletion) - entity.RemoveComponents(); - } - */ - private: template static void RegisterDrawer(const std::string& name, std::function func) { diff --git a/editor/src/editor_component.cpp b/editor/src/editor_component.cpp index 5434c99..e7f16f7 100644 --- a/editor/src/editor_component.cpp +++ b/editor/src/editor_component.cpp @@ -3,6 +3,82 @@ namespace OpenEngine { + void DrawVec3Control(const char* label, glm::vec3& values, + float reset_value, float column_width, + const std::array labels) + { + ImGuiIO& io = ImGui::GetIO(); + auto bold_font = io.Fonts->Fonts[0]; + + ImGui::PushID(label); + ImVec2 item_spacing = { 15.0f, 0.0f }; + ImGui::Columns(2); + ImGui::SetColumnWidth(0, column_width); + ImGui::Text("%s", label); + if (ImGui::IsMouseDoubleClicked(ImGuiMouseButton_Left) && ImGui::IsItemHovered()) + values = glm::vec3(reset_value); + ImGui::NextColumn(); + + ImGui::PushMultiItemsWidths(3, ImGui::CalcItemWidth()); + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2{ 0, 0 }); + + float line_height = ImGui::GetFontSize() + ImGui::GetStyle().FramePadding.y * 2.0f; + ImVec2 button_size = { line_height + 3.0f, line_height }; + + ImGui::PushStyleColor(ImGuiCol_Button, ImVec4{ 0.953f, 0.545f, 0.659f, 1.0f }); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4{ 1.0f, 0.8f, 0.9f, 1.0f }); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4{ 0.953f, 0.545f, 0.659f, 1.0f }); + ImGui::PushStyleColor(ImGuiCol_Text, ImVec4{ 0.0f, 0.0f, 0.0f, 1.0f }); + ImGui::PushFont(bold_font); + if (ImGui::Button(labels[0], button_size)) + values.x = reset_value; + ImGui::PopFont(); + ImGui::PopStyleColor(4); + + ImGui::SameLine(); + ImGui::DragFloat("##X", &values.x, 0.1f, 0.0f, 0.0f, "%.2f"); + ImGui::PopItemWidth(); + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, item_spacing); + ImGui::SameLine(); + + ImGui::PushStyleColor(ImGuiCol_Button, ImVec4{ 0.650f, 0.890f, 0.631f, 1.0f }); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4{ 0.9f, 1.0f, 0.9f, 1.0f }); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4{ 0.650f, 0.890f, 0.631f, 1.0f }); + ImGui::PushStyleColor(ImGuiCol_Text, ImVec4{ 0.0f, 0.0f, 0.0f, 1.0f }); + ImGui::PushFont(bold_font); + if (ImGui::Button(labels[1], button_size)) + values.y = reset_value; + ImGui::PopFont(); + ImGui::PopStyleColor(4); + ImGui::PopStyleVar(); + + ImGui::SameLine(); + ImGui::DragFloat("##Y", &values.y, 0.1f, 0.0f, 0.0f, "%.2f"); + ImGui::PopItemWidth(); + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, item_spacing); + ImGui::SameLine(); + + ImGui::PushStyleColor(ImGuiCol_Button, ImVec4{ 0.533f, 0.698f, 0.976f, 1.0f }); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4{ 0.7f, 0.9f, 1.0f, 1.0f }); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4{ 0.533f, 0.698f, 0.976f, 1.0f }); + ImGui::PushStyleColor(ImGuiCol_Text, ImVec4{ 0.0f, 0.0f, 0.0f, 1.0f }); + ImGui::PushFont(bold_font); + if (ImGui::Button(labels[2], button_size)) + values.z = reset_value; + ImGui::PopFont(); + ImGui::PopStyleColor(4); + ImGui::PopStyleVar(1); + + ImGui::SameLine(); + ImGui::DragFloat("##Z", &values.z, 0.1f, 0.0f, 0.0f, "%.2f"); + ImGui::PopItemWidth(); + + ImGui::PopStyleVar(); + + ImGui::Columns(1); + ImGui::PopID(); + } + void TagOnImGuiRender(entt::registry& registry, entt::entity entity) { char buffer[256]; diff --git a/editor/src/panels/scene_hierarchy.cpp b/editor/src/panels/scene_hierarchy.cpp index 7a23b74..8245820 100644 --- a/editor/src/panels/scene_hierarchy.cpp +++ b/editor/src/panels/scene_hierarchy.cpp @@ -196,7 +196,7 @@ namespace OpenEngine { auto& reg = scene->GetRegistry(); entt::entity handle = selected_context; - if (!selected_context) + if (!selected_context || !entity) return; entity.GetComponents(); @@ -222,7 +222,6 @@ namespace OpenEngine { if (ImGui::Button("...", ImVec2{ line_height, line_height })) ImGui::OpenPopup("component_settings"); ImGui::PopStyleColor(); - ImGui::PopStyleVar(); if (ImGui::BeginPopup("component_settings")) { diff --git a/open_engine/include/open_engine/scene/components.hpp b/open_engine/include/open_engine/scene/components.hpp index a33e779..d0d7065 100644 --- a/open_engine/include/open_engine/scene/components.hpp +++ b/open_engine/include/open_engine/scene/components.hpp @@ -4,7 +4,6 @@ #include "open_engine/scene/native_scriptable_entity.hpp" #include "open_engine/scene/scene_camera.hpp" -#include #include #include #include @@ -19,10 +18,6 @@ namespace OpenEngine { - void DrawVec3Control(const char* label, glm::vec3& values, - float reset_value = 0.0f, float column_width = 100.0f, - const std::array labels = {"x", "y", "z"}); - struct TagComponent { std::string tag; @@ -43,18 +38,10 @@ namespace OpenEngine { TransformComponent(const TransformComponent&) = default; TransformComponent(const glm::vec3& position) : translation(position) {} - - glm::mat4 GetTransform() const - { - glm::mat4 transform = glm::translate(glm::mat4(1.0f), translation); - - transform *= glm::toMat4(glm::quat(rotation)); - transform *= glm::scale(glm::mat4(1.0f), scale); - - return transform; - }; }; + glm::mat4 GetTransformFromComp(TransformComponent& transform_comp); + struct SpriteRendererComponent { glm::vec4 color{ 1.0f, 1.0f, 1.0f, 1.0f }; diff --git a/open_engine/src/open_engine/scene/components.cpp b/open_engine/src/open_engine/scene/components.cpp index d65f97b..248f5dc 100644 --- a/open_engine/src/open_engine/scene/components.cpp +++ b/open_engine/src/open_engine/scene/components.cpp @@ -1,83 +1,16 @@ -#include "imgui.h" #include #include namespace OpenEngine { - void DrawVec3Control(const char* label, glm::vec3& values, - float reset_value, float column_width, - const std::array labels) + glm::mat4 GetTransformFromComp(TransformComponent& transform_comp) { - ImGuiIO& io = ImGui::GetIO(); - auto bold_font = io.Fonts->Fonts[0]; + glm::mat4 transform = glm::translate(glm::mat4(1.0f), transform_comp.translation); - ImGui::PushID(label); - ImVec2 item_spacing = { 15.0f, 0.0f }; - ImGui::Columns(2); - ImGui::SetColumnWidth(0, column_width); - ImGui::Text("%s", label); - if (ImGui::IsMouseDoubleClicked(ImGuiMouseButton_Left) && ImGui::IsItemHovered()) - values = glm::vec3(reset_value); - ImGui::NextColumn(); + transform *= glm::toMat4(glm::quat(transform_comp.rotation)); + transform *= glm::scale(glm::mat4(1.0f), transform_comp.scale); - ImGui::PushMultiItemsWidths(3, ImGui::CalcItemWidth()); - ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2{ 0, 0 }); - - float line_height = ImGui::GetFontSize() + ImGui::GetStyle().FramePadding.y * 2.0f; - ImVec2 button_size = { line_height + 3.0f, line_height }; - - ImGui::PushStyleColor(ImGuiCol_Button, ImVec4{ 0.953f, 0.545f, 0.659f, 1.0f }); - ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4{ 1.0f, 0.8f, 0.9f, 1.0f }); - ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4{ 0.953f, 0.545f, 0.659f, 1.0f }); - ImGui::PushStyleColor(ImGuiCol_Text, ImVec4{ 0.0f, 0.0f, 0.0f, 1.0f }); - ImGui::PushFont(bold_font); - if (ImGui::Button(labels[0], button_size)) - values.x = reset_value; - ImGui::PopFont(); - ImGui::PopStyleColor(4); - - ImGui::SameLine(); - ImGui::DragFloat("##X", &values.x, 0.1f, 0.0f, 0.0f, "%.2f"); - ImGui::PopItemWidth(); - ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, item_spacing); - ImGui::SameLine(); - - ImGui::PushStyleColor(ImGuiCol_Button, ImVec4{ 0.650f, 0.890f, 0.631f, 1.0f }); - ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4{ 0.9f, 1.0f, 0.9f, 1.0f }); - ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4{ 0.650f, 0.890f, 0.631f, 1.0f }); - ImGui::PushStyleColor(ImGuiCol_Text, ImVec4{ 0.0f, 0.0f, 0.0f, 1.0f }); - ImGui::PushFont(bold_font); - if (ImGui::Button(labels[1], button_size)) - values.y = reset_value; - ImGui::PopFont(); - ImGui::PopStyleColor(4); - ImGui::PopStyleVar(); - - ImGui::SameLine(); - ImGui::DragFloat("##Y", &values.y, 0.1f, 0.0f, 0.0f, "%.2f"); - ImGui::PopItemWidth(); - ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, item_spacing); - ImGui::SameLine(); - - ImGui::PushStyleColor(ImGuiCol_Button, ImVec4{ 0.533f, 0.698f, 0.976f, 1.0f }); - ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4{ 0.7f, 0.9f, 1.0f, 1.0f }); - ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4{ 0.533f, 0.698f, 0.976f, 1.0f }); - ImGui::PushStyleColor(ImGuiCol_Text, ImVec4{ 0.0f, 0.0f, 0.0f, 1.0f }); - ImGui::PushFont(bold_font); - if (ImGui::Button(labels[2], button_size)) - values.z = reset_value; - ImGui::PopFont(); - ImGui::PopStyleColor(4); - ImGui::PopStyleVar(1); - - ImGui::SameLine(); - ImGui::DragFloat("##Z", &values.z, 0.1f, 0.0f, 0.0f, "%.2f"); - ImGui::PopItemWidth(); - - ImGui::PopStyleVar(); - - ImGui::Columns(1); - ImGui::PopID(); - } + return transform; + }; } diff --git a/open_engine/src/open_engine/scene/scene.cpp b/open_engine/src/open_engine/scene/scene.cpp index f226b43..88d5703 100644 --- a/open_engine/src/open_engine/scene/scene.cpp +++ b/open_engine/src/open_engine/scene/scene.cpp @@ -1,11 +1,9 @@ -#include "logging.hpp" #include -#include #include - -#include #include +#include +#include namespace OpenEngine { Entity Scene::CreateEntity(const std::string& name) @@ -49,7 +47,7 @@ namespace OpenEngine { if (camera_component.primary) { main_camera = &camera_component.camera; - main_transform = transform.GetTransform(); + main_transform = GetTransformFromComp(transform); break; } } @@ -61,7 +59,7 @@ namespace OpenEngine { for (const auto& entity : view) { auto [transform, sprite] = view.get(entity); - Renderer2D::DrawQuad(transform.GetTransform(), sprite.color, (int)entity); + Renderer2D::DrawQuad(GetTransformFromComp(transform), sprite.color, (int)entity); } Renderer2D::EndScene(); @@ -78,7 +76,7 @@ namespace OpenEngine { { auto [transform, sprite] = group.get(entity); - Renderer2D::DrawQuad(transform.GetTransform(), sprite.color, (int)entity); + Renderer2D::DrawQuad(GetTransformFromComp(transform), sprite.color, (int)entity); } Renderer2D::EndScene(); From 43047303b7904e9167cc9370442d43deae77d839 Mon Sep 17 00:00:00 2001 From: Erris Date: Tue, 24 Feb 2026 19:14:04 +0100 Subject: [PATCH 3/3] ui --- imgui.ini | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/imgui.ini b/imgui.ini index bbd499b..0935092 100644 --- a/imgui.ini +++ b/imgui.ini @@ -1,40 +1,40 @@ [Window][WindowOverViewport_11111111] Pos=0,24 -Size=2560,1371 +Size=1272,1363 Collapsed=0 [Window][Debug##Default] -Pos=-32,513 +Pos=-32,370 Size=400,400 Collapsed=0 [Window][Statistics] Pos=0,24 -Size=409,228 +Size=409,300 Collapsed=0 DockId=0x00000003,0 [Window][Properties] -Pos=2110,24 -Size=450,743 +Pos=822,24 +Size=450,739 Collapsed=0 DockId=0x00000007,0 [Window][Viewport] Pos=411,24 -Size=1697,1371 +Size=409,1363 Collapsed=0 DockId=0x00000009,0 [Window][Dear ImGui Demo] -Pos=2110,769 -Size=450,626 +Pos=822,765 +Size=450,622 Collapsed=0 DockId=0x00000008,0 [Window][Scene] -Pos=0,254 -Size=409,1141 +Pos=0,326 +Size=409,1061 Collapsed=0 DockId=0x00000004,0 @@ -142,11 +142,11 @@ Collapsed=0 DockId=0x00000009,1 [Docking][Data] -DockSpace ID=0x08BD597D Window=0x1BBC0F80 Pos=0,24 Size=2560,1371 Split=X +DockSpace ID=0x08BD597D Window=0x1BBC0F80 Pos=0,24 Size=1272,1363 Split=X DockNode ID=0x00000005 Parent=0x08BD597D SizeRef=820,1386 Split=X DockNode ID=0x00000001 Parent=0x00000005 SizeRef=409,1386 Split=Y Selected=0xE601B12F - DockNode ID=0x00000003 Parent=0x00000001 SizeRef=255,231 Selected=0x553E127E - DockNode ID=0x00000004 Parent=0x00000001 SizeRef=255,1153 Selected=0xE601B12F + DockNode ID=0x00000003 Parent=0x00000001 SizeRef=255,300 Selected=0x553E127E + DockNode ID=0x00000004 Parent=0x00000001 SizeRef=255,1061 Selected=0xE601B12F DockNode ID=0x00000002 Parent=0x00000005 SizeRef=1697,1386 Split=Y Selected=0xC450F867 DockNode ID=0x00000009 Parent=0x00000002 SizeRef=483,784 CentralNode=1 Selected=0xC450F867 DockNode ID=0x0000000A Parent=0x00000002 SizeRef=483,600 Selected=0x1BCA3180