protected override RigRemapData CreateGraph(Entity entity, ref Rig rig, ProcessDefaultAnimationGraph graphSystem, ref RigRemapSetup setup)
    {
        var set         = graphSystem.Set;
        var debugEntity = RigUtils.InstantiateDebugRigEntity(
            setup.SrcRig,
            EntityManager,
            new BoneRendererProperties {
            BoneShape = BoneRendererUtils.BoneShape.Line, Color = new float4(0f, 1f, 0f, 0.5f), Size = 1f
        }
            );

        PostUpdateCommands.AddComponent(debugEntity, new LocalToParent {
            Value = float4x4.identity
        });
        PostUpdateCommands.AddComponent(debugEntity, new Parent {
            Value = entity
        });

        var data = new RigRemapData();

        data.DeltaTimeNode   = set.Create <ConvertDeltaTimeToFloatNode>();
        data.ClipPlayerNode  = set.Create <ClipPlayerNode>();
        data.RemapperNode    = set.Create <RigRemapperNode>();
        data.EntityNode      = set.CreateComponentNode(entity);
        data.DebugEntityNode = set.CreateComponentNode(debugEntity);

        set.SetData(data.ClipPlayerNode, ClipPlayerNode.KernelPorts.Speed, 1.0f);

        // Connect kernel ports
        set.Connect(data.DeltaTimeNode, ConvertDeltaTimeToFloatNode.KernelPorts.Output, data.ClipPlayerNode, ClipPlayerNode.KernelPorts.DeltaTime);
        set.Connect(data.ClipPlayerNode, ClipPlayerNode.KernelPorts.Output, data.RemapperNode, RigRemapperNode.KernelPorts.Input);

        // Connect EntityNode
        set.Connect(data.EntityNode, data.DeltaTimeNode, ConvertDeltaTimeToFloatNode.KernelPorts.Input);
        set.Connect(data.RemapperNode, RigRemapperNode.KernelPorts.Output, data.EntityNode, NodeSet.ConnectionType.Feedback);

        // Connect DebugEntityNode
        set.Connect(data.ClipPlayerNode, ClipPlayerNode.KernelPorts.Output, data.DebugEntityNode);

        // Send messages
        set.SendMessage(data.ClipPlayerNode, ClipPlayerNode.SimulationPorts.Configuration, new ClipConfiguration {
            Mask = ClipConfigurationMask.LoopTime
        });
        set.SendMessage(data.ClipPlayerNode, ClipPlayerNode.SimulationPorts.Rig, new Rig {
            Value = setup.SrcRig
        });
        set.SendMessage(data.ClipPlayerNode, ClipPlayerNode.SimulationPorts.Clip, setup.SrcClip);
        set.SendMessage(data.RemapperNode, RigRemapperNode.SimulationPorts.SourceRig, new Rig {
            Value = setup.SrcRig
        });
        set.SendMessage(data.RemapperNode, RigRemapperNode.SimulationPorts.DestinationRig, rig);
        set.SendMessage(data.RemapperNode, RigRemapperNode.SimulationPorts.RemapTable, setup.RemapTable);

        return(data);
    }
