Add OnCollisionLeave2D

This commit is contained in:
Simon Lübeß
2023-08-10 22:07:58 +02:00
parent b28ca14e15
commit 4e5d3cfd64
4 changed files with 86 additions and 4 deletions
+23 -3
View File
@@ -290,12 +290,15 @@ class ScriptClass : SharpClass
private OnDestroyMethod _onDestroy; private OnDestroyMethod _onDestroy;
private function [CallingConvention(.Cdecl)] MonoObject*(MonoObject* instance, Collision2D collision, MonoException** exception) _onCollisionEnter2D; private function [CallingConvention(.Cdecl)] MonoObject*(MonoObject* instance, Collision2D collision, MonoException** exception) _onCollisionEnter2D;
private function [CallingConvention(.Cdecl)] MonoObject*(MonoObject* instance, Collision2D collision, MonoException** exception) _onCollisionLeave2D;
//private OnCollisionEnter2DMethod _onCollisionEnter2D; //private OnCollisionEnter2DMethod _onCollisionEnter2D;
private OnDestroyMethod _onCollisionLeave2D; //private OnDestroyMethod _onCollisionLeave2D;
private MonoMethod* _onCollisionEnter2DMethod; private MonoMethod* _onCollisionEnter2DMethod;
private MonoMethod* _onCollisionLeave2DMethod;
public bool HasCollisionEnter2D => _onCollisionEnter2D != null; public bool HasCollisionEnter2D => _onCollisionEnter2DMethod != null;
public bool HasCollisionLeave2D => _onCollisionLeave2DMethod != null;
/*public StringView Namespace => _namespace; /*public StringView Namespace => _namespace;
public StringView ClassName => _className; public StringView ClassName => _className;
@@ -314,9 +317,10 @@ class ScriptClass : SharpClass
_onDestroy = (OnDestroyMethod)GetMethodThunk("OnDestroy"); _onDestroy = (OnDestroyMethod)GetMethodThunk("OnDestroy");
_onCollisionEnter2D = (.)GetMethodThunk("OnCollisionEnter2D", 1); _onCollisionEnter2D = (.)GetMethodThunk("OnCollisionEnter2D", 1);
_onCollisionLeave2D = (OnDestroyMethod)GetMethodThunk("OnCollisionLeave2D"); _onCollisionLeave2D = (.)GetMethodThunk("OnCollisionLeave2D", 1);
_onCollisionEnter2DMethod = GetMethod("OnCollisionEnter2D", 1); _onCollisionEnter2DMethod = GetMethod("OnCollisionEnter2D", 1);
_onCollisionLeave2DMethod = GetMethod("OnCollisionLeave2D", 1);
} }
public void OnCreate(MonoObject* instance, out MonoException* exception) public void OnCreate(MonoObject* instance, out MonoException* exception)
@@ -359,6 +363,22 @@ class ScriptClass : SharpClass
// _onCollisionEnter2D(instance, collision, &exception); // _onCollisionEnter2D(instance, collision, &exception);
} }
public void OnCollisionLeave2D(MonoObject* instance, Collision2D collision, out MonoException* exception)
{
exception = null;
// TODO: use method thunk
if (_onCollisionLeave2DMethod != null)
{
#unwarn
void*[1] args = .(&collision);
Invoke(_onCollisionLeave2DMethod, instance, (.)&args);
}
// if (_onCollisionEnter2D != null)
// _onCollisionEnter2D(instance, collision, &exception);
}
public MonoObject* CreateInstance(UUID uuid, out MonoException* exception) public MonoObject* CreateInstance(UUID uuid, out MonoException* exception)
{ {
MonoObject* instance = Mono.mono_object_new(ScriptEngine.[Friend]s_AppDomain, _monoClass); MonoObject* instance = Mono.mono_object_new(ScriptEngine.[Friend]s_AppDomain, _monoClass);
+1 -1
View File
@@ -153,7 +153,7 @@ static class ScriptEngine
String directory = scope .(); String directory = scope .();
Path.GetDirectoryPath(_appAssemblyPath, directory); Path.GetDirectoryPath(_appAssemblyPath, directory);
if (_userAssemblyWatcher != null && _userAssemblyWatcher.Directory != directory) if (_userAssemblyWatcher != null) // _userAssemblyWatcher.Directory != directory
{ {
delete _userAssemblyWatcher; delete _userAssemblyWatcher;
} }
@@ -93,6 +93,17 @@ class ScriptInstance : RefCounter
ScriptEngine.HandleMonoException(exception, this); ScriptEngine.HandleMonoException(exception, this);
} }
public void InvokeOnCollisionLeave2D(Collision2D collision)
{
if (!_scriptClass.HasCollisionLeave2D)
return;
_scriptClass.OnCollisionLeave2D(_instance, collision, let exception);
if (exception != null)
ScriptEngine.HandleMonoException(exception, this);
}
public T GetFieldValue<T>(ScriptField field) public T GetFieldValue<T>(ScriptField field)
{ {
return _scriptClass.GetFieldValue<T>(_instance, field.[Friend]_monoField); return _scriptClass.GetFieldValue<T>(_instance, field.[Friend]_monoField);
+51
View File
@@ -235,6 +235,57 @@ namespace GlitchyEngine.World
scriptOfRigidbodyB?.Instance?.InvokeOnCollisionEnter2D(collision); scriptOfRigidbodyB?.Instance?.InvokeOnCollisionEnter2D(collision);
} }
}; };
_contactListener.endContactCallback = (contact, userData) => {
var fixtureA = Contact.GetFixtureA(contact);
var fixtureB = Contact.GetFixtureB(contact);
var bodyA = Fixture.GetBody(fixtureA);
var bodyB = Fixture.GetBody(fixtureB);
// Cast is obviously 64bit only
var colliderEntityHandleA = (EcsEntity)(uint)Fixture.GetUserData(fixtureA);
var colliderEntityHandleB = (EcsEntity)(uint)Fixture.GetUserData(fixtureB);
Entity colliderEntityA = .(colliderEntityHandleA, ScriptEngine.Context);
Entity colliderEntityB = .(colliderEntityHandleB, ScriptEngine.Context);
// Cast is obviously 64bit only
var rigidbodyEntityHandleA = (EcsEntity)(uint)Body.GetUserData(bodyA);
var rigidbodyEntityHandleB = (EcsEntity)(uint)Body.GetUserData(bodyB);
Entity rigidbodyEntityA = .(rigidbodyEntityHandleA, ScriptEngine.Context);
Entity rigidbodyEntityB = .(rigidbodyEntityHandleB, ScriptEngine.Context);
bool fireEventA = colliderEntityA.TryGetComponent<ScriptComponent>(let scriptOfColliderA);
fireEventA |= rigidbodyEntityA.TryGetComponent<ScriptComponent>(let scriptOfRigidbodyA);
if (fireEventA)
{
Collision2D collision = .();
collision.Entity = colliderEntityA.UUID;
collision.OtherEntity = colliderEntityB.UUID;
collision.Rigidbody = rigidbodyEntityA.UUID;
collision.OtherRigidbody = rigidbodyEntityB.UUID;
scriptOfColliderA?.Instance?.InvokeOnCollisionLeave2D(collision);
scriptOfRigidbodyA?.Instance?.InvokeOnCollisionLeave2D(collision);
}
bool fireEventB = colliderEntityB.TryGetComponent<ScriptComponent>(let scriptOfColliderB);
fireEventB |= rigidbodyEntityB.TryGetComponent<ScriptComponent>(let scriptOfRigidbodyB);
if (fireEventB)
{
Collision2D collision = .();
collision.Entity = colliderEntityB.UUID;
collision.OtherEntity = colliderEntityA.UUID;
collision.Rigidbody = rigidbodyEntityB.UUID;
collision.OtherRigidbody = rigidbodyEntityA.UUID;
scriptOfColliderB?.Instance?.InvokeOnCollisionLeave2D(collision);
scriptOfRigidbodyB?.Instance?.InvokeOnCollisionLeave2D(collision);
}
};
World.SetContactListener(_physicsWorld2D, &_contactListener); World.SetContactListener(_physicsWorld2D, &_contactListener);