BsScriptCollider.h 4.4 KB

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