Collision.cs 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. //
  2. // Helpers to surface a simpler API for collisions
  3. //
  4. using System;
  5. using System.Runtime.InteropServices;
  6. namespace Urho.Physics {
  7. public unsafe struct CollisionData {
  8. public Vector3 ContactPosition, ContactNormal;
  9. public float ContactDistance, ContactImpulse;
  10. public CollisionData (byte *p)
  11. {
  12. ContactPosition = *(Vector3 *)p;
  13. p += 12;
  14. ContactNormal = *(Vector3 *) p;
  15. p += 12;
  16. ContactDistance = *(float *) p;
  17. p += 4;
  18. ContactImpulse = *(float *) p;
  19. }
  20. public override string ToString ()
  21. {
  22. return $"[CollisionData: Position={ContactPosition}, Normal={ContactNormal}, Distance={ContactDistance}, Impuse={ContactImpulse}";
  23. }
  24. [DllImport (Consts.NativeImport, CallingConvention=CallingConvention.Cdecl)]
  25. extern static int MemoryStream_Size (IntPtr data);
  26. [DllImport (Consts.NativeImport, CallingConvention=CallingConvention.Cdecl)]
  27. extern static int MemoryStream_GetData (IntPtr data);
  28. internal static CollisionData [] FromContactData (IntPtr data, int size)
  29. {
  30. const int encodedSize = 4 * 3+3+1+1;
  31. var n = size / encodedSize;
  32. byte *ptr = (byte *) data;
  33. var ret = new CollisionData [n];
  34. for (int i = 0; i < n; i++){
  35. ret [i] = new CollisionData (ptr);
  36. ptr += encodedSize;
  37. }
  38. return ret;
  39. }
  40. }
  41. }