diff --git a/GlitchyEngine/src/Scripting/CoreClrHelper.bf b/GlitchyEngine/src/Scripting/CoreClrHelper.bf index cc72bc4..f6fd4da 100644 --- a/GlitchyEngine/src/Scripting/CoreClrHelper.bf +++ b/GlitchyEngine/src/Scripting/CoreClrHelper.bf @@ -2,6 +2,8 @@ using NetHostBeef; using System; using System.Interop; using GlitchyEngine.Core; +using GlitchyEngine.Scripting.Classes; + using static GlitchyEngine.Scripting.ScriptGlue; namespace GlitchyEngine.Scripting; @@ -11,6 +13,7 @@ public struct ScriptFunctionPointers public function void(UUID entityId) OnCreate; public function void(UUID entityId, float deltaTime) OnUpdate; public function void(UUID entityId, bool callEntity) OnDestroy; + public function void(UUID entityId, Collision2D collision) OnCollisionEnter2D; } static class CoreClrHelper @@ -124,6 +127,7 @@ static class CoreClrHelper GetFunctionPointerUnmanagedCallersOnly("GlitchyEngine.ScriptGlue, ScriptCore", "InvokeEntityOnCreate", out _entityScriptFunctions.OnCreate); GetFunctionPointerUnmanagedCallersOnly("GlitchyEngine.ScriptGlue, ScriptCore", "InvokeEntityOnUpdate", out _entityScriptFunctions.OnUpdate); GetFunctionPointerUnmanagedCallersOnly("GlitchyEngine.ScriptGlue, ScriptCore", "InvokeEntityOnDestroy", out _entityScriptFunctions.OnDestroy); + GetFunctionPointerUnmanagedCallersOnly("GlitchyEngine.ScriptGlue, ScriptCore", "InvokeEntityOnCollisionEnter2D", out _entityScriptFunctions.OnCollisionEnter2D); } public static void LoadAppAssembly(Span appAssemblyData, Span pdbData) diff --git a/GlitchyEngine/src/Scripting/NewScriptClass.bf b/GlitchyEngine/src/Scripting/NewScriptClass.bf index 9a4b4b9..519093e 100644 --- a/GlitchyEngine/src/Scripting/NewScriptClass.bf +++ b/GlitchyEngine/src/Scripting/NewScriptClass.bf @@ -100,4 +100,10 @@ class NewScriptInstance : RefCounter ScriptEngine.UnregisterScriptInstance(_entityId); } + + public void InvokeOnCollisionEnter2D(Collision2D collision) + { + if (_scriptClass.Methods.HasFlag(.OnCollisionEnter2D)) + CoreClrHelper._entityScriptFunctions.OnCollisionEnter2D(_entityId, collision); + } } \ No newline at end of file diff --git a/GlitchyEngine/src/Scripting/ScriptEngine.bf b/GlitchyEngine/src/Scripting/ScriptEngine.bf index 4d53cf6..4b259f2 100644 --- a/GlitchyEngine/src/Scripting/ScriptEngine.bf +++ b/GlitchyEngine/src/Scripting/ScriptEngine.bf @@ -392,6 +392,7 @@ static class ScriptEngine OnCreate = 0x1, OnUpdate = 0x2, OnDestroy = 0x4, + OnCollisionEnter2D = 0x8, } struct ScriptClassInfo diff --git a/ScriptCore/Entity.cs b/ScriptCore/Entity.cs index 56921ec..59626c6 100644 --- a/ScriptCore/Entity.cs +++ b/ScriptCore/Entity.cs @@ -14,7 +14,7 @@ namespace GlitchyEngine; /// /// The base class for all entities and scripts in the current world. /// -public class Entity : EngineObject +public partial class Entity : EngineObject { /// /// Gets or sets the name of the . @@ -451,4 +451,10 @@ public class Entity : EngineObject /// Will be called once when the entity is being destroyed. /// protected internal virtual void OnDestroy() { } + + /// + /// Will be called + /// + /// + protected internal virtual void OnCollisionEnter2D(Collision2D collision) { } } diff --git a/ScriptCore/ScriptGlue.cs b/ScriptCore/ScriptGlue.cs index b3039ac..b8fac1e 100644 --- a/ScriptCore/ScriptGlue.cs +++ b/ScriptCore/ScriptGlue.cs @@ -152,7 +152,8 @@ internal static unsafe partial class ScriptGlue None = 0, OnCreate = 0x1, OnUpdate = 0x2, - OnDestroy = 0x4 + OnDestroy = 0x4, + OnCollisionEnter2D = 0x8 } /// @@ -210,6 +211,7 @@ internal static unsafe partial class ScriptGlue methods |= HasMethod(type, nameof(Entity.OnCreate), ScriptMethods.OnCreate); methods |= HasMethod(type, nameof(Entity.OnUpdate), ScriptMethods.OnUpdate); methods |= HasMethod(type, nameof(Entity.OnDestroy), ScriptMethods.OnDestroy); + methods |= HasMethod(type, nameof(Entity.OnCollisionEnter2D), ScriptMethods.OnCollisionEnter2D); bool runInEditMode = type.HasCustomAttribute(); @@ -309,6 +311,20 @@ internal static unsafe partial class ScriptGlue Log.Exception(e); } } + + [UnmanagedCallersOnly(CallConvs = [typeof(CallConvCdecl)])] + public static void InvokeEntityOnCollisionEnter2D(UUID entityId, Collision2D collision) + { + try + { + (Entity entity, Type type) = EntityScriptInstances[entityId]; + entity.OnCollisionEnter2D(collision); + } + catch (Exception e) + { + Log.Exception(e); + } + } [UnmanagedCallersOnly] public static void InvokeEntityOnDestroy(UUID entityId, byte callDestroy)