BsScriptCollider.cpp 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  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 BansheeEngine
  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(&Collider::onCollisionBegin, instance, _1));
  28. collider->onCollisionStay.connect(std::bind(&Collider::onCollisionStay, instance, _1));
  29. collider->onCollisionEnd.connect(std::bind(&Collider::onCollisionEnd, instance, _1));
  30. }
  31. ScriptCollider::ScriptCollider(MonoObject* instance)
  32. :TScriptCollider(instance, nullptr)
  33. { }
  34. void ScriptCollider::initRuntimeData()
  35. {
  36. metaData.scriptClass->addInternalCall("Internal_GetPosition", &ScriptCollider::internal_GetPosition);
  37. metaData.scriptClass->addInternalCall("Internal_GetRotation", &ScriptCollider::internal_GetRotation);
  38. metaData.scriptClass->addInternalCall("Internal_SetTransform", &ScriptCollider::internal_SetTransform);
  39. metaData.scriptClass->addInternalCall("Internal_SetScale", &ScriptCollider::internal_SetScale);
  40. metaData.scriptClass->addInternalCall("Internal_GetScale", &ScriptCollider::internal_GetScale);
  41. metaData.scriptClass->addInternalCall("Internal_SetIsTrigger", &ScriptCollider::internal_SetIsTrigger);
  42. metaData.scriptClass->addInternalCall("Internal_GetIsTrigger", &ScriptCollider::internal_GetIsTrigger);
  43. metaData.scriptClass->addInternalCall("Internal_SetRigidbody", &ScriptCollider::internal_SetRigidbody);
  44. metaData.scriptClass->addInternalCall("Internal_GetRigidbody", &ScriptCollider::internal_GetRigidbody);
  45. metaData.scriptClass->addInternalCall("Internal_SetMass", &ScriptCollider::internal_SetMass);
  46. metaData.scriptClass->addInternalCall("Internal_GetMass", &ScriptCollider::internal_GetMass);
  47. metaData.scriptClass->addInternalCall("Internal_SetMaterial", &ScriptCollider::internal_SetMaterial);
  48. metaData.scriptClass->addInternalCall("Internal_GetMaterial", &ScriptCollider::internal_GetMaterial);
  49. metaData.scriptClass->addInternalCall("Internal_SetContactOffset", &ScriptCollider::internal_SetContactOffset);
  50. metaData.scriptClass->addInternalCall("Internal_GetContactOffset", &ScriptCollider::internal_GetContactOffset);
  51. metaData.scriptClass->addInternalCall("Internal_SetRestOffset", &ScriptCollider::internal_SetRestOffset);
  52. metaData.scriptClass->addInternalCall("Internal_GetRestOffset", &ScriptCollider::internal_GetRestOffset);
  53. metaData.scriptClass->addInternalCall("Internal_SetLayer", &ScriptCollider::internal_SetLayer);
  54. metaData.scriptClass->addInternalCall("Internal_GetLayer", &ScriptCollider::internal_GetLayer);
  55. metaData.scriptClass->addInternalCall("Internal_SetCollisionReportMode", &ScriptCollider::internal_SetCollisionReportMode);
  56. metaData.scriptClass->addInternalCall("Internal_GetCollisionReportMode", &ScriptCollider::internal_GetCollisionReportMode);
  57. metaData.scriptClass->addInternalCall("Internal_RayCast", &ScriptCollider::internal_RayCast);
  58. onCollisionBeginThunk = (OnCollisionThunkDef)metaData.scriptClass->getMethod("Internal_DoOnCollisionBegin", 1)->getThunk();
  59. onCollisionStayThunk = (OnCollisionThunkDef)metaData.scriptClass->getMethod("Internal_DoOnCollisionStay", 1)->getThunk();
  60. onCollisionEndThunk = (OnCollisionThunkDef)metaData.scriptClass->getMethod("Internal_DoOnCollisionEnd", 1)->getThunk();
  61. }
  62. void ScriptCollider::onCollisionBegin(MonoObject* instance, const CollisionData& collisionData)
  63. {
  64. MonoObject* managedCollisionData = ScriptCollisionDataHelper::box(ScriptCollisionDataHelper::create(collisionData));
  65. MonoUtil::invokeThunk(onCollisionBeginThunk, instance, managedCollisionData);
  66. }
  67. void ScriptCollider::onCollisionStay(MonoObject* instance, const CollisionData& collisionData)
  68. {
  69. MonoObject* managedCollisionData = ScriptCollisionDataHelper::box(ScriptCollisionDataHelper::create(collisionData));
  70. MonoUtil::invokeThunk(onCollisionStayThunk, instance, managedCollisionData);
  71. }
  72. void ScriptCollider::onCollisionEnd(MonoObject* instance, const CollisionData& collisionData)
  73. {
  74. MonoObject* managedCollisionData = ScriptCollisionDataHelper::box(ScriptCollisionDataHelper::create(collisionData));
  75. MonoUtil::invokeThunk(onCollisionEndThunk, instance, managedCollisionData);
  76. }
  77. void ScriptCollider::internal_GetPosition(ScriptColliderBase* thisPtr, Vector3* pos)
  78. {
  79. *pos = thisPtr->getCollider()->getPosition();
  80. }
  81. void ScriptCollider::internal_GetRotation(ScriptColliderBase* thisPtr, Quaternion* rot)
  82. {
  83. *rot = thisPtr->getCollider()->getRotation();
  84. }
  85. void ScriptCollider::internal_SetTransform(ScriptColliderBase* thisPtr, Vector3* pos, Quaternion* rot)
  86. {
  87. thisPtr->getCollider()->setTransform(*pos, *rot);
  88. }
  89. void ScriptCollider::internal_SetScale(ScriptColliderBase* thisPtr, Vector3* scale)
  90. {
  91. thisPtr->getCollider()->setScale(*scale);
  92. }
  93. void ScriptCollider::internal_GetScale(ScriptColliderBase* thisPtr, Vector3* scale)
  94. {
  95. *scale = thisPtr->getCollider()->getScale();
  96. }
  97. void ScriptCollider::internal_SetIsTrigger(ScriptColliderBase* thisPtr, bool value)
  98. {
  99. thisPtr->getCollider()->setIsTrigger(value);
  100. }
  101. bool ScriptCollider::internal_GetIsTrigger(ScriptColliderBase* thisPtr)
  102. {
  103. return thisPtr->getCollider()->getIsTrigger();
  104. }
  105. void ScriptCollider::internal_SetRigidbody(ScriptColliderBase* thisPtr, ScriptRigidbody* value)
  106. {
  107. Rigidbody* rigidbodyPtr = nullptr;
  108. if (value != nullptr)
  109. rigidbodyPtr = value->getRigidbody();
  110. thisPtr->getCollider()->setRigidbody(rigidbodyPtr);
  111. }
  112. MonoObject* ScriptCollider::internal_GetRigidbody(ScriptColliderBase* thisPtr)
  113. {
  114. Rigidbody* rigidbodyPtr = thisPtr->getCollider()->getRigidbody();
  115. if (rigidbodyPtr == nullptr)
  116. return nullptr;
  117. return (MonoObject*)rigidbodyPtr->_getOwner(PhysicsOwnerType::Script);
  118. }
  119. void ScriptCollider::internal_SetMass(ScriptColliderBase* thisPtr, float mass)
  120. {
  121. thisPtr->getCollider()->setMass(mass);
  122. }
  123. float ScriptCollider::internal_GetMass(ScriptColliderBase* thisPtr)
  124. {
  125. return thisPtr->getCollider()->getMass();
  126. }
  127. void ScriptCollider::internal_SetMaterial(ScriptColliderBase* thisPtr, ScriptPhysicsMaterial* material)
  128. {
  129. HPhysicsMaterial materialHandle;
  130. if (material != nullptr)
  131. materialHandle = material->getHandle();
  132. thisPtr->getCollider()->setMaterial(materialHandle);
  133. }
  134. MonoObject* ScriptCollider::internal_GetMaterial(ScriptColliderBase* thisPtr)
  135. {
  136. HPhysicsMaterial material = thisPtr->getCollider()->getMaterial();
  137. if (material == nullptr)
  138. return nullptr;
  139. ScriptPhysicsMaterial* scriptMaterial;
  140. ScriptResourceManager::instance().getScriptResource(material, &scriptMaterial, true);
  141. return scriptMaterial->getManagedInstance();
  142. }
  143. void ScriptCollider::internal_SetContactOffset(ScriptColliderBase* thisPtr, float value)
  144. {
  145. thisPtr->getCollider()->setContactOffset(value);
  146. }
  147. float ScriptCollider::internal_GetContactOffset(ScriptColliderBase* thisPtr)
  148. {
  149. return thisPtr->getCollider()->getContactOffset();
  150. }
  151. void ScriptCollider::internal_SetRestOffset(ScriptColliderBase* thisPtr, float value)
  152. {
  153. thisPtr->getCollider()->setRestOffset(value);
  154. }
  155. float ScriptCollider::internal_GetRestOffset(ScriptColliderBase* thisPtr)
  156. {
  157. return thisPtr->getCollider()->getRestOffset();
  158. }
  159. void ScriptCollider::internal_SetLayer(ScriptColliderBase* thisPtr, UINT64 layer)
  160. {
  161. thisPtr->getCollider()->setLayer(layer);
  162. }
  163. UINT64 ScriptCollider::internal_GetLayer(ScriptColliderBase* thisPtr)
  164. {
  165. return thisPtr->getCollider()->getLayer();
  166. }
  167. void ScriptCollider::internal_SetCollisionReportMode(ScriptColliderBase* thisPtr, CollisionReportMode mode)
  168. {
  169. thisPtr->getCollider()->setCollisionReportMode(mode);
  170. }
  171. CollisionReportMode ScriptCollider::internal_GetCollisionReportMode(ScriptColliderBase* thisPtr)
  172. {
  173. return thisPtr->getCollider()->getCollisionReportMode();
  174. }
  175. bool ScriptCollider::internal_RayCast(ScriptColliderBase* thisPtr, Vector3* origin, Vector3* unitDir, MonoObject** hit,
  176. float maxDist)
  177. {
  178. PhysicsQueryHit nativeHit;
  179. bool wasHit = thisPtr->getCollider()->rayCast(*origin, *unitDir, nativeHit, maxDist);
  180. if (!wasHit)
  181. *hit = nullptr;
  182. else
  183. *hit = ScriptPhysicsQueryHitHelper::box(ScriptPhysicsQueryHitHelper::create(nativeHit));
  184. return wasHit;
  185. }
  186. }