#include "../../YoggieEngine/src/EntryPoint.h" #include "../../YoggieEngine/src/AssetManager/ModelImporter.h" #include #include #include #include #include "UI/GUIRenderer.h" #include "UI/Widgets.h" #include "Project/Project.h" #include "SceneSerializer.h" #include "AssetManagement/AssetManager.h" #include "UI/MainMenuBar.h" const unsigned int MS_PER_UPDATE = 2; void CreateTestProject(std::unique_ptr& project, Scene& scene); class Editor : public Application { public: Editor() : Application("Editor"){ } void Run() override { auto NativeEditorWindow = NativeWindow(1200, 700); framebuffer = new Framebuffer(800, 600); auto renderer = Renderer(RendererConfig{ 1200, // Screen Width 700, // Screen Height glm::vec3{0,0,0}, // Clear Color true // Depth testing }); auto GuiRenderer = GUIRenderer(NativeEditorWindow); Selected = (entt::entity)-1; CreateTestProject(CurrentProject, ActiveScene); ActiveScene.Start(); renderer.setCurrentFrameBuffer(*framebuffer); double previous = glfwGetTime(); double lag = 0.0; while (!NativeEditorWindow.WindowShouldClose()) { double current = glfwGetTime(); double elapsed = current - previous; previous = current; lag += elapsed; NativeEditorWindow.Poll(); while (lag >= MS_PER_UPDATE) { ActiveScene.Update(); lag -= MS_PER_UPDATE; } // submit DrawCommands for all render3DComponents auto group = ActiveScene.getReg().view(); group.each([&renderer](auto enity, TransformComponent& t, Render3DComponent& renderComponent) { renderer.Submit(renderComponent, t); }); renderer.Render(); GuiRenderer.Begin(); RenderGUI(); GuiRenderer.End(); NativeEditorWindow.SwapBuffers(); glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT); } delete framebuffer; ActiveScene.Stop(); } void RenderGUI() { ImGui::DockSpaceOverViewport(ImGui::GetMainViewport()); // Show a menu bar { MainMenuBar menuBar= MainMenuBar(); menuBar.ApplicationMenu(CurrentProject); menuBar.SceneMenu(CurrentProject, ActiveScene); } { ProjectInfo projectInfo(*(CurrentProject.get())); } { Viewport sceneview = Viewport(*framebuffer); } { SceneExplorer explorer(Selected, ActiveScene); } { Inspector inspector = Inspector(); if (ActiveScene.getReg().valid(Selected)) { Entity SelectedEntity = Entity(Selected, &ActiveScene); inspector.AddComponentDropDown(SelectedEntity); inspector.ShowComponents(SelectedEntity); } } { Settings(); } { // AssetFinder assetsView = AssetFinder(); } { Console console = Console(); console.Show(); } ImGui::ShowDemoWindow(); ImGui::ShowMetricsWindow(); } private: std::unique_ptr CurrentProject; Scene ActiveScene; entt::entity Selected; Framebuffer* framebuffer ; }; YoggieEngine::Application* CreateApplication() { return new Editor(); } void CreateTestProject(std::unique_ptr& project, Scene& scene ) { project = std::make_unique(); std::string path = (std::filesystem::current_path()).string(); project.get()->setProjectDirectory(path); AssetManager::Init(); AssetManager::setAssetPath(project.get()->GetProjectDirectory()); AssetManager::BuildAssetView(); // Create a level and load it as the current level auto importer = ModelImporter(); // Create a cube auto model = importer.Import("build/Debug/Models/Cube.obj"); auto cube = scene.AddEntity("cube"); auto& render3DComponent = cube.AddComponent(); render3DComponent.mesh = *(model->renderable->mesh); cube.GetComponent().Position = glm::vec3(1.0f, 0.0f, 5.0f); auto cube2 = scene.AddEntity("Cube1"); auto& rendercube2 = cube2.AddComponent(); rendercube2.mesh = *(model->renderable->mesh); // create an ambient light source auto AmbientLight = scene.AddEntity("AmbientLight"); auto light = AmbientLight.AddComponent(); light.Color = glm::vec3(1.0f); light.Strength = 1.0f; }