Exemple #1
0
            void CopyPasteNodes()
            {
                object result = VFXCopy.Copy(m_SourceControllers, m_Rect);

                VFXPaste.Paste(m_TargetController, m_Rect.center, result, null, null, m_TargetControllers);
                List <VFXParameterController> targetParameters = new List <VFXParameterController>();
            }
 public static object CopyBlocks(IEnumerable <VFXBlockController> blocks)
 {
     if (s_Instance == null)
     {
         s_Instance = new VFXCopy();
     }
     return(s_Instance.DoCopyBlocks(blocks));
 }
 public static object Copy(IEnumerable <Controller> elements, Rect bounds)
 {
     if (s_Instance == null)
     {
         s_Instance = new VFXCopy();
     }
     return(s_Instance.CreateCopy(elements, bounds));
 }
            public void ConvertToSubgraphBlock(VFXView sourceView, IEnumerable <Controller> controllers, Rect rect)
            {
                this.m_Rect = rect;
                Init(sourceView, controllers);
                CreateUniqueSubgraph("SubgraphBlock", VisualEffectSubgraphBlock.Extension, VisualEffectAssetEditorUtility.CreateNew <VisualEffectSubgraphBlock>);

                m_SourceControllers.RemoveAll(t => t is VFXContextController); // Don't copy contexts
                CopyPasteNodes();

                m_SourceBlockControllers = m_SourceControllers.OfType <VFXBlockController>().OrderBy(t => t.index).ToList();

                VFXContextController sourceContextController = m_SourceBlockControllers.First().contextController;

                object copyData = VFXCopy.CopyBlocks(m_SourceBlockControllers);

                var targetContext = m_TargetController.graph.children.OfType <VFXBlockSubgraphContext>().FirstOrDefault();

                if (targetContext == null)
                {
                    targetContext = ScriptableObject.CreateInstance <VFXBlockSubgraphContext>();
                    m_TargetController.graph.AddChild(targetContext);
                }
                m_TargetController.LightApplyChanges();
                targetContext.position = sourceContextController.position;
                targetContext.SetSettingValue("m_SuitableContexts", (VFXBlockSubgraphContext.ContextType)m_SourceBlockControllers.Select(t => t.model.compatibleContexts).Aggregate((t, s) => t & s));
                m_TargetBlocks = new List <VFXBlockController>();

                VFXPaste.PasteBlocks(m_TargetController, copyData, targetContext, 0, m_TargetBlocks);

                var otherSourceControllers = m_SourceControllers.OfType <VFXNodeController>().Where(t => !(t is VFXBlockController)).ToList();

                //Create lost links between nodes and blocks
                foreach (var edge in m_SourceController.dataEdges.Where(t => otherSourceControllers.Contains(t.output.sourceNode) && m_SourceBlockControllers.Contains(t.input.sourceNode)))
                {
                    var outputNode = m_TargetControllers[m_SourceControllers.IndexOf(edge.output.sourceNode)];
                    var output     = outputNode.outputPorts.First(t => t.path == edge.output.path);

                    var inputBlock = m_TargetBlocks[m_SourceBlockControllers.IndexOf(edge.input.sourceNode as VFXBlockController)];
                    var input      = inputBlock.inputPorts.First(t => t.path == edge.input.path);

                    m_TargetController.CreateLink(input, output);
                }

                var sourceBlock = ScriptableObject.CreateInstance <VFXSubgraphBlock>();

                m_SourceNode = sourceBlock;
                sourceContextController.model.AddChild(m_SourceNode, m_SourceBlockControllers.Select(t => t.index).Min());
                sourceContextController.ApplyChanges();
                m_SourceNodeController = sourceContextController.blockControllers.First(t => t.model == m_SourceNode);
                PostSetup();
                m_SourceNodeController.ApplyChanges();

                var targetContextController = m_TargetController.GetRootNodeController(targetContext, 0) as VFXContextController;

                m_SourceControllersWithBlocks = m_SourceControllers.Concat(m_SourceBlockControllers);
                TransferEdges();
                UninitSmart();
            }
Exemple #5
0
        public static string SerializeElements(IEnumerable <Controller> elements, Rect bounds)
        {
            if (s_Instance == null)
            {
                s_Instance = new VFXCopy();
            }
            var serializableGraph = s_Instance.CreateCopy(elements, bounds) as SerializableGraph;

            return(JsonUtility.ToJson(serializableGraph));
        }
Exemple #6
0
            void CopyPasteOperators(Dictionary <VFXNodeController, VFXNodeController> targetNodes)
            {
                m_SourceOperatorAndParameters = m_SourceControllers.OfType <VFXNodeController>().Where(t => !(t is VFXBlockController)).ToList();
                object result = VFXCopy.Copy(m_SourceOperatorAndParameters, m_Rect);

                m_TargetOperatorAndParameters = new List <VFXNodeController>();
                VFXPaste.Paste(m_TargetController, m_Rect.center, result, null, null, m_TargetOperatorAndParameters);

                foreach (var st in m_SourceOperatorAndParameters.Zip(m_TargetOperatorAndParameters, (s, t) => new { source = s, target = t }))
                {
                    targetNodes[st.source] = st.target;
                }
            }
        internal void BlocksDropped(int blockIndex, IEnumerable <VFXBlockController> draggedBlocks, bool copy)
        {
            //Sort draggedBlock in the order we want them to appear and not the selected order ( blocks in the same context should appear in the same order as they where relative to each other).
            draggedBlocks = draggedBlocks.OrderBy(t => t.index).GroupBy(t => t.contextController).SelectMany <IGrouping <VFXContextController, VFXBlockController>, VFXBlockController>(t => t.Select(u => u));

            if (copy)
            {
                var copiedBlocks = VFXCopy.CopyBlocks(draggedBlocks);
                VFXPaste.PasteBlocks(viewController, copiedBlocks, model, blockIndex);
            }
            else
            {
                foreach (VFXBlockController draggedBlock in draggedBlocks)
                {
                    this.ReorderBlock(blockIndex++, draggedBlock.model);
                }
            }
        }