public void Init(InitContext ctx)
        {
            m_TransitionType = TransitionType.Crossfade;

            m_DeltaTimeNode  = ctx.Set.Create <KernelPassThroughNodeFloat>();
            m_TimeNode       = ctx.Set.Create <KernelPassThroughNodeFloat>();
            m_FalseInputNode = ctx.Set.Create <KernelPassThroughNodeBufferFloat>();
            m_TrueInputNode  = ctx.Set.Create <KernelPassThroughNodeBufferFloat>();
            m_OutputNode     = ctx.Set.Create <KernelPassThroughNodeBufferFloat>();

            var thisHandle = ctx.Set.CastHandle <TransitionByBoolNode>(ctx.Handle);

            ctx.Set.Connect(thisHandle, SimulationPorts.m_OutStreamSize, m_OutputNode, KernelPassThroughNodeBufferFloat.SimulationPorts.BufferSize);
            ctx.Set.Connect(thisHandle, SimulationPorts.m_OutStreamSize, m_FalseInputNode, KernelPassThroughNodeBufferFloat.SimulationPorts.BufferSize);
            ctx.Set.Connect(thisHandle, SimulationPorts.m_OutStreamSize, m_TrueInputNode, KernelPassThroughNodeBufferFloat.SimulationPorts.BufferSize);

            BuildNodes(thisHandle, ctx.Set);

            ctx.ForwardInput(KernelPorts.DeltaTime, m_DeltaTimeNode, KernelPassThroughNodeFloat.KernelPorts.Input);
            ctx.ForwardInput(KernelPorts.Time, m_TimeNode, KernelPassThroughNodeFloat.KernelPorts.Input);
            ctx.ForwardInput(KernelPorts.FalseInput, m_FalseInputNode, KernelPassThroughNodeBufferFloat.KernelPorts.Input);
            ctx.ForwardInput(KernelPorts.TrueInput, m_TrueInputNode, KernelPassThroughNodeBufferFloat.KernelPorts.Input);
            ctx.ForwardOutput(KernelPorts.Output, m_OutputNode, KernelPassThroughNodeBufferFloat.KernelPorts.Output);
        }
                public void Init(InitContext ctx)
                {
                    /*
                     * During initialization for this node we create a child node and remember it.
                     */
                    Child = ctx.Set.Create <ChildNode>();

                    /*
                     * Here's the interesting part where we essentially tell the node set that our ports should map directly
                     * to the child node's ports. This is essentially how we can emplace a subgraph partially inside another
                     * node. This is sometimes also referred to as "internal edges".
                     *
                     * When someone sends a message to the SecretlyForwardedInput, it will go directly to the child's
                     * Input message port.
                     * Similarly, if someone is connected to SecretlyForwardedOutput, they're actually connected directly
                     * to the child output, and will receive above mentioned message.
                     *
                     * You can of course forward data ports, and port arrays as well. In the latter case, the entire port
                     * array will be forwarded.
                     */
                    ctx.ForwardInput(SimulationPorts.SecretlyForwardedInput, Child, ChildNode.SimulationPorts.Input);
                    ctx.ForwardOutput(SimulationPorts.SecretlyForwardedOutput, Child, ChildNode.SimulationPorts.Output);
                }
        public void Init(InitContext ctx)
        {
            var thisHandle = ctx.Set.CastHandle <DirectionMixerNode>(ctx.Handle);

            m_TimeNode      = ctx.Set.Create <KernelPassThroughNodeFloat>();
            m_DeltaTimeNode = ctx.Set.Create <KernelPassThroughNodeFloat>();
            m_WeightNode    = ctx.Set.Create <KernelPassThroughNodeFloat>();

            m_Clip0 = ctx.Set.Create <UberClipNode>();
            m_Clip1 = ctx.Set.Create <UberClipNode>();
            m_Clip2 = ctx.Set.Create <UberClipNode>();
            m_Clip3 = ctx.Set.Create <UberClipNode>();
            m_Clip4 = ctx.Set.Create <UberClipNode>();

            m_NMixerNode        = ctx.Set.Create <NMixerNode>();
            m_ComputeWeightNode = ctx.Set.Create <DirectionMixerComputeWeightNode>();

            ctx.Set.Connect(m_TimeNode, KernelPassThroughNodeFloat.KernelPorts.Output, m_Clip0, UberClipNode.KernelPorts.Time);
            ctx.Set.Connect(m_TimeNode, KernelPassThroughNodeFloat.KernelPorts.Output, m_Clip1, UberClipNode.KernelPorts.Time);
            ctx.Set.Connect(m_TimeNode, KernelPassThroughNodeFloat.KernelPorts.Output, m_Clip2, UberClipNode.KernelPorts.Time);
            ctx.Set.Connect(m_TimeNode, KernelPassThroughNodeFloat.KernelPorts.Output, m_Clip3, UberClipNode.KernelPorts.Time);
            ctx.Set.Connect(m_TimeNode, KernelPassThroughNodeFloat.KernelPorts.Output, m_Clip4, UberClipNode.KernelPorts.Time);

            ctx.Set.Connect(m_DeltaTimeNode, KernelPassThroughNodeFloat.KernelPorts.Output, m_Clip0, UberClipNode.KernelPorts.DeltaTime);
            ctx.Set.Connect(m_DeltaTimeNode, KernelPassThroughNodeFloat.KernelPorts.Output, m_Clip1, UberClipNode.KernelPorts.DeltaTime);
            ctx.Set.Connect(m_DeltaTimeNode, KernelPassThroughNodeFloat.KernelPorts.Output, m_Clip2, UberClipNode.KernelPorts.DeltaTime);
            ctx.Set.Connect(m_DeltaTimeNode, KernelPassThroughNodeFloat.KernelPorts.Output, m_Clip3, UberClipNode.KernelPorts.DeltaTime);
            ctx.Set.Connect(m_DeltaTimeNode, KernelPassThroughNodeFloat.KernelPorts.Output, m_Clip4, UberClipNode.KernelPorts.DeltaTime);

            ctx.Set.SetPortArraySize(m_NMixerNode, NMixerNode.KernelPorts.Inputs, k_ClipCount);
            ctx.Set.Connect(m_Clip0, UberClipNode.KernelPorts.Output, m_NMixerNode, NMixerNode.KernelPorts.Inputs, 0);
            ctx.Set.Connect(m_Clip1, UberClipNode.KernelPorts.Output, m_NMixerNode, NMixerNode.KernelPorts.Inputs, 1);
            ctx.Set.Connect(m_Clip2, UberClipNode.KernelPorts.Output, m_NMixerNode, NMixerNode.KernelPorts.Inputs, 2);
            ctx.Set.Connect(m_Clip3, UberClipNode.KernelPorts.Output, m_NMixerNode, NMixerNode.KernelPorts.Inputs, 3);
            ctx.Set.Connect(m_Clip4, UberClipNode.KernelPorts.Output, m_NMixerNode, NMixerNode.KernelPorts.Inputs, 4);

            ctx.Set.Connect(m_WeightNode, KernelPassThroughNodeFloat.KernelPorts.Output, m_ComputeWeightNode, DirectionMixerComputeWeightNode.KernelPorts.Input);
            ctx.Set.SetPortArraySize(m_NMixerNode, NMixerNode.KernelPorts.Weights, k_ClipCount);
            ctx.Set.Connect(m_ComputeWeightNode, DirectionMixerComputeWeightNode.KernelPorts.OutWeight0, m_NMixerNode, NMixerNode.KernelPorts.Weights, 0);
            ctx.Set.Connect(m_ComputeWeightNode, DirectionMixerComputeWeightNode.KernelPorts.OutWeight1, m_NMixerNode, NMixerNode.KernelPorts.Weights, 1);
            ctx.Set.Connect(m_ComputeWeightNode, DirectionMixerComputeWeightNode.KernelPorts.OutWeight2, m_NMixerNode, NMixerNode.KernelPorts.Weights, 2);
            ctx.Set.Connect(m_ComputeWeightNode, DirectionMixerComputeWeightNode.KernelPorts.OutWeight3, m_NMixerNode, NMixerNode.KernelPorts.Weights, 3);
            ctx.Set.Connect(m_ComputeWeightNode, DirectionMixerComputeWeightNode.KernelPorts.OutWeight4, m_NMixerNode, NMixerNode.KernelPorts.Weights, 4);

            // Setup internal message connections
            ctx.Set.Connect(thisHandle, SimulationPorts.m_OutRig, m_Clip0, UberClipNode.SimulationPorts.Rig);
            ctx.Set.Connect(thisHandle, SimulationPorts.m_OutRig, m_Clip1, UberClipNode.SimulationPorts.Rig);
            ctx.Set.Connect(thisHandle, SimulationPorts.m_OutRig, m_Clip2, UberClipNode.SimulationPorts.Rig);
            ctx.Set.Connect(thisHandle, SimulationPorts.m_OutRig, m_Clip3, UberClipNode.SimulationPorts.Rig);
            ctx.Set.Connect(thisHandle, SimulationPorts.m_OutRig, m_Clip4, UberClipNode.SimulationPorts.Rig);
            ctx.Set.Connect(thisHandle, SimulationPorts.m_OutRig, m_NMixerNode, NMixerNode.SimulationPorts.Rig);

            ctx.Set.SetPortArraySize(thisHandle, SimulationPorts.m_OutClips, k_ClipCount);
            ctx.Set.Connect(thisHandle, SimulationPorts.m_OutClips, 0, m_Clip0, UberClipNode.SimulationPorts.Clip);
            ctx.Set.Connect(thisHandle, SimulationPorts.m_OutClips, 1, m_Clip1, UberClipNode.SimulationPorts.Clip);
            ctx.Set.Connect(thisHandle, SimulationPorts.m_OutClips, 2, m_Clip2, UberClipNode.SimulationPorts.Clip);
            ctx.Set.Connect(thisHandle, SimulationPorts.m_OutClips, 3, m_Clip3, UberClipNode.SimulationPorts.Clip);
            ctx.Set.Connect(thisHandle, SimulationPorts.m_OutClips, 4, m_Clip4, UberClipNode.SimulationPorts.Clip);

            ctx.Set.Connect(thisHandle, SimulationPorts.m_OutConfiguration, m_Clip0, UberClipNode.SimulationPorts.Configuration);
            ctx.Set.Connect(thisHandle, SimulationPorts.m_OutConfiguration, m_Clip1, UberClipNode.SimulationPorts.Configuration);
            ctx.Set.Connect(thisHandle, SimulationPorts.m_OutConfiguration, m_Clip2, UberClipNode.SimulationPorts.Configuration);
            ctx.Set.Connect(thisHandle, SimulationPorts.m_OutConfiguration, m_Clip3, UberClipNode.SimulationPorts.Configuration);
            ctx.Set.Connect(thisHandle, SimulationPorts.m_OutConfiguration, m_Clip4, UberClipNode.SimulationPorts.Configuration);

            // Setup port forwarding
            ctx.ForwardInput(KernelPorts.Time, m_TimeNode, KernelPassThroughNodeFloat.KernelPorts.Input);
            ctx.ForwardInput(KernelPorts.DeltaTime, m_DeltaTimeNode, KernelPassThroughNodeFloat.KernelPorts.Input);
            ctx.ForwardInput(KernelPorts.Weight, m_WeightNode, KernelPassThroughNodeFloat.KernelPorts.Input);
            ctx.ForwardOutput(KernelPorts.Output, m_NMixerNode, NMixerNode.KernelPorts.Output);
        }