Ejemplo n.º 2
0
    protected override RetargetData CreateGraph(Entity entity, ref Rig rig, PreAnimationGraphSystem graphSystem, ref RetargetSetup setup)
    {
        var set = graphSystem.Set;
        var debugEntity = RigUtils.InstantiateDebugRigEntity(
            setup.SrcRig,
            EntityManager,
            new BoneRendererProperties { BoneShape = BoneRendererUtils.BoneShape.Line, Color = new float4(0f, 1f, 0f, 0.5f), Size = 1f }
            );

        if (EntityManager.HasComponent<Translation>(entity))
        {
            PostUpdateCommands.AddComponent(
                debugEntity,
                EntityManager.GetComponentData<Translation>(entity)
                );
        }

        var data = new RetargetData();

        data.DeltaTimeNode   = set.Create<DeltaTimeNode>();
        data.ClipPlayerNode  = set.Create<ClipPlayerNode>();
        data.RemapperNode    = set.Create<RigRemapperNode>();
        data.EntityNode      = set.CreateComponentNode(entity);
        data.DebugEntityNode = set.CreateComponentNode(debugEntity);

        set.SetData(data.ClipPlayerNode, ClipPlayerNode.KernelPorts.Speed, 1.0f);

        // Connect kernel ports
        set.Connect(data.DeltaTimeNode, DeltaTimeNode.KernelPorts.DeltaTime, data.ClipPlayerNode, ClipPlayerNode.KernelPorts.DeltaTime);
        set.Connect(data.ClipPlayerNode, ClipPlayerNode.KernelPorts.Output, data.RemapperNode, RigRemapperNode.KernelPorts.Input);

        // Connect EntityNode
        set.Connect(data.RemapperNode, RigRemapperNode.KernelPorts.Output, data.EntityNode);

        // Connect DebugEntityNode
        set.Connect(data.ClipPlayerNode, ClipPlayerNode.KernelPorts.Output, data.DebugEntityNode);

        // Send messages
        set.SendMessage(data.ClipPlayerNode, ClipPlayerNode.SimulationPorts.Configuration, new ClipConfiguration { Mask = ClipConfigurationMask.LoopTime });
        set.SendMessage(data.ClipPlayerNode, ClipPlayerNode.SimulationPorts.Rig, new Rig { Value = setup.SrcRig });
        set.SendMessage(data.ClipPlayerNode, ClipPlayerNode.SimulationPorts.Clip, setup.SrcClip);
        set.SendMessage(data.RemapperNode, RigRemapperNode.SimulationPorts.SourceRig, new Rig { Value = setup.SrcRig });
        set.SendMessage(data.RemapperNode, RigRemapperNode.SimulationPorts.DestinationRig, rig);
        set.SendMessage(data.RemapperNode, RigRemapperNode.SimulationPorts.RemapTable, setup.RemapTable);

        PostUpdateCommands.AddComponent(entity, graphSystem.Tag);
        PostUpdateCommands.AddComponent(debugEntity, graphSystem.Tag);

        return data;
    }
Ejemplo n.º 3
0
    protected override RetargetData CreateGraph(Entity entity, NodeSet set, ref RetargetSetup setup)
    {
        var srcClip = ClipManager.Instance.GetClipFor(setup.SrcRig, setup.SrcClip);
        var data    = new RetargetData();

        data.DeltaTimeNode  = set.Create <DeltaTimeNode>();
        data.ClipPlayerNode = set.Create <ClipPlayerNode>();
        data.RemapperNode   = set.Create <RigRemapperNode>();

        set.SendMessage(data.ClipPlayerNode, (InputPortID)ClipPlayerNode.SimulationPorts.Speed, 1.0f);

        // Connect kernel ports
        set.Connect(data.DeltaTimeNode, (OutputPortID)DeltaTimeNode.KernelPorts.DeltaTime, data.ClipPlayerNode, (InputPortID)ClipPlayerNode.KernelPorts.DeltaTime);
        set.Connect(data.ClipPlayerNode, (OutputPortID)ClipPlayerNode.KernelPorts.Output, data.RemapperNode, (InputPortID)RigRemapperNode.KernelPorts.Input);

        // Send messages
        set.SendMessage(data.ClipPlayerNode, (InputPortID)ClipPlayerNode.SimulationPorts.Configuration, new ClipConfiguration {
            Mask = (int)ClipConfigurationMask.LoopTime
        });
        set.SendMessage(data.ClipPlayerNode, (InputPortID)ClipPlayerNode.SimulationPorts.ClipInstance, srcClip);
        set.SendMessage(data.RemapperNode, (InputPortID)RigRemapperNode.SimulationPorts.SourceRigDefinition, setup.SrcRig);
        set.SendMessage(data.RemapperNode, (InputPortID)RigRemapperNode.SimulationPorts.DestinationRigDefinition, setup.DstRig);
        set.SendMessage(data.RemapperNode, (InputPortID)RigRemapperNode.SimulationPorts.RemapTable, setup.RemapTable);

        data.Output.Buffer      = set.CreateGraphValue <Buffer <float> >(data.RemapperNode, (OutputPortID)RigRemapperNode.KernelPorts.Output);
        data.DebugOutput.Buffer = set.CreateGraphValue <Buffer <float> >(data.ClipPlayerNode, (OutputPortID)ClipPlayerNode.KernelPorts.Output);

        var debugEntity = RigUtils.InstantiateDebugRigEntity(
            setup.SrcRig,
            EntityManager,
            new BoneRendererProperties {
            BoneShape = BoneRendererUtils.BoneShape.Line, Color = new float4(0f, 1f, 0f, 0.5f), Size = 1f
        }
            );

        if (EntityManager.HasComponent <Translation>(entity))
        {
            PostUpdateCommands.AddComponent(
                debugEntity,
                EntityManager.GetComponentData <Translation>(entity)
                );
        }

        PostUpdateCommands.AddComponent(entity, data.Output);
        PostUpdateCommands.AddComponent(debugEntity, data.DebugOutput);

        return(data);
    }
