Exemple #1
0
        /// <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));
        }
Exemple #2
0
        /// <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);
        }
Exemple #5
0
        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);
        }
Exemple #7
0
        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);
        }