BsScriptJoint.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #pragma once
  4. #include "BsScriptEnginePrerequisites.h"
  5. #include "BsScriptObject.h"
  6. #include "BsJoint.h"
  7. namespace BansheeEngine
  8. {
  9. /** @addtogroup ScriptInteropEngine
  10. * @{
  11. */
  12. class ScriptJoint;
  13. /** Base class for all Joint interop objects. */
  14. class BS_SCR_BE_EXPORT ScriptJointBase : public ScriptObjectBase
  15. {
  16. public:
  17. /** Returns the native Joint object. */
  18. virtual Joint* getJoint() const { return mJoint.get(); };
  19. protected:
  20. friend ScriptJoint;
  21. ScriptJointBase(MonoObject* instance);
  22. virtual ~ScriptJointBase() {}
  23. /** Initializes the interop object with a native joint. Must be called right after construction. */
  24. void initialize(const SPtr<Joint>& joint);
  25. /** Destroys the internal joint object. */
  26. void destroyJoint();
  27. SPtr<Joint> mJoint;
  28. };
  29. /** A more specialized version of ScriptObject that allows the constructor to set the native joint. */
  30. template <class Type>
  31. class TScriptJoint : public ScriptObject<Type, ScriptJointBase>
  32. {
  33. public:
  34. virtual ~TScriptJoint() {}
  35. protected:
  36. TScriptJoint(MonoObject* instance, const SPtr<Joint>& joint)
  37. :ScriptObject(instance)
  38. {
  39. initialize(joint);
  40. }
  41. };
  42. /** Interop class between C++ & CLR for Joint. */
  43. class BS_SCR_BE_EXPORT ScriptJoint : public TScriptJoint<ScriptJoint>
  44. {
  45. public:
  46. SCRIPT_OBJ(ENGINE_ASSEMBLY, "BansheeEngine", "NativeJoint")
  47. private:
  48. friend class ScriptJointBase;
  49. ScriptJoint(MonoObject* instance);
  50. /** Triggered the joint breaks. */
  51. static void onJointBreak(MonoObject* instance);
  52. /************************************************************************/
  53. /* CLR HOOKS */
  54. /************************************************************************/
  55. static void internal_Destroy(ScriptJointBase* thisPtr);
  56. static void internal_SetBody(ScriptJointBase* thisPtr, JointBody body, ScriptRigidbody* value);
  57. static void internal_SetPosition(ScriptJointBase* thisPtr, JointBody body, Vector3* position);
  58. static void internal_SetRotation(ScriptJointBase* thisPtr, JointBody body, Quaternion* rotation);
  59. static void internal_SetBreakForce(ScriptJointBase* thisPtr, float force);
  60. static void internal_SetBreakTorque(ScriptJointBase* thisPtr, float torque);
  61. static void internal_SetEnableCollision(ScriptJointBase* thisPtr, bool value);
  62. typedef void(__stdcall *OnJointBreakThunkDef) (MonoObject*, MonoException**);
  63. static OnJointBreakThunkDef onJointBreakThunk;
  64. };
  65. /** @} */
  66. }