Pawn/PawnAnimator.cs
namespace Skateboard;

public abstract class PawnAnimator : Component
{
	[Property] public SkinnedModelRenderer Target { get; set; }

	protected SkinnedModelRenderer AnimPawn => Target ?? Components.Get<SkinnedModelRenderer>();

	public virtual void SetLookAt( string name, Vector3 worldPosition )
	{
		var pawn = Components.Get<Skateboard.Player.SkatePawn>();
		if ( pawn is null )
			return;

		var localPos = (worldPosition - pawn.EyePosition) * pawn.EyeRotation.Inverse;
		SetAnimParameter( name, localPos );
	}

	public virtual void SetAnimParameter( string name, Vector3 value )
	{
		AnimPawn?.Set( name, value );
	}

	public virtual void SetAnimParameter( string name, float value )
	{
		AnimPawn?.Set( name, value );
	}

	public virtual void SetAnimParameter( string name, bool value )
	{
		AnimPawn?.Set( name, value );
	}

	public virtual void SetAnimParameter( string name, int value )
	{
		AnimPawn?.Set( name, value );
	}

	public virtual void Trigger( string name )
	{
		SetAnimParameter( name, true );
	}

	public virtual void ResetParameters()
	{
		AnimPawn?.ClearParameters();
	}
}