Ejemplo n.º 4
0
    private void CreateDebugBoneRig(Entity entity, ref Rig rig)
    {
        var ecb = EsBufferSystem.CreateCommandBuffer();

        var debugEntityRig = RigUtils.InstantiateDebugRigEntity(rig.Value, EntityManager,
                                                                new BoneRendererProperties
        {
            BoneShape = BoneRendererUtils.BoneShape.Line, Color = new float4(0, 1, 0, 1), Size = 1
        });

        ecb.AddComponent(debugEntityRig, new LocalToParent {
            Value = float4x4.identity
        });
        ecb.AddComponent(debugEntityRig, new Parent {
            Value = entity
        });
    }
Ejemplo n.º 5
0
    protected override FKGraphData CreateGraph(Entity entity, ref Rig rig, PreAnimationGraphSystem graphSystem, ref FKGraphSetup setup)
    {
        var set = graphSystem.Set;

        var debugEntity = RigUtils.InstantiateDebugRigEntity(
            rig,
            EntityManager,
            new BoneRendererProperties {
            BoneShape = BoneRendererUtils.BoneShape.Line, Color = math.float4(1f, 0f, 0f, 1f), Size = 1f
        }
            );

        if (EntityManager.HasComponent <Translation>(entity))
        {
            float3 t = EntityManager.GetComponentData <Translation>(entity).Value;
            PostUpdateCommands.AddComponent(
                debugEntity,
                new Translation {
                Value = t - math.float3(0f, 0f, 0.5f)
            }
                );
        }

        var data = new FKGraphData();

        data.DeltaTimeNode   = set.Create <DeltaTimeNode>();
        data.ClipNode        = set.Create <ClipPlayerNode>();
        data.EntityNode      = set.CreateComponentNode(entity);
        data.DebugEntityNode = set.CreateComponentNode(debugEntity);

        set.Connect(data.DeltaTimeNode, DeltaTimeNode.KernelPorts.DeltaTime, data.ClipNode, ClipPlayerNode.KernelPorts.DeltaTime);
        set.Connect(data.ClipNode, ClipPlayerNode.KernelPorts.Output, data.EntityNode);
        set.Connect(data.ClipNode, ClipPlayerNode.KernelPorts.Output, data.DebugEntityNode);

        set.SetData(data.ClipNode, ClipPlayerNode.KernelPorts.Speed, 1.0f);
        set.SendMessage(data.ClipNode, ClipPlayerNode.SimulationPorts.Configuration, new ClipConfiguration {
            Mask = ClipConfigurationMask.LoopTime | ClipConfigurationMask.LoopValues
        });
        set.SendMessage(data.ClipNode, ClipPlayerNode.SimulationPorts.Rig, rig);
        set.SendMessage(data.ClipNode, ClipPlayerNode.SimulationPorts.Clip, setup.Clip);

        PostUpdateCommands.AddComponent(entity, graphSystem.Tag);

        return(data);
    }
