Ejemplo n.º 1
0
 void GetChangesFromChangelist(IGraphChangeList graphChanges, IReadOnlyCollection <IGraphElementModel> existingElementModels)
 {
     foreach (IGraphElementModel model in graphChanges.ChangedElements)
     {
         if (model is IEdgeModel edgeModel)
         {
             if (graphChanges.DeleteEdgeModels.Contains(edgeModel))
             {
                 m_EdgesToDelete.Add(edgeModel);
             }
             else
             {
                 m_EdgesToRebuild.Add(edgeModel);
             }
         }
         else if (model is INodeModel nodeModel)
         {
             m_NodesToRebuild.Add(nodeModel);
             if (nodeModel is IVariableModel variableModel && variableModel.DeclarationModel == null)
             {
                 // In particular, ThisNodeModel sometimes requires an update of the blackboard
                 BlackboardChanged = true;
             }
         }
         else if (model is IVariableDeclarationModel decl)
         {
             if (decl.Owner is IFunctionModel functionModel)
             {
                 m_NodesToRebuild.Add(functionModel);
                 var refFuncCalls = existingElementModels.OfType <FunctionRefCallNodeModel>().Where(f => functionModel == (IFunctionModel)f.Function);
                 m_NodesToRebuild.AddRange(refFuncCalls);
             }
             else if (decl.Owner is IGraphModel)
             {
                 BlackboardChanged = true;
             }
         }
         else if (model is IStickyNoteModel)
         {
             m_OtherElementsToRebuild.Add(model);
         }
         else if (model is IPlacematModel)
         {
             m_OtherElementsToRebuild.Add(model);
         }
         else
         {
             Debug.LogWarning($"Unexpected model to rebuild: {model.GetType().Name}, make sure it is correctly supported by UI Partial Rebuild.");
             m_OtherElementsToRebuild.Add(model);
         }
     }
 }
        static State RenameComponentQuery(State previousState, RenameComponentQueryAction action)
        {
            var    vsGraphModel = (VSGraphModel)previousState.CurrentGraphModel;
            string uniqueName   = vsGraphModel.GetUniqueName(action.Name);

            action.ComponentQueryDeclarationModel.SetName(uniqueName);

            IGraphChangeList graphChangeList = previousState.CurrentGraphModel.LastChanges;

            graphChangeList.ChangedElements.AddRange(vsGraphModel.FindUsages(action.ComponentQueryDeclarationModel));
            previousState.MarkForUpdate(UpdateFlags.RequestRebuild);
            return(previousState);
        }
        static State RenameElement(State previousState, RenameElementAction action)
        {
            var graphModel = (VSGraphModel)previousState.CurrentGraphModel;

            if (string.IsNullOrWhiteSpace(action.Name))
            {
                return(previousState);
            }

            Undo.RegisterCompleteObjectUndo((Object)graphModel.AssetModel, "Rename");
            action.RenamableModel.Rename(action.Name);
            EditorUtility.SetDirty((Object)graphModel.AssetModel);

            IGraphChangeList graphChangeList = previousState.CurrentGraphModel.LastChanges;

            VSGraphModel vsGraphModel = (VSGraphModel)previousState.CurrentGraphModel;

            if (action.RenamableModel is VariableDeclarationModel variableDeclarationModel)
            {
                graphChangeList.BlackBoardChanged = true;

                // update usage names
                graphChangeList.ChangedElements.AddRange(vsGraphModel.FindUsages <VariableNodeModel>(variableDeclarationModel));
            }
            else if (action.RenamableModel is IVariableModel variableModel)
            {
                graphChangeList.BlackBoardChanged = true;

                variableDeclarationModel = variableModel.DeclarationModel as VariableDeclarationModel;
                graphChangeList.ChangedElements.Add(variableDeclarationModel);

                graphChangeList.ChangedElements.AddRange(vsGraphModel.FindUsages <VariableNodeModel>(variableDeclarationModel));
            }
            else if (action.RenamableModel is IEdgePortalModel edgePortalModel)
            {
                variableDeclarationModel = edgePortalModel.DeclarationModel as VariableDeclarationModel;
                graphChangeList.ChangedElements.Add(variableDeclarationModel);
                graphChangeList.ChangedElements.AddRange(vsGraphModel.FindUsages <EdgePortalModel>(variableDeclarationModel));
            }
            else
            {
                graphChangeList.ChangedElements.Add(action.RenamableModel as IGraphElementModel);
            }


            previousState.MarkForUpdate(UpdateFlags.RequestCompilation | UpdateFlags.RequestRebuild);

            return(previousState);
        }
