コード例 #1
0
        private static List <string> getNodeStrings(ShaderLayer shaderLayer, NodeGenDelegate genDelegate)
        {
            List <string> nodeInputs = new List <string>();
            var           rootInputs = shaderLayer.getRoot().inputs;

            if ((rootInputs.Count == 0) || (rootInputs[0].inputNode == null))
            {
                return(nodeInputs);
            }

            List <BaseNode.NodeInput>  nodeList  = new List <BaseNode.NodeInput>();
            Queue <BaseNode.NodeInput> nodeStack = new Queue <BaseNode.NodeInput>();

            nodeStack.Enqueue(shaderLayer.getRoot().inputs[0]);
            while (nodeStack.Count > 0)
            {
                BaseNode.NodeInput node = nodeStack.Dequeue();

                if (!nodeList.Contains(node))
                {
                    nodeList.Add(node);

                    int numInputs = node.inputNode.inputs.Count;
                    for (int i = 0; i < numInputs; i++)
                    {
                        var nodeInput = node.inputNode.inputs[i];
                        if (nodeInput.inputNode != null)
                        {
                            nodeStack.Enqueue(nodeInput);
                        }
                    }

                    nodeInputs.Add(genDelegate(node));
                }
            }
            return(nodeInputs);
        }
コード例 #2
0
        private static string getCalls(ShaderLayer shaderLayer)
        {
            Dictionary <string, string> outputVariableNames = new Dictionary <string, string>();

            string nodeCalls = "";
            var    rootInput = shaderLayer.getRoot().inputs[0];

            if (rootInput.inputNode != null)
            {
                nodeCalls += GeneratorFactory.getShaderGenerator(rootInput.inputNode).getCallStr(rootInput, outputVariableNames);

                nodeCalls += "col = out" + rootInput.inputNode.GetType().Name + rootInput.inputNode.getNodeID() + "_" + rootInput.outputIndex + ";";
            }

            return(nodeCalls);
        }
