From 3192d7b9a04784aa0cf3890be37898934451d11c Mon Sep 17 00:00:00 2001 From: Erris Date: Sat, 28 Feb 2026 09:42:20 +0100 Subject: [PATCH] added play/pause and basic icon storage --- editor/include/editor.hpp | 107 ++++++++++++++++-- editor/src/panels/content_browser.cpp | 2 +- imgui.ini | 75 ++++++++---- .../src/open_engine/opengl/opengl_texture.cpp | 4 +- open_engine/src/open_engine/scene/scene.cpp | 8 +- 5 files changed, 157 insertions(+), 39 deletions(-) diff --git a/editor/include/editor.hpp b/editor/include/editor.hpp index cba7bee..beed995 100755 --- a/editor/include/editor.hpp +++ b/editor/include/editor.hpp @@ -5,6 +5,8 @@ #include #include "open_engine/application.hpp" +#include "open_engine/logging.hpp" +#include "open_engine/renderer/texture.hpp" #include "open_engine/scene/entity.hpp" #include "open_engine/scene/scene_serializer.hpp" #include "panels/content_browser.hpp" @@ -24,6 +26,12 @@ namespace OpenEngine { + enum class PlayState + { + Edit = 0, + Play = 1 + }; + class CameraController : public NativeScriptableEntity { public: @@ -85,6 +93,10 @@ namespace OpenEngine { editor_camera = EditorCamera(30.0f, 1920.0f/1080.0f, 0.1f, 1000.0f); + icons["play"] = Texture2D::Create("resources/textures/icons/play.png"); + icons["stop"] = Texture2D::Create("resources/textures/icons/stop.png"); + // TODO: Add file texture. Get free icons and add license + //icons["folder"] = Texture2D::Create("resources/textures/icons/folder.png"); /* for (float i = 0; i < 200; i++) { for (float y = 0; y < 200; y++) { @@ -102,6 +114,13 @@ namespace OpenEngine { scene_hierarchy.Init(scene); } + Ref GetIcon(const char* name) + { + if (icons.contains(name)) + return icons[name]; + return nullptr; + } + void OnDetach() override { } @@ -126,9 +145,19 @@ namespace OpenEngine { RenderCommand::Clear(); framebuffer->ClearBufferI(1, -1); - editor_camera.OnUpdate(); - scene->OnUpdateEditor(editor_camera); + switch (state) { + case PlayState::Play: { + scene->OnUpdateRuntime(); + break; + } + case PlayState::Edit: { + if (viewport_focused) + editor_camera.OnUpdate(); + scene->OnUpdateEditor(editor_camera); + break; + } + } auto [mx, my] = ImGui::GetMousePos(); @@ -144,8 +173,10 @@ namespace OpenEngine { // Mouse Picking if (Input::IsMouseButtonPressed(MouseCode::ButtonLeft) && mouse_x >= 0 && mouse_y >= 0 - && mouse_x < (int)viewport_size.x && (int)viewport_size.y && - !ImGuizmo::IsOver() && !Input::IsKeyPressed(KeyCode::LeftAlt)) { + && mouse_x < (int)viewport_size.x + && mouse_y < (int)viewport_size.y + && !ImGuizmo::IsOver() + && !Input::IsKeyPressed(KeyCode::LeftAlt)) { if (!clicked) { int id = framebuffer->ReadPixel(1, mouse_x, mouse_y); @@ -155,7 +186,6 @@ namespace OpenEngine { scene_hierarchy.SetSelectedEntity(selected_entity); } - clicked = true; } else { clicked = false; @@ -254,9 +284,9 @@ namespace OpenEngine { ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2{ 0, 0 }); ImGui::Begin("Viewport"); - bool focused = ImGui::IsWindowFocused(); - bool hovered = ImGui::IsWindowHovered(); - Application::Get().GetImGuiLayer()->SetBlockEvents((!focused && !hovered) || ImGui::IsAnyItemActive()); + viewport_focused = ImGui::IsWindowFocused(ImGuiFocusedFlags_RootWindow); + viewport_hovered = ImGui::IsWindowHovered(ImGuiHoveredFlags_RootWindow); + Application::Get().GetImGuiLayer()->SetBlockEvents((!viewport_focused && !viewport_hovered) || ImGui::IsAnyItemActive()); ImVec2 viewport_panel_size = ImGui::GetContentRegionAvail(); @@ -370,11 +400,50 @@ namespace OpenEngine { } } + void DrawPlayBar() + { + ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, { 0, 2 }); + ImGui::PushStyleVar(ImGuiStyleVar_ItemInnerSpacing, { 0, 0 }); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, { 0, 0 }); + ImGui::PushStyleColor(ImGuiCol_Button, { 0, 0, 0, 0 }); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, { 0.200f, 0.207f, 0.286f, 1.0f }); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, { 0, 0, 0, 0 }); + + ImGui::Begin("##play_state_bar", nullptr, ImGuiWindowFlags_NoDecoration + | ImGuiWindowFlags_NoScrollWithMouse + | ImGuiWindowFlags_NoScrollbar + | ImGuiWindowFlags_NoTitleBar); + + float size = ImGui::GetContentRegionAvail().y; + + auto icon = state == PlayState::Play ? icons["stop"] : icons["play"]; + + ImGui::SetCursorPosX((ImGui::GetContentRegionAvail().x * 0.5) - (size * 0.5) ); + if (ImGui::ImageButton("##play_button", + (ImTextureID)icon->GetID(), { size, size })) { + switch (state) { + case PlayState::Play : { + OnSceneStop(); + break; + } + case PlayState::Edit : { + OnScenePlay(); + break; + } + } + } + + ImGui::End(); + + ImGui::PopStyleColor(3); + ImGui::PopStyleVar(3); + } + void OnImGuiRender() override { OE_PROFILE_FUNCTION(); - ImGui::PushStyleVar(ImGuiStyleVar_WindowMinSize, ImVec2(450, 200)); + ImGui::PushStyleVar(ImGuiStyleVar_WindowMinSize, ImVec2(450, 35)); { if (ImGui::BeginMainMenuBar()) { if (ImGui::BeginMenu("File")) { @@ -409,15 +478,25 @@ namespace OpenEngine { DrawStats(); scene_hierarchy.OnImGuiRender(); - brower.OnImGuiRender(); + browser.OnImGuiRender(); DrawViewport(); + DrawPlayBar(); ImGui::ShowDemoWindow(); ImGui::PopStyleVar(); }; + void OnScenePlay() + { + state = PlayState::Play; + } + void OnSceneStop() + { + state = PlayState::Edit; + } + private: - ContentBrowserPanel brower; + ContentBrowserPanel browser; std::vector profiling_results; glm::vec2 world_pos_cursor = { 0.0f, 0.0f }; @@ -426,12 +505,18 @@ namespace OpenEngine { Ref framebuffer; glm::vec2 viewport_bounds[2]; + bool viewport_focused = false, viewport_hovered = false; + SceneHierarchy scene_hierarchy; EditorCamera editor_camera; int guizmo_operation = -1; + // TODO: Rename this to GameState + PlayState state = PlayState::Edit; + + std::unordered_map> icons; Ref scene; Entity selected_entity; diff --git a/editor/src/panels/content_browser.cpp b/editor/src/panels/content_browser.cpp index 43ed493..acb26cd 100644 --- a/editor/src/panels/content_browser.cpp +++ b/editor/src/panels/content_browser.cpp @@ -16,7 +16,7 @@ namespace OpenEngine { : current_directory(assets_directory) { // TODO: Add file texture. Get free icons and add license - folder_icon = Texture2D::Create("resources/textures/folder.png"); + folder_icon = Texture2D::Create("resources/textures/icons/folder.png"); } void ContentBrowserPanel::OnImGuiRender() diff --git a/imgui.ini b/imgui.ini index 0935092..7fa393d 100644 --- a/imgui.ini +++ b/imgui.ini @@ -10,38 +10,39 @@ Collapsed=0 [Window][Statistics] Pos=0,24 -Size=409,300 +Size=224,437 Collapsed=0 DockId=0x00000003,0 [Window][Properties] Pos=822,24 -Size=450,739 +Size=450,805 Collapsed=0 DockId=0x00000007,0 [Window][Viewport] -Pos=411,24 -Size=409,1363 +Pos=226,61 +Size=594,956 Collapsed=0 -DockId=0x00000009,0 +DockId=0x00000012,0 [Window][Dear ImGui Demo] -Pos=822,765 -Size=450,622 +Pos=822,831 +Size=450,556 Collapsed=0 DockId=0x00000008,0 [Window][Scene] -Pos=0,326 -Size=409,1061 +Pos=0,463 +Size=224,924 Collapsed=0 DockId=0x00000004,0 [Window][Dear ImGui Style Editor] -Pos=60,60 -Size=591,1380 +Pos=1308,24 +Size=800,1001 Collapsed=0 +DockId=0x0000000E,0 [Window][Example: Console] Pos=345,786 @@ -133,24 +134,50 @@ Collapsed=0 Pos=343,24 Size=1665,1371 Collapsed=0 -DockId=0x00000009,1 +DockId=0x00000012,1 [Window][Graph Editor] Pos=343,24 Size=1665,1371 Collapsed=0 -DockId=0x00000009,1 +DockId=0x00000012,1 + +[Window][Assets] +Pos=226,1019 +Size=594,368 +Collapsed=0 +DockId=0x0000000C,0 + +[Window][##play] +Pos=226,24 +Size=594,60 +Collapsed=0 +DockId=0x0000000F,0 + +[Window][##play_state_bar] +Pos=226,24 +Size=594,35 +Collapsed=0 +DockId=0x00000011,0 [Docking][Data] -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,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 - DockNode ID=0x00000006 Parent=0x08BD597D SizeRef=450,1386 Split=Y Selected=0x8C72BEA8 - DockNode ID=0x00000007 Parent=0x00000006 SizeRef=444,738 Selected=0x8C72BEA8 - DockNode ID=0x00000008 Parent=0x00000006 SizeRef=444,622 Selected=0x5E5F7166 +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=224,1386 Split=Y Selected=0xE601B12F + DockNode ID=0x00000003 Parent=0x00000001 SizeRef=255,417 Selected=0x553E127E + DockNode ID=0x00000004 Parent=0x00000001 SizeRef=255,883 Selected=0xE601B12F + DockNode ID=0x00000002 Parent=0x00000005 SizeRef=594,1386 Split=Y Selected=0xC450F867 + DockNode ID=0x00000009 Parent=0x00000002 SizeRef=483,784 Split=Y Selected=0xC450F867 + DockNode ID=0x0000000B Parent=0x00000009 SizeRef=409,932 Split=X Selected=0xC450F867 + DockNode ID=0x0000000D Parent=0x0000000B SizeRef=1080,993 Split=Y Selected=0xC450F867 + DockNode ID=0x0000000F Parent=0x0000000D SizeRef=594,60 Selected=0x8325EBDA + DockNode ID=0x00000010 Parent=0x0000000D SizeRef=594,931 Split=Y Selected=0xC450F867 + DockNode ID=0x00000011 Parent=0x00000010 SizeRef=594,35 HiddenTabBar=1 Selected=0xAB37695D + DockNode ID=0x00000012 Parent=0x00000010 SizeRef=594,956 CentralNode=1 Selected=0xC450F867 + DockNode ID=0x0000000E Parent=0x0000000B SizeRef=800,993 Selected=0x3EEA4247 + DockNode ID=0x0000000C Parent=0x00000009 SizeRef=409,368 Selected=0x42C24103 + DockNode ID=0x0000000A Parent=0x00000002 SizeRef=483,600 Selected=0x1BCA3180 + DockNode ID=0x00000006 Parent=0x08BD597D SizeRef=450,1386 Split=Y Selected=0x8C72BEA8 + DockNode ID=0x00000007 Parent=0x00000006 SizeRef=444,769 Selected=0x8C72BEA8 + DockNode ID=0x00000008 Parent=0x00000006 SizeRef=444,531 Selected=0x5E5F7166 diff --git a/open_engine/src/open_engine/opengl/opengl_texture.cpp b/open_engine/src/open_engine/opengl/opengl_texture.cpp index f8c16a8..28275c5 100644 --- a/open_engine/src/open_engine/opengl/opengl_texture.cpp +++ b/open_engine/src/open_engine/opengl/opengl_texture.cpp @@ -22,7 +22,7 @@ namespace OpenEngine { glTextureStorage2D(id, 1, internal_format, width, height); glTextureParameteri(id, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTextureParameteri(id, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTextureParameteri(id, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTextureParameteri(id, GL_TEXTURE_WRAP_S, GL_REPEAT); glTextureParameteri(id, GL_TEXTURE_WRAP_T, GL_REPEAT); @@ -59,7 +59,7 @@ namespace OpenEngine { glTextureStorage2D(id, 1, _internal_format, width, height); glTextureParameteri(id, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTextureParameteri(id, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTextureParameteri(id, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTextureSubImage2D(id, 0, 0, 0, width, height, _data_format, GL_UNSIGNED_BYTE, data); diff --git a/open_engine/src/open_engine/scene/scene.cpp b/open_engine/src/open_engine/scene/scene.cpp index 467a16d..c9cbb6e 100644 --- a/open_engine/src/open_engine/scene/scene.cpp +++ b/open_engine/src/open_engine/scene/scene.cpp @@ -59,7 +59,13 @@ namespace OpenEngine { for (const auto& entity : view) { auto [transform, sprite] = view.get(entity); - Renderer2D::DrawQuad(GetTransformFromComp(transform), sprite.color, (int)entity); + + if (sprite.texture) + Renderer2D::DrawQuad(GetTransformFromComp(transform), + sprite.texture, sprite.color, (int)entity, sprite.tiling_factor); + else + Renderer2D::DrawQuad(GetTransformFromComp(transform), + sprite.color, (int)entity); } Renderer2D::EndScene();