BsScriptCollider.cpp 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsScriptCollider.h"
  4. #include "BsMonoUtil.h"
  5. #include "BsMonoClass.h"
  6. #include "BsMonoMethod.h"
  7. #include "BsCollider.h"
  8. #include "BsRigidbody.h"
  9. #include "BsScriptRigidbody.h"
  10. #include "BsScriptPhysicsMaterial.h"
  11. #include "BsScriptCollisionData.h"
  12. #include "BsScriptPhysicsQueryHit.h"
  13. #include "BsScriptResourceManager.h"
  14. using namespace std::placeholders;
  15. namespace bs
  16. {
  17. ScriptCollider::OnCollisionThunkDef ScriptCollider::onCollisionBeginThunk = nullptr;
  18. ScriptCollider::OnCollisionThunkDef ScriptCollider::onCollisionStayThunk = nullptr;
  19. ScriptCollider::OnCollisionThunkDef ScriptCollider::onCollisionEndThunk = nullptr;
  20. ScriptColliderBase::ScriptColliderBase(MonoObject* instance)
  21. :ScriptObjectBase(instance)
  22. { }
  23. void ScriptColliderBase::initialize(const SPtr<Collider>& collider)
  24. {
  25. mCollider = collider;
  26. MonoObject* instance = getManagedInstance();
  27. collider->onCollisionBegin.connect(std::bind(&ScriptCollider::onCollisionBegin, instance, _1));
  28. collider->onCollisionStay.connect(std::bind(&ScriptCollider::onCollisionStay, instance, _1));
  29. collider->onCollisionEnd.connect(std::bind(&ScriptCollider::onCollisionEnd, instance, _1));
  30. }
  31. void ScriptColliderBase::destroyCollider()
  32. {
  33. mCollider = nullptr;
  34. }
  35. ScriptCollider::ScriptCollider(MonoObject* instance)
  36. :TScriptCollider(instance, nullptr)
  37. { }
  38. void ScriptCollider::initRuntimeData()
  39. {
  40. metaData.scriptClass->addInternalCall("Internal_Destroy", &ScriptCollider::internal_Destroy);
  41. metaData.scriptClass->addInternalCall("Internal_GetPosition", &ScriptCollider::internal_GetPosition);
  42. metaData.scriptClass->addInternalCall("Internal_GetRotation", &ScriptCollider::internal_GetRotation);
  43. metaData.scriptClass->addInternalCall("Internal_SetTransform", &ScriptCollider::internal_SetTransform);
  44. metaData.scriptClass->addInternalCall("Internal_SetScale", &ScriptCollider::internal_SetScale);
  45. metaData.scriptClass->addInternalCall("Internal_GetScale", &ScriptCollider::internal_GetScale);
  46. metaData.scriptClass->addInternalCall("Internal_SetIsTrigger", &ScriptCollider::internal_SetIsTrigger);
  47. metaData.scriptClass->addInternalCall("Internal_GetIsTrigger", &ScriptCollider::internal_GetIsTrigger);
  48. metaData.scriptClass->addInternalCall("Internal_SetRigidbody", &ScriptCollider::internal_SetRigidbody);
  49. metaData.scriptClass->addInternalCall("Internal_GetRigidbody", &ScriptCollider::internal_GetRigidbody);
  50. metaData.scriptClass->addInternalCall("Internal_SetMass", &ScriptCollider::internal_SetMass);
  51. metaData.scriptClass->addInternalCall("Internal_GetMass", &ScriptCollider::internal_GetMass);
  52. metaData.scriptClass->addInternalCall("Internal_SetMaterial", &ScriptCollider::internal_SetMaterial);
  53. metaData.scriptClass->addInternalCall("Internal_GetMaterial", &ScriptCollider::internal_GetMaterial);
  54. metaData.scriptClass->addInternalCall("Internal_SetContactOffset", &ScriptCollider::internal_SetContactOffset);
  55. metaData.scriptClass->addInternalCall("Internal_GetContactOffset", &ScriptCollider::internal_GetContactOffset);
  56. metaData.scriptClass->addInternalCall("Internal_SetRestOffset", &ScriptCollider::internal_SetRestOffset);
  57. metaData.scriptClass->addInternalCall("Internal_GetRestOffset", &ScriptCollider::internal_GetRestOffset);
  58. metaData.scriptClass->addInternalCall("Internal_SetLayer", &ScriptCollider::internal_SetLayer);
  59. metaData.scriptClass->addInternalCall("Internal_GetLayer", &ScriptCollider::internal_GetLayer);
  60. metaData.scriptClass->addInternalCall("Internal_SetCollisionReportMode", &ScriptCollider::internal_SetCollisionReportMode);
  61. metaData.scriptClass->addInternalCall("Internal_GetCollisionReportMode", &ScriptCollider::internal_GetCollisionReportMode);
  62. metaData.scriptClass->addInternalCall("Internal_RayCast", &ScriptCollider::internal_RayCast);
  63. onCollisionBeginThunk = (OnCollisionThunkDef)metaData.scriptClass->getMethod("Internal_DoOnCollisionBegin", 1)->getThunk();
  64. onCollisionStayThunk = (OnCollisionThunkDef)metaData.scriptClass->getMethod("Internal_DoOnCollisionStay", 1)->getThunk();
  65. onCollisionEndThunk = (OnCollisionThunkDef)metaData.scriptClass->getMethod("Internal_DoOnCollisionEnd", 1)->getThunk();
  66. }
  67. void ScriptCollider::onCollisionBegin(MonoObject* instance, const CollisionData& collisionData)
  68. {
  69. MonoObject* managedCollisionData = ScriptCollisionDataHelper::box(ScriptCollisionDataHelper::create(collisionData));
  70. MonoUtil::invokeThunk(onCollisionBeginThunk, instance, managedCollisionData);
  71. }
  72. void ScriptCollider::onCollisionStay(MonoObject* instance, const CollisionData& collisionData)
  73. {
  74. MonoObject* managedCollisionData = ScriptCollisionDataHelper::box(ScriptCollisionDataHelper::create(collisionData));
  75. MonoUtil::invokeThunk(onCollisionStayThunk, instance, managedCollisionData);
  76. }
  77. void ScriptCollider::onCollisionEnd(MonoObject* instance, const CollisionData& collisionData)
  78. {
  79. MonoObject* managedCollisionData = ScriptCollisionDataHelper::box(ScriptCollisionDataHelper::create(collisionData));
  80. MonoUtil::invokeThunk(onCollisionEndThunk, instance, managedCollisionData);
  81. }
  82. void ScriptCollider::internal_Destroy(ScriptColliderBase* thisPtr)
  83. {
  84. thisPtr->destroyCollider();
  85. }
  86. void ScriptCollider::internal_GetPosition(ScriptColliderBase* thisPtr, Vector3* pos)
  87. {
  88. *pos = thisPtr->getCollider()->getPosition();
  89. }
  90. void ScriptCollider::internal_GetRotation(ScriptColliderBase* thisPtr, Quaternion* rot)
  91. {
  92. *rot = thisPtr->getCollider()->getRotation();
  93. }
  94. void ScriptCollider::internal_SetTransform(ScriptColliderBase* thisPtr, Vector3* pos, Quaternion* rot)
  95. {
  96. thisPtr->getCollider()->setTransform(*pos, *rot);
  97. }
  98. void ScriptCollider::internal_SetScale(ScriptColliderBase* thisPtr, Vector3* scale)
  99. {
  100. thisPtr->getCollider()->setScale(*scale);
  101. }
  102. void ScriptCollider::internal_GetScale(ScriptColliderBase* thisPtr, Vector3* scale)
  103. {
  104. *scale = thisPtr->getCollider()->getScale();
  105. }
  106. void ScriptCollider::internal_SetIsTrigger(ScriptColliderBase* thisPtr, bool value)
  107. {
  108. thisPtr->getCollider()->setIsTrigger(value);
  109. }
  110. bool ScriptCollider::internal_GetIsTrigger(ScriptColliderBase* thisPtr)
  111. {
  112. return thisPtr->getCollider()->getIsTrigger();
  113. }
  114. void ScriptCollider::internal_SetRigidbody(ScriptColliderBase* thisPtr, ScriptRigidbody* value)
  115. {
  116. Rigidbody* rigidbodyPtr = nullptr;
  117. if (value != nullptr)
  118. rigidbodyPtr = value->getRigidbody();
  119. thisPtr->getCollider()->setRigidbody(rigidbodyPtr);
  120. }
  121. MonoObject* ScriptCollider::internal_GetRigidbody(ScriptColliderBase* thisPtr)
  122. {
  123. Rigidbody* rigidbodyPtr = thisPtr->getCollider()->getRigidbody();
  124. if (rigidbodyPtr == nullptr)
  125. return nullptr;
  126. return (MonoObject*)rigidbodyPtr->_getOwner(PhysicsOwnerType::Script);
  127. }
  128. void ScriptCollider::internal_SetMass(ScriptColliderBase* thisPtr, float mass)
  129. {
  130. thisPtr->getCollider()->setMass(mass);
  131. }
  132. float ScriptCollider::internal_GetMass(ScriptColliderBase* thisPtr)
  133. {
  134. return thisPtr->getCollider()->getMass();
  135. }
  136. void ScriptCollider::internal_SetMaterial(ScriptColliderBase* thisPtr, ScriptPhysicsMaterial* material)
  137. {
  138. HPhysicsMaterial materialHandle;
  139. if (material != nullptr)
  140. materialHandle = material->getHandle();
  141. thisPtr->getCollider()->setMaterial(materialHandle);
  142. }
  143. MonoObject* ScriptCollider::internal_GetMaterial(ScriptColliderBase* thisPtr)
  144. {
  145. HPhysicsMaterial material = thisPtr->getCollider()->getMaterial();
  146. if (material == nullptr)
  147. return nullptr;
  148. ScriptPhysicsMaterial* scriptMaterial;
  149. ScriptResourceManager::instance().getScriptResource(material, &scriptMaterial, true);
  150. return scriptMaterial->getManagedInstance();
  151. }
  152. void ScriptCollider::internal_SetContactOffset(ScriptColliderBase* thisPtr, float value)
  153. {
  154. thisPtr->getCollider()->setContactOffset(value);
  155. }
  156. float ScriptCollider::internal_GetContactOffset(ScriptColliderBase* thisPtr)
  157. {
  158. return thisPtr->getCollider()->getContactOffset();
  159. }
  160. void ScriptCollider::internal_SetRestOffset(ScriptColliderBase* thisPtr, float value)
  161. {
  162. thisPtr->getCollider()->setRestOffset(value);
  163. }
  164. float ScriptCollider::internal_GetRestOffset(ScriptColliderBase* thisPtr)
  165. {
  166. return thisPtr->getCollider()->getRestOffset();
  167. }
  168. void ScriptCollider::internal_SetLayer(ScriptColliderBase* thisPtr, UINT64 layer)
  169. {
  170. thisPtr->getCollider()->setLayer(layer);
  171. }
  172. UINT64 ScriptCollider::internal_GetLayer(ScriptColliderBase* thisPtr)
  173. {
  174. return thisPtr->getCollider()->getLayer();
  175. }
  176. void ScriptCollider::internal_SetCollisionReportMode(ScriptColliderBase* thisPtr, CollisionReportMode mode)
  177. {
  178. thisPtr->getCollider()->setCollisionReportMode(mode);
  179. }
  180. CollisionReportMode ScriptCollider::internal_GetCollisionReportMode(ScriptColliderBase* thisPtr)
  181. {
  182. return thisPtr->getCollider()->getCollisionReportMode();
  183. }
  184. bool ScriptCollider::internal_RayCast(ScriptColliderBase* thisPtr, Vector3* origin, Vector3* unitDir, MonoObject** hit,
  185. float maxDist)
  186. {
  187. PhysicsQueryHit nativeHit;
  188. bool wasHit = thisPtr->getCollider()->rayCast(*origin, *unitDir, nativeHit, maxDist);
  189. if (!wasHit)
  190. *hit = nullptr;
  191. else
  192. *hit = ScriptPhysicsQueryHitHelper::box(ScriptPhysicsQueryHitHelper::create(nativeHit));
  193. return wasHit;
  194. }
  195. }