YoggieEngine/Editor/src/app.cpp

204 lines
5.8 KiB
C++
Raw Normal View History

2022-11-12 15:57:34 +00:00
#include "../../YoggieEngine/src/EntryPoint.h"
#include <mini/ini.h>
#include <glm/glm.hpp>
#include <glm/gtc/type_ptr.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include "AssetManagement/SceneSerializer.h"
2022-11-10 20:51:11 +00:00
#include "AssetManagement/AssetManager.h"
2022-12-21 18:11:27 +00:00
#include "Views/Viewport.h"
#include "PropertyPanels/SceneExplorer.h"
#include "AssetManagement/AssetFinder.h"
#include "MainMenuBar.h"
#include "PropertyPanels/Inspector.h"
#include "Project/ProjectInfo.h"
#include "Runtime/RuntimeControls.h"
#include "Project/Settings.h"
#include "Console.h"
using namespace YoggieEngine;
class Editor : public Application {
public:
Editor() : Application("Editor"), Selected((entt::entity)-1){}
void Run() override
{
std::string path = (std::filesystem::current_path()).string();
project.setProjectDirectory(path);
AssetManager::Init();
AssetManager::setAssetPath(project.GetProjectDirectory());
AssetManager::BuildAssetView();
LoadLastOrEmptyProject();
ProjectInfo projectInfo(project);
Viewport sceneview = Viewport(scene);
RuntimeControls rc = RuntimeControls();
SceneExplorer explorer(Selected, scene);
Inspector inspector = Inspector();
Settings settings = Settings();
// AssetFinder assetsView = AssetFinder();
Console console = Console();
double previous = glfwGetTime();
double lag = 0.0;
while (!appWindow.WindowShouldClose())
{
PollEvents();
double now = glfwGetTime();
double elapsed = now - previous ;
previous = now;
lag += elapsed;
if (sceneview.isFocused)
{
const float movement_speed = 0.1f;
static float lastX = 400, lastY = 300;
const float sensitivity = 0.1;
static bool firstMouse = true;
if (MouseButtonPressed(YOGGIE_MOUSE_BUTTON_RIGHT)) {
glfwSetInputMode(appWindow.GetGLFWHandle(), GLFW_CURSOR, GLFW_CURSOR_HIDDEN);
auto newX = getCursorPosX(&appWindow);
auto newY = getCursorPosY(&appWindow);
if (firstMouse)
{
lastX = newX;
lastY = newY;
firstMouse = false;
}
float xoffset = newX - lastX;
float yoffset = newY - lastY;
lastX = newX;
lastY = newY;
xoffset *= sensitivity;
yoffset *= sensitivity;
sceneview.cam.yaw += xoffset;
sceneview.cam.pitch += yoffset;
if (sceneview.cam.pitch > 89.0f)
sceneview.cam.pitch = 89.0f;
if (sceneview.cam.pitch < -89.0f)
sceneview.cam.pitch = -89.0f;
}
else if (firstMouse == false)
{
glfwSetInputMode(appWindow.GetGLFWHandle(), GLFW_CURSOR, GLFW_CURSOR_NORMAL);
firstMouse = true;
}
// Check for Camara movement input here!
if (keyIsPressed(YOGGIE_KEY_W))
sceneview.cam.Position += sceneview.cam.Front * movement_speed;
if (keyIsPressed(YOGGIE_KEY_A))
sceneview.cam.Position -= sceneview.cam.Right * movement_speed;
if (keyIsPressed(YOGGIE_KEY_S))
sceneview.cam.Position -= sceneview.cam.Front * movement_speed;
if (keyIsPressed(YOGGIE_KEY_D))
sceneview.cam.Position += sceneview.cam.Right * movement_speed;
}
GuiBegin();
{
MainMenuBar menuBar = MainMenuBar();
2022-11-10 20:51:11 +00:00
// Show a menu bar
menuBar.ApplicationMenu(project);
menuBar.SceneMenu(project, scene);
menuBar.SelectMenu();
menuBar.WindowMenu();
menuBar.DebugMenu();
menuBar.Help();
}
if (scene.getReg().valid(Selected)) {
Entity SelectedEntity = Entity(Selected, &scene);
inspector.AddComponentDropDown(SelectedEntity);
inspector.ShowComponents(SelectedEntity);
2022-11-10 20:51:11 +00:00
}
projectInfo.Update();
sceneview.Update();
rc.Update();
explorer.Update();
settings.Update();
inspector.Update();
console.Update();
ImGui::ShowDemoWindow();
ImGui::ShowMetricsWindow();
GuiEnd();
SwapBuffers();
}
}
void LoadLastOrEmptyProject() {
// Check if there is a last known loaded project and
// load that one .
// Otherwise load no project..
// OR
// Load an empty project.
mINI::INIStructure ini;
if (std::filesystem::exists("build\\Debug\\Editor.ini"))
{
mINI::INIFile file("build\\Debug\\Editor.ini");
file.read(ini);
}
else
{
spdlog::debug("Could not find an `Editor.ini` file.");
}
if (ini["editor"]["openlastproject"] == "TRUE")
{
Project::LoadProject(ini["cache"]["project"], project);
LoadScene(ini["cache"]["scene"], scene);
}
else
{
spdlog::debug("Starting without a project. Please create one.");
}
}
private:
2023-01-04 14:57:08 +00:00
bool SimulatePhysics = true;
entt::entity Selected;
Project project;
Scene scene;
2022-12-21 18:11:27 +00:00
};
2022-11-12 15:57:34 +00:00
YoggieEngine::Application* CreateApplication() {
return new Editor();
}