Applying better design choices for general engine
Renderer is causing a big memory leak because it never deletes its Vertex Array
This commit is contained in:
@ -1,8 +1,5 @@
|
||||
#include "../../YoggieEngine/src/EntryPoint.h"
|
||||
#include <imgui.h>
|
||||
#include <backends/imgui_impl_opengl3.h>
|
||||
#include <backends/imgui_impl_glfw.h>
|
||||
#include <ImGuizmo.h>
|
||||
#include "../../YoggieEngine/src/AssetManager/ModelImporter.h"
|
||||
|
||||
#include <nfd.h>
|
||||
|
||||
@ -10,36 +7,37 @@
|
||||
#include <glm/gtc/type_ptr.hpp>
|
||||
#include <glm/gtc/matrix_transform.hpp>
|
||||
|
||||
#include "UI/GUIRenderer.h"
|
||||
#include "UI/Widgets.h"
|
||||
#include "Project/Project.h"
|
||||
#include "SceneSerializer.h"
|
||||
#include "EditorContext.h"
|
||||
#include "SceneRuntime.h"
|
||||
#include "AssetManagement/AssetManager.h"
|
||||
#include "UI/MainMenuBar.h"
|
||||
|
||||
const unsigned int MS_PER_UPDATE = 2;
|
||||
void CreateTestProject(std::unique_ptr<Project>& project, Scene& scene);
|
||||
|
||||
class Editor : public Application {
|
||||
public:
|
||||
Editor() : Application("Editor") {}
|
||||
|
||||
void Run() override
|
||||
{
|
||||
BarinkWindow mainWindow = BarinkWindow(1200, 700);
|
||||
InputSystem = new InputManager();
|
||||
renderer = new Renderer();
|
||||
auto NativeEditorWindow = NativeWindow(1200, 700);
|
||||
//auto renderer = Renderer();
|
||||
auto GuiRenderer = GUIRenderer(NativeEditorWindow);
|
||||
|
||||
InputSystem->attach(&mainWindow);
|
||||
Selected = (entt::entity)-1;
|
||||
|
||||
InitImGui(mainWindow);
|
||||
CreateTestProject(CurrentProject, ActiveScene);
|
||||
|
||||
activeRuntime.Start();
|
||||
ActiveScene.Start();
|
||||
|
||||
double previous = glfwGetTime();
|
||||
double lag = 0.0;
|
||||
|
||||
renderer->Prepare(activeRuntime.MainScene);
|
||||
|
||||
while (!mainWindow.WindowShouldClose())
|
||||
while (!NativeEditorWindow.WindowShouldClose())
|
||||
{
|
||||
|
||||
double current = glfwGetTime();
|
||||
@ -47,235 +45,77 @@ public:
|
||||
previous = current;
|
||||
lag += elapsed;
|
||||
|
||||
|
||||
InputSystem->PollEvents();
|
||||
NativeEditorWindow.Poll();
|
||||
|
||||
while (lag >= MS_PER_UPDATE)
|
||||
{
|
||||
activeRuntime.Update();
|
||||
ActiveScene.Update();
|
||||
lag -= MS_PER_UPDATE;
|
||||
}
|
||||
|
||||
renderer->Render(activeRuntime.framebuffer, activeRuntime.MainScene);
|
||||
// renderer.Render(framebuffer, ActiveScene);
|
||||
|
||||
ImGuiBegin();
|
||||
RenderGUI();
|
||||
ImGuiEnd();
|
||||
|
||||
mainWindow.SwapBuffers();
|
||||
GuiRenderer.Begin();
|
||||
RenderGUI();
|
||||
GuiRenderer.End();
|
||||
|
||||
NativeEditorWindow.SwapBuffers();
|
||||
glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);
|
||||
|
||||
|
||||
}
|
||||
|
||||
activeRuntime.Stop();
|
||||
|
||||
delete InputSystem;
|
||||
delete renderer;
|
||||
|
||||
ImGui_ImplOpenGL3_Shutdown();
|
||||
ImGui_ImplGlfw_Shutdown();
|
||||
ImGui::DestroyContext();
|
||||
ActiveScene.Stop();
|
||||
|
||||
}
|
||||
|
||||
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
|
||||
{
|
||||
MainMenuBar menuBar= MainMenuBar();
|
||||
menuBar.ApplicationMenu(CurrentProject);
|
||||
menuBar.SceneMenu(CurrentProject, ActiveScene);
|
||||
}
|
||||
|
||||
ImGui::BeginMainMenuBar();
|
||||
{
|
||||
ProjectInfo projectInfo(*(CurrentProject.get()));
|
||||
}
|
||||
|
||||
if (ImGui::BeginMenu("Application")) {
|
||||
{
|
||||
Viewport sceneview = Viewport(ActiveScene);
|
||||
}
|
||||
|
||||
if (ImGui::MenuItem("Load Project"))
|
||||
{
|
||||
nfdresult_t result = NFD_OpenDialog({ "yproj" }, NULL, &path);
|
||||
switch (result) {
|
||||
case(NFD_OKAY):
|
||||
Project::LoadProject(path, activeRuntime.CurrentProject);
|
||||
AssetManager::setAssetPath(activeRuntime.CurrentProject.get()->GetProjectDirectory());
|
||||
AssetManager::BuildAssetView();
|
||||
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();
|
||||
{
|
||||
SceneExplorer explorer(Selected, ActiveScene);
|
||||
}
|
||||
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
{
|
||||
Inspector inspector = Inspector();
|
||||
if (ActiveScene.getReg().valid(Selected)) {
|
||||
Entity SelectedEntity = Entity(Selected, &ActiveScene);
|
||||
inspector.AddComponentDropDown(SelectedEntity);
|
||||
inspector.ShowComponents(SelectedEntity);
|
||||
}
|
||||
|
||||
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");
|
||||
}
|
||||
|
||||
if (ImGui::MenuItem("Import Model"))
|
||||
{
|
||||
auto result = NFD_OpenDialog( "obj,fbx,gltf" , NULL, &modelImportPath);
|
||||
switch (result) {
|
||||
case(NFD_OKAY):
|
||||
// Import Model
|
||||
AssetManager::LoadFromSource(modelImportPath, activeRuntime.CurrentProject.get()->GetProjectDirectory() / "Assets");
|
||||
break;
|
||||
case(NFD_CANCEL):
|
||||
break;
|
||||
case(NFD_ERROR):
|
||||
std::cout << "NFD_Error: " << NFD_GetError() << std::endl;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (ImGui::MenuItem("Import MeshAsset (temp)"))
|
||||
{
|
||||
auto result = NFD_OpenDialog("mesh", NULL, &modelImportPath);
|
||||
switch (result) {
|
||||
case(NFD_OKAY):
|
||||
AssetManager::LoadFromAssetFile(modelImportPath);
|
||||
break;
|
||||
case(NFD_CANCEL):
|
||||
break;
|
||||
case(NFD_ERROR):
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
ImGui::EndMenu();
|
||||
}
|
||||
|
||||
{
|
||||
Settings();
|
||||
}
|
||||
|
||||
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);
|
||||
GamePort(*activeRuntime.framebuffer);
|
||||
SceneExplorer(activeRuntime.Selected, activeRuntime.MainScene);
|
||||
Inspector(activeRuntime.Selected, activeRuntime.MainScene);
|
||||
|
||||
Settings();
|
||||
AssetsFinder();
|
||||
Console();
|
||||
{
|
||||
AssetFinder assetsView = AssetFinder();
|
||||
}
|
||||
|
||||
|
||||
{
|
||||
Console console = Console();
|
||||
console.Show();
|
||||
}
|
||||
|
||||
ImGui::ShowDemoWindow();
|
||||
ImGui::ShowMetricsWindow();
|
||||
@ -284,14 +124,9 @@ public:
|
||||
|
||||
|
||||
private:
|
||||
EditorContext context;
|
||||
EditorRuntime activeRuntime ;
|
||||
char* path = nullptr;
|
||||
char* savePath = nullptr;
|
||||
char* scenePath = nullptr;
|
||||
char* openScenePath = nullptr;
|
||||
char* modelImportPath = nullptr;
|
||||
|
||||
std::unique_ptr<Project> CurrentProject;
|
||||
Scene ActiveScene;
|
||||
entt::entity Selected;
|
||||
|
||||
};
|
||||
|
||||
@ -301,12 +136,34 @@ YoggieEngine::Application* CreateApplication() {
|
||||
|
||||
}
|
||||
|
||||
void CreateTestProject(std::unique_ptr<Project>& project, Scene& scene ) {
|
||||
project = std::make_unique<Project>();
|
||||
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>();
|
||||
render3DComponent.mesh = *(model->renderable->mesh);
|
||||
|
||||
cube.GetComponent<TransformComponent>().Position = glm::vec3(1.0f, 0.0f, 5.0f);
|
||||
|
||||
auto cube2 = scene.AddEntity("Cube1");
|
||||
auto& rendercube2 = cube2.AddComponent<Render3DComponent>();
|
||||
rendercube2.mesh = *(model->renderable->mesh);
|
||||
|
||||
|
||||
|
||||
// create an ambient light source
|
||||
auto AmbientLight = scene.AddEntity("AmbientLight");
|
||||
auto light = AmbientLight.AddComponent<LightComponent>();
|
||||
light.Color = glm::vec3(1.0f);
|
||||
light.Strength = 1.0f;
|
||||
}
|
||||
|
Reference in New Issue
Block a user