added play/pause and basic icon storage
This commit is contained in:
@@ -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();
|
|
||||||
|
|
||||||
|
switch (state) {
|
||||||
|
case PlayState::Play: {
|
||||||
|
scene->OnUpdateRuntime();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case PlayState::Edit: {
|
||||||
|
if (viewport_focused)
|
||||||
|
editor_camera.OnUpdate();
|
||||||
scene->OnUpdateEditor(editor_camera);
|
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;
|
||||||
|
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
67
imgui.ini
67
imgui.ini
@@ -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=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=0x0000000A Parent=0x00000002 SizeRef=483,600 Selected=0x1BCA3180
|
||||||
DockNode ID=0x00000006 Parent=0x08BD597D SizeRef=450,1386 Split=Y Selected=0x8C72BEA8
|
DockNode ID=0x00000006 Parent=0x08BD597D SizeRef=450,1386 Split=Y Selected=0x8C72BEA8
|
||||||
DockNode ID=0x00000007 Parent=0x00000006 SizeRef=444,738 Selected=0x8C72BEA8
|
DockNode ID=0x00000007 Parent=0x00000006 SizeRef=444,769 Selected=0x8C72BEA8
|
||||||
DockNode ID=0x00000008 Parent=0x00000006 SizeRef=444,622 Selected=0x5E5F7166
|
DockNode ID=0x00000008 Parent=0x00000006 SizeRef=444,531 Selected=0x5E5F7166
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user