BsScriptPhysics.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsScriptPhysics.h"
  4. #include "BsMonoManager.h"
  5. #include "BsMonoClass.h"
  6. #include "BsMonoUtil.h"
  7. #include "BsPhysics.h"
  8. #include "BsScriptPhysicsMesh.h"
  9. #include "BsScriptCollider.h"
  10. #include "BsCollider.h"
  11. namespace bs
  12. {
  13. ScriptPhysics::ScriptPhysics(MonoObject* instance)
  14. :ScriptObject(instance)
  15. { }
  16. void ScriptPhysics::initRuntimeData()
  17. {
  18. metaData.scriptClass->addInternalCall("Internal_GetGravity", &ScriptPhysics::internal_GetGravity);
  19. metaData.scriptClass->addInternalCall("Internal_SetGravity", &ScriptPhysics::internal_SetGravity);
  20. metaData.scriptClass->addInternalCall("Internal_AddPhysicsRegion", &ScriptPhysics::internal_AddPhysicsRegion);
  21. metaData.scriptClass->addInternalCall("Internal_RemovePhysicsRegion", &ScriptPhysics::internal_RemovePhysicsRegion);
  22. metaData.scriptClass->addInternalCall("Internal_ClearPhysicsRegions", &ScriptPhysics::internal_ClearPhysicsRegions);
  23. metaData.scriptClass->addInternalCall("Internal_ToggleCollision", &ScriptPhysics::internal_ToggleCollision);
  24. metaData.scriptClass->addInternalCall("Internal_IsCollisionEnabled", &ScriptPhysics::internal_IsCollisionEnabled);
  25. metaData.scriptClass->addInternalCall("Internal_IsUpdateInProgress", &ScriptPhysics::internal_IsUpdateInProgress);
  26. metaData.scriptClass->addInternalCall("Internal_RayCast", &ScriptPhysics::internal_RayCast);
  27. metaData.scriptClass->addInternalCall("Internal_BoxCast", &ScriptPhysics::internal_BoxCast);
  28. metaData.scriptClass->addInternalCall("Internal_SphereCast", &ScriptPhysics::internal_SphereCast);
  29. metaData.scriptClass->addInternalCall("Internal_CapsuleCast", &ScriptPhysics::internal_CapsuleCast);
  30. metaData.scriptClass->addInternalCall("Internal_ConvexCast", &ScriptPhysics::internal_ConvexCast);
  31. metaData.scriptClass->addInternalCall("Internal_RayCastAll", &ScriptPhysics::internal_RayCastAll);
  32. metaData.scriptClass->addInternalCall("Internal_BoxCastAll", &ScriptPhysics::internal_BoxCastAll);
  33. metaData.scriptClass->addInternalCall("Internal_SphereCastAll", &ScriptPhysics::internal_SphereCastAll);
  34. metaData.scriptClass->addInternalCall("Internal_CapsuleCastAll", &ScriptPhysics::internal_CapsuleCastAll);
  35. metaData.scriptClass->addInternalCall("Internal_ConvexCastAll", &ScriptPhysics::internal_ConvexCastAll);
  36. metaData.scriptClass->addInternalCall("Internal_RayCastAny", &ScriptPhysics::internal_RayCastAny);
  37. metaData.scriptClass->addInternalCall("Internal_BoxCastAny", &ScriptPhysics::internal_BoxCastAny);
  38. metaData.scriptClass->addInternalCall("Internal_SphereCastAny", &ScriptPhysics::internal_SphereCastAny);
  39. metaData.scriptClass->addInternalCall("Internal_CapsuleCastAny", &ScriptPhysics::internal_CapsuleCastAny);
  40. metaData.scriptClass->addInternalCall("Internal_ConvexCastAny", &ScriptPhysics::internal_ConvexCastAny);
  41. metaData.scriptClass->addInternalCall("Internal_BoxOverlap", &ScriptPhysics::internal_BoxOverlap);
  42. metaData.scriptClass->addInternalCall("Internal_SphereOverlap", &ScriptPhysics::internal_SphereOverlap);
  43. metaData.scriptClass->addInternalCall("Internal_CapsuleOverlap", &ScriptPhysics::internal_CapsuleOverlap);
  44. metaData.scriptClass->addInternalCall("Internal_ConvexOverlap", &ScriptPhysics::internal_ConvexOverlap);
  45. metaData.scriptClass->addInternalCall("Internal_BoxOverlapAny", &ScriptPhysics::internal_BoxOverlapAny);
  46. metaData.scriptClass->addInternalCall("Internal_SphereOverlapAny", &ScriptPhysics::internal_SphereOverlapAny);
  47. metaData.scriptClass->addInternalCall("Internal_CapsuleOverlapAny", &ScriptPhysics::internal_CapsuleOverlapAny);
  48. metaData.scriptClass->addInternalCall("Internal_ConvexOverlapAny", &ScriptPhysics::internal_ConvexOverlapAny);
  49. }
  50. void ScriptPhysics::internal_GetGravity(Vector3* gravity)
  51. {
  52. *gravity = gPhysics().getGravity();
  53. }
  54. void ScriptPhysics::internal_SetGravity(Vector3* gravity)
  55. {
  56. gPhysics().setGravity(*gravity);
  57. }
  58. int ScriptPhysics::internal_AddPhysicsRegion(AABox* region)
  59. {
  60. return gPhysics().addBroadPhaseRegion(*region);
  61. }
  62. void ScriptPhysics::internal_RemovePhysicsRegion(int handle)
  63. {
  64. gPhysics().removeBroadPhaseRegion(handle);
  65. }
  66. void ScriptPhysics::internal_ClearPhysicsRegions()
  67. {
  68. gPhysics().clearBroadPhaseRegions();
  69. }
  70. void ScriptPhysics::internal_ToggleCollision(UINT64 layerA, UINT64 layerB, bool enabled)
  71. {
  72. gPhysics().toggleCollision(layerA, layerB, enabled);
  73. }
  74. bool ScriptPhysics::internal_IsCollisionEnabled(UINT64 layerA, UINT64 layerB)
  75. {
  76. return gPhysics().isCollisionEnabled(layerA, layerB);
  77. }
  78. bool ScriptPhysics::internal_IsUpdateInProgress()
  79. {
  80. return gPhysics()._isUpdateInProgress();
  81. }
  82. bool ScriptPhysics::internal_RayCast(Vector3* origin, Vector3* unitDir, ScriptPhysicsQueryHit* hit, UINT64 layer, float max)
  83. {
  84. PhysicsQueryHit nativeHit;
  85. bool wasHit = gPhysics().rayCast(*origin, *unitDir, nativeHit, layer, max);
  86. *hit = ScriptPhysicsQueryHitHelper::create(nativeHit);
  87. return wasHit;
  88. }
  89. bool ScriptPhysics::internal_BoxCast(AABox* box, Quaternion* rotation, Vector3* unitDir, ScriptPhysicsQueryHit* hit, UINT64 layer, float max)
  90. {
  91. PhysicsQueryHit nativeHit;
  92. bool wasHit = gPhysics().boxCast(*box, *rotation, *unitDir, nativeHit, layer, max);
  93. *hit = ScriptPhysicsQueryHitHelper::create(nativeHit);
  94. return wasHit;
  95. }
  96. bool ScriptPhysics::internal_SphereCast(Sphere* sphere, Vector3* unitDir, ScriptPhysicsQueryHit* hit, UINT64 layer, float max)
  97. {
  98. PhysicsQueryHit nativeHit;
  99. bool wasHit = gPhysics().sphereCast(*sphere, *unitDir, nativeHit, layer, max);
  100. *hit = ScriptPhysicsQueryHitHelper::create(nativeHit);
  101. return wasHit;
  102. }
  103. bool ScriptPhysics::internal_CapsuleCast(Capsule* capsule, Quaternion* rotation, Vector3* unitDir, ScriptPhysicsQueryHit* hit, UINT64 layer, float max)
  104. {
  105. PhysicsQueryHit nativeHit;
  106. bool wasHit = gPhysics().capsuleCast(*capsule, *rotation, *unitDir, nativeHit, layer, max);
  107. *hit = ScriptPhysicsQueryHitHelper::create(nativeHit);
  108. return wasHit;
  109. }
  110. bool ScriptPhysics::internal_ConvexCast(ScriptPhysicsMesh* mesh, Vector3* position, Quaternion* rotation, Vector3* unitDir, ScriptPhysicsQueryHit* hit, UINT64 layer, float max)
  111. {
  112. HPhysicsMesh meshHandle;
  113. if (mesh != nullptr)
  114. meshHandle = mesh->getHandle();
  115. PhysicsQueryHit nativeHit;
  116. bool wasHit = gPhysics().convexCast(meshHandle, *position, *rotation, *unitDir, nativeHit, layer, max);
  117. *hit = ScriptPhysicsQueryHitHelper::create(nativeHit);
  118. return wasHit;
  119. }
  120. MonoArray* nativeToManagedHitArray(const Vector<PhysicsQueryHit>& hits)
  121. {
  122. UINT32 numHits = (UINT32)hits.size();
  123. ScriptArray output = ScriptArray::create<ScriptPhysicsQueryHitHelper>(numHits);
  124. for (UINT32 i = 0; i < numHits; i++)
  125. output.set(i, ScriptPhysicsQueryHitHelper::create(hits[i]));
  126. return output.getInternal();
  127. }
  128. MonoArray* ScriptPhysics::internal_RayCastAll(Vector3* origin, Vector3* unitDir, UINT64 layer, float max)
  129. {
  130. return nativeToManagedHitArray(gPhysics().rayCastAll(*origin, *unitDir, layer, max));
  131. }
  132. MonoArray* ScriptPhysics::internal_BoxCastAll(AABox* box, Quaternion* rotation, Vector3* unitDir, UINT64 layer, float max)
  133. {
  134. return nativeToManagedHitArray(gPhysics().boxCastAll(*box, *rotation, *unitDir, layer, max));
  135. }
  136. MonoArray* ScriptPhysics::internal_SphereCastAll(Sphere* sphere, Vector3* unitDir, UINT64 layer, float max)
  137. {
  138. return nativeToManagedHitArray(gPhysics().sphereCastAll(*sphere, *unitDir, layer, max));
  139. }
  140. MonoArray* ScriptPhysics::internal_CapsuleCastAll(Capsule* capsule, Quaternion* rotation, Vector3* unitDir, UINT64 layer, float max)
  141. {
  142. return nativeToManagedHitArray(gPhysics().capsuleCastAll(*capsule, *rotation, *unitDir, layer, max));
  143. }
  144. MonoArray* ScriptPhysics::internal_ConvexCastAll(ScriptPhysicsMesh* mesh, Vector3* position, Quaternion* rotation, Vector3* unitDir, UINT64 layer, float max)
  145. {
  146. HPhysicsMesh meshHandle;
  147. if (mesh != nullptr)
  148. meshHandle = mesh->getHandle();
  149. return nativeToManagedHitArray(gPhysics().convexCastAll(meshHandle, *position, *rotation, *unitDir, layer, max));
  150. }
  151. bool ScriptPhysics::internal_RayCastAny(Vector3* origin, Vector3* unitDir, UINT64 layer, float max)
  152. {
  153. return gPhysics().rayCastAny(*origin, *unitDir, layer, max);
  154. }
  155. bool ScriptPhysics::internal_BoxCastAny(AABox* box, Quaternion* rotation, Vector3* unitDir, UINT64 layer, float max)
  156. {
  157. return gPhysics().boxCastAny(*box, *rotation, *unitDir, layer, max);
  158. }
  159. bool ScriptPhysics::internal_SphereCastAny(Sphere* sphere, Vector3* unitDir, UINT64 layer, float max)
  160. {
  161. return gPhysics().sphereCastAny(*sphere, *unitDir, layer, max);
  162. }
  163. bool ScriptPhysics::internal_CapsuleCastAny(Capsule* capsule, Quaternion* rotation, Vector3* unitDir, UINT64 layer, float max)
  164. {
  165. return gPhysics().capsuleCastAny(*capsule, *rotation, *unitDir, layer, max);
  166. }
  167. bool ScriptPhysics::internal_ConvexCastAny(ScriptPhysicsMesh* mesh, Vector3* position, Quaternion* rotation, Vector3* unitDir, UINT64 layer, float max)
  168. {
  169. HPhysicsMesh meshHandle;
  170. if (mesh != nullptr)
  171. meshHandle = mesh->getHandle();
  172. return gPhysics().convexCastAny(meshHandle, *position, *rotation, *unitDir, layer, max);
  173. }
  174. MonoArray* nativeToManagedColliderArray(const Vector<Collider*>& colliders)
  175. {
  176. UINT32 numColliders = (UINT32)colliders.size();
  177. ScriptArray output = ScriptArray::create<ScriptCollider>(numColliders);
  178. for (UINT32 i = 0; i < numColliders; i++)
  179. output.set(i, colliders[i]->_getOwner(PhysicsOwnerType::Script));
  180. return output.getInternal();
  181. }
  182. MonoArray* ScriptPhysics::internal_BoxOverlap(AABox* box, Quaternion* rotation, UINT64 layer)
  183. {
  184. return nativeToManagedColliderArray(gPhysics()._boxOverlap(*box, *rotation, layer));
  185. }
  186. MonoArray* ScriptPhysics::internal_SphereOverlap(Sphere* sphere, UINT64 layer)
  187. {
  188. return nativeToManagedColliderArray(gPhysics()._sphereOverlap(*sphere, layer));
  189. }
  190. MonoArray* ScriptPhysics::internal_CapsuleOverlap(Capsule* capsule, Quaternion* rotation, UINT64 layer)
  191. {
  192. return nativeToManagedColliderArray(gPhysics()._capsuleOverlap(*capsule, *rotation, layer));
  193. }
  194. MonoArray* ScriptPhysics::internal_ConvexOverlap(ScriptPhysicsMesh* mesh, Vector3* position, Quaternion* rotation, UINT64 layer)
  195. {
  196. HPhysicsMesh meshHandle;
  197. if (mesh != nullptr)
  198. meshHandle = mesh->getHandle();
  199. return nativeToManagedColliderArray(gPhysics()._convexOverlap(meshHandle, *position, *rotation, layer));
  200. }
  201. bool ScriptPhysics::internal_BoxOverlapAny(AABox* box, Quaternion* rotation, UINT64 layer)
  202. {
  203. return gPhysics().boxOverlapAny(*box, *rotation, layer);
  204. }
  205. bool ScriptPhysics::internal_SphereOverlapAny(Sphere* sphere, UINT64 layer)
  206. {
  207. return gPhysics().sphereOverlapAny(*sphere, layer);
  208. }
  209. bool ScriptPhysics::internal_CapsuleOverlapAny(Capsule* capsule, Quaternion* rotation, UINT64 layer)
  210. {
  211. return gPhysics().capsuleOverlapAny(*capsule, *rotation, layer);
  212. }
  213. bool ScriptPhysics::internal_ConvexOverlapAny(ScriptPhysicsMesh* mesh, Vector3* position, Quaternion* rotation, UINT64 layer)
  214. {
  215. HPhysicsMesh meshHandle;
  216. if (mesh != nullptr)
  217. meshHandle = mesh->getHandle();
  218. return gPhysics().convexOverlapAny(meshHandle, *position, *rotation, layer);
  219. }
  220. }