pretty property panel components

This commit is contained in:
Erris
2026-02-17 16:34:20 +01:00
parent d4c420d5b4
commit e0396fedd1
11 changed files with 151 additions and 64 deletions

View File

@@ -4,8 +4,9 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
project(OpenEngineProject) project(OpenEngineProject)
add_definitions(-DOE_DEBUG_TOOLS=1)
add_subdirectory(open_engine) add_subdirectory(open_engine)
add_subdirectory(application add_subdirectory(editor
./bin ./editor
) )

View File

@@ -1,6 +1,7 @@
[requires] [requires]
imgui/1.92.5-docking imgui/1.92.5-docking
spdlog/1.16.0 spdlog/1.16.0
entt/3.16.0
[generators] [generators]
CMakeDeps CMakeDeps

View File

@@ -27,16 +27,16 @@ namespace OpenEngine {
{ {
auto delta = Time::DeltaTime(); auto delta = Time::DeltaTime();
auto& transform = GetComponent<TransformComponent>(); auto& position = GetComponent<TransformComponent>().translation;
if (Input::IsKeyPressed(KeyCode::Up)) if (Input::IsKeyPressed(KeyCode::Up))
transform.transform[3][1] += 5.0 * delta; position.y += 5.0 * delta;
if (Input::IsKeyPressed(KeyCode::Down)) if (Input::IsKeyPressed(KeyCode::Down))
transform.transform[3][1] -= 5.0 * delta; position.y -= 5.0 * delta;
if (Input::IsKeyPressed(KeyCode::Right)) if (Input::IsKeyPressed(KeyCode::Right))
transform.transform[3][0] += 5.0 * delta; position.x += 5.0 * delta;
if (Input::IsKeyPressed(KeyCode::Left)) if (Input::IsKeyPressed(KeyCode::Left))
transform.transform[3][0] -= 5.0 * delta; position.x -= 5.0 * delta;
}; };
void OnDestroy() void OnDestroy()

View File

@@ -2,6 +2,7 @@
#define SCENE_HIERARCHY_HPP #define SCENE_HIERARCHY_HPP
#include "imgui.h" #include "imgui.h"
#include <array>
#include <open_engine.hpp> #include <open_engine.hpp>
namespace OpenEngine { namespace OpenEngine {

View File

@@ -1,8 +1,7 @@
#include "open_engine/scene/components.hpp"
#include <cstdint>
#include <cstring>
#include <panels/scene_hierarchy.hpp> #include <panels/scene_hierarchy.hpp>
#include <cstring>
#include <cstdint>
#include <imgui.h> #include <imgui.h>
namespace OpenEngine { namespace OpenEngine {
@@ -137,14 +136,3 @@ namespace OpenEngine {
DrawComponentDrawer<CameraComponent>(entity, "Camera"); DrawComponentDrawer<CameraComponent>(entity, "Camera");
} }
} }
/*
if (ImGui::BeginPopupContextWindow(0, ImGuiPopupFlags_MouseButtonRight | ImGuiPopupFlags_NoOpenOverItems))
{
if (ImGui::MenuItem("Create Empty Entity"))
{
// m_Context->CreateEntity("Empty Entity");
}
ImGui::EndPopup();
}
*/

View File

@@ -22,38 +22,38 @@ DockId=0x00000008,0
[Window][Viewport] [Window][Viewport]
Pos=406,0 Pos=406,0
Size=629,1386 Size=391,1059
Collapsed=0
DockId=0x00000006,0
[Window][Dear ImGui Demo]
Pos=1037,0
Size=235,1386
Collapsed=0
DockId=0x00000007,0
[Window][Scene]
Pos=0,151
Size=404,264
Collapsed=0 Collapsed=0
DockId=0x00000009,0 DockId=0x00000009,0
[Window][Properties] [Window][Dear ImGui Demo]
Pos=0,417 Pos=406,1061
Size=404,969 Size=391,325
Collapsed=0 Collapsed=0
DockId=0x0000000A,0 DockId=0x0000000A,0
[Docking][Data] [Window][Scene]
DockSpace ID=0x08BD597D Window=0x1BBC0F80 Pos=0,0 Size=1272,1386 Split=X Pos=0,151
DockNode ID=0x00000003 Parent=0x08BD597D SizeRef=1035,1386 Split=X Size=404,1235
DockNode ID=0x00000005 Parent=0x00000003 SizeRef=404,1386 Split=Y Selected=0x553E127E Collapsed=0
DockNode ID=0x00000001 Parent=0x00000005 SizeRef=274,149 Selected=0x553E127E DockId=0x00000002,0
DockNode ID=0x00000002 Parent=0x00000005 SizeRef=274,1235 Split=Y Selected=0xE601B12F
DockNode ID=0x00000009 Parent=0x00000002 SizeRef=498,264 Selected=0xE601B12F [Window][Properties]
DockNode ID=0x0000000A Parent=0x00000002 SizeRef=498,969 Selected=0x8C72BEA8 Pos=799,0
DockNode ID=0x00000006 Parent=0x00000003 SizeRef=629,1386 CentralNode=1 Selected=0xC450F867 Size=473,1386
DockNode ID=0x00000004 Parent=0x08BD597D SizeRef=235,1386 Split=Y Selected=0x5E5F7166 Collapsed=0
DockNode ID=0x00000007 Parent=0x00000004 SizeRef=235,305 Selected=0x5E5F7166 DockId=0x00000007,0
DockNode ID=0x00000008 Parent=0x00000004 SizeRef=235,1079 Selected=0xA5FF3A7A
[Docking][Data]
DockSpace ID=0x08BD597D Window=0x1BBC0F80 Pos=0,0 Size=1272,1386 Split=X
DockNode ID=0x00000003 Parent=0x08BD597D SizeRef=2085,1386 Split=X
DockNode ID=0x00000005 Parent=0x00000003 SizeRef=404,1386 Split=Y Selected=0x553E127E
DockNode ID=0x00000001 Parent=0x00000005 SizeRef=274,149 Selected=0x553E127E
DockNode ID=0x00000002 Parent=0x00000005 SizeRef=274,1235 Selected=0xE601B12F
DockNode ID=0x00000006 Parent=0x00000003 SizeRef=1679,1386 Split=Y Selected=0xC450F867
DockNode ID=0x00000009 Parent=0x00000006 SizeRef=629,1067 CentralNode=1 Selected=0xC450F867
DockNode ID=0x0000000A Parent=0x00000006 SizeRef=629,325 Selected=0x5E5F7166
DockNode ID=0x00000004 Parent=0x08BD597D SizeRef=473,1386 Split=Y Selected=0x5E5F7166
DockNode ID=0x00000007 Parent=0x00000004 SizeRef=235,305 Selected=0x8C72BEA8
DockNode ID=0x00000008 Parent=0x00000004 SizeRef=235,1079 Selected=0xA5FF3A7A

View File

@@ -5,13 +5,20 @@
#include "open_engine/scene/scene_camera.hpp" #include "open_engine/scene/scene_camera.hpp"
#include <cstring> #include <cstring>
#include <glm/glm.hpp> #include <glm/ext/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp> #include <glm/gtc/type_ptr.hpp>
#include <glm/fwd.hpp>
#include <glm/glm.hpp>
#include <imgui_internal.h>
#include <imgui.h> #include <imgui.h>
#include <string> #include <string>
namespace OpenEngine { namespace OpenEngine {
void DrawVec3Control(const char* label, glm::vec3& values,
float reset_value = 0.0f, float column_width = 100.0f,
const std::array<const char*, 3> labels = {"x", "y", "z"});
struct TagComponent struct TagComponent
{ {
std::string tag; std::string tag;
@@ -36,19 +43,33 @@ namespace OpenEngine {
struct TransformComponent struct TransformComponent
{ {
glm::mat4 transform{ 1.0f }; glm::vec3 translation = { 0.0f, 0.0f, 0.0f };
glm::vec3 rotation = { 0.0f, 0.0f, 0.0f };
glm::vec3 scale = { 1.0f, 1.0f, 1.0f };
TransformComponent() = default; TransformComponent() = default;
TransformComponent(const TransformComponent&) = default; TransformComponent(const TransformComponent&) = default;
TransformComponent(const glm::mat4& transform_mat) TransformComponent(const glm::vec3& position)
: transform(transform_mat) {} : translation(position) {}
operator glm::mat4() { return transform; }; glm::mat4 GetTransform() const
operator const glm::mat4() const { return transform; }; {
glm::mat4 transform = glm::translate(glm::mat4(1.0f), translation);
transform *= glm::rotate(glm::mat4(1.0f), rotation.x, { 1, 0, 0 })
* glm::rotate(glm::mat4(1.0f), rotation.y, { 0, 1, 0 })
* glm::rotate(glm::mat4(1.0f), rotation.z, { 0, 0, 1 });
transform *= glm::scale(glm::mat4(1.0f), scale);
return transform;
};
void OnImGuiRender(Entity& entity) void OnImGuiRender(Entity& entity)
{ {
ImGui::DragFloat3("Position", glm::value_ptr(transform[3]), 0.1f); DrawVec3Control("Position", translation);
DrawVec3Control("Rotation", rotation);
DrawVec3Control("Scale", scale);
}; };
}; };

View File

@@ -67,7 +67,7 @@ namespace OpenEngine {
float fov = 45.0f; float fov = 45.0f;
float perspective_near = 0.01f, perspective_far = 1000.0f; float perspective_near = 0.01f, perspective_far = 1000.0f;
float aspect_ratio = 0.0f; float aspect_ratio = 16.0f/9.0f;
}; };
} }

View File

@@ -160,10 +160,11 @@ namespace OpenEngine {
const ImVec4 mauve = ImVec4(0.796f, 0.698f, 0.972f, 1.0f); // #cba6f7 const ImVec4 mauve = ImVec4(0.796f, 0.698f, 0.972f, 1.0f); // #cba6f7
const ImVec4 peach = ImVec4(0.980f, 0.709f, 0.572f, 1.0f); // #fab387 const ImVec4 peach = ImVec4(0.980f, 0.709f, 0.572f, 1.0f); // #fab387
const ImVec4 yellow = ImVec4(0.980f, 0.913f, 0.596f, 1.0f); // #f9e2af const ImVec4 yellow = ImVec4(0.980f, 0.913f, 0.596f, 1.0f); // #f9e2af
const ImVec4 red = ImVec4(0.953f, 0.545f, 0.659f, 1.0f); // #f38ba8
const ImVec4 green = ImVec4(0.650f, 0.890f, 0.631f, 1.0f); // #a6e3a1 const ImVec4 green = ImVec4(0.650f, 0.890f, 0.631f, 1.0f); // #a6e3a1
const ImVec4 blue = ImVec4(0.533f, 0.698f, 0.976f, 1.0f); // #89b4fa
const ImVec4 teal = ImVec4(0.580f, 0.886f, 0.819f, 1.0f); // #94e2d5 const ImVec4 teal = ImVec4(0.580f, 0.886f, 0.819f, 1.0f); // #94e2d5
const ImVec4 sapphire = ImVec4(0.458f, 0.784f, 0.878f, 1.0f); // #74c7ec const ImVec4 sapphire = ImVec4(0.458f, 0.784f, 0.878f, 1.0f); // #74c7ec
const ImVec4 blue = ImVec4(0.533f, 0.698f, 0.976f, 1.0f); // #89b4fa
const ImVec4 lavender = ImVec4(0.709f, 0.764f, 0.980f, 1.0f); // #b4befe const ImVec4 lavender = ImVec4(0.709f, 0.764f, 0.980f, 1.0f); // #b4befe
// Main window and backgrounds // Main window and backgrounds

View File

@@ -0,0 +1,74 @@
#include "imgui.h"
#include <pch.hpp>
#include <scene/components.hpp>
namespace OpenEngine {
void DrawVec3Control(const char* label, glm::vec3& values,
float reset_value, float column_width,
const std::array<const char*, 3> labels)
{
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 });
if (ImGui::Button(labels[0], button_size))
values.x = reset_value;
ImGui::PopStyleColor(4);
ImGui::SameLine();
ImGui::DragFloat("##X", &values.x, 0.1f);
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 });
if (ImGui::Button(labels[1], button_size))
values.y = reset_value;
ImGui::PopStyleColor(4);
ImGui::PopStyleVar();
ImGui::SameLine();
ImGui::DragFloat("##Y", &values.y, 0.1f);
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 });
if (ImGui::Button(labels[2], button_size))
values.z = reset_value;
ImGui::PopStyleColor(4);
ImGui::PopStyleVar(1);
ImGui::SameLine();
ImGui::DragFloat("##Z", &values.z, 0.1f);
ImGui::PopItemWidth();
ImGui::PopStyleVar();
ImGui::Columns(1);
ImGui::PopID();
}
}

