Compare commits
3 Commits
145338d666
...
ba69726e33
Author | SHA1 | Date | |
---|---|---|---|
ba69726e33 | |||
7223c20f1d | |||
282844b905 |
7
.gitignore
vendored
7
.gitignore
vendored
@ -16,4 +16,9 @@ x64/
|
||||
*.gltf
|
||||
!sponza.gltf
|
||||
|
||||
imgui.ini
|
||||
imgui.ini
|
||||
libs/physx/physx/include/
|
||||
libs/physx/physx/compiler/
|
||||
libs/physx/physx/buildtools/
|
||||
libs/physx/physx/bin/
|
||||
libs/nativefiledialog/build/
|
||||
|
6
.gitmodules
vendored
6
.gitmodules
vendored
@ -36,3 +36,9 @@
|
||||
[submodule "libs/nativefiledialog"]
|
||||
path = libs/nativefiledialog
|
||||
url = https://git.barink.dev/Nigel/nativefiledialog.git
|
||||
[submodule "libs/mINI"]
|
||||
path = libs/mINI
|
||||
url = https://github.com/pulzed/mINI.git
|
||||
[submodule "libs/imgui-filebrowser"]
|
||||
path = libs/imgui-filebrowser
|
||||
url = https://github.com/AirGuanZ/imgui-filebrowser.git
|
||||
|
Binary file not shown.
@ -30,6 +30,7 @@ includedirs{
|
||||
incfolder["entt"],
|
||||
incfolder["yamlcpp"],
|
||||
incfolder["nativefiledialog"],
|
||||
incfolder["mINI"]
|
||||
|
||||
|
||||
}
|
||||
|
@ -47,6 +47,9 @@ void MainMenuBar::ApplicationMenu(Project& project) {
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
if (ImGui::MenuItem("Preferences"))
|
||||
{
|
||||
@ -72,6 +75,9 @@ void MainMenuBar::SceneMenu(Project& project, YoggieEngine::Scene& scene) {
|
||||
switch (result) {
|
||||
case(NFD_OKAY):
|
||||
SaveScene(path, scene);
|
||||
|
||||
project.AddScene(scene);
|
||||
|
||||
break;
|
||||
case(NFD_CANCEL):
|
||||
break;
|
||||
|
@ -13,6 +13,15 @@ void Project::SaveProject(std::filesystem::path path, Project& project)
|
||||
projectYAML << YAML::Key << "Project" << YAML::Value << project.Name;
|
||||
projectYAML << YAML::Key << "Directory" << YAML::Value << path.parent_path().u8string();
|
||||
projectYAML << YAML::EndMap;
|
||||
projectYAML << YAML::BeginMap;
|
||||
|
||||
|
||||
projectYAML << YAML::Key << "Scenes" << YAML::Value << YAML::BeginSeq;
|
||||
for (auto scene : project.Scenes) {
|
||||
projectYAML << scene->name;
|
||||
}
|
||||
projectYAML << YAML::EndSeq;
|
||||
|
||||
std::ofstream projectFile;
|
||||
|
||||
projectFile.open(path.u8string());
|
||||
@ -56,10 +65,12 @@ namespace YAML {
|
||||
return false;
|
||||
rhs.setName(node["Project"].as<std::string>());
|
||||
rhs.setProjectDirectory(node["Directory"].as<std::string>());
|
||||
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
};
|
||||
|
||||
}
|
@ -1,6 +1,10 @@
|
||||
#pragma once
|
||||
#include <filesystem>
|
||||
#include <iostream>
|
||||
#include "../../YoggieEngine/src/YoggieEngine.h"
|
||||
#include <yaml-cpp/yaml.h>
|
||||
|
||||
|
||||
class Project {
|
||||
public:
|
||||
Project() = default;
|
||||
@ -13,10 +17,21 @@ public:
|
||||
void setProjectDirectory(std::string& path) { ProjectDirectory = std::filesystem::path(path); }
|
||||
const std::filesystem::path GetProjectDirectory() { return ProjectDirectory; }
|
||||
|
||||
|
||||
void AddScene(YoggieEngine::Scene& scene)
|
||||
{
|
||||
Scenes.push_back(&scene);
|
||||
}
|
||||
|
||||
static void SaveProject(std::filesystem::path path, Project& project);
|
||||
static void LoadProject(std::filesystem::path path, Project& project);
|
||||
private:
|
||||
std::string Name;
|
||||
std::filesystem::path ProjectDirectory;
|
||||
|
||||
std::vector<YoggieEngine::Scene*> Scenes;
|
||||
|
||||
friend class YAML::convert<Project>;
|
||||
|
||||
};
|
||||
|
||||
|
@ -3,11 +3,14 @@
|
||||
|
||||
void Inspector::Draw()
|
||||
{
|
||||
|
||||
}
|
||||
if (selected.isValid()) {
|
||||
AddComponentDropDown();
|
||||
ShowComponents();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Inspector::AddComponentDropDown(YoggieEngine::Entity& selected)
|
||||
void Inspector::AddComponentDropDown()
|
||||
{
|
||||
static char* names[] = { "Script Component", "Camera Component", "Light Component" };
|
||||
if (ImGui::Button("Add Component"))
|
||||
@ -28,7 +31,7 @@ void Inspector::AddComponentDropDown(YoggieEngine::Entity& selected)
|
||||
}
|
||||
|
||||
|
||||
void Inspector::ShowComponents(YoggieEngine::Entity& selected)
|
||||
void Inspector::ShowComponents()
|
||||
{
|
||||
auto component = selected.GetComponent<YoggieEngine::IdentifierComponent>();
|
||||
ImGui::InputText("Name:", (char*)component.name.c_str(), component.name.size() * sizeof(char), ImGuiInputTextFlags_ReadOnly);
|
||||
|
@ -8,13 +8,15 @@ inline void ComponentView(const std::string& componentName, voidFunction func);
|
||||
|
||||
class Inspector : public EditorWindow {
|
||||
public:
|
||||
Inspector() : EditorWindow("Inspector") {}
|
||||
Inspector( YoggieEngine::Entity& selected ) : EditorWindow("Inspector"), selected(selected){}
|
||||
|
||||
void Draw()override;
|
||||
|
||||
private:
|
||||
|
||||
void AddComponentDropDown(YoggieEngine::Entity& selected);
|
||||
void AddComponentDropDown();
|
||||
void ShowComponents();
|
||||
|
||||
void ShowComponents(YoggieEngine::Entity& selected);
|
||||
|
||||
YoggieEngine::Entity& selected;
|
||||
};
|
||||
|
@ -6,8 +6,8 @@ void SceneExplorer::Draw()
|
||||
YoggieEngine::Entity entity = YoggieEngine::Entity(enttNumber, &scene);
|
||||
auto id = entity.GetComponent<YoggieEngine::IdentifierComponent>();
|
||||
|
||||
if (ImGui::Selectable(id.name.c_str(), enttNumber == selected)) {
|
||||
selected = enttNumber;
|
||||
if (ImGui::Selectable(id.name.c_str(), entity == selected)) {
|
||||
selected = YoggieEngine::Entity(enttNumber, &scene);
|
||||
}
|
||||
});
|
||||
}
|
@ -5,7 +5,7 @@
|
||||
|
||||
class SceneExplorer : public EditorWindow {
|
||||
public:
|
||||
SceneExplorer(entt::entity& selected, YoggieEngine::Scene& scene)
|
||||
SceneExplorer(YoggieEngine::Entity& selected, YoggieEngine::Scene& scene)
|
||||
: EditorWindow("SceneExplorer"), scene(scene), selected(selected)
|
||||
{}
|
||||
|
||||
@ -13,7 +13,7 @@ public:
|
||||
|
||||
|
||||
private:
|
||||
entt::entity selected;
|
||||
YoggieEngine::Entity& selected;
|
||||
YoggieEngine::Scene& scene;
|
||||
|
||||
|
||||
|
@ -1,17 +1,10 @@
|
||||
#include "../../YoggieEngine/src/EntryPoint.h"
|
||||
#include "../../YoggieEngine/src/AssetManager/ModelImporter.h"
|
||||
#include "../../YoggieEngine/src/Physics/Physics.h"
|
||||
|
||||
#include <nfd.h>
|
||||
|
||||
#include <mini/ini.h>
|
||||
#include <glm/glm.hpp>
|
||||
#include <glm/gtc/type_ptr.hpp>
|
||||
#include <glm/gtc/matrix_transform.hpp>
|
||||
|
||||
#include "Project/Project.h"
|
||||
#include "AssetManagement/SceneSerializer.h"
|
||||
#include "AssetManagement/AssetManager.h"
|
||||
|
||||
#include "Views/Viewport.h"
|
||||
#include "PropertyPanels/SceneExplorer.h"
|
||||
#include "AssetManagement/AssetFinder.h"
|
||||
@ -24,25 +17,32 @@
|
||||
|
||||
using namespace YoggieEngine;
|
||||
|
||||
|
||||
class Editor : public Application {
|
||||
public:
|
||||
Editor() : Application("Editor"), Selected((entt::entity)-1){}
|
||||
Editor() : Application("Editor"){}
|
||||
|
||||
void Run() override
|
||||
{
|
||||
std::string path = (std::filesystem::current_path()).string();
|
||||
project.setProjectDirectory(path);
|
||||
|
||||
AssetManager::Init();
|
||||
AssetManager::setAssetPath(project.GetProjectDirectory());
|
||||
AssetManager::BuildAssetView();
|
||||
|
||||
LoadLastOrEmptyProject();
|
||||
|
||||
MainMenuBar menuBar = MainMenuBar();
|
||||
ProjectInfo projectInfo(project);
|
||||
Viewport sceneview = Viewport(scene);
|
||||
RuntimeControls rc = RuntimeControls();
|
||||
SceneExplorer explorer(Selected, scene);
|
||||
Inspector inspector = Inspector();
|
||||
Inspector inspector = Inspector(Selected);
|
||||
Settings settings = Settings();
|
||||
// AssetFinder assetsView = AssetFinder();
|
||||
Console console = Console();
|
||||
|
||||
Selected = YoggieEngine::Entity((entt::entity) -1, &scene);
|
||||
|
||||
double previous = glfwGetTime();
|
||||
double lag = 0.0;
|
||||
while (!appWindow.WindowShouldClose())
|
||||
@ -114,23 +114,19 @@ public:
|
||||
}
|
||||
|
||||
GuiBegin();
|
||||
{
|
||||
MainMenuBar menuBar = MainMenuBar();
|
||||
|
||||
// Show a menu bar
|
||||
menuBar.ApplicationMenu(project);
|
||||
menuBar.SceneMenu(project, scene);
|
||||
menuBar.SelectMenu();
|
||||
menuBar.WindowMenu();
|
||||
menuBar.DebugMenu();
|
||||
menuBar.Help();
|
||||
|
||||
// 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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
projectInfo.Update();
|
||||
sceneview.Update();
|
||||
rc.Update();
|
||||
@ -156,48 +152,33 @@ public:
|
||||
// Otherwise load no project..
|
||||
// OR
|
||||
// Load an empty project.
|
||||
mINI::INIStructure ini;
|
||||
|
||||
std::string path = (std::filesystem::current_path()).string();
|
||||
project.setProjectDirectory(path);
|
||||
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.");
|
||||
}
|
||||
|
||||
AssetManager::Init();
|
||||
AssetManager::setAssetPath(project.GetProjectDirectory());
|
||||
AssetManager::BuildAssetView();
|
||||
if (ini["editor"]["openlastproject"] == "TRUE")
|
||||
{
|
||||
Project::LoadProject(ini["cache"]["project"], project);
|
||||
LoadScene(ini["cache"]["scene"], scene);
|
||||
|
||||
// Create a level and load it as the current level
|
||||
auto importer = ModelImporter();
|
||||
|
||||
|
||||
// create an ambient light source
|
||||
auto light = scene.AddEntity("Light");
|
||||
auto& lightComponent = light.AddComponent<LightComponent>();
|
||||
lightComponent.Color = glm::vec3(1.0f);
|
||||
|
||||
|
||||
// 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("Cube2");
|
||||
auto& rendercube2 = cube2.AddComponent<Render3DComponent>();
|
||||
rendercube2.mesh = *(model->renderable->mesh);
|
||||
auto& relationcube = cube.AddComponent<RelationComponent>(cube2);
|
||||
auto& rigidbodycomp = cube.AddComponent<RigidBody>();
|
||||
auto& rigidbodycomp2 = cube2.AddComponent<RigidBody>();
|
||||
|
||||
|
||||
auto Grass = scene.AddEntity("Grass/Window-Pane");
|
||||
//auto& renderGrass = Grass.AddComponent<Render3DComponent>();
|
||||
}
|
||||
else
|
||||
{
|
||||
spdlog::debug("Starting without a project. Please create one.");
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
bool SimulatePhysics = true;
|
||||
entt::entity Selected;
|
||||
YoggieEngine::Entity Selected;
|
||||
|
||||
Project project;
|
||||
Scene scene;
|
||||
|
@ -1,7 +1,8 @@
|
||||
#pragma once
|
||||
typedef uint64_t ENTITY_UUID;
|
||||
#include "Scene.h"
|
||||
|
||||
namespace YoggieEngine {
|
||||
class Scene;
|
||||
|
||||
class Entity {
|
||||
public:
|
||||
Entity() = default;
|
||||
@ -25,8 +26,15 @@ namespace YoggieEngine {
|
||||
}
|
||||
|
||||
// NOTE: Not Scene context aware!!
|
||||
bool operator== (Entity& other) {
|
||||
return m_entity == other.m_entity;
|
||||
inline bool operator== (Entity& other) {
|
||||
return m_entity == other.m_entity;// && other.m_scene == m_scene;
|
||||
}
|
||||
|
||||
inline bool isValid() {
|
||||
if (m_scene == nullptr)
|
||||
return false;
|
||||
|
||||
return m_scene->m_registry.valid(m_entity);
|
||||
}
|
||||
|
||||
private:
|
||||
|
@ -4,6 +4,11 @@
|
||||
using namespace entt;
|
||||
|
||||
namespace YoggieEngine{
|
||||
|
||||
Scene::Scene(const std::string& name): name(name)
|
||||
{
|
||||
}
|
||||
|
||||
Scene::Scene()
|
||||
{
|
||||
}
|
||||
|
@ -4,6 +4,7 @@ namespace YoggieEngine {
|
||||
class Scene
|
||||
{
|
||||
public:
|
||||
Scene(const std::string& name );
|
||||
Scene();
|
||||
~Scene();
|
||||
|
||||
@ -15,6 +16,7 @@ namespace YoggieEngine {
|
||||
void Stop();
|
||||
|
||||
entt::registry& getReg() { return m_registry; }
|
||||
std::string name;
|
||||
|
||||
private:
|
||||
entt::registry m_registry;
|
||||
|
@ -6,7 +6,7 @@ incfolder["assimp"] = "%{wks.location}/libs/assimp/include"
|
||||
incfolder["glm"] = "%{wks.location}/libs/glm"
|
||||
incfolder["entt"] = "%{wks.location}/libs/entt/src"
|
||||
incfolder["yamlcpp"] = "%{wks.location}/libs/yaml-cpp/include"
|
||||
|
||||
incfolder["mINI"] = "%{wks.location}/libs/mINI/src"
|
||||
-- Graphics
|
||||
incfolder["glad"] = "%{wks.location}/libs/glad/include"
|
||||
incfolder["glfw"] = "%{wks.location}/libs/glfw/include"
|
||||
|
1
libs/imgui-filebrowser
Submodule
1
libs/imgui-filebrowser
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit cfccc2aab651cb19cbc2c3ad36be78c36078ec76
|
1
libs/mINI
Submodule
1
libs/mINI
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit a1ff72e8898db8b53282e9eb7c7ec5973519787e
|
Loading…
x
Reference in New Issue
Block a user