//********************************** 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
{
/** @addtogroup Physics
* @{
*/
///
/// Material that controls how two physical objects interact with each other. Materials of both objects are used during
/// their interaction and their combined values are used.
///
public class PhysicsMaterial : Resource
{
///
/// Constructor for internal use by the runtime.
///
private PhysicsMaterial(bool dummy)
{ }
///
/// Creates a brand new physics material.
///
/// Controls friction when two in-contact objects are not moving lateral to each other.
///
/// Controls friction when two in-contact objects are moving lateral to each other.
///
/// Controls "bounciness" of an object during a collision. Value of 1 means the collision
/// is elastic, and value of 0 means the value is inelastic.
public PhysicsMaterial(float staticFriction = 0.0f, float dynamicFriction = 0.0f, float restitution = 0.0f)
{
Internal_CreateInstance(this, staticFriction, dynamicFriction, restitution);
}
///
/// Controls friction when two in-contact objects are not moving lateral to each other (for example how difficult is
/// to get an object moving from a static state while it is in contact other object(s)).
///
public float StaticFriction
{
get { return Internal_GetStaticFriction(mCachedPtr); }
set { Internal_SetStaticFriction(mCachedPtr, value); }
}
///
/// Controls friction when two in-contact objects are moving lateral to each other (for example how quickly does an
/// object slow down when sliding along another object).
///
public float DynamicFriction
{
get { return Internal_GetDynamicFriction(mCachedPtr); }
set { Internal_SetDynamicFriction(mCachedPtr, value); }
}
///
/// Controls "bounciness" of an object during a collision. Value of 1 means the collision is elastic, and value
/// of 0 means the value is inelastic. Must be in [0, 1] range.
///
public float Restitution
{
get { return Internal_GetRestitution(mCachedPtr); }
set { Internal_SetRestitution(mCachedPtr, value); }
}
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_CreateInstance(PhysicsMaterial instance, float staticFriction,
float dynamicFriction, float restitution);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern float Internal_GetStaticFriction(IntPtr thisPtr);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_SetStaticFriction(IntPtr thisPtr, float value);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern float Internal_GetDynamicFriction(IntPtr thisPtr);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_SetDynamicFriction(IntPtr thisPtr, float value);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern float Internal_GetRestitution(IntPtr thisPtr);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_SetRestitution(IntPtr thisPtr, float value);
}
/** @} */
}