View File

@@ -34,8 +34,8 @@ namespace OpenEngine {
}); });
} }
Camera* main_camera = nullptr; SceneCamera* main_camera = nullptr;
glm::mat4* main_transform = nullptr; glm::mat4 main_transform{ 1.0f };
{ {
auto camera_view = registry.view<CameraComponent, TransformComponent>(); auto camera_view = registry.view<CameraComponent, TransformComponent>();
for (auto entity : camera_view) { for (auto entity : camera_view) {
@@ -43,19 +43,19 @@ namespace OpenEngine {
if (camera_component.primary) { if (camera_component.primary) {
main_camera = &camera_component.camera; main_camera = &camera_component.camera;
main_transform = &transform.transform; main_transform = transform.GetTransform();
break; break;
} }
} }
if (main_camera) { if (main_camera) {
Renderer2D::BeginScene(main_camera->GetProjection(), *main_transform); Renderer2D::BeginScene(main_camera->GetProjection(), main_transform);
auto view = registry.view<TransformComponent, SpriteRendererComponent>(); auto view = registry.view<TransformComponent, SpriteRendererComponent>();
for (const auto& entity : view) { for (const auto& entity : view) {
auto [transform, sprite] = view.get<TransformComponent, SpriteRendererComponent>(entity); auto [transform, sprite] = view.get<TransformComponent, SpriteRendererComponent>(entity);
Renderer2D::DrawQuad(transform.transform, sprite.color); Renderer2D::DrawQuad(transform.GetTransform(), sprite.color);
} }
Renderer2D::EndScene(); Renderer2D::EndScene();