From 1458512ec604ad39b13c5adf1c2adfe91dc404fa Mon Sep 17 00:00:00 2001 From: Adrien GIVRY Date: Fri, 14 Feb 2025 15:54:02 -0500 Subject: [PATCH] Fixed invalid default scene when created through the asset browser --- .../OvCore/include/OvCore/SceneSystem/Scene.h | 10 ++++++ .../include/OvCore/SceneSystem/SceneManager.h | 6 ++-- .../OvCore/src/OvCore/SceneSystem/Scene.cpp | 23 ++++++++++++- .../src/OvCore/SceneSystem/SceneManager.cpp | 32 +++++-------------- .../include/OvEditor/Core/EditorActions.h | 3 +- .../OvEditor/src/OvEditor/Core/Editor.cpp | 2 +- .../src/OvEditor/Core/EditorActions.cpp | 21 ++++++++---- .../src/OvEditor/Panels/AssetBrowser.cpp | 7 ++-- 8 files changed, 66 insertions(+), 38 deletions(-) diff --git a/Sources/Overload/OvCore/include/OvCore/SceneSystem/Scene.h b/Sources/Overload/OvCore/include/OvCore/SceneSystem/Scene.h index e6e37ba46..dda820cf2 100644 --- a/Sources/Overload/OvCore/include/OvCore/SceneSystem/Scene.h +++ b/Sources/Overload/OvCore/include/OvCore/SceneSystem/Scene.h @@ -45,6 +45,16 @@ namespace OvCore::SceneSystem */ ~Scene(); + /** + * Add a default camera to the scene + */ + void AddDefaultCamera(); + + /** + * Add default lights to the scene + */ + void AddDefaultLights(); + /** * Play the scene */ diff --git a/Sources/Overload/OvCore/include/OvCore/SceneSystem/SceneManager.h b/Sources/Overload/OvCore/include/OvCore/SceneSystem/SceneManager.h index 14d2258f9..7c3487547 100644 --- a/Sources/Overload/OvCore/include/OvCore/SceneSystem/SceneManager.h +++ b/Sources/Overload/OvCore/include/OvCore/SceneSystem/SceneManager.h @@ -48,9 +48,9 @@ namespace OvCore::SceneSystem void LoadEmptyScene(); /** - * Load an empty lighted scene in memory + * Load a default scene in memory */ - void LoadEmptyLightedScene(); + void LoadDefaultScene(); /** * Load specific scene in memory @@ -108,7 +108,7 @@ namespace OvCore::SceneSystem private: const std::string m_sceneRootFolder; - Scene* m_currentScene = nullptr; + std::unique_ptr m_currentScene = nullptr; bool m_currentSceneLoadedFromPath = false; std::string m_currentSceneSourcePath = ""; diff --git a/Sources/Overload/OvCore/src/OvCore/SceneSystem/Scene.cpp b/Sources/Overload/OvCore/src/OvCore/SceneSystem/Scene.cpp index 0aee8358f..3041fd80d 100644 --- a/Sources/Overload/OvCore/src/OvCore/SceneSystem/Scene.cpp +++ b/Sources/Overload/OvCore/src/OvCore/SceneSystem/Scene.cpp @@ -7,7 +7,9 @@ #include #include -#include "OvCore/SceneSystem/Scene.h" +#include +#include +#include OvCore::SceneSystem::Scene::Scene() { @@ -24,6 +26,25 @@ OvCore::SceneSystem::Scene::~Scene() m_actors.clear(); } +void OvCore::SceneSystem::Scene::AddDefaultCamera() +{ + auto& camera = CreateActor("Main Camera"); + camera.AddComponent(); + camera.transform.SetLocalPosition({ 0.0f, 3.0f, 8.0f }); + camera.transform.SetLocalRotation(OvMaths::FQuaternion({ 20.0f, 180.0f, 0.0f })); +} + +void OvCore::SceneSystem::Scene::AddDefaultLights() +{ + auto& directionalLight = CreateActor("Directional Light"); + directionalLight.AddComponent().SetIntensity(0.75f); + directionalLight.transform.SetLocalPosition({ 0.0f, 10.0f, 0.0f }); + directionalLight.transform.SetLocalRotation(OvMaths::FQuaternion({ 120.0f, -40.0f, 0.0f })); + + auto& ambientLight = CreateActor("Ambient Light"); + ambientLight.AddComponent().SetRadius(10000.0f); +} + void OvCore::SceneSystem::Scene::Play() { m_isPlaying = true; diff --git a/Sources/Overload/OvCore/src/OvCore/SceneSystem/SceneManager.cpp b/Sources/Overload/OvCore/src/OvCore/SceneSystem/SceneManager.cpp index 288717537..f8629098f 100644 --- a/Sources/Overload/OvCore/src/OvCore/SceneSystem/SceneManager.cpp +++ b/Sources/Overload/OvCore/src/OvCore/SceneSystem/SceneManager.cpp @@ -45,32 +45,17 @@ void OvCore::SceneSystem::SceneManager::LoadAndPlayDelayed(const std::string& p_ void OvCore::SceneSystem::SceneManager::LoadEmptyScene() { UnloadCurrentScene(); - - m_currentScene = new Scene(); - + m_currentScene.reset(new Scene()); SceneLoadEvent.Invoke(); } -void OvCore::SceneSystem::SceneManager::LoadEmptyLightedScene() +void OvCore::SceneSystem::SceneManager::LoadDefaultScene() { UnloadCurrentScene(); - - m_currentScene = new Scene(); - + m_currentScene.reset(new Scene()); + m_currentScene->AddDefaultCamera(); + m_currentScene->AddDefaultLights(); SceneLoadEvent.Invoke(); - - auto& directionalLight = m_currentScene->CreateActor("Directional Light"); - directionalLight.AddComponent().SetIntensity(0.75f); - directionalLight.transform.SetLocalPosition({ 0.0f, 10.0f, 0.0f }); - directionalLight.transform.SetLocalRotation(OvMaths::FQuaternion({ 120.0f, -40.0f, 0.0f })); - - auto& ambientLight = m_currentScene->CreateActor("Ambient Light"); - ambientLight.AddComponent().SetRadius(10000.0f); - - auto& camera = m_currentScene->CreateActor("Main Camera"); - camera.AddComponent(); - camera.transform.SetLocalPosition({ 0.0f, 3.0f, 8.0f }); - camera.transform.SetLocalRotation(OvMaths::FQuaternion({ 20.0f, 180.0f, 0.0f })); } bool OvCore::SceneSystem::SceneManager::LoadScene(const std::string& p_path, bool p_absolute) @@ -114,8 +99,7 @@ void OvCore::SceneSystem::SceneManager::UnloadCurrentScene() { if (m_currentScene) { - delete m_currentScene; - m_currentScene = nullptr; + m_currentScene.release(); SceneUnloadEvent.Invoke(); } @@ -124,12 +108,12 @@ void OvCore::SceneSystem::SceneManager::UnloadCurrentScene() bool OvCore::SceneSystem::SceneManager::HasCurrentScene() const { - return m_currentScene; + return m_currentScene != nullptr; } OvCore::SceneSystem::Scene* OvCore::SceneSystem::SceneManager::GetCurrentScene() const { - return m_currentScene; + return m_currentScene.get(); } std::string OvCore::SceneSystem::SceneManager::GetCurrentSceneSourcePath() const diff --git a/Sources/Overload/OvEditor/include/OvEditor/Core/EditorActions.h b/Sources/Overload/OvEditor/include/OvEditor/Core/EditorActions.h index 568dfdd2f..9894afaf3 100644 --- a/Sources/Overload/OvEditor/include/OvEditor/Core/EditorActions.h +++ b/Sources/Overload/OvEditor/include/OvEditor/Core/EditorActions.h @@ -303,9 +303,10 @@ namespace OvEditor::Core /** * Save the current scene to the given path + * @param p_sceneToSave * @param p_path */ - void SaveCurrentSceneTo(const std::string& p_path); + void SaveSceneToDisk(OvCore::SceneSystem::Scene& p_scene, const std::string& p_path); /** * Load a scene from the disk diff --git a/Sources/Overload/OvEditor/src/OvEditor/Core/Editor.cpp b/Sources/Overload/OvEditor/src/OvEditor/Core/Editor.cpp index 5b8250103..17959b7b1 100644 --- a/Sources/Overload/OvEditor/src/OvEditor/Core/Editor.cpp +++ b/Sources/Overload/OvEditor/src/OvEditor/Core/Editor.cpp @@ -36,7 +36,7 @@ OvEditor::Core::Editor::Editor(Context& p_context) : { SetupUI(); - m_context.sceneManager.LoadEmptyLightedScene(); + m_context.sceneManager.LoadDefaultScene(); } OvEditor::Core::Editor::~Editor() diff --git a/Sources/Overload/OvEditor/src/OvEditor/Core/EditorActions.cpp b/Sources/Overload/OvEditor/src/OvEditor/Core/EditorActions.cpp index d0755acb0..c1348b22f 100644 --- a/Sources/Overload/OvEditor/src/OvEditor/Core/EditorActions.cpp +++ b/Sources/Overload/OvEditor/src/OvEditor/Core/EditorActions.cpp @@ -51,17 +51,21 @@ void OvEditor::Core::EditorActions::LoadEmptyScene() if (GetCurrentEditorMode() != EEditorMode::EDIT) StopPlaying(); - m_context.sceneManager.LoadEmptyLightedScene(); + m_context.sceneManager.LoadEmptyScene(); + auto scene = m_context.sceneManager.GetCurrentScene(); + scene->AddDefaultCamera(); + scene->AddDefaultLights(); + OVLOG_INFO("New scene created"); } -void OvEditor::Core::EditorActions::SaveCurrentSceneTo(const std::string& p_path) +void OvEditor::Core::EditorActions::SaveSceneToDisk(OvCore::SceneSystem::Scene& p_scene, const std::string& p_path) { tinyxml2::XMLDocument doc; tinyxml2::XMLNode* node = doc.NewElement("root"); doc.InsertFirstChild(node); m_context.sceneManager.StoreCurrentSceneSourcePath(p_path); - m_context.sceneManager.GetCurrentScene()->OnSerialize(doc, node); + p_scene.OnSerialize(doc, node); doc.SaveFile(p_path.c_str()); } @@ -84,8 +88,12 @@ void OvEditor::Core::EditorActions::SaveSceneChanges() { if (IsCurrentSceneLoadedFromDisk()) { - SaveCurrentSceneTo(m_context.sceneManager.GetCurrentSceneSourcePath()); - OVLOG_INFO("Current scene saved to: " + m_context.sceneManager.GetCurrentSceneSourcePath()); + auto currentScene = m_context.sceneManager.GetCurrentScene(); + OVASSERT(currentScene, "Current scene is null"); + + const std::string currentScenePath = m_context.sceneManager.GetCurrentSceneSourcePath(); + SaveSceneToDisk(*currentScene, currentScenePath); + OVLOG_INFO("Current scene saved to: " + currentScenePath); } else { @@ -112,7 +120,8 @@ void OvEditor::Core::EditorActions::SaveAs() } } - SaveCurrentSceneTo(dialog.GetSelectedFilePath()); + auto currentScene = m_context.sceneManager.GetCurrentScene(); + SaveSceneToDisk(*currentScene, dialog.GetSelectedFilePath()); OVLOG_INFO("Current scene saved to: " + dialog.GetSelectedFilePath()); } } diff --git a/Sources/Overload/OvEditor/src/OvEditor/Panels/AssetBrowser.cpp b/Sources/Overload/OvEditor/src/OvEditor/Panels/AssetBrowser.cpp index 3d9840085..e22d98922 100644 --- a/Sources/Overload/OvEditor/src/OvEditor/Panels/AssetBrowser.cpp +++ b/Sources/Overload/OvEditor/src/OvEditor/Panels/AssetBrowser.cpp @@ -279,8 +279,11 @@ class FolderContextualMenu : public BrowserItemContextualMenu ++fails; } while (std::filesystem::exists(finalPath)); - std::ofstream outfile(finalPath); - outfile << "Directional Lighttrue10class OvCore::ECS::Components::CDirectionalLight1111110.75class OvCore::ECS::Components::CTransform01000.81379771-0.171010060.296198160.46984628111Ambient Lighttrue20class OvCore::ECS::Components::CAmbientSphereLight1110.110000class OvCore::ECS::Components::CTransform0000001111Main Cameratrue30class OvCore::ECS::Components::CCamera450.110000.19215690.30196080.47450981class OvCore::ECS::Components::CTransform038-7.5904039e-090.98480773-0.17364819-4.3047311e-08111" << std::endl; // Empty scene content + auto emptyScene = OvCore::SceneSystem::Scene{}; + emptyScene.AddDefaultCamera(); + emptyScene.AddDefaultLights(); + + EDITOR_EXEC(SaveSceneToDisk(emptyScene, finalPath)); ItemAddedEvent.Invoke(finalPath); Close();