private static void BakeToSkeleton(RigBuilder rigBuilder, IRigConstraint constraint, AnimationClip clip, AnimationClip defaultPoseClip, IEnumerable <EditorCurveBinding> bindings, CurveFilterOptions filterOptions) { // Make sure the base constraint is valid if (constraint == null || !constraint.IsValid()) { throw new InvalidOperationException( string.Format("The rig constraint {0} is not a valid constraint.", constraint != null ? constraint.ToString() : "")); } var overrides = new Dictionary <IRigConstraint, IRigConstraint>(); using (var graph = new EvaluationGraph(rigBuilder, clip, defaultPoseClip, overrides, constraint)) { BakeCurvesToClip(clip, bindings, rigBuilder, graph, filterOptions); } }
internal static IBakeParameters FindBakeParameters(IRigConstraint constraint) { var constraintType = constraint.GetType(); var bakeParametersTypes = TypeCache.GetTypesWithAttribute <BakeParametersAttribute>(); foreach (var bakeParametersType in bakeParametersTypes) { if (!typeof(IBakeParameters).IsAssignableFrom(bakeParametersType)) { continue; } var attribute = bakeParametersType.GetCustomAttribute <BakeParametersAttribute>(); if (attribute.constraintType == constraintType) { return((IBakeParameters)Activator.CreateInstance(bakeParametersType)); } } return(null); }
private static IRigConstraint FindInverseRigConstraint(IRigConstraint constraint) { if (constraint == null) { return(null); } var inverseConstraintTypes = TypeCache.GetTypesWithAttribute <InverseRigConstraintAttribute>(); foreach (var inverseConstraintType in inverseConstraintTypes) { var attribute = inverseConstraintType.GetCustomAttribute <InverseRigConstraintAttribute>(); if (attribute.baseConstraint == constraint.GetType()) { return((IRigConstraint)Activator.CreateInstance(inverseConstraintType, new object[] { constraint })); } } return(null); }
private static void BakeToConstraint(RigBuilder rigBuilder, IRigConstraint constraint, AnimationClip clip, AnimationClip defaultPoseClip, IEnumerable <EditorCurveBinding> bindings, CurveFilterOptions filterOptions) { // Make sure the base constraint is valid if (constraint == null || !constraint.IsValid()) { throw new InvalidOperationException( string.Format("The rig constraint {0} is not a valid constraint.", constraint != null ? constraint.ToString() : "")); } // Check if the constraint is inverse solvable var inverseConstraint = FindInverseRigConstraint(constraint); if (inverseConstraint == null) { throw new InvalidOperationException( string.Format("No inverse rig constraint could be found for {0}.", constraint.ToString())); } else if (!inverseConstraint.IsValid()) { throw new InvalidOperationException( string.Format("The inverse rig constrain {1} for {0} is not a valid constraint.", constraint.ToString(), inverseConstraint.ToString())); } var overrides = new Dictionary <IRigConstraint, IRigConstraint>(); overrides.Add(constraint, inverseConstraint); using (var graph = new EvaluationGraph(rigBuilder, clip, defaultPoseClip, overrides, constraint)) { BakeCurvesToClip(clip, bindings, rigBuilder, graph, filterOptions); } }
public EvaluationGraph(RigBuilder rigBuilder, AnimationClip clip, AnimationClip defaultPoseClip, IReadOnlyDictionary <IRigConstraint, IRigConstraint> overrides, IRigConstraint lastConstraint = null) { m_SyncSceneToStreamLayer = new SyncSceneToStreamLayer(); bool stopBuilding = false; var layers = rigBuilder.layers; m_RigLayers = new List <IRigLayer>(layers.Count); for (int i = 0; i < layers.Count; ++i) { if (stopBuilding == true) { break; } if (layers[i].rig == null || !layers[i].active) { continue; } IRigConstraint[] constraints = RigUtils.GetConstraints(layers[i].rig); if (constraints == null || constraints.Length == 0) { continue; } var newConstraints = new List <IRigConstraint>(constraints.Length); foreach (IRigConstraint constraint in constraints) { if (overrides.TryGetValue(constraint, out IRigConstraint newConstraint)) { if (newConstraint != null) { newConstraints.Add(newConstraint); } } else { newConstraints.Add(constraint); } if (constraint == lastConstraint) { stopBuilding = true; break; } } m_RigLayers.Add(new OverrideRigLayer(layers[i].rig, newConstraints.ToArray())); } m_Graph = PlayableGraph.Create("Evaluation-Graph"); m_Graph.SetTimeUpdateMode(DirectorUpdateMode.Manual); var animator = rigBuilder.GetComponent <Animator>(); m_Clip = clip; var settings = AnimationUtility.GetAnimationClipSettings(m_Clip); m_ClipLoopTime = settings.loopTime; // Override loop time in clip asset. settings.loopTime = false; AnimationUtility.SetAnimationClipSettings(m_Clip, settings); var defaultPosePlayable = AnimationClipPlayable.Create(m_Graph, defaultPoseClip); var clipPlayable = AnimationClipPlayable.Create(m_Graph, m_Clip); defaultPosePlayable.SetApplyFootIK(false); clipPlayable.SetApplyFootIK(false); AnimationLayerMixerPlayable mixer = AnimationLayerMixerPlayable.Create(m_Graph, 2); mixer.ConnectInput(0, defaultPosePlayable, 0, 1.0f); mixer.ConnectInput(1, clipPlayable, 0, 1.0f); Playable inputPlayable = mixer; var playableChains = RigBuilderUtils.BuildPlayables(animator, m_Graph, m_RigLayers, m_SyncSceneToStreamLayer); foreach (var chain in playableChains) { if (!chain.IsValid()) { continue; } chain.playables[0].AddInput(inputPlayable, 0, 1); inputPlayable = chain.playables[chain.playables.Length - 1]; } var output = AnimationPlayableOutput.Create(m_Graph, "bake-output", animator); output.SetSourcePlayable(inputPlayable); }
/// <inheritdoc /> IEnumerable <EditorCurveBinding> IBakeParameters.GetConstrainedCurveBindings(RigBuilder rigBuilder, IRigConstraint constraint) { Debug.Assert(constraint is T); T tConstraint = (T)constraint; return(GetConstrainedCurveBindings(rigBuilder, tConstraint)); }