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 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)
|
||||||
@@ -358,6 +362,22 @@ class ScriptClass : SharpClass
|
|||||||
// if (_onCollisionEnter2D != null)
|
// if (_onCollisionEnter2D != null)
|
||||||
// _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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -92,6 +92,17 @@ class ScriptInstance : RefCounter
|
|||||||
if (exception != null)
|
if (exception != null)
|
||||||
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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user