BsScriptCollider.h 4.5 KB

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