//********************************** 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
{
///
/// Wrapper around the native Rigidbody class.
///
///
internal class NativeRigidbody : ScriptObject
{
private Rigidbody component;
///
/// Component that owns the native rigidbody object.
///
public Rigidbody Component
{
get { return component; }
set { component = value; }
}
public Vector3 Position
{
get { Vector3 pos; Internal_GetPosition(mCachedPtr, out pos); return pos; }
set { Quaternion rot = Rotation; Internal_SetTransform(mCachedPtr, ref value, ref rot); }
}
public Quaternion Rotation
{
get { Quaternion rot; Internal_GetRotation(mCachedPtr, out rot); return rot; }
set { Vector3 pos = Position; Internal_SetTransform(mCachedPtr, ref pos, ref value); }
}
public float Mass
{
get { return Internal_GetMass(mCachedPtr); }
set { Internal_SetMass(mCachedPtr, value); }
}
public bool Kinematic
{
get { return Internal_GetIsKinematic(mCachedPtr); }
set { Internal_SetIsKinematic(mCachedPtr, value); }
}
public bool Sleeping
{
get { return Internal_IsSleeping(mCachedPtr); }
set
{
if (value)
Internal_Sleep(mCachedPtr);
else
Internal_WakeUp(mCachedPtr);
}
}
public float SleepThreshold
{
get { return Internal_GetSleepThreshold(mCachedPtr); }
set { Internal_SetSleepThreshold(mCachedPtr, value); }
}
public bool UseGravity
{
get { return Internal_GetUseGravity(mCachedPtr); }
set { Internal_SetUseGravity(mCachedPtr, value); }
}
public Vector3 Velocity
{
get { Vector3 velocity; Internal_GetVelocity(mCachedPtr, out velocity); return velocity; }
set { Internal_SetVelocity(mCachedPtr, ref value); }
}
public Vector3 AngularVelocity
{
get { Vector3 velocity; Internal_GetAngularVelocity(mCachedPtr, out velocity); return velocity; }
set { Internal_SetAngularVelocity(mCachedPtr, ref value); }
}
public float Drag
{
get { return Internal_GetDrag(mCachedPtr); }
set { Internal_SetDrag(mCachedPtr, value); }
}
public float AngularDrag
{
get { return Internal_GetAngularDrag(mCachedPtr); }
set { Internal_SetAngularDrag(mCachedPtr, value); }
}
public Vector3 InertiaTensor
{
get { Vector3 tensor; Internal_GetInertiaTensor(mCachedPtr, out tensor); return tensor; }
set { Internal_SetInertiaTensor(mCachedPtr, ref value); }
}
public Vector3 CenterOfMassPosition
{
get { Vector3 pos; Internal_GetCenterOfMassPosition(mCachedPtr, out pos); return pos; }
set { Quaternion rot = CenterOfMassRotation; Internal_SetCenterOfMass(mCachedPtr, ref value, ref rot); }
}
public Quaternion CenterOfMassRotation
{
get { Quaternion rot; Internal_GetCenterOfMassRotation(mCachedPtr, out rot); return rot; }
set { Vector3 pos = CenterOfMassPosition; Internal_SetCenterOfMass(mCachedPtr, ref pos, ref value); }
}
public float MaxAngularVelocity
{
get { return Internal_GetMaxAngularVelocity(mCachedPtr); }
set { Internal_SetMaxAngularVelocity(mCachedPtr, value); }
}
public int PositionSolverCount
{
get { return Internal_GetPositionSolverCount(mCachedPtr); }
set { Internal_SetPositionSolverCount(mCachedPtr, value); }
}
public int VelocitySolverCount
{
get { return Internal_GetVelocitySolverCount(mCachedPtr); }
set { Internal_SetVelocitySolverCount(mCachedPtr, value); }
}
public RigidbodyInterpolationMode InterpolationMode
{
get { return Internal_GetInterpolationMode(mCachedPtr); }
set { Internal_SetInterpolationMode(mCachedPtr, value); }
}
public RigidbodyFlag Flags
{
get { return Internal_GetFlags(mCachedPtr); }
set { Internal_SetFlags(mCachedPtr, value); }
}
public NativeRigidbody(SceneObject linkedSO)
{
IntPtr linkedSOPtr = IntPtr.Zero;
if (linkedSO != null)
linkedSOPtr = linkedSO.GetCachedPtr();
Internal_CreateInstance(this, linkedSOPtr);
}
public void Destroy()
{
Internal_Destroy(mCachedPtr);
}
public void Move(Vector3 position)
{
Internal_Move(mCachedPtr, ref position);
}
public void Rotate(Quaternion rotation)
{
Internal_Rotate(mCachedPtr, ref rotation);
}
public void AddForce(Vector3 force, ForceMode mode)
{
Internal_AddForce(mCachedPtr, ref force, mode);
}
public void AddTorque(Vector3 torque, ForceMode mode)
{
Internal_AddTorque(mCachedPtr, ref torque, mode);
}
public void AddForceAtPoint(Vector3 force, Vector3 position, PointForceMode mode)
{
Internal_AddForceAtPoint(mCachedPtr, ref force, ref position, mode);
}
public Vector3 GetVelocityAtPoint(Vector3 position)
{
Vector3 velocity;
Internal_GetVelocityAtPoint(mCachedPtr, ref position, out velocity);
return velocity;
}
public void AddCollider(Collider collider)
{
if (collider == null)
return;
IntPtr colliderPtr = collider.GetCachedPtr();
Internal_AddCollider(mCachedPtr, colliderPtr);
}
public void RemoveCollider(Collider collider)
{
if (collider == null)
return;
IntPtr colliderPtr = collider.GetCachedPtr();
Internal_RemoveCollider(mCachedPtr, colliderPtr);
}
public void RemoveColliders()
{
Internal_RemoveColliders(mCachedPtr);
}
public void UpdateMassDistribution()
{
Internal_UpdateMassDistribution(mCachedPtr);
}
private void Internal_DoOnCollisionBegin(ScriptCollisionData scriptCollisionData)
{
CollisionData collisionData;
collisionData.colliderA = scriptCollisionData.colliderA.Component;
collisionData.colliderB = scriptCollisionData.colliderB.Component;
collisionData.contactPoints = scriptCollisionData.contactPoints;
Component.DoOnCollisionBegin(collisionData);
}
private void Internal_DoOnCollisionStay(ScriptCollisionData scriptCollisionData)
{
CollisionData collisionData;
collisionData.colliderA = scriptCollisionData.colliderA.Component;
collisionData.colliderB = scriptCollisionData.colliderB.Component;
collisionData.contactPoints = scriptCollisionData.contactPoints;
Component.DoOnCollisionStay(collisionData);
}
private void Internal_DoOnCollisionEnd(ScriptCollisionData scriptCollisionData)
{
CollisionData collisionData;
collisionData.colliderA = scriptCollisionData.colliderA.Component;
collisionData.colliderB = scriptCollisionData.colliderB.Component;
collisionData.contactPoints = scriptCollisionData.contactPoints;
Component.DoOnCollisionEnd(collisionData);
}
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_CreateInstance(NativeRigidbody instance, IntPtr linkedSO);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_Destroy(IntPtr thisPtr);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_Move(IntPtr thisPtr, ref Vector3 position);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_Rotate(IntPtr thisPtr, ref Quaternion rotation);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_GetPosition(IntPtr thisPtr, out Vector3 position);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_GetRotation(IntPtr thisPtr, out Quaternion rotation);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_SetTransform(IntPtr thisPtr, ref Vector3 pos, ref Quaternion rot);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_SetMass(IntPtr thisPtr, float mass);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern float Internal_GetMass(IntPtr thisPtr);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_SetIsKinematic(IntPtr thisPtr, bool kinematic);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern bool Internal_GetIsKinematic(IntPtr thisPtr);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern bool Internal_IsSleeping(IntPtr thisPtr);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_Sleep(IntPtr thisPtr);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_WakeUp(IntPtr thisPtr);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_SetSleepThreshold(IntPtr thisPtr, float threshold);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern float Internal_GetSleepThreshold(IntPtr thisPtr);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_SetUseGravity(IntPtr thisPtr, bool gravity);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern bool Internal_GetUseGravity(IntPtr thisPtr);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_SetVelocity(IntPtr thisPtr, ref Vector3 velocity);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_GetVelocity(IntPtr thisPtr, out Vector3 velocity);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_SetAngularVelocity(IntPtr thisPtr, ref Vector3 velocity);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_GetAngularVelocity(IntPtr thisPtr, out Vector3 velocity);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_SetDrag(IntPtr thisPtr, float drag);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern float Internal_GetDrag(IntPtr thisPtr);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_SetAngularDrag(IntPtr thisPtr, float drag);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern float Internal_GetAngularDrag(IntPtr thisPtr);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_SetInertiaTensor(IntPtr thisPtr, ref Vector3 tensor);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_GetInertiaTensor(IntPtr thisPtr, out Vector3 tensor);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_SetMaxAngularVelocity(IntPtr thisPtr, float maxVelocity);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern float Internal_GetMaxAngularVelocity(IntPtr thisPtr);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_SetCenterOfMass(IntPtr thisPtr, ref Vector3 position, ref Quaternion rotation);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_GetCenterOfMassPosition(IntPtr thisPtr, out Vector3 position);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_GetCenterOfMassRotation(IntPtr thisPtr, out Quaternion rotation);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_SetPositionSolverCount(IntPtr thisPtr, int count);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern int Internal_GetPositionSolverCount(IntPtr thisPtr);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_SetVelocitySolverCount(IntPtr thisPtr, int count);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern int Internal_GetVelocitySolverCount(IntPtr thisPtr);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_SetInterpolationMode(IntPtr thisPtr, RigidbodyInterpolationMode value);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern RigidbodyInterpolationMode Internal_GetInterpolationMode(IntPtr thisPtr);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_SetFlags(IntPtr thisPtr, RigidbodyFlag flags);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern RigidbodyFlag Internal_GetFlags(IntPtr thisPtr);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_AddForce(IntPtr thisPtr, ref Vector3 force, ForceMode mode);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_AddTorque(IntPtr thisPtr, ref Vector3 torque, ForceMode mode);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_AddForceAtPoint(IntPtr thisPtr, ref Vector3 force, ref Vector3 position, PointForceMode mode);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_GetVelocityAtPoint(IntPtr thisPtr, ref Vector3 point, out Vector3 velocity);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_AddCollider(IntPtr thisPtr, IntPtr collider);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_RemoveCollider(IntPtr thisPtr, IntPtr collider);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_RemoveColliders(IntPtr thisPtr);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_UpdateMassDistribution(IntPtr thisPtr);
}
}