//********************************** 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 Collider class.
///
///
internal class NativeCollider : ScriptObject
{
private Collider component;
///
/// Component that owns the native collider object.
///
public Collider 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 Vector3 Scale
{
get { Vector3 scale; Internal_GetScale(mCachedPtr, out scale); return scale; }
set { Internal_SetScale(mCachedPtr, ref value); }
}
public bool IsTrigger
{
get { return Internal_GetIsTrigger(mCachedPtr); }
set { Internal_SetIsTrigger(mCachedPtr, value); }
}
public NativeRigidbody Rigidbody
{
get { return Internal_GetRigidbody(mCachedPtr); }
set
{
IntPtr rigidbodyPtr = IntPtr.Zero;
if (value != null)
rigidbodyPtr = value.GetCachedPtr();
Internal_SetRigidbody(mCachedPtr, rigidbodyPtr);
}
}
public float Mass
{
get { return Internal_GetMass(mCachedPtr); }
set { Internal_SetMass(mCachedPtr, value); }
}
public PhysicsMaterial Material
{
get { return Internal_GetMaterial(mCachedPtr); }
set
{
IntPtr materialPtr = IntPtr.Zero;
if (value != null)
materialPtr = value.GetCachedPtr();
Internal_SetMaterial(mCachedPtr, materialPtr);
}
}
public float ContactOffset
{
get { return Internal_GetContactOffset(mCachedPtr); }
set { Internal_SetContactOffset(mCachedPtr, value); }
}
public float RestOffset
{
get { return Internal_GetRestOffset(mCachedPtr); }
set { Internal_SetRestOffset(mCachedPtr, value); }
}
public ulong Layer
{
get { return Internal_GetLayer(mCachedPtr); }
set { Internal_SetLayer(mCachedPtr, value); }
}
public CollisionReportMode CollisionReportMode
{
get { return Internal_GetCollisionReportMode(mCachedPtr); }
set { Internal_SetCollisionReportMode(mCachedPtr, value); }
}
public bool Raycast(Vector3 origin, Vector3 unitDir, out ScriptPhysicsQueryHit hit, float maxDist)
{
return Internal_RayCast(mCachedPtr, ref origin, ref unitDir, out hit, maxDist);
}
public void Destroy()
{
Internal_Destroy(mCachedPtr);
}
private void Internal_DoOnCollisionBegin(ScriptCollisionData scriptCollisionData)
{
Component.DoOnCollisionBegin(new CollisionData(scriptCollisionData));
}
private void Internal_DoOnCollisionStay(ScriptCollisionData scriptCollisionData)
{
Component.DoOnCollisionStay(new CollisionData(scriptCollisionData));
}
private void Internal_DoOnCollisionEnd(ScriptCollisionData scriptCollisionData)
{
Component.DoOnCollisionEnd(new CollisionData(scriptCollisionData));
}
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_Destroy(IntPtr thisPtr);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_GetPosition(IntPtr thisPtr, out Vector3 pos);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_GetRotation(IntPtr thisPtr, out Quaternion rot);
[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_SetScale(IntPtr thisPtr, ref Vector3 scale);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_GetScale(IntPtr thisPtr, out Vector3 scale);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_SetIsTrigger(IntPtr thisPtr, bool value);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern bool Internal_GetIsTrigger(IntPtr thisPtr);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_SetRigidbody(IntPtr thisPtr, IntPtr rigidbody);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern NativeRigidbody Internal_GetRigidbody(IntPtr thisPtr);
[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_SetMaterial(IntPtr thisPtr, IntPtr physicsMaterial);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern PhysicsMaterial Internal_GetMaterial(IntPtr thisPtr);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_SetContactOffset(IntPtr thisPtr, float value);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern float Internal_GetContactOffset(IntPtr thisPtr);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_SetRestOffset(IntPtr thisPtr, float value);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern float Internal_GetRestOffset(IntPtr thisPtr);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_SetLayer(IntPtr thisPtr, ulong layer);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern ulong Internal_GetLayer(IntPtr thisPtr);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_SetCollisionReportMode(IntPtr thisPtr, CollisionReportMode mode);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern CollisionReportMode Internal_GetCollisionReportMode(IntPtr thisPtr);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern bool Internal_RayCast(IntPtr thisPtr, ref Vector3 origin, ref Vector3 unitDir,
out ScriptPhysicsQueryHit hit, float maxDist);
}
}