summaryrefslogtreecommitdiff
path: root/Assets/ThirdParty/VRM/VRM/UniGLTF/Scripts/Format/glTFAnimation.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Assets/ThirdParty/VRM/VRM/UniGLTF/Scripts/Format/glTFAnimation.cs')
-rw-r--r--Assets/ThirdParty/VRM/VRM/UniGLTF/Scripts/Format/glTFAnimation.cs252
1 files changed, 252 insertions, 0 deletions
diff --git a/Assets/ThirdParty/VRM/VRM/UniGLTF/Scripts/Format/glTFAnimation.cs b/Assets/ThirdParty/VRM/VRM/UniGLTF/Scripts/Format/glTFAnimation.cs
new file mode 100644
index 00000000..3dfc1c6f
--- /dev/null
+++ b/Assets/ThirdParty/VRM/VRM/UniGLTF/Scripts/Format/glTFAnimation.cs
@@ -0,0 +1,252 @@
+using System;
+using System.Linq;
+using System.Collections.Generic;
+using UniJSON;
+using UnityEngine;
+
+
+namespace UniGLTF
+{
+ [Serializable]
+ public class glTFAnimationTarget : JsonSerializableBase
+ {
+ [JsonSchema(Minimum = 0)]
+ public int node;
+
+ [JsonSchema(Required = true, EnumValues = new object[] { "translation", "rotation", "scale", "weights" }, EnumSerializationType = EnumSerializationType.AsString)]
+ public string path;
+
+ // empty schemas
+ public object extensions;
+ public object extras;
+
+ protected override void SerializeMembers(GLTFJsonFormatter f)
+ {
+ f.KeyValue(() => node);
+ if (!string.IsNullOrEmpty(path))
+ {
+ f.KeyValue(() => path);
+ }
+ }
+
+ public enum Interpolations
+ {
+ LINEAR,
+ STEP,
+ CUBICSPLINE
+ }
+
+ public const string PATH_TRANSLATION = "translation";
+ public const string PATH_EULER_ROTATION = "rotation";
+ public const string PATH_ROTATION = "rotation";
+ public const string PATH_SCALE = "scale";
+ public const string PATH_WEIGHT = "weights";
+ public const string NOT_IMPLEMENTED = "NotImplemented";
+
+ [Obsolete("Use AnimationProperties")]
+ public enum AnimationPropertys
+ {
+ Translation = AnimationProperties.Translation,
+ EulerRotation = AnimationProperties.EulerRotation,
+ Rotation = AnimationProperties.Rotation,
+ Scale = AnimationProperties.Scale,
+ Weight = AnimationProperties.Weight,
+ BlendShape = AnimationProperties.BlendShape,
+
+ NotImplemented = AnimationProperties.NotImplemented
+ }
+
+ [Obsolete]
+ internal static AnimationProperties AnimationPropertysToAnimationProperties(AnimationPropertys property)
+ {
+ if (!Enum.IsDefined(typeof(AnimationProperties), property))
+ {
+ throw new InvalidCastException("Failed to convert AnimationPropertys '" + property + "' to AnimationProperties");
+ }
+ return (AnimationProperties)property;
+ }
+
+ public enum AnimationProperties
+ {
+ Translation,
+ EulerRotation,
+ Rotation,
+ Scale,
+ Weight,
+ BlendShape,
+
+ NotImplemented
+ }
+
+ [Obsolete]
+ public static string GetPathName(AnimationPropertys property)
+ {
+ return GetPathName(AnimationPropertysToAnimationProperties(property));
+ }
+
+ public static string GetPathName(AnimationProperties property)
+ {
+ switch (property)
+ {
+ case AnimationProperties.Translation:
+ return PATH_TRANSLATION;
+ case AnimationProperties.EulerRotation:
+ case AnimationProperties.Rotation:
+ return PATH_ROTATION;
+ case AnimationProperties.Scale:
+ return PATH_SCALE;
+ case AnimationProperties.BlendShape:
+ return PATH_WEIGHT;
+ default: throw new NotImplementedException();
+ }
+ }
+
+ public static AnimationProperties GetAnimationProperty(string path)
+ {
+ switch (path)
+ {
+ case PATH_TRANSLATION:
+ return AnimationProperties.Translation;
+ case PATH_ROTATION:
+ return AnimationProperties.Rotation;
+ case PATH_SCALE:
+ return AnimationProperties.Scale;
+ case PATH_WEIGHT:
+ return AnimationProperties.BlendShape;
+ default: throw new NotImplementedException();
+ }
+ }
+
+ [Obsolete]
+ public static int GetElementCount(AnimationPropertys property)
+ {
+ return GetElementCount(AnimationPropertysToAnimationProperties(property));
+ }
+
+ public static int GetElementCount(AnimationProperties property)
+ {
+ switch (property)
+ {
+ case AnimationProperties.Translation: return 3;
+ case AnimationProperties.EulerRotation: return 3;
+ case AnimationProperties.Rotation: return 4;
+ case AnimationProperties.Scale: return 3;
+ case AnimationProperties.BlendShape: return 1;
+ default: throw new NotImplementedException();
+ }
+ }
+
+ public static int GetElementCount(string path)
+ {
+ return GetElementCount(GetAnimationProperty(path));
+ }
+ }
+
+ [Serializable]
+ public class glTFAnimationChannel : JsonSerializableBase
+ {
+ [JsonSchema(Required = true, Minimum = 0)]
+ public int sampler = -1;
+
+ [JsonSchema(Required = true)]
+ public glTFAnimationTarget target;
+
+ // empty schemas
+ public object extensions;
+ public object extras;
+
+ protected override void SerializeMembers(GLTFJsonFormatter f)
+ {
+ f.KeyValue(() => sampler);
+ f.Key("target"); f.GLTFValue(target);
+ }
+ }
+
+ [Serializable]
+ public class glTFAnimationSampler : JsonSerializableBase
+ {
+ [JsonSchema(Required = true, Minimum = 0)]
+ public int input = -1;
+
+ [JsonSchema(EnumValues = new object[] { "LINEAR", "STEP", "CUBICSPLINE" }, EnumSerializationType = EnumSerializationType.AsString)]
+ public string interpolation;
+
+ [JsonSchema(Required = true, Minimum = 0)]
+ public int output = -1;
+
+ // empty schemas
+ public object extensions;
+ public object extras;
+
+ protected override void SerializeMembers(GLTFJsonFormatter f)
+ {
+ f.KeyValue(() => input);
+ if (!string.IsNullOrEmpty(interpolation))
+ {
+ f.KeyValue(() => interpolation);
+ }
+ f.KeyValue(() => output);
+ }
+ }
+
+ [Serializable]
+ public class glTFAnimation : JsonSerializableBase
+ {
+ public string name = "";
+
+ [JsonSchema(Required = true, MinItems = 1)]
+ public List<glTFAnimationChannel> channels = new List<glTFAnimationChannel>();
+
+ [JsonSchema(Required = true, MinItems = 1)]
+ public List<glTFAnimationSampler> samplers = new List<glTFAnimationSampler>();
+
+ // empty schemas
+ public object extensions;
+ public object extras;
+
+ protected override void SerializeMembers(GLTFJsonFormatter f)
+ {
+ if (!string.IsNullOrEmpty(name))
+ {
+ f.KeyValue(() => name);
+ }
+
+ f.Key("channels"); f.GLTFValue(channels);
+ f.Key("samplers"); f.GLTFValue(samplers);
+ }
+
+ [Obsolete]
+ public int AddChannelAndGetSampler(int nodeIndex, glTFAnimationTarget.AnimationPropertys property)
+ {
+ return AddChannelAndGetSampler(nodeIndex, glTFAnimationTarget.AnimationPropertysToAnimationProperties(property));
+ }
+
+ public int AddChannelAndGetSampler(int nodeIndex, glTFAnimationTarget.AnimationProperties property)
+ {
+ // find channel
+ var channel = channels.FirstOrDefault(x => x.target.node == nodeIndex && x.target.path == glTFAnimationTarget.GetPathName(property));
+ if (channel != null)
+ {
+ return channel.sampler;
+ }
+
+ // not found. create new
+ var samplerIndex = samplers.Count;
+ var sampler = new glTFAnimationSampler();
+ samplers.Add(sampler);
+
+ channel = new glTFAnimationChannel
+ {
+ sampler = samplerIndex,
+ target = new glTFAnimationTarget
+ {
+ node = nodeIndex,
+ path = glTFAnimationTarget.GetPathName(property),
+ },
+ };
+ channels.Add(channel);
+
+ return samplerIndex;
+ }
+ }
+}