internal Motion(MotionDefinition motion, List <MotionControllerDefinition> controllers) : this() { Duration = motion.Duration; for (int i = 0; i < controllers.Count; i++) { // Remove useless controllers var controller = controllers[i]; var keyframes = motion.Tracks[i].Keyframes; var isDummy = false; if (keyframes.Count == 1 && keyframes[0].Time == 0) { var keyframe = keyframes[0]; switch (controller.Type) { //case ControllerType.Position: // switch ( keyframe ) // { // case Vector3Key vector3Key: // isDummy = vector3Key.Value == Vector3.Zero; // break; // } // break; //case ControllerType.Rotation: // switch ( keyframe ) // { // case QuaternionKey quaternionKey: // isDummy = quaternionKey.Value == Quaternion.Identity; // break; // } // break; case ControllerType.Scale: switch (keyframe) { case Vector3Key vector3Key: isDummy = vector3Key.Value == Vector3.One; break; } break; } } if (!isDummy) { Controllers.Add(new NodeController(controller, keyframes)); } } }
public static VisualElement CreateHolder(MotionDefinition def, AvatarParameterData data) { void Action() { var layer = def.GetParents <AnimatorLayerDefinition>().FirstOrDefault(); var animator = def.GetParents <AnimatorDefinition>().FirstOrDefault(); if ((layer?.IsRealized ?? false) && (animator?.IsRealized ?? false)) { animator.Animator.SelectAnimatorLayer(layer.Layer); EditorApplication.delayCall += () => Selection.activeObject = def.Motion; } } var fields = CreateHolder(Action, $"{def}", def); fields.SetupDeletion(fields.DeleteButton, fields.ObjectField, def, data); return(fields.Container); }
private List <MotionDefinition> BuildMotionDefinitions() { var motionDefs = new List <MotionDefinition>(); var motionDefCache = new Dictionary <Motion, MotionDefinition>(); foreach (var motion in Motions) { if (motion == null) { motionDefs.Add(null); continue; } if (motionDefCache.TryGetValue(motion, out var motionDef)) { motionDefs.Add(motionDef); continue; } motionDef = new MotionDefinition { Duration = motion.Duration, }; foreach (var controllerDef in mControllerDefinitions) { var controller = motion.Controllers.FirstOrDefault(x => x.GetDefinitionHash() == controllerDef.GetHashCode()); if (controller != null) { motionDef.Tracks.Add(new KeyframeTrack(controller.Keys)); continue; } // Need to add dummy values var keyframes = new List <IKey>(); void AddPlaceholderKeyframe(short time) { IKey key; switch (controllerDef.Type) { case ControllerType.Position: key = new Vector3Key(); break; case ControllerType.Type1: case ControllerType.Morph: case ControllerType.Type8: key = new UInt32Key(); break; case ControllerType.Scale: key = new Vector3Key { Value = Vector3.One }; break; case ControllerType.Rotation: key = new QuaternionKey { Value = Quaternion.Identity }; break; case ControllerType.Type5: key = new SingleKey(); break; default: throw new InvalidOperationException(); } key.Time = time; keyframes.Add(key); } AddPlaceholderKeyframe(0); motionDef.Tracks.Add(new KeyframeTrack(keyframes)); } motionDefs.Add(motionDef); motionDefCache[motion] = motionDef; } return(motionDefs); }