BsScriptCollider.h 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  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 "BsPhysicsCommon.h"
  7. namespace BansheeEngine
  8. {
  9. /** @addtogroup ScriptInteropEngine
  10. * @{
  11. */
  12. class ScriptCollider;
  13. /** Base class for all Collider interop objects. */
  14. class BS_SCR_BE_EXPORT ScriptColliderBase : public ScriptObjectBase
  15. {
  16. public:
  17. /** Returns the native Collider object. */
  18. virtual Collider* getCollider() const { return mCollider.get(); };
  19. protected:
  20. friend ScriptCollider;
  21. ScriptColliderBase(MonoObject* instance);
  22. virtual ~ScriptColliderBase() {}
  23. /** Initializes the interop object with a native collider. Must be called right after construction. */
  24. void initialize(const SPtr<Collider>& collider);
  25. /** Destroys the internal collider object. */
  26. void destroyCollider();
  27. SPtr<Collider> mCollider;
  28. };
  29. /** A more specialized version of ScriptObject that allows the constructor to set the native collider. */
  30. template <class Type>
  31. class TScriptCollider : public ScriptObject<Type, ScriptColliderBase>
  32. {
  33. public:
  34. virtual ~TScriptCollider() {}
  35. protected:
  36. TScriptCollider(MonoObject* instance, const SPtr<Collider>& collider)
  37. :ScriptObject(instance)
  38. {
  39. initialize(collider);
  40. }
  41. };
  42. /** Interop class between C++ & CLR for Collider. */
  43. class BS_SCR_BE_EXPORT ScriptCollider : public TScriptCollider<ScriptCollider>
  44. {
  45. public:
  46. SCRIPT_OBJ(ENGINE_ASSEMBLY, "BansheeEngine", "NativeCollider")
  47. private:
  48. friend class ScriptColliderBase;
  49. ScriptCollider(MonoObject* instance);
  50. /** Triggered when some object starts interacting with the collider. */
  51. static void onCollisionBegin(MonoObject* instance, const CollisionData& collisionData);
  52. /** Triggered when some object remains interacting with the collider throughout a frame. */
  53. static void onCollisionStay(MonoObject* instance, const CollisionData& collisionData);
  54. /** Triggered when some object ends interacting with the collider. */
  55. static void onCollisionEnd(MonoObject* instance, const CollisionData& collisionData);
  56. /************************************************************************/
  57. /* CLR HOOKS */
  58. /************************************************************************/
  59. static void internal_Destroy(ScriptColliderBase* thisPtr);
  60. static void internal_GetPosition(ScriptColliderBase* thisPtr, Vector3* pos);
  61. static void internal_GetRotation(ScriptColliderBase* thisPtr, Quaternion* rot);
  62. static void internal_SetTransform(ScriptColliderBase* thisPtr, Vector3* pos, Quaternion* rot);
  63. static void internal_SetScale(ScriptColliderBase* thisPtr, Vector3* scale);
  64. static void internal_GetScale(ScriptColliderBase* thisPtr, Vector3* scale);
  65. static void internal_SetIsTrigger(ScriptColliderBase* thisPtr, bool value);
  66. static bool internal_GetIsTrigger(ScriptColliderBase* thisPtr);
  67. static void internal_SetRigidbody(ScriptColliderBase* thisPtr, ScriptRigidbody* value);
  68. static MonoObject* internal_GetRigidbody(ScriptColliderBase* thisPtr);
  69. static void internal_SetMass(ScriptColliderBase* thisPtr, float mass);
  70. static float internal_GetMass(ScriptColliderBase* thisPtr);
  71. static void internal_SetMaterial(ScriptColliderBase* thisPtr, ScriptPhysicsMaterial* material);
  72. static MonoObject* internal_GetMaterial(ScriptColliderBase* thisPtr);
  73. static void internal_SetContactOffset(ScriptColliderBase* thisPtr, float value);
  74. static float internal_GetContactOffset(ScriptColliderBase* thisPtr);
  75. static void internal_SetRestOffset(ScriptColliderBase* thisPtr, float value);
  76. static float internal_GetRestOffset(ScriptColliderBase* thisPtr);
  77. static void internal_SetLayer(ScriptColliderBase* thisPtr, UINT64 layer);
  78. static UINT64 internal_GetLayer(ScriptColliderBase* thisPtr);
  79. static void internal_SetCollisionReportMode(ScriptColliderBase* thisPtr, CollisionReportMode mode);
  80. static CollisionReportMode internal_GetCollisionReportMode(ScriptColliderBase* thisPtr);
  81. static bool internal_RayCast(ScriptColliderBase* thisPtr, Vector3* origin, Vector3* unitDir, MonoObject** hit,
  82. float maxDist);
  83. typedef void(__stdcall *OnCollisionThunkDef) (MonoObject*, MonoObject*, MonoException**);
  84. static OnCollisionThunkDef onCollisionBeginThunk;
  85. static OnCollisionThunkDef onCollisionStayThunk;
  86. static OnCollisionThunkDef onCollisionEndThunk;
  87. };
  88. /** @} */
  89. }