//********************************** Banshee Engine (www.banshee3d.com) **************************************************// //**************** Copyright (c) 2016 Marko Pintera (marko.pintera@gmail.com). All rights reserved. **********************// using System; using System.Runtime.CompilerServices; namespace BansheeEngine { /** @cond INTEROP */ /** @addtogroup Interop * @{ */ /// /// Wrapper around the native CharacterController class. /// /// internal class NativeCharacterController : ScriptObject { private CharacterController component; /// /// Component that owns the native character controller object. /// public CharacterController Component { get { return component; } set { component = value; } } public Vector3 Position { get { Vector3 pos; Internal_GetPosition(mCachedPtr, out pos); return pos; } set { Internal_SetPosition(mCachedPtr, ref value); } } public Vector3 FootPosition { get { Vector3 pos; Internal_GetFootPosition(mCachedPtr, out pos); return pos; } set { Internal_SetFootPosition(mCachedPtr, ref value); } } public float Radius { set { Internal_SetRadius(mCachedPtr, value); } } public float Height { set { Internal_SetHeight(mCachedPtr, value); } } public Vector3 Up { set { Internal_SetUp(mCachedPtr, ref value); } } public CharacterClimbingMode ClimbingMode { set { Internal_SetClimbingMode(mCachedPtr, value); } } public CharacterNonWalkableMode NonWalkableMode { set { Internal_SetNonWalkableMode(mCachedPtr, value); } } public float MinMoveDistance { set { Internal_SetMinMoveDistance(mCachedPtr, value); } } public float ContactOffset { set { Internal_SetContactOffset(mCachedPtr, value); } } public float StepOffset { set { Internal_SetStepOffset(mCachedPtr, value); } } public Radian SlopeLimit { set { Internal_SetSlopeLimit(mCachedPtr, value.Radians); } } public ulong Layer { set { Internal_SetLayer(mCachedPtr, value); } } public NativeCharacterController(ScriptCharacterControllerData initData) { Internal_CreateInstance(this, ref initData); } public void Destroy() { Internal_Destroy(mCachedPtr); } public CharacterCollisionFlag Move(Vector3 position) { return Internal_Move(mCachedPtr, ref position); } private void Internal_DoOnColliderHit(ScriptControllerCollision scriptCollisionData) { ControllerColliderCollision collisionData = new ControllerColliderCollision(); collisionData.position = scriptCollisionData.position; collisionData.normal = scriptCollisionData.normal; collisionData.motionDir = scriptCollisionData.motionDir; collisionData.motionAmount = scriptCollisionData.motionAmount; collisionData.triangleIndex = scriptCollisionData.triangleIndex; if(scriptCollisionData.collider != null) collisionData.collider = scriptCollisionData.collider.Component; else collisionData.collider = null; Component.DoOnColliderHit(collisionData); } private void Internal_DoOnControllerHit(ScriptControllerCollision scriptCollisionData) { ControllerControllerCollision collisionData = new ControllerControllerCollision(); collisionData.position = scriptCollisionData.position; collisionData.normal = scriptCollisionData.normal; collisionData.motionDir = scriptCollisionData.motionDir; collisionData.motionAmount = scriptCollisionData.motionAmount; if (scriptCollisionData.controller != null) collisionData.controller = scriptCollisionData.controller.Component; else collisionData.controller = null; Component.DoOnControllerHit(collisionData); } [MethodImpl(MethodImplOptions.InternalCall)] private static extern void Internal_CreateInstance(NativeCharacterController instance, ref ScriptCharacterControllerData initData); [MethodImpl(MethodImplOptions.InternalCall)] private static extern void Internal_Destroy(IntPtr thisPtr); [MethodImpl(MethodImplOptions.InternalCall)] private static extern CharacterCollisionFlag Internal_Move(IntPtr thisPtr, ref Vector3 position); [MethodImpl(MethodImplOptions.InternalCall)] private static extern void Internal_GetPosition(IntPtr thisPtr, out Vector3 position); [MethodImpl(MethodImplOptions.InternalCall)] private static extern void Internal_SetPosition(IntPtr thisPtr, ref Vector3 position); [MethodImpl(MethodImplOptions.InternalCall)] private static extern void Internal_GetFootPosition(IntPtr thisPtr, out Vector3 position); [MethodImpl(MethodImplOptions.InternalCall)] private static extern void Internal_SetFootPosition(IntPtr thisPtr, ref Vector3 position); [MethodImpl(MethodImplOptions.InternalCall)] private static extern void Internal_SetRadius(IntPtr thisPtr, float radius); [MethodImpl(MethodImplOptions.InternalCall)] private static extern void Internal_SetHeight(IntPtr thisPtr, float height); [MethodImpl(MethodImplOptions.InternalCall)] private static extern void Internal_SetUp(IntPtr thisPtr, ref Vector3 up); [MethodImpl(MethodImplOptions.InternalCall)] private static extern void Internal_SetClimbingMode(IntPtr thisPtr, CharacterClimbingMode mode); [MethodImpl(MethodImplOptions.InternalCall)] private static extern void Internal_SetNonWalkableMode(IntPtr thisPtr, CharacterNonWalkableMode mode); [MethodImpl(MethodImplOptions.InternalCall)] private static extern void Internal_SetMinMoveDistance(IntPtr thisPtr, float value); [MethodImpl(MethodImplOptions.InternalCall)] private static extern void Internal_SetContactOffset(IntPtr thisPtr, float value); [MethodImpl(MethodImplOptions.InternalCall)] private static extern void Internal_SetStepOffset(IntPtr thisPtr, float value); [MethodImpl(MethodImplOptions.InternalCall)] private static extern void Internal_SetSlopeLimit(IntPtr thisPtr, float value); [MethodImpl(MethodImplOptions.InternalCall)] private static extern void Internal_SetLayer(IntPtr thisPtr, ulong layer); } /** @} */ /** @endcond */ }