Improved architecute
further abstracting away the runtime
This commit is contained in:
		
							
								
								
									
										9
									
								
								Editor/src/EditorContext.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								Editor/src/EditorContext.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,9 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
struct EditorContext {
 | 
			
		||||
    std::shared_ptr<Project> CurrentProject;
 | 
			
		||||
    Scene MainScene;
 | 
			
		||||
 | 
			
		||||
    EditorContext() = default;
 | 
			
		||||
    EditorContext(EditorContext& other) = default;
 | 
			
		||||
    ~EditorContext() = default;
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										70
									
								
								Editor/src/SceneRuntime.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								Editor/src/SceneRuntime.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,70 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
#include "../../YoggieEngine/src/BarinkEngine.h"
 | 
			
		||||
#include "../../YoggieEngine/src/AssetManager/ModelImporter.h"
 | 
			
		||||
#include "../../YoggieEngine/src/Graphics/Memory/Framebuffer.h"
 | 
			
		||||
#include "../../YoggieEngine/src/PerfCounter.cpp"
 | 
			
		||||
#include "../../YoggieEngine/src/Scene/Entity.h"
 | 
			
		||||
#include "Project.h"
 | 
			
		||||
 | 
			
		||||
class SceneRuntime : public  ApplicationRuntime {
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
    SceneRuntime() = default;
 | 
			
		||||
	void Start() override  
 | 
			
