NativeCollider.cs 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. using System;
  4. using System.Runtime.CompilerServices;
  5. namespace BansheeEngine
  6. {
  7. /// <summary>
  8. /// Wrapper around the native Collider class.
  9. /// <see cref="Collider"/>
  10. /// </summary>
  11. internal class NativeCollider : ScriptObject
  12. {
  13. private Collider component;
  14. /// <summary>
  15. /// Component that owns the native collider object.
  16. /// </summary>
  17. public Collider Component
  18. {
  19. get { return component; }
  20. set { component = value; }
  21. }
  22. public Vector3 Position
  23. {
  24. get { Vector3 pos; Internal_GetPosition(mCachedPtr, out pos); return pos; }
  25. set { Quaternion rot = Rotation; Internal_SetTransform(mCachedPtr, ref value, ref rot); }
  26. }
  27. public Quaternion Rotation
  28. {
  29. get { Quaternion rot; Internal_GetRotation(mCachedPtr, out rot); return rot; }
  30. set { Vector3 pos = Position; Internal_SetTransform(mCachedPtr, ref pos, ref value); }
  31. }
  32. public Vector3 Scale
  33. {
  34. get { Vector3 scale; Internal_GetScale(mCachedPtr, out scale); return scale; }
  35. set { Internal_SetScale(mCachedPtr, ref value); }
  36. }
  37. public bool IsTrigger
  38. {
  39. get { return Internal_GetIsTrigger(mCachedPtr); }
  40. set { Internal_SetIsTrigger(mCachedPtr, value); }
  41. }
  42. public NativeRigidbody Rigidbody
  43. {
  44. get { return Internal_GetRigidbody(mCachedPtr); }
  45. set
  46. {
  47. IntPtr rigidbodyPtr = IntPtr.Zero;
  48. if (value != null)
  49. rigidbodyPtr = value.GetCachedPtr();
  50. Internal_SetRigidbody(mCachedPtr, rigidbodyPtr);
  51. }
  52. }
  53. public float Mass
  54. {
  55. get { return Internal_GetMass(mCachedPtr); }
  56. set { Internal_SetMass(mCachedPtr, value); }
  57. }
  58. public PhysicsMaterial Material
  59. {
  60. get { return Internal_GetMaterial(mCachedPtr); }
  61. set
  62. {
  63. IntPtr materialPtr = IntPtr.Zero;
  64. if (value != null)
  65. materialPtr = value.GetCachedPtr();
  66. Internal_SetMaterial(mCachedPtr, materialPtr);
  67. }
  68. }
  69. public float ContactOffset
  70. {
  71. get { return Internal_GetContactOffset(mCachedPtr); }
  72. set { Internal_SetContactOffset(mCachedPtr, value); }
  73. }
  74. public float RestOffset
  75. {
  76. get { return Internal_GetRestOffset(mCachedPtr); }
  77. set { Internal_SetRestOffset(mCachedPtr, value); }
  78. }
  79. public ulong Layer
  80. {
  81. get { return Internal_GetLayer(mCachedPtr); }
  82. set { Internal_SetLayer(mCachedPtr, value); }
  83. }
  84. public CollisionReportMode CollisionReportMode
  85. {
  86. get { return Internal_GetCollisionReportMode(mCachedPtr); }
  87. set { Internal_SetCollisionReportMode(mCachedPtr, value); }
  88. }
  89. public bool Raycast(Vector3 origin, Vector3 unitDir, out ScriptPhysicsQueryHit hit, float maxDist)
  90. {
  91. return Internal_RayCast(mCachedPtr, ref origin, ref unitDir, out hit, maxDist);
  92. }
  93. public void Destroy()
  94. {
  95. Internal_Destroy(mCachedPtr);
  96. }
  97. private void Internal_DoOnCollisionBegin(ScriptCollisionData scriptCollisionData)
  98. {
  99. CollisionData collisionData;
  100. collisionData.colliderA = scriptCollisionData.colliderA.Component;
  101. collisionData.colliderB = scriptCollisionData.colliderB.Component;
  102. collisionData.contactPoints = scriptCollisionData.contactPoints;
  103. Component.DoOnCollisionBegin(collisionData);
  104. }
  105. private void Internal_DoOnCollisionStay(ScriptCollisionData scriptCollisionData)
  106. {
  107. CollisionData collisionData;
  108. collisionData.colliderA = scriptCollisionData.colliderA.Component;
  109. collisionData.colliderB = scriptCollisionData.colliderB.Component;
  110. collisionData.contactPoints = scriptCollisionData.contactPoints;
  111. Component.DoOnCollisionStay(collisionData);
  112. }
  113. private void Internal_DoOnCollisionEnd(ScriptCollisionData scriptCollisionData)
  114. {
  115. CollisionData collisionData;
  116. collisionData.colliderA = scriptCollisionData.colliderA.Component;
  117. collisionData.colliderB = scriptCollisionData.colliderB.Component;
  118. collisionData.contactPoints = scriptCollisionData.contactPoints;
  119. Component.DoOnCollisionEnd(collisionData);
  120. }
  121. [MethodImpl(MethodImplOptions.InternalCall)]
  122. private static extern void Internal_Destroy(IntPtr thisPtr);
  123. [MethodImpl(MethodImplOptions.InternalCall)]
  124. private static extern void Internal_GetPosition(IntPtr thisPtr, out Vector3 pos);
  125. [MethodImpl(MethodImplOptions.InternalCall)]
  126. private static extern void Internal_GetRotation(IntPtr thisPtr, out Quaternion rot);
  127. [MethodImpl(MethodImplOptions.InternalCall)]
  128. private static extern void Internal_SetTransform(IntPtr thisPtr, ref Vector3 pos, ref Quaternion rot);
  129. [MethodImpl(MethodImplOptions.InternalCall)]
  130. private static extern void Internal_SetScale(IntPtr thisPtr, ref Vector3 scale);
  131. [MethodImpl(MethodImplOptions.InternalCall)]
  132. private static extern void Internal_GetScale(IntPtr thisPtr, out Vector3 scale);
  133. [MethodImpl(MethodImplOptions.InternalCall)]
  134. private static extern void Internal_SetIsTrigger(IntPtr thisPtr, bool value);
  135. [MethodImpl(MethodImplOptions.InternalCall)]
  136. private static extern bool Internal_GetIsTrigger(IntPtr thisPtr);
  137. [MethodImpl(MethodImplOptions.InternalCall)]
  138. private static extern void Internal_SetRigidbody(IntPtr thisPtr, IntPtr rigidbody);
  139. [MethodImpl(MethodImplOptions.InternalCall)]
  140. private static extern NativeRigidbody Internal_GetRigidbody(IntPtr thisPtr);
  141. [MethodImpl(MethodImplOptions.InternalCall)]
  142. private static extern void Internal_SetMass(IntPtr thisPtr, float mass);
  143. [MethodImpl(MethodImplOptions.InternalCall)]
  144. private static extern float Internal_GetMass(IntPtr thisPtr);
  145. [MethodImpl(MethodImplOptions.InternalCall)]
  146. private static extern void Internal_SetMaterial(IntPtr thisPtr, IntPtr physicsMaterial);
  147. [MethodImpl(MethodImplOptions.InternalCall)]
  148. private static extern PhysicsMaterial Internal_GetMaterial(IntPtr thisPtr);
  149. [MethodImpl(MethodImplOptions.InternalCall)]
  150. private static extern void Internal_SetContactOffset(IntPtr thisPtr, float value);
  151. [MethodImpl(MethodImplOptions.InternalCall)]
  152. private static extern float Internal_GetContactOffset(IntPtr thisPtr);
  153. [MethodImpl(MethodImplOptions.InternalCall)]
  154. private static extern void Internal_SetRestOffset(IntPtr thisPtr, float value);
  155. [MethodImpl(MethodImplOptions.InternalCall)]
  156. private static extern float Internal_GetRestOffset(IntPtr thisPtr);
  157. [MethodImpl(MethodImplOptions.InternalCall)]
  158. private static extern void Internal_SetLayer(IntPtr thisPtr, ulong layer);
  159. [MethodImpl(MethodImplOptions.InternalCall)]
  160. private static extern ulong Internal_GetLayer(IntPtr thisPtr);
  161. [MethodImpl(MethodImplOptions.InternalCall)]
  162. private static extern void Internal_SetCollisionReportMode(IntPtr thisPtr, CollisionReportMode mode);
  163. [MethodImpl(MethodImplOptions.InternalCall)]
  164. private static extern CollisionReportMode Internal_GetCollisionReportMode(IntPtr thisPtr);
  165. [MethodImpl(MethodImplOptions.InternalCall)]
  166. private static extern bool Internal_RayCast(IntPtr thisPtr, ref Vector3 origin, ref Vector3 unitDir,
  167. out ScriptPhysicsQueryHit hit, float maxDist);
  168. }
  169. }