BsScriptRigidbody.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsScriptRigidbody.h"
  4. #include "BsMonoUtil.h"
  5. #include "BsMonoClass.h"
  6. #include "BsMonoMethod.h"
  7. #include "BsScriptCollisionData.h"
  8. #include "BsScriptSceneObject.h"
  9. #include "BsScriptCollider.h"
  10. #include "BsCollider.h"
  11. #include "BsQuaternion.h"
  12. using namespace std::placeholders;
  13. namespace BansheeEngine
  14. {
  15. ScriptRigidbody::OnCollisionThunkDef ScriptRigidbody::onCollisionBeginThunk = nullptr;
  16. ScriptRigidbody::OnCollisionThunkDef ScriptRigidbody::onCollisionStayThunk = nullptr;
  17. ScriptRigidbody::OnCollisionThunkDef ScriptRigidbody::onCollisionEndThunk = nullptr;
  18. ScriptRigidbody::ScriptRigidbody(MonoObject* instance, const SPtr<Rigidbody>& body)
  19. :ScriptObject(instance), mRigidbody(body)
  20. {
  21. body->onCollisionBegin.connect(std::bind(&ScriptRigidbody::onCollisionBegin, instance, _1));
  22. body->onCollisionStay.connect(std::bind(&ScriptRigidbody::onCollisionStay, instance, _1));
  23. body->onCollisionEnd.connect(std::bind(&ScriptRigidbody::onCollisionEnd, instance, _1));
  24. }
  25. void ScriptRigidbody::initRuntimeData()
  26. {
  27. metaData.scriptClass->addInternalCall("Internal_CreateInstance", &ScriptRigidbody::internal_CreateInstance);
  28. metaData.scriptClass->addInternalCall("Internal_Destroy", &ScriptRigidbody::internal_Destroy);
  29. metaData.scriptClass->addInternalCall("Internal_Move", &ScriptRigidbody::internal_Move);
  30. metaData.scriptClass->addInternalCall("Internal_Rotate", &ScriptRigidbody::internal_Rotate);
  31. metaData.scriptClass->addInternalCall("Internal_GetPosition", &ScriptRigidbody::internal_GetPosition);
  32. metaData.scriptClass->addInternalCall("Internal_GetRotation", &ScriptRigidbody::internal_GetRotation);
  33. metaData.scriptClass->addInternalCall("Internal_SetTransform", &ScriptRigidbody::internal_SetTransform);
  34. metaData.scriptClass->addInternalCall("Internal_SetMass", &ScriptRigidbody::internal_SetMass);
  35. metaData.scriptClass->addInternalCall("Internal_GetMass", &ScriptRigidbody::internal_GetMass);
  36. metaData.scriptClass->addInternalCall("Internal_SetIsKinematic", &ScriptRigidbody::internal_SetIsKinematic);
  37. metaData.scriptClass->addInternalCall("Internal_GetIsKinematic", &ScriptRigidbody::internal_GetIsKinematic);
  38. metaData.scriptClass->addInternalCall("Internal_IsSleeping", &ScriptRigidbody::internal_IsSleeping);
  39. metaData.scriptClass->addInternalCall("Internal_Sleep", &ScriptRigidbody::internal_Sleep);
  40. metaData.scriptClass->addInternalCall("Internal_WakeUp", &ScriptRigidbody::internal_WakeUp);
  41. metaData.scriptClass->addInternalCall("Internal_SetSleepThreshold", &ScriptRigidbody::internal_SetSleepThreshold);
  42. metaData.scriptClass->addInternalCall("Internal_GetSleepThreshold", &ScriptRigidbody::internal_GetSleepThreshold);
  43. metaData.scriptClass->addInternalCall("Internal_SetUseGravity", &ScriptRigidbody::internal_SetUseGravity);
  44. metaData.scriptClass->addInternalCall("Internal_GetUseGravity", &ScriptRigidbody::internal_GetUseGravity);
  45. metaData.scriptClass->addInternalCall("Internal_SetVelocity", &ScriptRigidbody::internal_SetVelocity);
  46. metaData.scriptClass->addInternalCall("Internal_GetVelocity", &ScriptRigidbody::internal_GetVelocity);
  47. metaData.scriptClass->addInternalCall("Internal_SetAngularVelocity", &ScriptRigidbody::internal_SetAngularVelocity);
  48. metaData.scriptClass->addInternalCall("Internal_GetAngularVelocity", &ScriptRigidbody::internal_GetAngularVelocity);
  49. metaData.scriptClass->addInternalCall("Internal_SetDrag", &ScriptRigidbody::internal_SetDrag);
  50. metaData.scriptClass->addInternalCall("Internal_GetDrag", &ScriptRigidbody::internal_GetDrag);
  51. metaData.scriptClass->addInternalCall("Internal_SetAngularDrag", &ScriptRigidbody::internal_SetAngularDrag);
  52. metaData.scriptClass->addInternalCall("Internal_GetAngularDrag", &ScriptRigidbody::internal_GetAngularDrag);
  53. metaData.scriptClass->addInternalCall("Internal_SetInertiaTensor", &ScriptRigidbody::internal_SetInertiaTensor);
  54. metaData.scriptClass->addInternalCall("Internal_GetInertiaTensor", &ScriptRigidbody::internal_GetInertiaTensor);
  55. metaData.scriptClass->addInternalCall("Internal_SetMaxAngularVelocity", &ScriptRigidbody::internal_SetMaxAngularVelocity);
  56. metaData.scriptClass->addInternalCall("Internal_GetMaxAngularVelocity", &ScriptRigidbody::internal_GetMaxAngularVelocity);
  57. metaData.scriptClass->addInternalCall("Internal_SetCenterOfMass", &ScriptRigidbody::internal_SetCenterOfMass);
  58. metaData.scriptClass->addInternalCall("Internal_GetCenterOfMassPosition", &ScriptRigidbody::internal_GetCenterOfMassPosition);
  59. metaData.scriptClass->addInternalCall("Internal_GetCenterOfMassRotation", &ScriptRigidbody::internal_GetCenterOfMassRotation);
  60. metaData.scriptClass->addInternalCall("Internal_SetPositionSolverCount", &ScriptRigidbody::internal_SetPositionSolverCount);
  61. metaData.scriptClass->addInternalCall("Internal_GetPositionSolverCount", &ScriptRigidbody::internal_GetPositionSolverCount);
  62. metaData.scriptClass->addInternalCall("Internal_SetVelocitySolverCount", &ScriptRigidbody::internal_SetVelocitySolverCount);
  63. metaData.scriptClass->addInternalCall("Internal_GetVelocitySolverCount", &ScriptRigidbody::internal_GetVelocitySolverCount);
  64. metaData.scriptClass->addInternalCall("Internal_SetFlags", &ScriptRigidbody::internal_SetFlags);
  65. metaData.scriptClass->addInternalCall("Internal_GetFlags", &ScriptRigidbody::internal_GetFlags);
  66. metaData.scriptClass->addInternalCall("Internal_AddForce", &ScriptRigidbody::internal_AddForce);
  67. metaData.scriptClass->addInternalCall("Internal_AddTorque", &ScriptRigidbody::internal_AddTorque);
  68. metaData.scriptClass->addInternalCall("Internal_AddForceAtPoint", &ScriptRigidbody::internal_AddForceAtPoint);
  69. metaData.scriptClass->addInternalCall("Internal_GetVelocityAtPoint", &ScriptRigidbody::internal_GetVelocityAtPoint);
  70. metaData.scriptClass->addInternalCall("Internal_AddCollider", &ScriptRigidbody::internal_AddCollider);
  71. metaData.scriptClass->addInternalCall("Internal_RemoveCollider", &ScriptRigidbody::internal_RemoveCollider);
  72. metaData.scriptClass->addInternalCall("Internal_RemoveColliders", &ScriptRigidbody::internal_RemoveColliders);
  73. metaData.scriptClass->addInternalCall("Internal_UpdateMassDistribution", &ScriptRigidbody::internal_UpdateMassDistribution);
  74. onCollisionBeginThunk = (OnCollisionThunkDef)metaData.scriptClass->getMethod("Internal_DoOnCollisionBegin", 1)->getThunk();
  75. onCollisionStayThunk = (OnCollisionThunkDef)metaData.scriptClass->getMethod("Internal_DoOnCollisionStay", 1)->getThunk();
  76. onCollisionEndThunk = (OnCollisionThunkDef)metaData.scriptClass->getMethod("Internal_DoOnCollisionEnd", 1)->getThunk();
  77. }
  78. void ScriptRigidbody::onCollisionBegin(MonoObject* instance, const CollisionData& collisionData)
  79. {
  80. MonoObject* managedCollisionData = ScriptCollisionDataHelper::box(ScriptCollisionDataHelper::create(collisionData));
  81. MonoUtil::invokeThunk(onCollisionBeginThunk, instance, managedCollisionData);
  82. }
  83. void ScriptRigidbody::onCollisionStay(MonoObject* instance, const CollisionData& collisionData)
  84. {
  85. MonoObject* managedCollisionData = ScriptCollisionDataHelper::box(ScriptCollisionDataHelper::create(collisionData));
  86. MonoUtil::invokeThunk(onCollisionStayThunk, instance, managedCollisionData);
  87. }
  88. void ScriptRigidbody::onCollisionEnd(MonoObject* instance, const CollisionData& collisionData)
  89. {
  90. MonoObject* managedCollisionData = ScriptCollisionDataHelper::box(ScriptCollisionDataHelper::create(collisionData));
  91. MonoUtil::invokeThunk(onCollisionEndThunk, instance, managedCollisionData);
  92. }
  93. void ScriptRigidbody::internal_CreateInstance(MonoObject* instance, ScriptSceneObject* linkedSO)
  94. {
  95. HSceneObject so;
  96. if (linkedSO != nullptr)
  97. so = linkedSO->getNativeSceneObject();
  98. SPtr<Rigidbody> rigidbody = Rigidbody::create(so);
  99. rigidbody->_setOwner(PhysicsOwnerType::Script, instance);
  100. new (bs_alloc<ScriptRigidbody>()) ScriptRigidbody(instance, rigidbody);
  101. }
  102. void ScriptRigidbody::internal_Destroy(ScriptRigidbody* thisPtr)
  103. {
  104. thisPtr->mRigidbody = nullptr;
  105. }
  106. void ScriptRigidbody::internal_Move(ScriptRigidbody* thisPtr, Vector3* position)
  107. {
  108. thisPtr->mRigidbody->move(*position);
  109. }
  110. void ScriptRigidbody::internal_Rotate(ScriptRigidbody* thisPtr, Quaternion* rotation)
  111. {
  112. thisPtr->mRigidbody->rotate(*rotation);
  113. }
  114. void ScriptRigidbody::internal_GetPosition(ScriptRigidbody* thisPtr, Vector3* position)
  115. {
  116. *position = thisPtr->mRigidbody->getPosition();
  117. }
  118. void ScriptRigidbody::internal_GetRotation(ScriptRigidbody* thisPtr, Quaternion* rotation)
  119. {
  120. *rotation = thisPtr->mRigidbody->getRotation();
  121. }
  122. void ScriptRigidbody::internal_SetTransform(ScriptRigidbody* thisPtr, Vector3* pos, Quaternion* rot)
  123. {
  124. thisPtr->mRigidbody->setTransform(*pos, *rot);
  125. }
  126. void ScriptRigidbody::internal_SetMass(ScriptRigidbody* thisPtr, float mass)
  127. {
  128. thisPtr->mRigidbody->setMass(mass);
  129. }
  130. float ScriptRigidbody::internal_GetMass(ScriptRigidbody* thisPtr)
  131. {
  132. return thisPtr->mRigidbody->getMass();
  133. }
  134. void ScriptRigidbody::internal_SetIsKinematic(ScriptRigidbody* thisPtr, bool kinematic)
  135. {
  136. thisPtr->mRigidbody->setIsKinematic(kinematic);
  137. }
  138. bool ScriptRigidbody::internal_GetIsKinematic(ScriptRigidbody* thisPtr)
  139. {
  140. return thisPtr->mRigidbody->getIsKinematic();
  141. }
  142. bool ScriptRigidbody::internal_IsSleeping(ScriptRigidbody* thisPtr)
  143. {
  144. return thisPtr->mRigidbody->isSleeping();
  145. }
  146. void ScriptRigidbody::internal_Sleep(ScriptRigidbody* thisPtr)
  147. {
  148. thisPtr->mRigidbody->sleep();
  149. }
  150. void ScriptRigidbody::internal_WakeUp(ScriptRigidbody* thisPtr)
  151. {
  152. thisPtr->mRigidbody->wakeUp();
  153. }
  154. void ScriptRigidbody::internal_SetSleepThreshold(ScriptRigidbody* thisPtr, float threshold)
  155. {
  156. thisPtr->mRigidbody->setSleepThreshold(threshold);
  157. }
  158. float ScriptRigidbody::internal_GetSleepThreshold(ScriptRigidbody* thisPtr)
  159. {
  160. return thisPtr->mRigidbody->getSleepThreshold();
  161. }
  162. void ScriptRigidbody::internal_SetUseGravity(ScriptRigidbody* thisPtr, bool gravity)
  163. {
  164. thisPtr->mRigidbody->setUseGravity(gravity);
  165. }
  166. bool ScriptRigidbody::internal_GetUseGravity(ScriptRigidbody* thisPtr)
  167. {
  168. return thisPtr->mRigidbody->getUseGravity();
  169. }
  170. void ScriptRigidbody::internal_SetVelocity(ScriptRigidbody* thisPtr, Vector3* velocity)
  171. {
  172. thisPtr->mRigidbody->setVelocity(*velocity);
  173. }
  174. void ScriptRigidbody::internal_GetVelocity(ScriptRigidbody* thisPtr, Vector3* velocity)
  175. {
  176. *velocity = thisPtr->mRigidbody->getVelocity();
  177. }
  178. void ScriptRigidbody::internal_SetAngularVelocity(ScriptRigidbody* thisPtr, Vector3* velocity)
  179. {
  180. thisPtr->mRigidbody->setAngularVelocity(*velocity);
  181. }
  182. void ScriptRigidbody::internal_GetAngularVelocity(ScriptRigidbody* thisPtr, Vector3* velocity)
  183. {
  184. *velocity = thisPtr->mRigidbody->getAngularVelocity();
  185. }
  186. void ScriptRigidbody::internal_SetDrag(ScriptRigidbody* thisPtr, float drag)
  187. {
  188. thisPtr->mRigidbody->setDrag(drag);
  189. }
  190. float ScriptRigidbody::internal_GetDrag(ScriptRigidbody* thisPtr)
  191. {
  192. return thisPtr->mRigidbody->getDrag();
  193. }
  194. void ScriptRigidbody::internal_SetAngularDrag(ScriptRigidbody* thisPtr, float drag)
  195. {
  196. thisPtr->mRigidbody->setAngularDrag(drag);
  197. }
  198. float ScriptRigidbody::internal_GetAngularDrag(ScriptRigidbody* thisPtr)
  199. {
  200. return thisPtr->mRigidbody->getAngularDrag();
  201. }
  202. void ScriptRigidbody::internal_SetInertiaTensor(ScriptRigidbody* thisPtr, Vector3* tensor)
  203. {
  204. thisPtr->mRigidbody->setInertiaTensor(*tensor);
  205. }
  206. void ScriptRigidbody::internal_GetInertiaTensor(ScriptRigidbody* thisPtr, Vector3* tensor)
  207. {
  208. *tensor = thisPtr->mRigidbody->getInertiaTensor();
  209. }
  210. void ScriptRigidbody::internal_SetMaxAngularVelocity(ScriptRigidbody* thisPtr, float maxVelocity)
  211. {
  212. thisPtr->mRigidbody->setMaxAngularVelocity(maxVelocity);
  213. }
  214. float ScriptRigidbody::internal_GetMaxAngularVelocity(ScriptRigidbody* thisPtr)
  215. {
  216. return thisPtr->mRigidbody->getMaxAngularVelocity();
  217. }
  218. void ScriptRigidbody::internal_SetCenterOfMass(ScriptRigidbody* thisPtr, Vector3* position, Quaternion* rotation)
  219. {
  220. thisPtr->mRigidbody->setCenterOfMass(*position, *rotation);
  221. }
  222. void ScriptRigidbody::internal_GetCenterOfMassPosition(ScriptRigidbody* thisPtr, Vector3* position)
  223. {
  224. *position = thisPtr->mRigidbody->getCenterOfMassPosition();
  225. }
  226. void ScriptRigidbody::internal_GetCenterOfMassRotation(ScriptRigidbody* thisPtr, Quaternion* rotation)
  227. {
  228. *rotation = thisPtr->mRigidbody->getCenterOfMassRotation();
  229. }
  230. void ScriptRigidbody::internal_SetPositionSolverCount(ScriptRigidbody* thisPtr, UINT32 count)
  231. {
  232. thisPtr->mRigidbody->setPositionSolverCount(count);
  233. }
  234. UINT32 ScriptRigidbody::internal_GetPositionSolverCount(ScriptRigidbody* thisPtr)
  235. {
  236. return thisPtr->mRigidbody->getPositionSolverCount();
  237. }
  238. void ScriptRigidbody::internal_SetVelocitySolverCount(ScriptRigidbody* thisPtr, UINT32 count)
  239. {
  240. thisPtr->mRigidbody->setVelocitySolverCount(count);
  241. }
  242. UINT32 ScriptRigidbody::internal_GetVelocitySolverCount(ScriptRigidbody* thisPtr)
  243. {
  244. return thisPtr->mRigidbody->getVelocitySolverCount();
  245. }
  246. void ScriptRigidbody::internal_SetFlags(ScriptRigidbody* thisPtr, Rigidbody::Flag flags)
  247. {
  248. thisPtr->mRigidbody->setFlags(flags);
  249. }
  250. Rigidbody::Flag ScriptRigidbody::internal_GetFlags(ScriptRigidbody* thisPtr)
  251. {
  252. return thisPtr->mRigidbody->getFlags();
  253. }
  254. void ScriptRigidbody::internal_AddForce(ScriptRigidbody* thisPtr, Vector3* force, ForceMode mode)
  255. {
  256. thisPtr->mRigidbody->addForce(*force, mode);
  257. }
  258. void ScriptRigidbody::internal_AddTorque(ScriptRigidbody* thisPtr, Vector3* torque, ForceMode mode)
  259. {
  260. thisPtr->mRigidbody->addTorque(*torque, mode);
  261. }
  262. void ScriptRigidbody::internal_AddForceAtPoint(ScriptRigidbody* thisPtr, Vector3* force, Vector3* position, PointForceMode mode)
  263. {
  264. thisPtr->mRigidbody->addForceAtPoint(*force, *position, mode);
  265. }
  266. void ScriptRigidbody::internal_GetVelocityAtPoint(ScriptRigidbody* thisPtr, Vector3* point, Vector3* velocity)
  267. {
  268. *velocity = thisPtr->mRigidbody->getVelocityAtPoint(*point);
  269. }
  270. void ScriptRigidbody::internal_AddCollider(ScriptRigidbody* thisPtr, ScriptColliderBase* collider)
  271. {
  272. if (collider == nullptr)
  273. return;
  274. thisPtr->mRigidbody->addCollider(collider->getCollider()->_getInternal());
  275. }
  276. void ScriptRigidbody::internal_RemoveCollider(ScriptRigidbody* thisPtr, ScriptColliderBase* collider)
  277. {
  278. if (collider == nullptr)
  279. return;
  280. thisPtr->mRigidbody->removeCollider(collider->getCollider()->_getInternal());
  281. }
  282. void ScriptRigidbody::internal_RemoveColliders(ScriptRigidbody* thisPtr)
  283. {
  284. thisPtr->mRigidbody->removeColliders();
  285. }
  286. void ScriptRigidbody::internal_UpdateMassDistribution(ScriptRigidbody* thisPtr)
  287. {
  288. thisPtr->mRigidbody->updateMassDistribution();
  289. }
  290. }