Ejemplo n.º 6
0
        private static void TransferMotionToConstraint(RigBuilder rigBuilder, IEnumerable <Rig> rigs)
        {
            var constraints = new List <IRigConstraint>();

            foreach (var rig in rigs)
            {
                constraints.AddRange(RigUtils.GetConstraints(rig));
            }

            var clip = AnimationWindowUtils.activeAnimationClip;

            // Make sure we have a clip selected
            if (clip == null)
            {
                throw new InvalidOperationException(
                          "There is no clip to work on." +
                          " The animation window must be open with an active clip!");
            }

            AnimationClip editableClip = clip;

            if (!GetEditableClip(ref editableClip))
            {
                return;
            }

            AnimationClip defaultPoseClip = CreateDefaultPose(rigBuilder);

            Undo.RegisterCompleteObjectUndo(editableClip, kBakeToConstraintUndoLabel);

            var animator = rigBuilder.GetComponent <Animator>();

            if (editableClip != clip)
            {
                AddClipToAnimatorController(animator, editableClip);
            }

            var bindingsToRemove = new HashSet <EditorCurveBinding>();

            // Remove weight curve & force constraint to be active
            if (Preferences.forceConstraintWeightOnBake)
            {
                AnimationCurve oneWeightCurve = AnimationCurve.Constant(0f, editableClip.length, 1f);

                foreach (var rig in rigs)
                {
                    AnimationUtility.SetEditorCurve(editableClip, GetWeightCurveBinding(rigBuilder, rig), oneWeightCurve);
                }
            }

            foreach (IRigConstraint constraint in constraints)
            {
                var bakeParameters = FindBakeParameters(constraint);
                if (bakeParameters == null || !bakeParameters.canBakeToConstraint)
                {
                    continue;
                }

                // Flush out animation mode modifications
                AnimationMode.BeginSampling();
                AnimationMode.EndSampling();

                var bindings = bakeParameters.GetSourceCurveBindings(rigBuilder, constraint);
                BakeToConstraint(rigBuilder, constraint, editableClip, defaultPoseClip, bindings, Preferences.bakeToConstraintCurveFilterOptions);

                bindingsToRemove.UnionWith(bakeParameters.GetConstrainedCurveBindings(rigBuilder, constraint));
            }

            if (Preferences.bakeToConstraintAndRemoveCurves)
            {
                RemoveCurves(editableClip, bindingsToRemove);
            }
        }
Ejemplo n.º 7
0
            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);
            }
