Loading files
This file is pinned to the selected release. Download the original to open it in your design tool.
504f2a2a4This file is pinned to the selected release. Download the original to open it in your design tool.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Numerics;
using System.Text;
namespace SharpGLTF.Schema2
{
public static partial class Toolkit
{
public static Animation UseAnimation(this ModelRoot root, string name)
{
Guard.NotNull(root, nameof(root));
var animation = root.LogicalAnimations.FirstOrDefault(item => item.Name == name);
return animation ?? root.CreateAnimation(name);
}
public static Node WithScaleAnimation(this Node node, string animationName, Animations.ICurveSampler<Vector3> sampler)
{
Guard.NotNull(node, nameof(node));
if (sampler is Animations.IConvertibleCurve<Vector3> curve)
{
var animation = node.LogicalParent.UseAnimation(animationName);
var degree = curve.MaxDegree;
if (degree == 0) animation.CreateScaleChannel(node, curve.ToStepCurve(), false);
if (degree == 1) animation.CreateScaleChannel(node, curve.ToLinearCurve(), true);
if (degree == 3) animation.CreateScaleChannel(node, curve.ToSplineCurve());
}
else
{
throw new ArgumentException("Must implement IConvertibleCurve<Vector3>", nameof(sampler));
}
return node;
}
public static Node WithTranslationAnimation(this Node node, string animationName, Animations.ICurveSampler<Vector3> sampler)
{
Guard.NotNull(node, nameof(node));
if (sampler is Animations.IConvertibleCurve<Vector3> curve)
{
var animation = node.LogicalParent.UseAnimation(animationName);
var degree = curve.MaxDegree;
if (degree == 0) animation.CreateTranslationChannel(node, curve.ToStepCurve(), false);
if (degree == 1) animation.CreateTranslationChannel(node, curve.ToLinearCurve(), true);
if (degree == 3) animation.CreateTranslationChannel(node, curve.ToSplineCurve());
}
else
{
throw new ArgumentException("Must implement IConvertibleCurve<Vector3>", nameof(sampler));
}
return node;
}
public static Node WithMorphingAnimation(this Node node, string animationName, Animations.ICurveSampler<Transforms.SparseWeight8> sampler)
{
Guard.NotNull(node, nameof(node));
Guard.NotNull(node.MorphWeights, nameof(node.MorphWeights), "Set node.MorphWeights before setting morphing animation");
Guard.MustBeGreaterThanOrEqualTo(node.MorphWeights.Count, 0, nameof(node.MorphWeights));
if (sampler is Animations.IConvertibleCurve<Transforms.SparseWeight8> curve)
{
var animation = node.LogicalParent.UseAnimation(animationName);
var degree = curve.MaxDegree;
if (degree == 0) animation.CreateMorphChannel(node, curve.ToStepCurve(), node.MorphWeights.Count, false);
if (degree == 1) animation.CreateMorphChannel(node, curve.ToLinearCurve(), node.MorphWeights.Count, true);
if (degree == 3) animation.CreateMorphChannel(node, curve.ToSplineCurve(), node.MorphWeights.Count);
}
return node;
}
public static Node WithRotationAnimation(this Node node, string animationName, Animations.ICurveSampler<Quaternion> sampler)
{
Guard.NotNull(node, nameof(node));
if (sampler is Animations.IConvertibleCurve<Quaternion> curve)
{
var animation = node.LogicalParent.UseAnimation(animationName);
var degree = curve.MaxDegree;
if (degree == 0) animation.CreateRotationChannel(node, curve.ToStepCurve(), false);
if (degree == 1) animation.CreateRotationChannel(node, curve.ToLinearCurve(), true);
if (degree == 3) animation.CreateRotationChannel(node, curve.ToSplineCurve());
}
else
{
throw new ArgumentException("Must implement IConvertibleCurve<Quaternion>", nameof(sampler));
}
return node;
}
public static Node WithScaleAnimation(this Node node, string animationName, params (Single Key, Vector3 Value)[] keyframes)
{
Guard.NotNull(node, nameof(node));
Guard.NotNullOrEmpty(keyframes, nameof(keyframes));
var keys = keyframes.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
return node.WithScaleAnimation(animationName, keys);
}
public static Node WithRotationAnimation(this Node node, string animationName, params (Single Key, Quaternion Value)[] keyframes)
{
Guard.NotNull(node, nameof(node));
Guard.NotNullOrEmpty(keyframes, nameof(keyframes));
var keys = keyframes.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
return node.WithRotationAnimation(animationName, keys);
}
public static Node WithTranslationAnimation(this Node node, string animationName, params (Single Key, Vector3 Value)[] keyframes)
{
Guard.NotNull(node, nameof(node));
Guard.NotNullOrEmpty(keyframes, nameof(keyframes));
var keys = keyframes.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
return node.WithTranslationAnimation(animationName, keys);
}
public static Node WithScaleAnimation(this Node node, string animationName, IReadOnlyDictionary<Single, Vector3> keyframes)
{
Guard.NotNull(node, nameof(node));
Guard.NotNullOrEmpty(keyframes, nameof(keyframes));
var root = node.LogicalParent;
var animation = root.UseAnimation(animationName);
animation.CreateScaleChannel(node, keyframes);
return node;
}
public static Node WithRotationAnimation(this Node node, string animationName, IReadOnlyDictionary<Single, Quaternion> keyframes)
{
Guard.NotNull(node, nameof(node));
Guard.NotNullOrEmpty(keyframes, nameof(keyframes));
var root = node.LogicalParent;
var animation = root.UseAnimation(animationName);
animation.CreateRotationChannel(node, keyframes);
return node;
}
public static Node WithTranslationAnimation(this Node node, string animationName, IReadOnlyDictionary<Single, Vector3> keyframes)
{
Guard.NotNull(node, nameof(node));
Guard.NotNullOrEmpty(keyframes, nameof(keyframes));
var root = node.LogicalParent;
var animation = root.UseAnimation(animationName);
animation.CreateTranslationChannel(node, keyframes);
return node;
}
}
}