Ejemplo n.º 4
0
        public void ComputeChanges(IGraphChangeList graphChangeList, Dictionary <IGraphElementModel, GraphElement> existingElements)
        {
            BlackboardChanged = graphChangeList.BlackBoardChanged;

            GetChangesFromChangelist(graphChangeList, existingElements.Keys);

            GatherDeletedElements(existingElements, graphChangeList);

            UpdateEdgesAndNodesForStacks(existingElements);

            UpdateEdgesToRebuildFromNodesToRebuild();

            RemoveDeletedModelsFromRebuildLists(existingElements);

            MarkEdgesToBeRebuiltToDelete(existingElements);
        }
Ejemplo n.º 5
0
        static State UpdateFunctionReturnType(State previousState, UpdateFunctionReturnTypeAction action)
        {
            Undo.RegisterCompleteObjectUndo((Object)previousState.AssetModel, "Update Function Return Type");
            ((FunctionModel)action.FunctionModel).ReturnType = action.NewType;
            IGraphChangeList graphChangeList = previousState.CurrentGraphModel.LastChanges;

            graphChangeList.ChangedElements.Add(action.FunctionModel);
            graphChangeList.ChangedElements.AddRange(((FunctionModel)action.FunctionModel).FindFunctionUsages(previousState.CurrentGraphModel));

            // Not pretty but efficient. Needed to add/remove/update the return value port of the node according to the function type
            foreach (var returnNodeModel in ((VSGraphModel)action.FunctionModel.GraphModel).GetAllNodes().OfType <ReturnNodeModel>())
            {
                returnNodeModel.DefineNode();
            }

            return(previousState);
        }
        static State RenameElement(State previousState, RenameElementAction action)
        {
            if (string.IsNullOrWhiteSpace(action.Name))
            {
                return(previousState);
            }

            Undo.RegisterCompleteObjectUndo((Object)action.RenamableModel.AssetModel, "Renaming graph element");
            action.RenamableModel.Rename(action.Name);

            IGraphChangeList graphChangeList = previousState.CurrentGraphModel.LastChanges;

            VSGraphModel vsGraphModel = (VSGraphModel)previousState.CurrentGraphModel;

            if (action.RenamableModel is IFunctionModel functionDefinitionModel)
            {
                RenameFunctionUsages((FunctionModel)functionDefinitionModel);
            }
            else if (action.RenamableModel is VariableDeclarationModel variableDeclarationModel)
            {
                graphChangeList.BlackBoardChanged = true;

                if (variableDeclarationModel.Owner is IFunctionModel functionModel)
                {
                    RenameFunctionUsages((FunctionModel)functionModel);
                }

                // update usage names
                graphChangeList.ChangedElements.AddRange(vsGraphModel.FindUsages(variableDeclarationModel));
            }
            else if (action.RenamableModel is IVariableModel variableModel)
            {
                graphChangeList.BlackBoardChanged = true;

                variableDeclarationModel = variableModel.DeclarationModel as VariableDeclarationModel;
                graphChangeList.ChangedElements.Add(variableDeclarationModel);

                graphChangeList.ChangedElements.AddRange(vsGraphModel.FindUsages(variableDeclarationModel));
                if (variableDeclarationModel.FunctionModel != null)
                {
                    graphChangeList.ChangedElements.Add(variableDeclarationModel.FunctionModel);
                }
            }
            else
            {
                graphChangeList.ChangedElements.Add(action.RenamableModel);
            }


            previousState.MarkForUpdate(UpdateFlags.RequestCompilation | UpdateFlags.RequestRebuild);

            return(previousState);

            void RenameFunctionUsages(FunctionModel functionModel)
            {
                var toUpdate = functionModel.FindFunctionUsages(previousState.CurrentGraphModel);

                graphChangeList.ChangedElements.AddRange(toUpdate);
                graphChangeList.ChangedElements.Add(functionModel);
            }
        }
