added play/pause and basic icon storage

This commit is contained in:
Erris
2026-02-28 09:42:20 +01:00
parent 9de9609dee
commit 3192d7b9a0
5 changed files with 157 additions and 39 deletions

View File

@@ -5,6 +5,8 @@
#include <open_engine.hpp> #include <open_engine.hpp>
#include "open_engine/application.hpp" #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/entity.hpp"
#include "open_engine/scene/scene_serializer.hpp" #include "open_engine/scene/scene_serializer.hpp"
#include "panels/content_browser.hpp" #include "panels/content_browser.hpp"
@@ -24,6 +26,12 @@
namespace OpenEngine { namespace OpenEngine {
enum class PlayState
{
Edit = 0,
Play = 1
};
class CameraController : public NativeScriptableEntity class CameraController : public NativeScriptableEntity
{ {
public: public:
@@ -85,6 +93,10 @@ namespace OpenEngine {
editor_camera = EditorCamera(30.0f, 1920.0f/1080.0f, 0.1f, 1000.0f); 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 i = 0; i < 200; i++) {
for (float y = 0; y < 200; y++) { for (float y = 0; y < 200; y++) {
@@ -102,6 +114,13 @@ namespace OpenEngine {
scene_hierarchy.Init(scene); scene_hierarchy.Init(scene);
} }
Ref<Texture2D> GetIcon(const char* name)
{
if (icons.contains(name))
return icons[name];
return nullptr;
}
void OnDetach() override void OnDetach() override
{ {
} }
@@ -126,9 +145,19 @@ namespace OpenEngine {
RenderCommand::Clear(); RenderCommand::Clear();
framebuffer->ClearBufferI(1, -1); 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(); auto [mx, my] = ImGui::GetMousePos();
@@ -144,8 +173,10 @@ namespace OpenEngine {
// Mouse Picking // Mouse Picking
if (Input::IsMouseButtonPressed(MouseCode::ButtonLeft) if (Input::IsMouseButtonPressed(MouseCode::ButtonLeft)
&& mouse_x >= 0 && mouse_y >= 0 && mouse_x >= 0 && mouse_y >= 0
&& mouse_x < (int)viewport_size.x && (int)viewport_size.y && && mouse_x < (int)viewport_size.x
!ImGuizmo::IsOver() && !Input::IsKeyPressed(KeyCode::LeftAlt)) { && mouse_y < (int)viewport_size.y
&& !ImGuizmo::IsOver()
&& !Input::IsKeyPressed(KeyCode::LeftAlt)) {
if (!clicked) { if (!clicked) {
int id = framebuffer->ReadPixel(1, mouse_x, mouse_y); int id = framebuffer->ReadPixel(1, mouse_x, mouse_y);
@@ -155,7 +186,6 @@ namespace OpenEngine {
scene_hierarchy.SetSelectedEntity(selected_entity); scene_hierarchy.SetSelectedEntity(selected_entity);
} }
clicked = true; clicked = true;
} else { } else {
clicked = false; clicked = false;
@@ -254,9 +284,9 @@ namespace OpenEngine {
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2{ 0, 0 }); ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2{ 0, 0 });
ImGui::Begin("Viewport"); ImGui::Begin("Viewport");
bool focused = ImGui::IsWindowFocused(); viewport_focused = ImGui::IsWindowFocused(ImGuiFocusedFlags_RootWindow);
bool hovered = ImGui::IsWindowHovered(); viewport_hovered = ImGui::IsWindowHovered(ImGuiHoveredFlags_RootWindow);
Application::Get().GetImGuiLayer()->SetBlockEvents((!focused && !hovered) || ImGui::IsAnyItemActive()); Application::Get().GetImGuiLayer()->SetBlockEvents((!viewport_focused && !viewport_hovered) || ImGui::IsAnyItemActive());
ImVec2 viewport_panel_size = ImGui::GetContentRegionAvail(); 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 void OnImGuiRender() override
{ {
OE_PROFILE_FUNCTION(); OE_PROFILE_FUNCTION();
ImGui::PushStyleVar(ImGuiStyleVar_WindowMinSize, ImVec2(450, 200)); ImGui::PushStyleVar(ImGuiStyleVar_WindowMinSize, ImVec2(450, 35));
{ {
if (ImGui::BeginMainMenuBar()) { if (ImGui::BeginMainMenuBar()) {
if (ImGui::BeginMenu("File")) { if (ImGui::BeginMenu("File")) {
@@ -409,15 +478,25 @@ namespace OpenEngine {
DrawStats(); DrawStats();
scene_hierarchy.OnImGuiRender(); scene_hierarchy.OnImGuiRender();
brower.OnImGuiRender(); browser.OnImGuiRender();
DrawViewport(); DrawViewport();
DrawPlayBar();
ImGui::ShowDemoWindow(); ImGui::ShowDemoWindow();
ImGui::PopStyleVar(); ImGui::PopStyleVar();
}; };
void OnScenePlay()
{
state = PlayState::Play;
}
void OnSceneStop()
{
state = PlayState::Edit;
}
private: private:
ContentBrowserPanel brower; ContentBrowserPanel browser;
std::vector<Time::ProfilingResult> profiling_results; std::vector<Time::ProfilingResult> profiling_results;
glm::vec2 world_pos_cursor = { 0.0f, 0.0f }; glm::vec2 world_pos_cursor = { 0.0f, 0.0f };
@@ -426,12 +505,18 @@ namespace OpenEngine {
Ref<OpenEngine::FrameBuffer> framebuffer; Ref<OpenEngine::FrameBuffer> framebuffer;
glm::vec2 viewport_bounds[2]; glm::vec2 viewport_bounds[2];
bool viewport_focused = false, viewport_hovered = false;
SceneHierarchy scene_hierarchy; SceneHierarchy scene_hierarchy;
EditorCamera editor_camera; EditorCamera editor_camera;
int guizmo_operation = -1; int guizmo_operation = -1;
// TODO: Rename this to GameState
PlayState state = PlayState::Edit;
std::unordered_map<const char*, Ref<Texture2D>> icons;
Ref<Scene> scene; Ref<Scene> scene;
Entity selected_entity; Entity selected_entity;

View File

@@ -16,7 +16,7 @@ namespace OpenEngine {
: current_directory(assets_directory) : current_directory(assets_directory)
{ {
// TODO: Add file texture. Get free icons and add license // 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() void ContentBrowserPanel::OnImGuiRender()

View File

@@ -10,38 +10,39 @@ Collapsed=0
[Window][Statistics] [Window][Statistics]
Pos=0,24 Pos=0,24
Size=409,300 Size=224,437
Collapsed=0 Collapsed=0
DockId=0x00000003,0 DockId=0x00000003,0
[Window][Properties] [Window][Properties]
Pos=822,24 Pos=822,24
Size=450,739 Size=450,805
Collapsed=0 Collapsed=0
DockId=0x00000007,0 DockId=0x00000007,0
[Window][Viewport] [Window][Viewport]
Pos=411,24 Pos=226,61
Size=409,1363 Size=594,956
Collapsed=0 Collapsed=0
DockId=0x00000009,0 DockId=0x00000012,0
[Window][Dear ImGui Demo] [Window][Dear ImGui Demo]
Pos=822,765 Pos=822,831
Size=450,622 Size=450,556
Collapsed=0 Collapsed=0
DockId=0x00000008,0 DockId=0x00000008,0
[Window][Scene] [Window][Scene]
Pos=0,326 Pos=0,463
Size=409,1061 Size=224,924
Collapsed=0 Collapsed=0
DockId=0x00000004,0 DockId=0x00000004,0
[Window][Dear ImGui Style Editor] [Window][Dear ImGui Style Editor]
Pos=60,60 Pos=1308,24
Size=591,1380 Size=800,1001
Collapsed=0 Collapsed=0
DockId=0x0000000E,0
[Window][Example: Console] [Window][Example: Console]
Pos=345,786 Pos=345,786
@@ -133,24 +134,50 @@ Collapsed=0
Pos=343,24 Pos=343,24
Size=1665,1371 Size=1665,1371
Collapsed=0 Collapsed=0
DockId=0x00000009,1 DockId=0x00000012,1
[Window][Graph Editor] [Window][Graph Editor]
Pos=343,24 Pos=343,24
Size=1665,1371 Size=1665,1371
Collapsed=0 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] [Docking][Data]
DockSpace ID=0x08BD597D Window=0x1BBC0F80 Pos=0,24 Size=1272,1363 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=0x00000005 Parent=0x08BD597D SizeRef=820,1386 Split=X
DockNode ID=0x00000001 Parent=0x00000005 SizeRef=409,1386 Split=Y Selected=0xE601B12F DockNode ID=0x00000001 Parent=0x00000005 SizeRef=224,1386 Split=Y Selected=0xE601B12F
DockNode ID=0x00000003 Parent=0x00000001 SizeRef=255,300 Selected=0x553E127E DockNode ID=0x00000003 Parent=0x00000001 SizeRef=255,417 Selected=0x553E127E
DockNode ID=0x00000004 Parent=0x00000001 SizeRef=255,1061 Selected=0xE601B12F DockNode ID=0x00000004 Parent=0x00000001 SizeRef=255,883 Selected=0xE601B12F
DockNode ID=0x00000002 Parent=0x00000005 SizeRef=1697,1386 Split=Y Selected=0xC450F867 DockNode ID=0x00000002 Parent=0x00000005 SizeRef=594,1386 Split=Y Selected=0xC450F867
DockNode ID=0x00000009 Parent=0x00000002 SizeRef=483,784 CentralNode=1 Selected=0xC450F867 DockNode ID=0x00000009 Parent=0x00000002 SizeRef=483,784 Split=Y Selected=0xC450F867
DockNode ID=0x0000000A Parent=0x00000002 SizeRef=483,600 Selected=0x1BCA3180 DockNode ID=0x0000000B Parent=0x00000009 SizeRef=409,932 Split=X Selected=0xC450F867
DockNode ID=0x00000006 Parent=0x08BD597D SizeRef=450,1386 Split=Y Selected=0x8C72BEA8 DockNode ID=0x0000000D Parent=0x0000000B SizeRef=1080,993 Split=Y Selected=0xC450F867
DockNode ID=0x00000007 Parent=0x00000006 SizeRef=444,738 Selected=0x8C72BEA8 DockNode ID=0x0000000F Parent=0x0000000D SizeRef=594,60 Selected=0x8325EBDA
DockNode ID=0x00000008 Parent=0x00000006 SizeRef=444,622 Selected=0x5E5F7166 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

View File

@@ -22,7 +22,7 @@ namespace OpenEngine {
glTextureStorage2D(id, 1, internal_format, width, height); glTextureStorage2D(id, 1, internal_format, width, height);
glTextureParameteri(id, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 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_S, GL_REPEAT);
glTextureParameteri(id, GL_TEXTURE_WRAP_T, GL_REPEAT); glTextureParameteri(id, GL_TEXTURE_WRAP_T, GL_REPEAT);
@@ -59,7 +59,7 @@ namespace OpenEngine {
glTextureStorage2D(id, 1, _internal_format, width, height); glTextureStorage2D(id, 1, _internal_format, width, height);
glTextureParameteri(id, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 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); glTextureSubImage2D(id, 0, 0, 0, width, height, _data_format, GL_UNSIGNED_BYTE, data);

View File

@@ -59,7 +59,13 @@ namespace OpenEngine {
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(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(); Renderer2D::EndScene();