BsScriptJoint.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "Wrappers/Physics/BsScriptJoint.h"
  4. #include "BsMonoUtil.h"
  5. #include "BsMonoClass.h"
  6. #include "BsMonoMethod.h"
  7. #include "Wrappers/Physics/BsScriptRigidbody.h"
  8. namespace bs
  9. {
  10. ScriptJoint::OnJointBreakThunkDef ScriptJoint::onJointBreakThunk = nullptr;
  11. ScriptJointBase::ScriptJointBase(MonoObject* instance)
  12. :ScriptObjectBase(instance)
  13. { }
  14. void ScriptJointBase::initialize(const SPtr<Joint>& joint)
  15. {
  16. mJoint = joint;
  17. MonoObject* instance = getManagedInstance();
  18. joint->onJointBreak.connect(std::bind(&ScriptJoint::onJointBreak, instance));
  19. }
  20. void ScriptJointBase::destroyJoint()
  21. {
  22. mJoint = nullptr;
  23. }
  24. ScriptJoint::ScriptJoint(MonoObject* instance)
  25. :TScriptJoint(instance, nullptr)
  26. { }
  27. void ScriptJoint::initRuntimeData()
  28. {
  29. metaData.scriptClass->addInternalCall("Internal_Destroy", &ScriptJoint::internal_Destroy);
  30. metaData.scriptClass->addInternalCall("Internal_SetBody", &ScriptJoint::internal_SetBody);
  31. metaData.scriptClass->addInternalCall("Internal_SetPosition", &ScriptJoint::internal_SetPosition);
  32. metaData.scriptClass->addInternalCall("Internal_SetRotation", &ScriptJoint::internal_SetRotation);
  33. metaData.scriptClass->addInternalCall("Internal_SetBreakForce", &ScriptJoint::internal_SetBreakForce);
  34. metaData.scriptClass->addInternalCall("Internal_SetBreakTorque", &ScriptJoint::internal_SetBreakTorque);
  35. metaData.scriptClass->addInternalCall("Internal_SetEnableCollision", &ScriptJoint::internal_SetEnableCollision);
  36. onJointBreakThunk = (OnJointBreakThunkDef)metaData.scriptClass->getMethod("Internal_DoOnJointBreak")->getThunk();
  37. }
  38. void ScriptJoint::onJointBreak(MonoObject* instance)
  39. {
  40. MonoUtil::invokeThunk(onJointBreakThunk, instance);
  41. }
  42. void ScriptJoint::internal_Destroy(ScriptJointBase* thisPtr)
  43. {
  44. thisPtr->destroyJoint();
  45. }
  46. void ScriptJoint::internal_SetBody(ScriptJointBase* thisPtr, JointBody body, ScriptRigidbody* value)
  47. {
  48. Rigidbody* rigidbody = nullptr;
  49. if (value != nullptr)
  50. rigidbody = value->getRigidbody();
  51. thisPtr->mJoint->setBody(body, rigidbody);
  52. }
  53. void ScriptJoint::internal_SetPosition(ScriptJointBase* thisPtr, JointBody body, Vector3* position)
  54. {
  55. Quaternion rotation = thisPtr->mJoint->getRotation(body);
  56. thisPtr->mJoint->setTransform(body, *position, rotation);
  57. }
  58. void ScriptJoint::internal_SetRotation(ScriptJointBase* thisPtr, JointBody body, Quaternion* rotation)
  59. {
  60. Vector3 position = thisPtr->mJoint->getPosition(body);
  61. thisPtr->mJoint->setTransform(body, position, *rotation);
  62. }
  63. void ScriptJoint::internal_SetBreakForce(ScriptJointBase* thisPtr, float force)
  64. {
  65. thisPtr->mJoint->setBreakForce(force);
  66. }
  67. void ScriptJoint::internal_SetBreakTorque(ScriptJointBase* thisPtr, float torque)
  68. {
  69. thisPtr->mJoint->setBreakTorque(torque);
  70. }
  71. void ScriptJoint::internal_SetEnableCollision(ScriptJointBase* thisPtr, bool value)
  72. {
  73. thisPtr->mJoint->setEnableCollision(value);
  74. }
  75. void ScriptCommonJointData::toDesc(JOINT_DESC& desc) const
  76. {
  77. ScriptArray bodiesArray(bodies);
  78. ScriptRigidbody* rigidbodyA = bodiesArray.get<ScriptRigidbody*>(0);
  79. if (rigidbodyA != nullptr)
  80. desc.bodies[0].body = rigidbodyA->getRigidbody();
  81. ScriptRigidbody* rigidbodyB = bodiesArray.get<ScriptRigidbody*>(1);
  82. if (rigidbodyB != nullptr)
  83. desc.bodies[1].body = rigidbodyB->getRigidbody();
  84. ScriptArray positionArray(positions);
  85. desc.bodies[0].position = positionArray.get<Vector3>(0);
  86. desc.bodies[1].position = positionArray.get<Vector3>(1);
  87. ScriptArray rotationArray(rotations);
  88. desc.bodies[0].rotation = rotationArray.get<Quaternion>(0);
  89. desc.bodies[1].rotation = rotationArray.get<Quaternion>(1);
  90. desc.breakForce = breakForce;
  91. desc.breakTorque = breakTorque;
  92. desc.enableCollision = enableCollision;
  93. }
  94. }