Ejemplo n.º 8
0
    protected override FeatherBlendData CreateGraph(Entity entity, ref Rig rig, PreAnimationGraphSystem graphSystem, ref FeatherBlendSetup setup)
    {
        var set = graphSystem.Set;

        var debugClip1Entity = RigUtils.InstantiateDebugRigEntity(
            rig,
            EntityManager,
            new BoneRendererProperties {
            BoneShape = BoneRendererUtils.BoneShape.Line, Color = new float4(1f, 0f, 0f, 1f), Size = 1f
        }
            );

        var debugClip2Entity = RigUtils.InstantiateDebugRigEntity(
            rig,
            EntityManager,
            new BoneRendererProperties {
            BoneShape = BoneRendererUtils.BoneShape.Line, Color = new float4(0f, 0f, 1f, 1f), Size = 1f
        }
            );

        if (EntityManager.HasComponent <Translation>(entity))
        {
            float3 t      = EntityManager.GetComponentData <Translation>(entity).Value;
            float3 offset = new float3(1.5f, 0f, 0f);

            PostUpdateCommands.AddComponent(
                debugClip1Entity,
                new Translation {
                Value = t - offset
            }
                );

            PostUpdateCommands.AddComponent(
                debugClip2Entity,
                new Translation {
                Value = t + offset
            }
                );
        }

        var data = new FeatherBlendData();

        // Create the nodes.
        data.DeltaTimeNode        = set.Create <DeltaTimeNode>();
        data.Clip1Node            = set.Create <ClipPlayerNode>();
        data.Clip2Node            = set.Create <ClipPlayerNode>();
        data.FeatherBlendNode     = set.Create <ChannelWeightMixerNode>();
        data.WeightBuilderNode    = set.Create <WeightBuilderNode>();
        data.EntityNode           = set.CreateComponentNode(entity);
        data.DebugClip1EntityNode = set.CreateComponentNode(debugClip1Entity);
        data.DebugClip2EntityNode = set.CreateComponentNode(debugClip2Entity);

        // Connect the nodes. The DeltaTimeNode output is used to evaluate the clips in the ClipNodes,
        // and the ClipNodes' outputs are blended in the FeatherBlendNode, each channel being weighted
        // depending on the value of the corresponding element in the weight buffer output by the WeightBuilderNode.
        set.Connect(data.DeltaTimeNode, DeltaTimeNode.KernelPorts.DeltaTime, data.Clip1Node, ClipPlayerNode.KernelPorts.DeltaTime);
        set.Connect(data.DeltaTimeNode, DeltaTimeNode.KernelPorts.DeltaTime, data.Clip2Node, ClipPlayerNode.KernelPorts.DeltaTime);
        set.Connect(data.Clip1Node, ClipPlayerNode.KernelPorts.Output, data.FeatherBlendNode, ChannelWeightMixerNode.KernelPorts.Input0);
        set.Connect(data.Clip2Node, ClipPlayerNode.KernelPorts.Output, data.FeatherBlendNode, ChannelWeightMixerNode.KernelPorts.Input1);
        set.Connect(data.WeightBuilderNode, WeightBuilderNode.KernelPorts.Output, data.FeatherBlendNode, ChannelWeightMixerNode.KernelPorts.WeightMasks);

        set.SetData(data.WeightBuilderNode, WeightBuilderNode.KernelPorts.DefaultWeight, setup.DefaultWeight);
        set.SetData(data.FeatherBlendNode, ChannelWeightMixerNode.KernelPorts.Weight, 1.0f);
        set.SetData(data.Clip1Node, ClipPlayerNode.KernelPorts.Speed, 1.0f);
        set.SetData(data.Clip2Node, ClipPlayerNode.KernelPorts.Speed, 1.0f);

        // Set the port arrays for the WightBuilderNode.
        var weightLength = setup.WeightTable.Value.Weights.Length;

        set.SetPortArraySize(data.WeightBuilderNode, WeightBuilderNode.KernelPorts.ChannelIndices, (ushort)weightLength);
        set.SetPortArraySize(data.WeightBuilderNode, WeightBuilderNode.KernelPorts.ChannelWeights, (ushort)weightLength);
        for (ushort i = 0; i < weightLength; ++i)
        {
            var w = setup.WeightTable.Value.Weights[i];
            set.SetData(data.WeightBuilderNode, WeightBuilderNode.KernelPorts.ChannelIndices, i, w.Index);
            set.SetData(data.WeightBuilderNode, WeightBuilderNode.KernelPorts.ChannelWeights, i, w.Weight);
        }

        // Connect RigEntity component data
        set.Connect(data.FeatherBlendNode, ChannelWeightMixerNode.KernelPorts.Output, data.EntityNode);

        // Connect Debug1Entity component data
        set.Connect(data.Clip1Node, ClipPlayerNode.KernelPorts.Output, data.DebugClip1EntityNode);

        // Connect Debug2Entity component data
        set.Connect(data.Clip2Node, ClipPlayerNode.KernelPorts.Output, data.DebugClip2EntityNode);

        // Send messages to setup constant data in the nodes.
        set.SendMessage(data.Clip1Node, ClipPlayerNode.SimulationPorts.Configuration, new ClipConfiguration {
            Mask = ClipConfigurationMask.LoopTime
        });
        set.SendMessage(data.Clip2Node, ClipPlayerNode.SimulationPorts.Configuration, new ClipConfiguration {
            Mask = ClipConfigurationMask.LoopTime
        });
        set.SendMessage(data.Clip1Node, ClipPlayerNode.SimulationPorts.Rig, rig);
        set.SendMessage(data.Clip1Node, ClipPlayerNode.SimulationPorts.Clip, setup.Clip1);
        set.SendMessage(data.Clip2Node, ClipPlayerNode.SimulationPorts.Rig, rig);
        set.SendMessage(data.Clip2Node, ClipPlayerNode.SimulationPorts.Clip, setup.Clip2);
        set.SendMessage(data.FeatherBlendNode, ChannelWeightMixerNode.SimulationPorts.Rig, rig);
        set.SendMessage(data.WeightBuilderNode, WeightBuilderNode.SimulationPorts.Rig, rig);

        PostUpdateCommands.AddComponent(entity, graphSystem.Tag);
        PostUpdateCommands.AddComponent(debugClip1Entity, graphSystem.Tag);
        PostUpdateCommands.AddComponent(debugClip2Entity, graphSystem.Tag);

        return(data);
    }