Ejemplo n.º 7
0
        void GatherDeletedElements(Dictionary <IGraphElementModel, GraphElement> existingElements, IGraphChangeList graphChangeList)
        {
            foreach (IGraphElementModel elementModel in existingElements.Keys)
            {
                if (elementModel is INodeModel node)
                {
                    if (node.NodeAssetReference == null)
                    {
                        var graphElement = existingElements[node];
                        if (graphElement is Experimental.GraphView.Node)
                        {
                            m_EdgesToDelete.AddRange(node.GetConnectedEdges());
                        }
                        m_GraphElementsToDelete.Add(graphElement);
                    }
                }
                else if (elementModel is VariableDeclarationModel decl)
                {
                    if (decl == null)
                    {
                        var graphElement = existingElements[elementModel];
                        if (decl.Owner is IFunctionModel functionModel)
                        {
                            var refFuncCalls = existingElements.Keys.OfType <FunctionRefCallNodeModel>().Where(f => functionModel == (IFunctionModel)f.Function);
                            m_NodesToRebuild.AddRange(refFuncCalls);
                        }

                        m_GraphElementsToDelete.Add(graphElement);
                    }
                }
                else if (elementModel is IStickyNoteModel)
                {
                    var graphElement = existingElements[elementModel];
                    m_GraphElementsToDelete.Add(graphElement);
                }
            }

            foreach (IEdgeModel edge in graphChangeList.DeleteEdgeModels)
            {
                if (existingElements.TryGetValue(edge, out GraphElement edgeGraphElement))
                {
                    m_GraphElementsToDelete.Add(edgeGraphElement);
                }
            }
        }
        internal void UpdateTopology()
        {
            Profiler.BeginSample("UpdateTopology");
            Stopwatch topologyStopwatch = new Stopwatch();

            topologyStopwatch.Start();

            State       state             = m_Store.GetState();
            IGraphModel currentGraphModel = state.CurrentGraphModel;

            if (currentGraphModel == null)
            {
                return;
            }

            IGraphChangeList graphChangeList      = currentGraphModel.LastChanges;
            string           dispatchedActionName = state.LastDispatchedActionName; // save this now, because some actions trigger a UIRefresh, hiding the original action (TODO)

            m_GraphView.DisablePersistedSelectionRestore();

            bool fullUIRebuildOnChange = state.Preferences.GetBool(VSPreferences.BoolPref.FullUIRebuildOnChange);
            bool forceRebuildUI        = fullUIRebuildOnChange || currentGraphModel != m_LastGraphModel || graphChangeList == null || !graphChangeList.HasAnyTopologyChange() || ModelsToNodeMapping == null;

            if (forceRebuildUI) // no specific graph changes passed, assume rebuild everything
            {
                RebuildAll(state);
            }
            else
            {
                PartialRebuild(state);
            }

            state.EditorDataModel.ClearElementsToSelectUponCreation();

            MapModelsToNodes();

            if (state.Preferences.GetBool(VSPreferences.BoolPref.ShowUnusedNodes))
            {
                m_GraphView.PositionDependenciesManagers.UpdateNodeState(ModelsToNodeMapping);
            }

            m_GraphView.HighlightGraphElements();

            m_LastGraphModel = currentGraphModel;

            m_GraphView.EnablePersistedSelectionRestore();

            if (ElementToRename != null)
            {
                m_GraphView.ClearSelection();
                m_GraphView.AddToSelection((GraphElement)ElementToRename);
                ElementToRename.Rename(forceRename: true);
                ElementToRename = null;
                state.EditorDataModel.ElementModelToRename = null;
            }

            m_GraphView.MarkDirtyRepaint();

            topologyStopwatch.Stop();
            Profiler.EndSample();

            if (state.Preferences.GetBool(VSPreferences.BoolPref.WarnOnUIFullRebuild) && state.lastActionUIRebuildType == State.UIRebuildType.Full)
            {
                Debug.LogWarning($"Rebuilding the whole UI ({dispatchedActionName})");
            }
            if (state.Preferences.GetBool(VSPreferences.BoolPref.LogUIBuildTime))
            {
                Debug.Log($"UI Update ({dispatchedActionName}) took {topologyStopwatch.ElapsedMilliseconds} ms");
            }
        }
Ejemplo n.º 9
0
        void GatherDeletedElements(Dictionary <IGraphElementModel, GraphElement> existingElements, IGraphChangeList graphChangeList)
        {
            foreach (IGraphElementModel elementModel in existingElements.Keys)
            {
                if (elementModel is INodeModel node)
                {
                    if (node.Destroyed)
                    {
                        var graphElement = existingElements[node];
                        if (graphElement is Unity.Modifier.GraphElements.CollapsiblePortNode)
                        {
                            m_EdgesToDelete.AddRange(node.GetConnectedEdges());
                        }
                        m_GraphElementsToDelete.Add(graphElement);
                    }
                }
                else if (elementModel is IStickyNoteModel stickyNote)
                {
                    if (stickyNote.Destroyed)
                    {
                        var graphElement = existingElements[elementModel];
                        m_GraphElementsToDelete.Add(graphElement);
                    }
                }
                else if (elementModel is IPlacematModel placemat)
                {
                    if (placemat.Destroyed)
                    {
                        var graphElement = existingElements[elementModel];
                        m_GraphElementsToDelete.Add(graphElement);
                    }
                }
            }

            foreach (IEdgeModel edge in graphChangeList.DeleteEdgeModels)
            {
                if (existingElements.TryGetValue(edge, out GraphElement edgeGraphElement))
                {
                    m_GraphElementsToDelete.Add(edgeGraphElement);
                }
            }
        }