NativeCharacterController.cs 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. using System;
  4. using System.Runtime.CompilerServices;
  5. namespace BansheeEngine
  6. {
  7. /** @cond INTEROP */
  8. /** @addtogroup Interop
  9. * @{
  10. */
  11. /// <summary>
  12. /// Wrapper around the native CharacterController class.
  13. /// <see cref="CharacterController"/>
  14. /// </summary>
  15. internal class NativeCharacterController : ScriptObject
  16. {
  17. private CharacterController component;
  18. /// <summary>
  19. /// Component that owns the native character controller object.
  20. /// </summary>
  21. public CharacterController Component
  22. {
  23. get { return component; }
  24. set { component = value; }
  25. }
  26. public Vector3 Position
  27. {
  28. get { Vector3 pos; Internal_GetPosition(mCachedPtr, out pos); return pos; }
  29. set { Internal_SetPosition(mCachedPtr, ref value); }
  30. }
  31. public Vector3 FootPosition
  32. {
  33. get { Vector3 pos; Internal_GetFootPosition(mCachedPtr, out pos); return pos; }
  34. set { Internal_SetFootPosition(mCachedPtr, ref value); }
  35. }
  36. public float Radius
  37. {
  38. set { Internal_SetRadius(mCachedPtr, value); }
  39. }
  40. public float Height
  41. {
  42. set { Internal_SetHeight(mCachedPtr, value); }
  43. }
  44. public Vector3 Up
  45. {
  46. set { Internal_SetUp(mCachedPtr, ref value); }
  47. }
  48. public CharacterClimbingMode ClimbingMode
  49. {
  50. set { Internal_SetClimbingMode(mCachedPtr, value); }
  51. }
  52. public CharacterNonWalkableMode NonWalkableMode
  53. {
  54. set { Internal_SetNonWalkableMode(mCachedPtr, value); }
  55. }
  56. public float MinMoveDistance
  57. {
  58. set { Internal_SetMinMoveDistance(mCachedPtr, value); }
  59. }
  60. public float ContactOffset
  61. {
  62. set { Internal_SetContactOffset(mCachedPtr, value); }
  63. }
  64. public float StepOffset
  65. {
  66. set { Internal_SetStepOffset(mCachedPtr, value); }
  67. }
  68. public Radian SlopeLimit
  69. {
  70. set { Internal_SetSlopeLimit(mCachedPtr, value.Radians); }
  71. }
  72. public ulong Layer
  73. {
  74. set { Internal_SetLayer(mCachedPtr, value); }
  75. }
  76. public NativeCharacterController(ScriptCharacterControllerData initData)
  77. {
  78. Internal_CreateInstance(this, ref initData);
  79. }
  80. public void Destroy()
  81. {
  82. Internal_Destroy(mCachedPtr);
  83. }
  84. public CharacterCollisionFlag Move(Vector3 position)
  85. {
  86. return Internal_Move(mCachedPtr, ref position);
  87. }
  88. private void Internal_DoOnColliderHit(ScriptControllerCollision scriptCollisionData)
  89. {
  90. ControllerColliderCollision collisionData = new ControllerColliderCollision();
  91. collisionData.position = scriptCollisionData.position;
  92. collisionData.normal = scriptCollisionData.normal;
  93. collisionData.motionDir = scriptCollisionData.motionDir;
  94. collisionData.motionAmount = scriptCollisionData.motionAmount;
  95. collisionData.triangleIndex = scriptCollisionData.triangleIndex;
  96. if(scriptCollisionData.collider != null)
  97. collisionData.collider = scriptCollisionData.collider.Component;
  98. else
  99. collisionData.collider = null;
  100. Component.DoOnColliderHit(collisionData);
  101. }
  102. private void Internal_DoOnControllerHit(ScriptControllerCollision scriptCollisionData)
  103. {
  104. ControllerControllerCollision collisionData = new ControllerControllerCollision();
  105. collisionData.position = scriptCollisionData.position;
  106. collisionData.normal = scriptCollisionData.normal;
  107. collisionData.motionDir = scriptCollisionData.motionDir;
  108. collisionData.motionAmount = scriptCollisionData.motionAmount;
  109. if (scriptCollisionData.controller != null)
  110. collisionData.controller = scriptCollisionData.controller.Component;
  111. else
  112. collisionData.controller = null;
  113. Component.DoOnControllerHit(collisionData);
  114. }
  115. [MethodImpl(MethodImplOptions.InternalCall)]
  116. private static extern void Internal_CreateInstance(NativeCharacterController instance,
  117. ref ScriptCharacterControllerData initData);
  118. [MethodImpl(MethodImplOptions.InternalCall)]
  119. private static extern void Internal_Destroy(IntPtr thisPtr);
  120. [MethodImpl(MethodImplOptions.InternalCall)]
  121. private static extern CharacterCollisionFlag Internal_Move(IntPtr thisPtr, ref Vector3 position);
  122. [MethodImpl(MethodImplOptions.InternalCall)]
  123. private static extern void Internal_GetPosition(IntPtr thisPtr, out Vector3 position);
  124. [MethodImpl(MethodImplOptions.InternalCall)]
  125. private static extern void Internal_SetPosition(IntPtr thisPtr, ref Vector3 position);
  126. [MethodImpl(MethodImplOptions.InternalCall)]
  127. private static extern void Internal_GetFootPosition(IntPtr thisPtr, out Vector3 position);
  128. [MethodImpl(MethodImplOptions.InternalCall)]
  129. private static extern void Internal_SetFootPosition(IntPtr thisPtr, ref Vector3 position);
  130. [MethodImpl(MethodImplOptions.InternalCall)]
  131. private static extern void Internal_SetRadius(IntPtr thisPtr, float radius);
  132. [MethodImpl(MethodImplOptions.InternalCall)]
  133. private static extern void Internal_SetHeight(IntPtr thisPtr, float height);
  134. [MethodImpl(MethodImplOptions.InternalCall)]
  135. private static extern void Internal_SetUp(IntPtr thisPtr, ref Vector3 up);
  136. [MethodImpl(MethodImplOptions.InternalCall)]
  137. private static extern void Internal_SetClimbingMode(IntPtr thisPtr, CharacterClimbingMode mode);
  138. [MethodImpl(MethodImplOptions.InternalCall)]
  139. private static extern void Internal_SetNonWalkableMode(IntPtr thisPtr, CharacterNonWalkableMode mode);
  140. [MethodImpl(MethodImplOptions.InternalCall)]
  141. private static extern void Internal_SetMinMoveDistance(IntPtr thisPtr, float value);
  142. [MethodImpl(MethodImplOptions.InternalCall)]
  143. private static extern void Internal_SetContactOffset(IntPtr thisPtr, float value);
  144. [MethodImpl(MethodImplOptions.InternalCall)]
  145. private static extern void Internal_SetStepOffset(IntPtr thisPtr, float value);
  146. [MethodImpl(MethodImplOptions.InternalCall)]
  147. private static extern void Internal_SetSlopeLimit(IntPtr thisPtr, float value);
  148. [MethodImpl(MethodImplOptions.InternalCall)]
  149. private static extern void Internal_SetLayer(IntPtr thisPtr, ulong layer);
  150. }
  151. /** @} */
  152. /** @endcond */
  153. }