Code/BoBiCo Soft-Physics/SoftBoneSkinnedModelUtility.cs

Utility static class for skinned model bone transforms and vector helpers. It reads bone animation or pose transforms from a SkinnedModelRenderer, converts between world and local space using the renderer's WorldTransform, and provides a SafeNormal helper for vectors.

using System;

public static class SoftBoneSkinnedModelUtility
{
	private const float Epsilon = 0.000008f;

	public static bool TryGetBoneAnimationLocal( SkinnedModelRenderer renderer, BoneCollection.Bone bone, out Transform transform )
	{
		transform = default;

		if ( renderer is null || !renderer.IsValid() || bone is null )
			return false;

		if ( renderer.TryGetBoneTransformAnimation( bone, out var worldTransform ) )
		{
			transform = renderer.WorldTransform.ToLocal( worldTransform );
			return true;
		}

		if ( renderer.TryGetBoneTransform( bone, out worldTransform ) )
		{
			transform = renderer.WorldTransform.ToLocal( worldTransform );
			return true;
		}

		return false;
	}

	public static Vector3 ToWorld( SkinnedModelRenderer renderer, Vector3 localPosition )
	{
		if ( renderer is null || !renderer.IsValid() )
			return localPosition;

		return renderer.WorldTransform.PointToWorld( localPosition );
	}

	public static Vector3 ToLocal( SkinnedModelRenderer renderer, Vector3 worldPosition )
	{
		if ( renderer is null || !renderer.IsValid() )
			return worldPosition;

		return renderer.WorldTransform.PointToLocal( worldPosition );
	}

	public static Vector3 SafeNormal( Vector3 value, Vector3 fallback )
	{
		if ( value.Length <= Epsilon )
			return fallback.Length > Epsilon ? fallback.Normal : Vector3.Forward;

		return value.Normal;
	}
}