BsScriptJoint.cpp 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsScriptJoint.h"
  4. #include "BsMonoUtil.h"
  5. #include "BsMonoClass.h"
  6. #include "BsMonoMethod.h"
  7. #include "BsScriptRigidbody.h"
  8. namespace BansheeEngine
  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. }