		||||
	{
 | 
			
		||||
        CurrentProject = std::make_shared<Project>("Random");
 | 
			
		||||
 | 
			
		||||
        framebuffer = new Framebuffer();
 | 
			
		||||
       
 | 
			
		||||
        // Create a level and load it as the current level
 | 
			
		||||
        auto importer = ModelImporter();
 | 
			
		||||
 | 
			
		||||
        // Create a cube 
 | 
			
		||||
        Model = importer.Import("build/Debug/Models/Cube.obj");
 | 
			
		||||
        cube = MainScene.AddEntity("cube");
 | 
			
		||||
 | 
			
		||||
        auto& render3DComponent = cube.AddComponent<Render3DComponent>();
 | 
			
		||||
        render3DComponent.mesh = *(Model->renderable->mesh);
 | 
			
		||||
 | 
			
		||||
        cube.GetComponent<TransformComponent>().Position = glm::vec3(1.0f, 0.0f, 5.0f);
 | 
			
		||||
 | 
			
		||||
        auto cube2 = MainScene.AddEntity("Cube1");
 | 
			
		||||
        auto& rendercube2 = cube2.AddComponent<Render3DComponent>();
 | 
			
		||||
        rendercube2.mesh = *(Model->renderable->mesh);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        // create an ambient light source
 | 
			
		||||
        auto AmbientLight = MainScene.AddEntity("AmbientLight");
 | 
			
		||||
        auto light = AmbientLight.AddComponent<LightComponent>();
 | 
			
		||||
        light.Color = glm::vec3(1.0f);
 | 
			
		||||
        light.Strength = 1.0f;
 | 
			
		||||
 | 
			
		||||
        Selected = (entt::entity)-1;
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	void Update() override  
 | 
			
		||||
	{
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void FixedUpdate() override 
 | 
			
		||||
	{
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	void Stop() override 
 | 
			
		||||
	{
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    std::shared_ptr<Project> CurrentProject = nullptr;
 | 
			
		||||
    Scene MainScene;
 | 
			
		||||
 | 
			
		||||
    Framebuffer* framebuffer;
 | 
			
		||||
    SceneObject* Model;
 | 
			
		||||
    Entity cube;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    entt::entity  Selected;
 | 
			
		||||
    friend class Editor;
 | 
			
		||||
};
 | 
			
		||||
@ -108,7 +108,7 @@ void SceneExplorer(entt::entity& selected, Scene& scene )
 | 
			
		||||
    ImGui::End();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Viewport(Framebuffer& framebuffer, Scene& scene) {
 | 
			
		||||
void Viewport(Framebuffer& framebuffer) {
 | 
			
		||||
 | 
			
		||||
    unsigned int viewportWindowFlags = ImGuiWindowFlags_NoTitleBar
 | 
			
		||||
        | ImGuiWindowFlags_NoDecoration
 | 
			
		||||
 | 
			
		||||
@ -17,7 +17,7 @@ void Inspector(entt::entity entity, Scene& scene);
 | 
			
		||||
 | 
			
		||||
void SceneExplorer(entt::entity& selected, Scene& scene);
 | 
			
		||||
 | 
			
		||||
void Viewport(Framebuffer& framebuffer, Scene& scene);
 | 
			
		||||
void Viewport(Framebuffer& framebuffer);
 | 
			
		||||
 | 
			
		||||
void Settings();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										270
									
								
								Editor/src/app.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										270
									
								
								Editor/src/app.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,270 @@
 | 
			
		||||
#include <glm/gtc/type_ptr.hpp>
 | 
			
		||||
#include <glm/gtc/matrix_transform.hpp>
 | 
			
		||||
#include <imgui.h>
 | 
			
		||||
#include <backends/imgui_impl_opengl3.h>
 | 
			
		||||
#include <backends/imgui_impl_glfw.h>
 | 
			
		||||
#include <imgui_internal.h>
 | 
			
		||||
#include <nfd.h>
 | 
			
		||||
 | 
			
		||||
#include "../../libs/guizmo/ImGuizmo.h"
 | 
			
		||||
 | 
			
		||||
#include "UI/Widgets.h"
 | 
			
		||||
#include "Project.h"
 | 
			
		||||
#include "SceneSerializer.h"
 | 
			
		||||
#include "EditorContext.h"
 | 
			
		||||
#include "SceneRuntime.h"
 | 
			
		||||
#include "../../YoggieEngine/src/BarinkEngine.h"
 | 
			
		||||
 | 
			
		||||
const unsigned int MS_PER_UPDATE = 2;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Editor : public Application {
 | 
			
		||||
public:
 | 
			
		||||
    Editor() : Application("Editor") {}
 | 
			
		||||
    void Run() override
 | 
			
		||||
    {
 | 
			
		||||
        BarinkWindow mainWindow = BarinkWindow(1200, 700);
 | 
			
		||||
        
 | 
			
		||||
        InputSystem = new InputManager();
 | 
			
		||||
        renderer = new Renderer();
 | 
			
		||||
 | 
			
		||||
        InputSystem->attach(&mainWindow);
 | 
			
		||||
 | 
			
		||||
        InitImGui(mainWindow);
 | 
			
		||||
 | 
			
		||||
        activeRuntime.Start();
 | 
			
		||||
 | 
			
		||||
        double previous = glfwGetTime();
 | 
			
		||||
        double lag = 0.0;
 | 
			
		||||
 | 
			
		||||
        renderer->Prepare(activeRuntime.MainScene);
 | 
			
		||||
 | 
			
		||||
        while (!mainWindow.WindowShouldClose())
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
            double current = glfwGetTime();
 | 
			
		||||
            double elapsed = current - previous;
 | 
			
		||||
            previous = current;
 | 
			
		||||
            lag += elapsed;
 | 
			
		||||
 | 
			
		||||
            InputSystem->PollEvents();
 | 
			
		||||
 | 
			
		||||
            while (lag >= MS_PER_UPDATE) 
 | 
			
		||||
            {
 | 
			
		||||
                activeRuntime.Update();
 | 
			
		||||
                lag -= MS_PER_UPDATE;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            renderer->Render(activeRuntime.framebuffer, activeRuntime.MainScene);
 | 
			
		||||
            
 | 
			
		||||
            ImGuiBegin();
 | 
			
		||||
            RenderGUI();
 | 
			
		||||
            ImGuiEnd();
 | 
			
		||||
 | 
			
		||||
            mainWindow.SwapBuffers();
 | 
			
		||||
            glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        activeRuntime.Stop();
 | 
			
		||||
 | 
			
		||||
        delete InputSystem;
 | 
			
		||||
        delete renderer;
 | 
			
		||||
 | 
			
		||||
        ImGui_ImplOpenGL3_Shutdown();
 | 
			
		||||
        ImGui_ImplGlfw_Shutdown();
 | 
			
		||||
        ImGui::DestroyContext();
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void InitImGui(BarinkWindow& window ) 
 | 
			
		||||
    {
 | 
			
		||||
        IMGUI_CHECKVERSION();
 | 
			
		||||
        ImGui::CreateContext();
 | 
			
		||||
        ImGuiIO& io = ImGui::GetIO();
 | 
			
		||||
        io.ConfigFlags |= ImGuiConfigFlags_::ImGuiConfigFlags_ViewportsEnable;
 | 
			
		||||
        io.ConfigFlags |= ImGuiConfigFlags_::ImGuiConfigFlags_DockingEnable;
 | 
			
		||||
        io.Fonts->AddFontFromFileTTF("build/Debug/Fonts/Roboto-Regular.ttf", 18);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        ImGui::StyleColorsDark();
 | 
			
		||||
 | 
			
		||||
        ImGui_ImplGlfw_InitForOpenGL(window.windowptr(), true);
 | 
			
		||||
        ImGui_ImplOpenGL3_Init("#version 440");
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void ImGuiBegin() {
 | 
			
		||||
        ImGui_ImplGlfw_NewFrame();
 | 
			
		||||
        ImGui_ImplOpenGL3_NewFrame();
 | 
			
		||||
 | 
			
		||||
        ImGui::NewFrame();
 | 
			
		||||
 | 
			
		||||
        ImGuizmo::SetOrthographic(true);
 | 
			
		||||
        ImGuizmo::BeginFrame();
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void ImGuiEnd() {
 | 
			
		||||
        ImGui::EndFrame();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        ImGui::Render();
 | 
			
		||||
        ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
 | 
			
		||||
 | 
			
		||||
        if (ImGui::GetIO().ConfigFlags & ImGuiConfigFlags_ViewportsEnable)
 | 
			
		||||
        {
 | 
			
		||||
            GLFWwindow* last_context = glfwGetCurrentContext();
 | 
			
		||||
            ImGui::UpdatePlatformWindows();
 | 
			
		||||
            ImGui::RenderPlatformWindowsDefault();
 | 
			
		||||
            glfwMakeContextCurrent(last_context);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    void RenderGUI() {
 | 
			
		||||
        ImGui::DockSpaceOverViewport(ImGui::GetMainViewport());
 | 
			
		||||
 | 
			
		||||
        // Show a menu bar
 | 
			
		||||
 | 
			
		||||
        ImGui::BeginMainMenuBar();
 | 
			
		||||
 | 
			
		||||
        if (ImGui::BeginMenu("Application")) {
 | 
			
		||||
 | 
			
		||||
            if (ImGui::MenuItem("Load Project"))
 | 
			
		||||
            {
 | 
			
		||||
                nfdresult_t result = NFD_OpenDialog({ "yproj" }, NULL, &path);
 | 
			
		||||
                switch (result) {
 | 
			
		||||
                case(NFD_OKAY):
 | 
			
		||||
                    Project::LoadProject(path, activeRuntime.CurrentProject);
 | 
			
		||||
                    break;
 | 
			
		||||
                case(NFD_CANCEL):
 | 
			
		||||
                    break;
 | 
			
		||||
                case(NFD_ERROR):
 | 
			
		||||
                    std::cout << "NFD_Error: " << NFD_GetError() << std::endl;
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (ImGui::MenuItem("Save project as...")) {
 | 
			
		||||
                nfdresult_t result = NFD_SaveDialog({ "yproj" }, NULL, &savePath);
 | 
			
		||||
                switch (result) {
 | 
			
		||||
                case(NFD_OKAY):
 | 
			
		||||
                    std::cout << "Save as: " << savePath << std::endl;
 | 
			
		||||
                    Project::SaveProject(savePath, *activeRuntime.CurrentProject.get());
 | 
			
		||||
                    break;
 | 
			
		||||
                case(NFD_CANCEL):
 | 
			
		||||
                    break;
 | 
			
		||||
                case(NFD_ERROR):
 | 
			
		||||
                    std::cout << "NFD_Error: " << NFD_GetError() << std::endl;
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            if (ImGui::MenuItem("Preferences"))
 | 
			
		||||
            {
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (ImGui::MenuItem("Exit"))
 | 
			
		||||
            {
 | 
			
		||||
                // TODO: Exit application
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            ImGui::EndMenu();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        if (ImGui::BeginMenu("Scene")) {
 | 
			
		||||
 | 
			
		||||
            if (ImGui::MenuItem("Save scene"))
 | 
			
		||||
            {
 | 
			
		||||
                nfdresult_t result = NFD_SaveDialog({ "yscene" }, NULL, &scenePath);
 | 
			
		||||
                switch (result) {
 | 
			
		||||
                case(NFD_OKAY):
 | 
			
		||||
                    SaveScene(scenePath,  activeRuntime.MainScene);
 | 
			
		||||
                    break;
 | 
			
		||||
                case(NFD_CANCEL):
 | 
			
		||||
                    break;
 | 
			
		||||
                case(NFD_ERROR):
 | 
			
		||||
                    std::cout << "NFD_Error: " << NFD_GetError() << std::endl;
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (ImGui::MenuItem("Load scene"))
 | 
			
		||||
            {
 | 
			
		||||
                auto result = NFD_OpenDialog({ "yscene" }, NULL, &openScenePath);
 | 
			
		||||
                switch (result) {
 | 
			
		||||
                case (NFD_OKAY):
 | 
			
		||||
                   LoadScene(openScenePath, activeRuntime.MainScene);
 | 
			
		||||
                    break;
 | 
			
		||||
                case(NFD_CANCEL):
 | 
			
		||||
                    break;
 | 
			
		||||
                case(NFD_ERROR):
 | 
			
		||||
                    std::cout << "NFD_Error: " << NFD_GetError() << std::endl;
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (ImGui::MenuItem("Add Entity")) {
 | 
			
		||||
                activeRuntime.MainScene.AddEntity("New Entity");
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            ImGui::EndMenu();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        ImGui::EndMainMenuBar();
 | 
			
		||||
 | 
			
		||||
        ImGui::Begin("ProjectInfo");
 | 
			
		||||
        ImGui::Text("Project: %s", activeRuntime.CurrentProject.get()->GetName().c_str());
 | 
			
		||||
        ImGui::Text("Directory: %s", activeRuntime.CurrentProject.get()->GetProjectDirectory().u8string().c_str());
 | 
			
		||||
        ImGui::End();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        //ShowStats();
 | 
			
		||||
        Viewport(*activeRuntime.framebuffer);
 | 
			
		||||
        SceneExplorer(activeRuntime.Selected, activeRuntime.MainScene);
 | 
			
		||||
        Inspector(activeRuntime.Selected, activeRuntime.MainScene);
 | 
			
		||||
 | 
			
		||||
        Settings();
 | 
			
		||||
        AssetsFinder();
 | 
			
		||||
        Console();
 | 
			
		||||
 | 
			
		||||
        ImGui::ShowDemoWindow();
 | 
			
		||||
        ImGui::ShowMetricsWindow();
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    EditorContext context;
 | 
			
		||||
    SceneRuntime activeRuntime ;
 | 
			
		||||
    char* path = nullptr;
 | 
			
		||||
    char* savePath = nullptr;
 | 
			
		||||
    char* scenePath = nullptr;
 | 
			
		||||
    char* openScenePath = nullptr;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int main (int argc , char* argv[]) {
 | 
			
		||||
 | 
			
		||||
    Editor().Run();
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,242 +0,0 @@
 | 
			
		||||
#include <glm/gtc/type_ptr.hpp>
 | 
			
		||||
#include <glm/gtc/matrix_transform.hpp>
 | 
			
		||||
#include <imgui.h>
 | 
			
		||||
#include <imgui_internal.h>
 | 
			
		||||
#include <nfd.h>
 | 
			
		||||
 | 
			
		||||
#include "../../libs/guizmo/ImGuizmo.h"
 | 
			
		||||
#include "../../YoggieEngine/src/BarinkEngine.h"
 | 
			
		||||
#include "../../YoggieEngine/src/AssetManager/ModelImporter.h"
 | 
			
		||||
#include "../../YoggieEngine/src/Graphics/Memory/Framebuffer.h"
 | 
			
		||||
#include "../../YoggieEngine/src/PerfCounter.cpp"
 | 
			
		||||
#include "../../YoggieEngine/src/Scene/Entity.h"
 | 
			
		||||
#include "UI/Widgets.h"
 | 
			
		||||
#include "Project.h"
 | 
			
		||||
#include "SceneSerializer.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
using namespace YoggieEngine;
 | 
			
		||||
/*
 | 
			
		||||
* Define globals
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
struct EditorContext  {
 | 
			
		||||
    Project CurrentProject;
 | 
			
		||||
    Scene MainScene;
 | 
			
		||||
 | 
			
		||||
    EditorContext() = default;
 | 
			
		||||
    EditorContext(EditorContext& other) = default;
 | 
			
		||||
    ~EditorContext() = default;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
std::shared_ptr<Project> CurrentProject;
 | 
			
		||||
Scene MainScene;
 | 
			
		||||
 | 
			
		||||
Framebuffer* framebuffer;
 | 
			
		||||
SceneObject* Model;
 | 
			
		||||
Entity cube;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
entt::entity  Selected;
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
* Runs once at startup
 | 
			
		||||
* - USe to initialize the game/sandbox/demo
 | 
			
		||||
*/
 | 
			
		||||
void Start() {
 | 
			
		||||
 | 
			
		||||
    CurrentProject = std::make_shared<Project>("Random");
 | 
			
		||||
    auto io = ImGui::GetIO();
 | 
			
		||||
    io.Fonts->AddFontFromFileTTF("build/Debug/Fonts/Roboto-Regular.ttf", 18);
 | 
			
		||||
 
 | 
			
		||||
    framebuffer = new Framebuffer();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    // Create a level and load it as the current level
 | 
			
		||||
    auto importer = ModelImporter();
 | 
			
		||||
    
 | 
			
		||||
    // Create a cube 
 | 
			
		||||
    Model = importer.Import("build/Debug/Models/Cube.obj");
 | 
			
		||||
    cube = MainScene.AddEntity("cube");
 | 
			
		||||
    
 | 
			
		||||
    auto& render3DComponent = cube.AddComponent<Render3DComponent>();
 | 
			
		||||
    render3DComponent.mesh = *(Model->renderable->mesh);
 | 
			
		||||
 | 
			
		||||
    cube.GetComponent<TransformComponent>().Position = glm::vec3(1.0f, 0.0f, 5.0f);
 | 
			
		||||
    
 | 
			
		||||
    auto cube2 = MainScene.AddEntity("Cube1");
 | 
			
		||||
    auto& rendercube2 = cube2.AddComponent<Render3DComponent>();
 | 
			
		||||
    rendercube2.mesh = *(Model->renderable->mesh);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    // create an ambient light source
 | 
			
		||||
    auto AmbientLight = MainScene.AddEntity("AmbientLight");
 | 
			
		||||
    auto light = AmbientLight.AddComponent<LightComponent>();
 | 
			
		||||
    light.Color = glm::vec3(1.0f);
 | 
			
		||||
    light.Strength = 1.0f;
 | 
			
		||||
 | 
			
		||||
    Selected = (entt::entity) -1;
 | 
			
		||||
 | 
			
		||||
    renderer.Prepare(MainScene);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
char* path = nullptr;
 | 
			
		||||
char* savePath = nullptr;
 | 
			
		||||
char* scenePath = nullptr;
 | 
			
		||||
char* openScenePath = nullptr;
 | 
			
		||||
/*
 | 
			
		||||
* Runs every frame
 | 
			
		||||
* - Use to draw Immediate mode graphics (Not meant for HUD's )
 | 
			
		||||
*/
 | 
			
		||||
void ImmediateGraphicsDraw()
 | 
			
		||||
{   ImGui::DockSpaceOverViewport(ImGui::GetMainViewport());
 | 
			
		||||
     
 | 
			
		||||
    // Show a menu bar
 | 
			
		||||
 | 
			
		||||
    ImGui::BeginMainMenuBar();
 | 
			
		||||
 | 
			
		||||
    if (ImGui::BeginMenu("Application")) {
 | 
			
		||||
 | 
			
		||||
        if (ImGui::MenuItem("Load Project")) 
 | 
			
		||||
        {
 | 
			
		||||
            nfdresult_t result = NFD_OpenDialog({ "yproj" }, NULL, &path);
 | 
			
		||||
                switch (result) {
 | 
			
		||||
                case(NFD_OKAY):
 | 
			
		||||
                    Project::LoadProject( path, CurrentProject);
 | 
			
		||||
                    break;
 | 
			
		||||
                case(NFD_CANCEL):
 | 
			
		||||
                    break;
 | 
			
		||||
                case(NFD_ERROR):
 | 
			
		||||
                    std::cout << "NFD_Error: " << NFD_GetError() << std::endl;
 | 
			
		||||
                    break;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (ImGui::MenuItem("Save project as...")) {
 | 
			
		||||
            nfdresult_t result = NFD_SaveDialog({ "yproj" }, NULL, &savePath);
 | 
			
		||||
            switch (result) {
 | 
			
		||||
            case(NFD_OKAY):
 | 
			
		||||
                std::cout << "Save as: " << savePath << std::endl;
 | 
			
		||||
                Project::SaveProject(savePath, *CurrentProject.get());
 | 
			
		||||
                break;
 | 
			
		||||
            case(NFD_CANCEL):
 | 
			
		||||
                break;
 | 
			
		||||
            case(NFD_ERROR):
 | 
			
		||||
                std::cout << "NFD_Error: " << NFD_GetError() << std::endl;
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        if (ImGui::MenuItem("Preferences"))
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (ImGui::MenuItem("Exit"))
 | 
			
		||||
        {
 | 
			
		||||
            // TODO: Exit application
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ImGui::EndMenu();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    if (ImGui::BeginMenu("Scene")) {
 | 
			
		||||
 | 
			
		||||
        if (ImGui::MenuItem("Save scene"))
 | 
			
		||||
        {
 | 
			
		||||
            nfdresult_t result= NFD_SaveDialog({"yscene"},NULL, &scenePath);
 | 
			
		||||
            switch (result) {
 | 
			
		||||
            case(NFD_OKAY):
 | 
			
		||||
                SaveScene(scenePath, MainScene);
 | 
			
		||||
                break;
 | 
			
		||||
            case(NFD_CANCEL):
 | 
			
		||||
                break;
 | 
			
		||||
            case(NFD_ERROR):
 | 
			
		||||
                std::cout << "NFD_Error: " << NFD_GetError() << std::endl;
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (ImGui::MenuItem("Load scene"))
 | 
			
		||||
        {
 | 
			
		||||
            auto result = NFD_OpenDialog({ "yscene" }, NULL, &openScenePath);
 | 
			
		||||
            switch (result) {
 | 
			
		||||
            case (NFD_OKAY):
 | 
			
		||||
                LoadScene(openScenePath, MainScene);
 | 
			
		||||
                break;
 | 
			
		||||
            case(NFD_CANCEL):
 | 
			
		||||
                break;
 | 
			
		||||
            case(NFD_ERROR):
 | 
			
		||||
                std::cout << "NFD_Error: " << NFD_GetError() << std::endl;
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (ImGui::MenuItem("Add Entity")) {
 | 
			
		||||
            MainScene.AddEntity("New entity");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ImGui::EndMenu();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    ImGui::EndMainMenuBar();
 | 
			
		||||
 | 
			
		||||
    ImGui::Begin("ProjectInfo");
 | 
			
		||||
    ImGui::Text("Project: %s", CurrentProject.get()->GetName().c_str());
 | 
			
		||||
    ImGui::Text("Directory: %s", CurrentProject.get()->GetProjectDirectory().u8string().c_str());
 | 
			
		||||
    ImGui::End();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    //ShowStats();
 | 
			
		||||
    Viewport(*framebuffer, MainScene);
 | 
			
		||||
    SceneExplorer(Selected, MainScene);
 | 
			
		||||
    Inspector(Selected, MainScene );
 | 
			
		||||
 | 
			
		||||
    Settings();
 | 
			
		||||
    AssetsFinder();
 | 
			
		||||
    Console();
 | 
			
		||||
 | 
			
		||||
    ImGui::ShowDemoWindow();
 | 
			
		||||
    ImGui::ShowMetricsWindow();
 | 
			
		||||
   
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Render() 
 | 
			
		||||
{
 | 
			
		||||
    renderer.Render( *framebuffer, MainScene);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
* Runs every frame
 | 
			
		||||
* - Meant for game logic ( non-physics related)
 | 
			
		||||
*/
 | 
			
		||||
void Update()
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
* Runs every physics update
 | 
			
		||||
*/
 | 
			
		||||
void fixed_update() 
 | 
			
		||||
{
 | 
			
		||||
    
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
* Runs at the end of the program
 | 
			
		||||
* - Meant for cleanup
 | 
			
		||||
*/
 | 
			
		||||
void Stop()
 | 
			
		||||
{
 | 
			
		||||
    delete framebuffer;
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user