using NativeEngine;
namespace Sandbox;
///
/// A model scene object that supports animations and can be rendered within a .
///
public sealed partial class SceneModel : SceneObject
{
bool FindAnimParam( string name, out IAnimParameterInstance p )
{
p = default;
if ( !AnimationGraph.IsValid() )
return false;
if ( !AnimationGraph.TryGetParameterIndex( name, out var index ) )
return false;
p = animNative.GetAnimParameter( index );
return p.IsValid;
}
///
/// Sets a boolean animation graph parameter by name.
///
public void SetAnimParameter( string name, bool value )
{
if ( FindAnimParam( name, out var p ) )
{
var t = p.GetParameterType();
if ( t == AnimParamType.Bool )
{
p.SetValue( value );
return;
}
if ( t == AnimParamType.Int )
{
p.SetValue( value ? 1 : 0 );
return;
}
if ( t == AnimParamType.Float )
{
p.SetValue( value ? 1.0f : 0.0f );
return;
}
Log.Warning( $"SetBool: {t}" );
}
}
///
/// Sets a float animation graph parameter by name.
///
public void SetAnimParameter( string name, float value )
{
if ( FindAnimParam( name, out var p ) )
{
var t = p.GetParameterType();
if ( t == AnimParamType.Bool )
{
p.SetValue( value.AlmostEqual( 0.0f ) );
return;
}
if ( t == AnimParamType.Float )
{
p.SetValue( value );
return;
}
if ( t == AnimParamType.Int )
{
p.SetValue( (int)value );
return;
}
if ( t == AnimParamType.Enum )
{
p.SetEnumValue( (int)value );
return;
}
Log.Warning( $"SetBool: {t}" );
}
}
///
/// Sets a vector animation graph parameter by name.
///
public void SetAnimParameter( string name, Vector3 value )
{
if ( FindAnimParam( name, out var p ) )
{
var t = p.GetParameterType();
if ( t == AnimParamType.Vector )
{
p.SetValue( value );
return;
}
Log.Warning( $"SetBool: {t}" );
}
}
///
/// Sets a integer animation graph parameter by name.
///
public void SetAnimParameter( string name, int value )
{
if ( FindAnimParam( name, out var p ) )
{
var t = p.GetParameterType();
if ( t == AnimParamType.Bool )
{
p.SetValue( value == 0 );
return;
}
if ( t == AnimParamType.Float )
{
p.SetValue( (float)value );
return;
}
if ( t == AnimParamType.Int )
{
p.SetValue( value );
return;
}
if ( t == AnimParamType.Enum )
{
p.SetEnumValue( value );
return;
}
Log.Warning( $"Set int: {t}" );
}
}
///
/// Sets a rotation animation graph parameter by name.
///
public void SetAnimParameter( string name, Rotation value )
{
if ( FindAnimParam( name, out var p ) )
{
var t = p.GetParameterType();
if ( t == AnimParamType.Rotation )
{
p.SetValue( value );
return;
}
Log.Warning( $"Set rot: {t}" );
}
}
///
/// Reset all animgraph parameters to their default values.
///
public void ResetAnimParameters()
{
animNative.ResetGraphParameters();
}
///
/// Get an animated parameter
///
public Rotation GetRotation( string name ) => animNative.GetParameterRotation( name );
///
/// Get an animated parameter
///
public Vector3 GetVector3( string name ) => animNative.GetParameterVector3( name );
///
/// Get an animated parameter
///
public bool GetBool( string name ) => animNative.GetParameterInt( name ) != 0;
///
/// Get an animated parameter
///
public float GetFloat( string name ) => animNative.GetParameterFloat( name );
///
/// Get an animated parameter
///
public int GetInt( string name ) => animNative.GetParameterInt( name );
}