BsScriptRigidbody.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383
  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_SetInterpolationMode", &ScriptRigidbody::internal_SetInterpolationMode);
  65. metaData.scriptClass->addInternalCall("Internal_GetInterpolationMode", &ScriptRigidbody::internal_GetInterpolationMode);
  66. metaData.scriptClass->addInternalCall("Internal_SetFlags", &ScriptRigidbody::internal_SetFlags);
  67. metaData.scriptClass->addInternalCall("Internal_GetFlags", &ScriptRigidbody::internal_GetFlags);
  68. metaData.scriptClass->addInternalCall("Internal_AddForce", &ScriptRigidbody::internal_AddForce);
  69. metaData.scriptClass->addInternalCall("Internal_AddTorque", &ScriptRigidbody::internal_AddTorque);
  70. metaData.scriptClass->addInternalCall("Internal_AddForceAtPoint", &ScriptRigidbody::internal_AddForceAtPoint);
  71. metaData.scriptClass->addInternalCall("Internal_GetVelocityAtPoint", &ScriptRigidbody::internal_GetVelocityAtPoint);
  72. metaData.scriptClass->addInternalCall("Internal_AddCollider", &ScriptRigidbody::internal_AddCollider);
  73. metaData.scriptClass->addInternalCall("Internal_RemoveCollider", &ScriptRigidbody::internal_RemoveCollider);
  74. metaData.scriptClass->addInternalCall("Internal_RemoveColliders", &ScriptRigidbody::internal_RemoveColliders);
  75. metaData.scriptClass->addInternalCall("Internal_UpdateMassDistribution", &ScriptRigidbody::internal_UpdateMassDistribution);
  76. onCollisionBeginThunk = (OnCollisionThunkDef)metaData.scriptClass->getMethod("Internal_DoOnCollisionBegin", 1)->getThunk();
  77. onCollisionStayThunk = (OnCollisionThunkDef)metaData.scriptClass->getMethod("Internal_DoOnCollisionStay", 1)->getThunk();
  78. onCollisionEndThunk = (OnCollisionThunkDef)metaData.scriptClass->getMethod("Internal_DoOnCollisionEnd", 1)->getThunk();
  79. }
  80. void ScriptRigidbody::onCollisionBegin(MonoObject* instance, const CollisionData& collisionData)
  81. {
  82. MonoObject* managedCollisionData = ScriptCollisionDataHelper::box(ScriptCollisionDataHelper::create(collisionData));
  83. MonoUtil::invokeThunk(onCollisionBeginThunk, instance, managedCollisionData);
  84. }
  85. void ScriptRigidbody::onCollisionStay(MonoObject* instance, const CollisionData& collisionData)
  86. {
  87. MonoObject* managedCollisionData = ScriptCollisionDataHelper::box(ScriptCollisionDataHelper::create(collisionData));
  88. MonoUtil::invokeThunk(onCollisionStayThunk, instance, managedCollisionData);
  89. }
  90. void ScriptRigidbody::onCollisionEnd(MonoObject* instance, const CollisionData& collisionData)
  91. {
  92. MonoObject* managedCollisionData = ScriptCollisionDataHelper::box(ScriptCollisionDataHelper::create(collisionData));
  93. MonoUtil::invokeThunk(onCollisionEndThunk, instance, managedCollisionData);
  94. }
  95. void ScriptRigidbody::internal_CreateInstance(MonoObject* instance, ScriptSceneObject* linkedSO)
  96. {
  97. HSceneObject so;
  98. if (linkedSO != nullptr)
  99. so = linkedSO->getNativeSceneObject();
  100. SPtr<Rigidbody> rigidbody = Rigidbody::create(so);
  101. rigidbody->_setOwner(PhysicsOwnerType::Script, instance);
  102. new (bs_alloc<ScriptRigidbody>()) ScriptRigidbody(instance, rigidbody);
  103. }
  104. void ScriptRigidbody::internal_Destroy(ScriptRigidbody* thisPtr)
  105. {
  106. thisPtr->mRigidbody = nullptr;
  107. }
  108. void ScriptRigidbody::internal_Move(ScriptRigidbody* thisPtr, Vector3* position)
  109. {
  110. thisPtr->mRigidbody->move(*position);
  111. }
  112. void ScriptRigidbody::internal_Rotate(ScriptRigidbody* thisPtr, Quaternion* rotation)
  113. {
  114. thisPtr->mRigidbody->rotate(*rotation);
  115. }
  116. void ScriptRigidbody::internal_GetPosition(ScriptRigidbody* thisPtr, Vector3* position)
  117. {
  118. *position = thisPtr->mRigidbody->getPosition();
  119. }
  120. void ScriptRigidbody::internal_GetRotation(ScriptRigidbody* thisPtr, Quaternion* rotation)
  121. {
  122. *rotation = thisPtr->mRigidbody->getRotation();
  123. }
  124. void ScriptRigidbody::internal_SetTransform(ScriptRigidbody* thisPtr, Vector3* pos, Quaternion* rot)
  125. {
  126. thisPtr->mRigidbody->setTransform(*pos, *rot);
  127. }
  128. void ScriptRigidbody::internal_SetMass(ScriptRigidbody* thisPtr, float mass)
  129. {
  130. thisPtr->mRigidbody->setMass(mass);
  131. }
  132. float ScriptRigidbody::internal_GetMass(ScriptRigidbody* thisPtr)
  133. {
  134. return thisPtr->mRigidbody->getMass();
  135. }
  136. void ScriptRigidbody::internal_SetIsKinematic(ScriptRigidbody* thisPtr, bool kinematic)
  137. {
  138. thisPtr->mRigidbody->setIsKinematic(kinematic);
  139. }
  140. bool ScriptRigidbody::internal_GetIsKinematic(ScriptRigidbody* thisPtr)
  141. {
  142. return thisPtr->mRigidbody->getIsKinematic();
  143. }
  144. bool ScriptRigidbody::internal_IsSleeping(ScriptRigidbody* thisPtr)
  145. {
  146. return thisPtr->mRigidbody->isSleeping();
  147. }
  148. void ScriptRigidbody::internal_Sleep(ScriptRigidbody* thisPtr)
  149. {
  150. thisPtr->mRigidbody->sleep();
  151. }
  152. void ScriptRigidbody::internal_WakeUp(ScriptRigidbody* thisPtr)
  153. {
  154. thisPtr->mRigidbody->wakeUp();
  155. }
  156. void ScriptRigidbody::internal_SetSleepThreshold(ScriptRigidbody* thisPtr, float threshold)
  157. {
  158. thisPtr->mRigidbody->setSleepThreshold(threshold);
  159. }
  160. float ScriptRigidbody::internal_GetSleepThreshold(ScriptRigidbody* thisPtr)
  161. {
  162. return thisPtr->mRigidbody->getSleepThreshold();
  163. }
  164. void ScriptRigidbody::internal_SetUseGravity(ScriptRigidbody* thisPtr, bool gravity)
  165. {
  166. thisPtr->mRigidbody->setUseGravity(gravity);
  167. }
  168. bool ScriptRigidbody::internal_GetUseGravity(ScriptRigidbody* thisPtr)
  169. {
  170. return thisPtr->mRigidbody->getUseGravity();
  171. }
  172. void ScriptRigidbody::internal_SetVelocity(ScriptRigidbody* thisPtr, Vector3* velocity)
  173. {
  174. thisPtr->mRigidbody->setVelocity(*velocity);
  175. }
  176. void ScriptRigidbody::internal_GetVelocity(ScriptRigidbody* thisPtr, Vector3* velocity)
  177. {
  178. *velocity = thisPtr->mRigidbody->getVelocity();
  179. }
  180. void ScriptRigidbody::internal_SetAngularVelocity(ScriptRigidbody* thisPtr, Vector3* velocity)
  181. {
  182. thisPtr->mRigidbody->setAngularVelocity(*velocity);
  183. }
  184. void ScriptRigidbody::internal_GetAngularVelocity(ScriptRigidbody* thisPtr, Vector3* velocity)
  185. {
  186. *velocity = thisPtr->mRigidbody->getAngularVelocity();
  187. }
  188. void ScriptRigidbody::internal_SetDrag(ScriptRigidbody* thisPtr, float drag)
  189. {
  190. thisPtr->mRigidbody->setDrag(drag);
  191. }
  192. float ScriptRigidbody::internal_GetDrag(ScriptRigidbody* thisPtr)
  193. {
  194. return thisPtr->mRigidbody->getDrag();
  195. }
  196. void ScriptRigidbody::internal_SetAngularDrag(ScriptRigidbody* thisPtr, float drag)
  197. {
  198. thisPtr->mRigidbody->setAngularDrag(drag);
  199. }
  200. float ScriptRigidbody::internal_GetAngularDrag(ScriptRigidbody* thisPtr)
  201. {
  202. return thisPtr->mRigidbody->getAngularDrag();
  203. }
  204. void ScriptRigidbody::internal_SetInertiaTensor(ScriptRigidbody* thisPtr, Vector3* tensor)
  205. {
  206. thisPtr->mRigidbody->setInertiaTensor(*tensor);
  207. }
  208. void ScriptRigidbody::internal_GetInertiaTensor(ScriptRigidbody* thisPtr, Vector3* tensor)
  209. {
  210. *tensor = thisPtr->mRigidbody->getInertiaTensor();
  211. }
  212. void ScriptRigidbody::internal_SetMaxAngularVelocity(ScriptRigidbody* thisPtr, float maxVelocity)
  213. {
  214. thisPtr->mRigidbody->setMaxAngularVelocity(maxVelocity);
  215. }
  216. float ScriptRigidbody::internal_GetMaxAngularVelocity(ScriptRigidbody* thisPtr)
  217. {
  218. return thisPtr->mRigidbody->getMaxAngularVelocity();
  219. }
  220. void ScriptRigidbody::internal_SetCenterOfMass(ScriptRigidbody* thisPtr, Vector3* position, Quaternion* rotation)
  221. {
  222. thisPtr->mRigidbody->setCenterOfMass(*position, *rotation);
  223. }
  224. void ScriptRigidbody::internal_GetCenterOfMassPosition(ScriptRigidbody* thisPtr, Vector3* position)
  225. {
  226. *position = thisPtr->mRigidbody->getCenterOfMassPosition();
  227. }
  228. void ScriptRigidbody::internal_GetCenterOfMassRotation(ScriptRigidbody* thisPtr, Quaternion* rotation)
  229. {
  230. *rotation = thisPtr->mRigidbody->getCenterOfMassRotation();
  231. }
  232. void ScriptRigidbody::internal_SetPositionSolverCount(ScriptRigidbody* thisPtr, UINT32 count)
  233. {
  234. thisPtr->mRigidbody->setPositionSolverCount(count);
  235. }
  236. UINT32 ScriptRigidbody::internal_GetPositionSolverCount(ScriptRigidbody* thisPtr)
  237. {
  238. return thisPtr->mRigidbody->getPositionSolverCount();
  239. }
  240. void ScriptRigidbody::internal_SetVelocitySolverCount(ScriptRigidbody* thisPtr, UINT32 count)
  241. {
  242. thisPtr->mRigidbody->setVelocitySolverCount(count);
  243. }
  244. UINT32 ScriptRigidbody::internal_GetVelocitySolverCount(ScriptRigidbody* thisPtr)
  245. {
  246. return thisPtr->mRigidbody->getVelocitySolverCount();
  247. }
  248. void ScriptRigidbody::internal_SetInterpolationMode(ScriptRigidbody* thisPtr, Rigidbody::InterpolationMode value)
  249. {
  250. thisPtr->mRigidbody->setInterpolationMode(value);
  251. }
  252. Rigidbody::InterpolationMode ScriptRigidbody::internal_GetInterpolationMode(ScriptRigidbody* thisPtr)
  253. {
  254. return thisPtr->mRigidbody->getInterpolationMode();
  255. }
  256. void ScriptRigidbody::internal_SetFlags(ScriptRigidbody* thisPtr, Rigidbody::Flag flags)
  257. {
  258. thisPtr->mRigidbody->setFlags(flags);
  259. }
  260. Rigidbody::Flag ScriptRigidbody::internal_GetFlags(ScriptRigidbody* thisPtr)
  261. {
  262. return thisPtr->mRigidbody->getFlags();
  263. }
  264. void ScriptRigidbody::internal_AddForce(ScriptRigidbody* thisPtr, Vector3* force, ForceMode mode)
  265. {
  266. thisPtr->mRigidbody->addForce(*force, mode);
  267. }
  268. void ScriptRigidbody::internal_AddTorque(ScriptRigidbody* thisPtr, Vector3* torque, ForceMode mode)
  269. {
  270. thisPtr->mRigidbody->addTorque(*torque, mode);
  271. }
  272. void ScriptRigidbody::internal_AddForceAtPoint(ScriptRigidbody* thisPtr, Vector3* force, Vector3* position, PointForceMode mode)
  273. {
  274. thisPtr->mRigidbody->addForceAtPoint(*force, *position, mode);
  275. }
  276. void ScriptRigidbody::internal_GetVelocityAtPoint(ScriptRigidbody* thisPtr, Vector3* point, Vector3* velocity)
  277. {
  278. *velocity = thisPtr->mRigidbody->getVelocityAtPoint(*point);
  279. }
  280. void ScriptRigidbody::internal_AddCollider(ScriptRigidbody* thisPtr, ScriptColliderBase* collider)
  281. {
  282. if (collider == nullptr)
  283. return;
  284. thisPtr->mRigidbody->addCollider(collider->getCollider()->_getInternal());
  285. }
  286. void ScriptRigidbody::internal_RemoveCollider(ScriptRigidbody* thisPtr, ScriptColliderBase* collider)
  287. {
  288. if (collider == nullptr)
  289. return;
  290. thisPtr->mRigidbody->removeCollider(collider->getCollider()->_getInternal());
  291. }
  292. void ScriptRigidbody::internal_RemoveColliders(ScriptRigidbody* thisPtr)
  293. {
  294. thisPtr->mRigidbody->removeColliders();
  295. }
  296. void ScriptRigidbody::internal_UpdateMassDistribution(ScriptRigidbody* thisPtr)
  297. {
  298. thisPtr->mRigidbody->updateMassDistribution();
  299. }
  300. }