added play/pause and basic icon storage
This commit is contained in:
@@ -5,6 +5,8 @@
|
||||
#include <open_engine.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/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<Texture2D> 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();
|
||||
|
||||
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<Time::ProfilingResult> profiling_results;
|
||||
|
||||
glm::vec2 world_pos_cursor = { 0.0f, 0.0f };
|
||||
@@ -426,12 +505,18 @@ namespace OpenEngine {
|
||||
Ref<OpenEngine::FrameBuffer> 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<const char*, Ref<Texture2D>> icons;
|
||||
Ref<Scene> scene;
|
||||
Entity selected_entity;
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
67
imgui.ini
67
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=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,738 Selected=0x8C72BEA8
|
||||
DockNode ID=0x00000008 Parent=0x00000006 SizeRef=444,622 Selected=0x5E5F7166
|
||||
DockNode ID=0x00000007 Parent=0x00000006 SizeRef=444,769 Selected=0x8C72BEA8
|
||||
DockNode ID=0x00000008 Parent=0x00000006 SizeRef=444,531 Selected=0x5E5F7166
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -59,7 +59,13 @@ namespace OpenEngine {
|
||||
|
||||
for (const auto& entity : view) {
|
||||
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();
|
||||
|
||||
Reference in New Issue
Block a user