From 8079c478323e8a17289a268614ec2e43ba8c9fde Mon Sep 17 00:00:00 2001 From: antopilo Date: Sat, 21 Sep 2024 13:18:35 -0400 Subject: [PATCH] Instancing prefab through code should instance body and scripts immediatly --- Nuake/src/Resource/Prefab.cpp | 2 + Nuake/src/Scene/Scene.cpp | 7 +- Nuake/src/Scene/Scene.h | 9 +++ Nuake/src/Scene/Systems/PhysicsSystem.cpp | 7 ++ Nuake/src/Scene/Systems/PhysicsSystem.h | 1 + Nuake/src/Scene/Systems/ScriptingSystem.cpp | 73 ++++++++++--------- Nuake/src/Scene/Systems/ScriptingSystem.h | 2 + .../src/Scripting/NetModules/SceneNetAPI.cpp | 6 ++ 8 files changed, 72 insertions(+), 35 deletions(-) diff --git a/Nuake/src/Resource/Prefab.cpp b/Nuake/src/Resource/Prefab.cpp index a33e3c08..0db11848 100644 --- a/Nuake/src/Resource/Prefab.cpp +++ b/Nuake/src/Resource/Prefab.cpp @@ -1,6 +1,8 @@ #include "Prefab.h" #include "src/Scene/Components/ParentComponent.h" #include +#include +#include namespace Nuake { diff --git a/Nuake/src/Scene/Scene.cpp b/Nuake/src/Scene/Scene.cpp index 1d9045e8..b6f87a5f 100644 --- a/Nuake/src/Scene/Scene.cpp +++ b/Nuake/src/Scene/Scene.cpp @@ -52,10 +52,13 @@ namespace Nuake m_EditorCamera = CreateRef(); m_Environement = CreateRef(); + physicsSystem = CreateRef(this); + scriptingSystem = CreateRef(this); + // Adding systems - Order is important - m_Systems.push_back(CreateRef(this)); + m_Systems.push_back(physicsSystem); m_Systems.push_back(CreateRef(this)); - m_Systems.push_back(CreateRef(this)); + m_Systems.push_back(scriptingSystem); m_Systems.push_back(CreateRef(this)); m_Systems.push_back(CreateRef(this)); m_Systems.push_back(CreateRef(this)); diff --git a/Nuake/src/Scene/Scene.h b/Nuake/src/Scene/Scene.h index fadf220a..eec28b31 100644 --- a/Nuake/src/Scene/Scene.h +++ b/Nuake/src/Scene/Scene.h @@ -22,6 +22,9 @@ namespace Nuake DECLARE_MULTICAST_DELEGATE(PreInitializeDelegate) DECLARE_MULTICAST_DELEGATE(PostInitializeDelegate) + class PhysicsSystem; + class ScriptingSystem; + class Scene : public ISerializable { friend Entity; @@ -43,6 +46,9 @@ namespace Nuake std::unordered_map m_EntitiesNameMap; std::string Path = ""; + Ref physicsSystem; + Ref scriptingSystem; + Ref m_SceneRenderer; static Ref New(); @@ -98,6 +104,9 @@ namespace Nuake PreInitializeDelegate& OnPreInitialize() { return preInitializeDelegate; } PostInitializeDelegate& OnPostInitialize() { return postInitializeDelegate; } + Ref GetPhysicsSystem() const { return physicsSystem; } + Ref GetScriptingSystem() const { return scriptingSystem; } + protected: PreInitializeDelegate preInitializeDelegate; PostInitializeDelegate postInitializeDelegate; diff --git a/Nuake/src/Scene/Systems/PhysicsSystem.cpp b/Nuake/src/Scene/Systems/PhysicsSystem.cpp index fe3fb0c3..0b9f0145 100644 --- a/Nuake/src/Scene/Systems/PhysicsSystem.cpp +++ b/Nuake/src/Scene/Systems/PhysicsSystem.cpp @@ -109,6 +109,13 @@ namespace Nuake PhysicsManager::Get().Reset(); } + void PhysicsSystem::InitializeNewBodies() + { + InitializeShapes(); + InitializeRigidbodies(); + InitializeCharacterControllers(); + } + void PhysicsSystem::InitializeQuakeMap() { auto quakeBrushesView = m_Scene->m_Registry.view(); diff --git a/Nuake/src/Scene/Systems/PhysicsSystem.h b/Nuake/src/Scene/Systems/PhysicsSystem.h index 24c6a28e..87010375 100644 --- a/Nuake/src/Scene/Systems/PhysicsSystem.h +++ b/Nuake/src/Scene/Systems/PhysicsSystem.h @@ -13,6 +13,7 @@ namespace Nuake void FixedUpdate(Timestep ts) override; void Exit() override; + void InitializeNewBodies(); private: void InitializeShapes(); void InitializeQuakeMap(); diff --git a/Nuake/src/Scene/Systems/ScriptingSystem.cpp b/Nuake/src/Scene/Systems/ScriptingSystem.cpp index 9c094ea2..948d95bb 100644 --- a/Nuake/src/Scene/Systems/ScriptingSystem.cpp +++ b/Nuake/src/Scene/Systems/ScriptingSystem.cpp @@ -82,41 +82,10 @@ namespace Nuake if (!Engine::IsPlayMode()) return; + InitializeNewScripts(); + auto& scriptingEngineNet = ScriptingEngineNet::Get(); auto netEntities = m_Scene->m_Registry.view(); - - // Instance all the new entities - std::vector entityJustInstanced; - for (auto& e : netEntities) - { - auto& netScriptComponent = netEntities.get(e); - if (!netScriptComponent.Initialized) - { - if (netScriptComponent.ScriptPath.empty()) - continue; - - auto entity = Entity{ e, m_Scene }; - - // Creates an instance of the entity script in C# - scriptingEngineNet.RegisterEntityScript(entity); - - netScriptComponent.Initialized = true; - entityJustInstanced.push_back(entity); - } - } - - // Call init on the newly created instance - for (auto& e : entityJustInstanced) - { - auto& netScriptComponent = e.GetComponent(); - if (e.IsValid() && scriptingEngineNet.HasEntityScriptInstance(e)) - { - // We can now call on init on it. - auto scriptInstance = scriptingEngineNet.GetEntityScript(e); - scriptInstance.InvokeMethod("OnInit"); - } - } - // Then call update on all the other scripts for (auto& e : netEntities) { @@ -187,6 +156,44 @@ namespace Nuake ScriptingEngineNet::Get().Uninitialize(); } + void ScriptingSystem::InitializeNewScripts() + { + auto& scriptingEngineNet = ScriptingEngineNet::Get(); + auto netEntities = m_Scene->m_Registry.view(); + + // Instance all the new entities + std::vector entityJustInstanced; + for (auto& e : netEntities) + { + auto& netScriptComponent = netEntities.get(e); + if (!netScriptComponent.Initialized) + { + if (netScriptComponent.ScriptPath.empty()) + continue; + + auto entity = Entity{ e, m_Scene }; + + // Creates an instance of the entity script in C# + scriptingEngineNet.RegisterEntityScript(entity); + + netScriptComponent.Initialized = true; + entityJustInstanced.push_back(entity); + } + } + + // Call init on the newly created instance + for (auto& e : entityJustInstanced) + { + auto& netScriptComponent = e.GetComponent(); + if (e.IsValid() && scriptingEngineNet.HasEntityScriptInstance(e)) + { + // We can now call on init on it. + auto scriptInstance = scriptingEngineNet.GetEntityScript(e); + scriptInstance.InvokeMethod("OnInit"); + } + } + } + void ScriptingSystem::DispatchPhysicCallbacks() { auto& scriptingEngineNet = ScriptingEngineNet::Get(); diff --git a/Nuake/src/Scene/Systems/ScriptingSystem.h b/Nuake/src/Scene/Systems/ScriptingSystem.h index 20f46794..75cdc272 100644 --- a/Nuake/src/Scene/Systems/ScriptingSystem.h +++ b/Nuake/src/Scene/Systems/ScriptingSystem.h @@ -15,6 +15,8 @@ namespace Nuake { void FixedUpdate(Timestep ts) override; void Exit() override; + void InitializeNewScripts(); + private: void DispatchPhysicCallbacks(); }; diff --git a/Nuake/src/Scripting/NetModules/SceneNetAPI.cpp b/Nuake/src/Scripting/NetModules/SceneNetAPI.cpp index 2142ea6d..a1f4816a 100644 --- a/Nuake/src/Scripting/NetModules/SceneNetAPI.cpp +++ b/Nuake/src/Scripting/NetModules/SceneNetAPI.cpp @@ -21,6 +21,8 @@ #include "src/Scene/Components/QuakeMap.h" #include "src/Physics/PhysicsManager.h" +#include "src/Scene/Systems/PhysicsSystem.h" +#include "src/Scene/Systems/ScriptingSystem.h" #include "src/Scripting/ScriptingEngineNet.h" #include @@ -293,6 +295,10 @@ namespace Nuake { transformComponent.SetLocalPosition(position); transformComponent.SetLocalRotation(Quat(qw, qx, qy, qz)); + Ref scene = Engine::GetCurrentScene(); + scene->GetPhysicsSystem()->InitializeNewBodies(); + scene->GetScriptingSystem()->InitializeNewScripts(); + return root.GetHandle(); }