Added Entity event OnCollisionEnter2D

This commit is contained in:
Simon Lübeß
2025-08-08 19:09:34 +02:00
parent bf03e99e4a
commit 74243cd285
5 changed files with 35 additions and 2 deletions
@@ -2,6 +2,8 @@ using NetHostBeef;
using System; using System;
using System.Interop; using System.Interop;
using GlitchyEngine.Core; using GlitchyEngine.Core;
using GlitchyEngine.Scripting.Classes;
using static GlitchyEngine.Scripting.ScriptGlue; using static GlitchyEngine.Scripting.ScriptGlue;
namespace GlitchyEngine.Scripting; namespace GlitchyEngine.Scripting;
@@ -11,6 +13,7 @@ public struct ScriptFunctionPointers
public function void(UUID entityId) OnCreate; public function void(UUID entityId) OnCreate;
public function void(UUID entityId, float deltaTime) OnUpdate; public function void(UUID entityId, float deltaTime) OnUpdate;
public function void(UUID entityId, bool callEntity) OnDestroy; public function void(UUID entityId, bool callEntity) OnDestroy;
public function void(UUID entityId, Collision2D collision) OnCollisionEnter2D;
} }
static class CoreClrHelper static class CoreClrHelper
@@ -124,6 +127,7 @@ static class CoreClrHelper
GetFunctionPointerUnmanagedCallersOnly("GlitchyEngine.ScriptGlue, ScriptCore", "InvokeEntityOnCreate", out _entityScriptFunctions.OnCreate); GetFunctionPointerUnmanagedCallersOnly("GlitchyEngine.ScriptGlue, ScriptCore", "InvokeEntityOnCreate", out _entityScriptFunctions.OnCreate);
GetFunctionPointerUnmanagedCallersOnly("GlitchyEngine.ScriptGlue, ScriptCore", "InvokeEntityOnUpdate", out _entityScriptFunctions.OnUpdate); GetFunctionPointerUnmanagedCallersOnly("GlitchyEngine.ScriptGlue, ScriptCore", "InvokeEntityOnUpdate", out _entityScriptFunctions.OnUpdate);
GetFunctionPointerUnmanagedCallersOnly("GlitchyEngine.ScriptGlue, ScriptCore", "InvokeEntityOnDestroy", out _entityScriptFunctions.OnDestroy); GetFunctionPointerUnmanagedCallersOnly("GlitchyEngine.ScriptGlue, ScriptCore", "InvokeEntityOnDestroy", out _entityScriptFunctions.OnDestroy);
GetFunctionPointerUnmanagedCallersOnly("GlitchyEngine.ScriptGlue, ScriptCore", "InvokeEntityOnCollisionEnter2D", out _entityScriptFunctions.OnCollisionEnter2D);
} }
public static void LoadAppAssembly(Span<uint8> appAssemblyData, Span<uint8> pdbData) public static void LoadAppAssembly(Span<uint8> appAssemblyData, Span<uint8> pdbData)
@@ -100,4 +100,10 @@ class NewScriptInstance : RefCounter
ScriptEngine.UnregisterScriptInstance(_entityId); ScriptEngine.UnregisterScriptInstance(_entityId);
} }
public void InvokeOnCollisionEnter2D(Collision2D collision)
{
if (_scriptClass.Methods.HasFlag(.OnCollisionEnter2D))
CoreClrHelper._entityScriptFunctions.OnCollisionEnter2D(_entityId, collision);
}
} }
@@ -392,6 +392,7 @@ static class ScriptEngine
OnCreate = 0x1, OnCreate = 0x1,
OnUpdate = 0x2, OnUpdate = 0x2,
OnDestroy = 0x4, OnDestroy = 0x4,
OnCollisionEnter2D = 0x8,
} }
struct ScriptClassInfo struct ScriptClassInfo
+7 -1
View File
@@ -14,7 +14,7 @@ namespace GlitchyEngine;
/// <summary> /// <summary>
/// The base class for all entities and scripts in the current world. /// The base class for all entities and scripts in the current world.
/// </summary> /// </summary>
public class Entity : EngineObject public partial class Entity : EngineObject
{ {
/// <summary> /// <summary>
/// Gets or sets the name of the <see cref="Entity"/>. /// Gets or sets the name of the <see cref="Entity"/>.
@@ -451,4 +451,10 @@ public class Entity : EngineObject
/// Will be called once when the entity is being destroyed. /// Will be called once when the entity is being destroyed.
/// </summary> /// </summary>
protected internal virtual void OnDestroy() { } protected internal virtual void OnDestroy() { }
/// <summary>
/// Will be called
/// </summary>
/// <param name="collision"></param>
protected internal virtual void OnCollisionEnter2D(Collision2D collision) { }
} }
+17 -1
View File
@@ -152,7 +152,8 @@ internal static unsafe partial class ScriptGlue
None = 0, None = 0,
OnCreate = 0x1, OnCreate = 0x1,
OnUpdate = 0x2, OnUpdate = 0x2,
OnDestroy = 0x4 OnDestroy = 0x4,
OnCollisionEnter2D = 0x8
} }
/// <summary> /// <summary>
@@ -210,6 +211,7 @@ internal static unsafe partial class ScriptGlue
methods |= HasMethod(type, nameof(Entity.OnCreate), ScriptMethods.OnCreate); methods |= HasMethod(type, nameof(Entity.OnCreate), ScriptMethods.OnCreate);
methods |= HasMethod(type, nameof(Entity.OnUpdate), ScriptMethods.OnUpdate); methods |= HasMethod(type, nameof(Entity.OnUpdate), ScriptMethods.OnUpdate);
methods |= HasMethod(type, nameof(Entity.OnDestroy), ScriptMethods.OnDestroy); methods |= HasMethod(type, nameof(Entity.OnDestroy), ScriptMethods.OnDestroy);
methods |= HasMethod(type, nameof(Entity.OnCollisionEnter2D), ScriptMethods.OnCollisionEnter2D);
bool runInEditMode = type.HasCustomAttribute<RunInEditModeAttribute>(); bool runInEditMode = type.HasCustomAttribute<RunInEditModeAttribute>();
@@ -309,6 +311,20 @@ internal static unsafe partial class ScriptGlue
Log.Exception(e); 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] [UnmanagedCallersOnly]
public static void InvokeEntityOnDestroy(UUID entityId, byte callDestroy) public static void InvokeEntityOnDestroy(UUID entityId, byte callDestroy)