From 69205ec4fafba0d68ddf84a23d6876671e604787 Mon Sep 17 00:00:00 2001 From: Antoine Pilote Date: Sat, 16 Mar 2024 16:37:38 -0400 Subject: [PATCH] Added ShowMouse and get global position to .net api, deferred onInit after all entities have been initialized --- Nuake/src/Scene/Systems/ScriptingSystem.cpp | 19 ++++++++++++++----- .../src/Scripting/NetModules/InputNetAPI.cpp | 13 +++++++++++++ .../src/Scripting/NetModules/SceneNetAPI.cpp | 14 ++++++++++++++ Nuake/src/Scripting/ScriptingEngineNet.cpp | 2 +- NuakeNet/src/Components.cs | 14 +++++++++++++- NuakeNet/src/Input.cs | 6 ++++++ 6 files changed, 61 insertions(+), 7 deletions(-) diff --git a/Nuake/src/Scene/Systems/ScriptingSystem.cpp b/Nuake/src/Scene/Systems/ScriptingSystem.cpp index cb0b9487..708d8a27 100644 --- a/Nuake/src/Scene/Systems/ScriptingSystem.cpp +++ b/Nuake/src/Scene/Systems/ScriptingSystem.cpp @@ -52,13 +52,22 @@ namespace Nuake if (netScriptComponent.ScriptPath.empty()) continue; - // Creates an instance of the entity script in C# auto entity = Entity{ e, m_Scene }; - scriptingEngineNet.RegisterEntityScript(entity); - // We can now call on init on it. - auto scriptInstance = scriptingEngineNet.GetEntityScript(entity); - scriptInstance.InvokeMethod("OnInit"); + // Creates an instance of the entity script in C# + scriptingEngineNet.RegisterEntityScript(entity); + } + + for (auto& e : netEntities) + { + auto entity = Entity{ e, m_Scene }; + + if (entity.IsValid() && scriptingEngineNet.HasEntityScriptInstance(entity)) + { + // We can now call on init on it. + auto scriptInstance = scriptingEngineNet.GetEntityScript(entity); + scriptInstance.InvokeMethod("OnInit"); + } } return true; diff --git a/Nuake/src/Scripting/NetModules/InputNetAPI.cpp b/Nuake/src/Scripting/NetModules/InputNetAPI.cpp index 71e34b3a..e3fc1cdf 100644 --- a/Nuake/src/Scripting/NetModules/InputNetAPI.cpp +++ b/Nuake/src/Scripting/NetModules/InputNetAPI.cpp @@ -6,6 +6,18 @@ namespace Nuake { + void ShowMouse(bool visible) + { + if (visible) + { + Input::ShowMouse(); + } + else + { + Input::HideMouse(); + } + } + bool IsKeyDown(int keyCode) { return Input::IsKeyDown(keyCode); @@ -25,6 +37,7 @@ namespace Nuake { void InputNetAPI::RegisterMethods() { + RegisterMethod("Input.ShowMouseIcall", &ShowMouse); RegisterMethod("Input.IsKeyDownIcall", &IsKeyDown); RegisterMethod("Input.IsKeyPressedIcall", &IsKeyPressed); diff --git a/Nuake/src/Scripting/NetModules/SceneNetAPI.cpp b/Nuake/src/Scripting/NetModules/SceneNetAPI.cpp index fadb5070..2e3a7fe8 100644 --- a/Nuake/src/Scripting/NetModules/SceneNetAPI.cpp +++ b/Nuake/src/Scripting/NetModules/SceneNetAPI.cpp @@ -115,6 +115,19 @@ namespace Nuake { } } + Coral::NativeArray TransformGetGlobalPosition(int entityId) + { + Entity entity = { (entt::entity)(entityId), Engine::GetCurrentScene().get() }; + + if (entity.IsValid() && entity.HasComponent()) + { + auto& component = entity.GetComponent(); + const auto& globalPosition = component.GetGlobalPosition(); + Coral::NativeArray result = { globalPosition.x, globalPosition.y, globalPosition.z }; + return result; + } + } + void TransformRotate(int entityId, float x, float y, float z) { Entity entity = { (entt::entity)(entityId), Engine::GetCurrentScene().get() }; @@ -203,6 +216,7 @@ namespace Nuake { // Components RegisterMethod("TransformComponent.SetPositionIcall", &TransformSetPosition); + RegisterMethod("TransformComponent.GetGlobalPositionIcall", &TransformGetGlobalPosition); RegisterMethod("TransformComponent.RotateIcall", &TransformRotate); RegisterMethod("CameraComponent.GetDirectionIcall", &CameraGetDirection); diff --git a/Nuake/src/Scripting/ScriptingEngineNet.cpp b/Nuake/src/Scripting/ScriptingEngineNet.cpp index 3544a1b0..ea4fcecf 100644 --- a/Nuake/src/Scripting/ScriptingEngineNet.cpp +++ b/Nuake/src/Scripting/ScriptingEngineNet.cpp @@ -223,7 +223,7 @@ namespace Nuake if (!HasEntityScriptInstance(entity)) { Logger::Log("Failed to get entity .Net script instance, doesn't exist", ".net", CRITICAL); - throw std::exception("Failed to get entity .Net script instance, doesn't exist"); + return Coral::ManagedObject(); } return m_EntityToManagedObjects[entity.GetID()]; diff --git a/NuakeNet/src/Components.cs b/NuakeNet/src/Components.cs index 6e7fb641..5297edcd 100644 --- a/NuakeNet/src/Components.cs +++ b/NuakeNet/src/Components.cs @@ -39,6 +39,7 @@ namespace Nuake.Net public class TransformComponent : IComponent { + internal static unsafe delegate*> GetGlobalPositionIcall; internal static unsafe delegate* SetPositionIcall; internal static unsafe delegate* RotateIcall; @@ -76,7 +77,18 @@ namespace Nuake.Net unsafe { SetPositionIcall(EntityID, value.X, value.Y, value.Z); } } } - public Vector3 GlobalPosition { get; set; } + public Vector3 GlobalPosition + { + get + { + unsafe + { + NativeArray result = GetGlobalPositionIcall(EntityID); + return new Vector3(result[0], result[1], result[2]); + } + } + set { } + } } public class LightComponent : IComponent diff --git a/NuakeNet/src/Input.cs b/NuakeNet/src/Input.cs index b986cdcc..23183e59 100644 --- a/NuakeNet/src/Input.cs +++ b/NuakeNet/src/Input.cs @@ -134,10 +134,16 @@ namespace Nuake.Net public class Input { + internal static unsafe delegate* ShowMouseIcall; internal static unsafe delegate* IsKeyDownIcall; internal static unsafe delegate* IsKeyPressedIcall; internal static unsafe delegate*> GetMousePositionIcall; + public static void ShowMouse(bool visible) + { + unsafe { ShowMouseIcall(visible); } + } + public static bool IsKeyDown(Key keys) { unsafe { return IsKeyDownIcall((int)keys); }