BsScriptCollider.cpp 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "Wrappers/Physics/BsScriptCollider.h"
  4. #include "BsMonoUtil.h"
  5. #include "BsMonoClass.h"
  6. #include "BsMonoMethod.h"
  7. #include "Physics/BsCollider.h"
  8. #include "Physics/BsRigidbody.h"
  9. #include "Wrappers/Physics/BsScriptRigidbody.h"
  10. #include "Wrappers/Physics/BsScriptCollisionData.h"
  11. #include "Wrappers/Physics/BsScriptPhysicsQueryHit.h"
  12. #include "BsScriptResourceManager.h"
  13. #include "BsScriptPhysicsMaterial.generated.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. ScriptResourceBase* scriptMaterial = ScriptResourceManager::instance().getScriptResource(material, true);
  149. return scriptMaterial->getManagedInstance();
  150. }
  151. void ScriptCollider::internal_SetContactOffset(ScriptColliderBase* thisPtr, float value)
  152. {
  153. thisPtr->getCollider()->setContactOffset(value);
  154. }
  155. float ScriptCollider::internal_GetContactOffset(ScriptColliderBase* thisPtr)
  156. {
  157. return thisPtr->getCollider()->getContactOffset();
  158. }
  159. void ScriptCollider::internal_SetRestOffset(ScriptColliderBase* thisPtr, float value)
  160. {
  161. thisPtr->getCollider()->setRestOffset(value);
  162. }
  163. float ScriptCollider::internal_GetRestOffset(ScriptColliderBase* thisPtr)
  164. {
  165. return thisPtr->getCollider()->getRestOffset();
  166. }
  167. void ScriptCollider::internal_SetLayer(ScriptColliderBase* thisPtr, UINT64 layer)
  168. {
  169. thisPtr->getCollider()->setLayer(layer);
  170. }
  171. UINT64 ScriptCollider::internal_GetLayer(ScriptColliderBase* thisPtr)
  172. {
  173. return thisPtr->getCollider()->getLayer();
  174. }
  175. void ScriptCollider::internal_SetCollisionReportMode(ScriptColliderBase* thisPtr, CollisionReportMode mode)
  176. {
  177. thisPtr->getCollider()->setCollisionReportMode(mode);
  178. }
  179. CollisionReportMode ScriptCollider::internal_GetCollisionReportMode(ScriptColliderBase* thisPtr)
  180. {
  181. return thisPtr->getCollider()->getCollisionReportMode();
  182. }
  183. bool ScriptCollider::internal_RayCast(ScriptColliderBase* thisPtr, Vector3* origin, Vector3* unitDir, MonoObject** hit,
  184. float maxDist)
  185. {
  186. PhysicsQueryHit nativeHit;
  187. bool wasHit = thisPtr->getCollider()->rayCast(*origin, *unitDir, nativeHit, maxDist);
  188. if (!wasHit)
  189. *hit = nullptr;
  190. else
  191. *hit = ScriptPhysicsQueryHitHelper::box(ScriptPhysicsQueryHitHelper::create(nativeHit));
  192. return wasHit;
  193. }
  194. }