NativeCharacterController.cs 6.9 KB

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