/// <inheritdoc /> IAnimationJob IAnimationJobBinder.Create(Animator animator, IAnimationJobData data, Component component) { Debug.Assert(data is TData); TData tData = (TData)data; return(Create(animator, ref tData, component)); }
/// <inheritdoc /> void IAnimationJobBinder.Update(IAnimationJob job, IAnimationJobData data) { Debug.Assert(data is TData && job is TJob); TData tData = (TData)data; Update((TJob)job, ref tData); }
private static bool ExtractWeightedTransforms( Animator animator, FieldInfo field, ref IAnimationJobData data, List <Transform> syncableTransforms, List <Property> syncableProperties) { bool handled = true; Type fieldType = field.FieldType; if (fieldType == typeof(WeightedTransform)) { var value = ((WeightedTransform)field.GetValue(data)).transform; if (value != null && value.IsChildOf(animator.transform)) { syncableTransforms.Add(value); } syncableProperties.Add( new Property { name = PropertyUtils.ConstructConstraintDataPropertyName(field.Name + ".weight"), descriptor = s_SupportedPropertyTypeToDescriptor[typeof(float)] } ); } else if (fieldType == typeof(WeightedTransformArray)) { var list = (IEnumerable <WeightedTransform>)field.GetValue(data); int index = 0; foreach (var element in list) { if (element.transform != null && element.transform.IsChildOf(animator.transform)) { syncableTransforms.Add(element.transform); } syncableProperties.Add( new Property { name = PropertyUtils.ConstructConstraintDataPropertyName(field.Name + ".m_Item" + index + ".weight"), descriptor = s_SupportedPropertyTypeToDescriptor[typeof(float)] } ); ++index; } } else { handled = false; } return(handled); }
private static bool ExtractPropertyType( FieldInfo field, ref IAnimationJobData data, List <Property> syncableProperties ) { if (!s_SupportedPropertyTypeToDescriptor.TryGetValue(field.FieldType, out PropertyDescriptor descriptor)) { return(false); } syncableProperties.Add( new Property { name = PropertyUtils.ConstructConstraintDataPropertyName(field.Name), descriptor = descriptor } ); return(true); }
public void Clear() { if (graph.IsValid()) { graph.Destroy(); } foreach (var layer in layers) { layer.Reset(); } if (m_RigLayerData != null) { m_RigLayerData.Clear(); } if (m_SyncSceneToStreamJobData != null && m_SyncSceneToStreamJobData.IsValid()) { RigUtils.syncSceneToStreamBinder.Destroy(m_SyncSceneToStreamJob); m_SyncSceneToStreamJobData = null; } }
private static bool ExtractTransformType( Animator animator, FieldInfo field, ref IAnimationJobData data, List <Transform> syncableTransforms ) { bool handled = true; Type fieldType = field.FieldType; if (fieldType == typeof(Transform)) { var value = (Transform)field.GetValue(data); if (value != null && value.IsChildOf(animator.transform)) { syncableTransforms.Add(value); } } else if (fieldType == typeof(Transform[]) || fieldType == typeof(List <Transform>)) { var list = (IEnumerable <Transform>)field.GetValue(data); foreach (var element in list) { if (element != null && element.IsChildOf(animator.transform)) { syncableTransforms.Add(element); } } } else { handled = false; } return(handled); }
public bool Build() { Clear(); var animator = GetComponent <Animator>(); if (animator == null || layers.Count == 0) { return(false); } string graphName = gameObject.transform.name + "_Rigs"; graph = PlayableGraph.Create(graphName); graph.SetTimeUpdateMode(DirectorUpdateMode.GameTime); // Create sync scene to stream layer var syncLayerOutput = AnimationPlayableOutput.Create(graph, "syncSceneToStreamOutput", animator); syncLayerOutput.SetAnimationStreamSource(AnimationStreamSource.PreviousInputs); // Create all rig layers m_RigLayerData = new List <LayerData>(layers.Count); List <JobTransform> allRigReferences = new List <JobTransform>(); foreach (var layer in layers) { if (!layer.Initialize(animator)) { continue; } LayerData data = new LayerData(); data.output = AnimationPlayableOutput.Create(graph, "rigOutput", animator); data.output.SetAnimationStreamSource(AnimationStreamSource.PreviousInputs); data.playables = BuildRigPlayables(graph, layer.rig, ref data.output); layer.data = m_RigLayerData.Count; m_RigLayerData.Add(data); // Gather all references used by rig var references = RigUtils.GetAllConstraintReferences(animator, layer.rig.constraints); if (references != null) { allRigReferences.AddRange(references); } references = RigUtils.GetAllRigTransformReferences(layer.rig); if (references != null) { allRigReferences.AddRange(references); } } // Create sync to stream job with all rig references m_SyncSceneToStreamJobData = RigUtils.CreateSyncSceneToStreamData(allRigReferences.ToArray()); if (m_SyncSceneToStreamJobData.IsValid()) { m_SyncSceneToStreamJob = RigUtils.syncSceneToStreamBinder.Create(animator, m_SyncSceneToStreamJobData); syncLayerOutput.SetSourcePlayable(RigUtils.syncSceneToStreamBinder.CreatePlayable(graph, m_SyncSceneToStreamJob)); } graph.Play(); return(true); }