mirror of
https://github.com/aharabada/glitchy-engine-beef.git
synced 2026-09-05 13:01:52 +00:00
Add OnCollisionLeave2D
This commit is contained in:
@@ -290,12 +290,15 @@ class ScriptClass : SharpClass
|
||||
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) _onCollisionLeave2D;
|
||||
|
||||
//private OnCollisionEnter2DMethod _onCollisionEnter2D;
|
||||
private OnDestroyMethod _onCollisionLeave2D;
|
||||
//private OnDestroyMethod _onCollisionLeave2D;
|
||||
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 ClassName => _className;
|
||||
@@ -314,9 +317,10 @@ class ScriptClass : SharpClass
|
||||
_onDestroy = (OnDestroyMethod)GetMethodThunk("OnDestroy");
|
||||
|
||||
_onCollisionEnter2D = (.)GetMethodThunk("OnCollisionEnter2D", 1);
|
||||
_onCollisionLeave2D = (OnDestroyMethod)GetMethodThunk("OnCollisionLeave2D");
|
||||
_onCollisionLeave2D = (.)GetMethodThunk("OnCollisionLeave2D", 1);
|
||||
|
||||
_onCollisionEnter2DMethod = GetMethod("OnCollisionEnter2D", 1);
|
||||
_onCollisionLeave2DMethod = GetMethod("OnCollisionLeave2D", 1);
|
||||
}
|
||||
|
||||
public void OnCreate(MonoObject* instance, out MonoException* exception)
|
||||
@@ -359,6 +363,22 @@ class ScriptClass : SharpClass
|
||||
// _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)
|
||||
{
|
||||
MonoObject* instance = Mono.mono_object_new(ScriptEngine.[Friend]s_AppDomain, _monoClass);
|
||||
|
||||
@@ -153,7 +153,7 @@ static class ScriptEngine
|
||||
String directory = scope .();
|
||||
Path.GetDirectoryPath(_appAssemblyPath, directory);
|
||||
|
||||
if (_userAssemblyWatcher != null && _userAssemblyWatcher.Directory != directory)
|
||||
if (_userAssemblyWatcher != null) // _userAssemblyWatcher.Directory != directory
|
||||
{
|
||||
delete _userAssemblyWatcher;
|
||||
}
|
||||
|
||||
@@ -93,6 +93,17 @@ class ScriptInstance : RefCounter
|
||||
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)
|
||||
{
|
||||
return _scriptClass.GetFieldValue<T>(_instance, field.[Friend]_monoField);
|
||||
|
||||
@@ -235,6 +235,57 @@ namespace GlitchyEngine.World
|
||||
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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user