NativeCharacterController.cs 6.5 KB

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