コード例 #3
0
        void OnGUI()
        {
            if (EditorApplication.isPlaying)
            {
                return;
            }
            if (!layerObject)
            {
                return;
            }
            layerObject.getRoot();//trigger lazy creation of the root object
            drawState.layerObject = layerObject;

            switch (Event.current.type)
            {
            case EventType.KeyDown:
            {
                if (Event.current.keyCode == KeyCode.Delete)
                {
                    if ((null != SelectedNode) && !(SelectedNode is RootNode))
                    {
                        Undo.RecordObject(layerObject, "Delete Node");
                        {
                            layerObject.nodes.Remove(SelectedNode);

                            foreach (var node in layerObject.nodes)
                            {
                                for (int i = 0; i < node.inputs.Count; i++)
                                {
                                    var nodeInput = node.inputs[i];
                                    if (nodeInput.inputNode == SelectedNode)
                                    {
                                        node.inputs.RemoveAt(i);
                                        i--;
                                    }
                                }
                            }
                        }
                        Undo.FlushUndoRecordObjects();

                        SelectedNode = null;
                        Event.current.Use();
                    }
                }
                break;
            }

            case EventType.MouseDown:
            {
                if (Event.current.button == 2)        //Middle mouse button
                {
                    drawState.scrollStart  = Event.current.mousePosition;
                    drawState.scrolling    = true;
                    drawState.scrollOffset = Vector2.zero;
                    Event.current.Use();
                }
                break;
            }

            case EventType.MouseUp:
            {
                if (Event.current.button == 2)        //Middle mouse button
                {
                    drawState.scrolling    = false;
                    drawState.guiOffset   += drawState.scrollOffset;
                    drawState.scrollOffset = Vector2.zero;
                    Event.current.Use();
                }
                break;
            }

            case EventType.MouseDrag:
            {
                if (drawState.scrolling)
                {
                    drawState.scrollOffset = Event.current.mousePosition - drawState.scrollStart;
                }
                break;
            }

            case EventType.ContextClick:
            {
                drawState.menuPos = Event.current.mousePosition;
                GenericMenu menu = new GenericMenu();

                foreach (Type type in Assembly.GetAssembly(typeof(RecipeLayerBase)).GetTypes()
                         .Where(myType => myType.IsClass && !myType.IsAbstract && myType.IsSubclassOf(typeof(BaseNode))))
                {
                    if (type != typeof(RootNode))
                    {
                        menu.AddItem(new GUIContent(Utilities.MakeNiceName(type.Name)), false, NodeCreateCallback, type);
                    }
                }

                menu.ShowAsContext();
                Event.current.Use();
                break;
            }
            }

            if (null != SelectedNode)
            {
                if (!(SelectedNode is RootNode))
                {
                    SerializedObject nodeObject = new SerializedObject(SelectedNode);
                    var nameProp = nodeObject.FindProperty("nodeName");
                    nameProp.stringValue = DefaultNodeRenderer.DrawLabelEdit(SelectedNode, drawState, nameProp.stringValue);

                    nodeObject.ApplyModifiedProperties();
                }
            }

            {
                BeginWindows();

                if (Event.current.type == EventType.Layout)
                {
                    drawState.windowData.Clear();
                }
                int   id           = 0;
                Event currentEvent = Event.current;
                drawState.menuPos = currentEvent.mousePosition;

                foreach (var node in layerObject.nodes)
                {
                    BaseNodeRenderer.NodeDrawState.WindowData d = new BaseNodeRenderer.NodeDrawState.WindowData();
                    if (Event.current.type == EventType.Layout)
                    {
                        d.pos = node.nodePosition + drawState.guiOffset + drawState.scrollOffset;
                        drawState.windowData.Add(d);
                    }
                    else
                    {
                        d = drawState.windowData[id];
                    }

                    //update the window positions iff we are currently scrolling the view
                    if (drawState.scrolling && Event.current.type == EventType.MouseDrag)
                    {
                        d.pos = node.nodePosition + drawState.guiOffset + drawState.scrollOffset;
                        drawState.windowData[id] = d;
                    }

                    BaseNodeRenderer nodeRenderer = RendererFactory.getRenderer(node);

                    Rect             windowRect = new Rect(d.pos, nodeRenderer.getNodeSize(node).size);
                    SerializedObject nodeObject = new SerializedObject(node);
                    var posProp = nodeObject.FindProperty("nodePosition");

                    windowRect = GUI.Window(id, windowRect, DrawNodeWindow, "", GUIStyle.none);

                    posProp.vector2Value = windowRect.position - drawState.guiOffset - drawState.scrollOffset;

                    nodeObject.ApplyModifiedProperties();

                    id++;
                }

                EndWindows();//triggers the actual drawing of the windows, anything drawn after this will be drawn above all the windows
            }

            if (drawState.connectivityChange)
            {
                refreshShader = true;
                drawState.connectivityChange = false;
            }

            switch (Event.current.type)
            {
            case EventType.MouseUp:
            {
                drawState.drawCurve = false;
                break;
            }

            case EventType.Repaint:
            {
                foreach (var node in layerObject.nodes)
                {
                    BaseNodeRenderer nodeRenderer = RendererFactory.getRenderer(node);
                    var nodeSize = nodeRenderer.getNodeSize(node);

                    int i = 0;
                    foreach (var input in node.inputs)
                    {
                        if (null != input.inputNode)
                        {
                            var inputPos = node.nodePosition + new Vector2(0, (i * 16) + 35) + drawState.guiOffset + drawState.scrollOffset;
                            var endPos   = input.inputNode.nodePosition + new Vector2(nodeSize.width, 35 + (20 * input.outputIndex)) + drawState.guiOffset + drawState.scrollOffset;

                            DrawNodeCurve(inputPos, endPos, Color.cyan);
                        }
                        i++;
                    }
                }
                if (drawState.drawCurve)
                {
                    DrawNodeCurve(drawState.curveStart, Event.current.mousePosition, Color.red);
                }
                break;
            }
            }
        }