예제 #1
0
        // ======================================================================
        // Common Creation
        // ----------------------------------------------------------------------
        public iCS_EditorObject CreatePort(string name, int parentId, Type valueType, VSObjectType portType, int index = -1)
        {
            int id     = GetNextAvailableId();
            var parent = EditorObjects[parentId];

            if (index == -1)
            {
                if (portType == VSObjectType.TriggerPort)
                {
                    index = (int)iCS_PortIndex.Trigger;
                }
                if (portType == VSObjectType.EnablePort)
                {
                    index = GetNextAvailableEnablePortIndex(parent);
                }
                else
                {
                    index = GetNextDynamicOrProposedPortIndex(parent);
                }
            }
            iCS_EditorObject port = iCS_EditorObject.CreateInstance(id, name, valueType, parentId, portType, this);

            port.PortIndex = index;
            if (parent.IsPort)
            {
                //            port.LocalOffset= parent.LocalOffset;
                port.CollisionOffset = parent.CollisionOffset;
            }
            else
            {
                var globalPos = parent.GlobalPosition;
                //          port.GlobalPosition= globalPos;
                port.CollisionOffsetFromGlobalPosition = globalPos;
            }
            // Set initial port edge.
            if (port.IsEnablePort)
            {
                port.Edge = iCS_EdgeEnum.Top;
            }
            else if (port.IsTriggerPort)
            {
                port.Edge = iCS_EdgeEnum.Bottom;
            }
            else if (port.IsInputPort)
            {
                port.Edge = iCS_EdgeEnum.Left;
            }
            else if (port.IsDataPort)
            {
                port.Edge = iCS_EdgeEnum.Right;
            }
            else
            {
                port.UpdatePortEdge();
            }
            port.CleanupPortEdgePosition();
            return(EditorObjects[id]);
        }
예제 #2
0
        // ----------------------------------------------------------------------
        public static iCS_EditorObject CreateTransition(iCS_EditorObject fromStatePort, iCS_EditorObject toState, Vector2 toStatePortPos)
        {
#if SHOW_DEBUG
            Debug.Log("iCanScript: Create Transition Package");
#endif
            if (fromStatePort == null || toState == null)
            {
                return(null);
            }
            if (!IsCreationAllowed())
            {
                return(null);
            }
            var iStorage = toState.IStorage;
            OpenTransaction(iStorage);
            iCS_EditorObject transitionPackage = null;
            try {
                // Create toStatePort
                iCS_EditorObject toStatePort = iStorage.CreatePort("", toState.InstanceId, typeof(void), VSObjectType.InStatePort);
                // Update port positions
                toStatePort.SetInitialPosition(toStatePortPos);
                toStatePort.UpdatePortEdge();
                fromStatePort.UpdatePortEdge();
                // Temporally connect state ports together.
                iStorage.SetSource(toStatePort, fromStatePort);
                // Create transition package
                transitionPackage = iStorage.CreateTransition(fromStatePort, toStatePort);
                // Try to position the transition in the middle
                var fromStatePortPos = fromStatePort.GlobalPosition;
                var globalPos        = 0.5f * (fromStatePortPos + toStatePortPos);
                transitionPackage.SetInitialPosition(globalPos);
                transitionPackage.Iconize();
                // Attempt to proper edge for transition ports.
                var outTransitionPort = toStatePort.ProducerPort;
                var inTransitionPort  = iStorage.GetInTransitionPort(transitionPackage);
                var diff = toStatePortPos - fromStatePortPos;
                if (Mathf.Abs(diff.x) > Mathf.Abs(diff.y))
                {
                    if (Vector2.Dot(diff, Vector2.right) > 0)
                    {
                        inTransitionPort.Edge  = NodeEdge.Left;
                        toStatePort.Edge       = NodeEdge.Left;
                        outTransitionPort.Edge = NodeEdge.Right;
                        fromStatePort.Edge     = NodeEdge.Right;
                    }
                    else
                    {
                        inTransitionPort.Edge  = NodeEdge.Right;
                        toStatePort.Edge       = NodeEdge.Right;
                        outTransitionPort.Edge = NodeEdge.Left;
                        fromStatePort.Edge     = NodeEdge.Left;
                    }
                }
                else
                {
                    if (Vector2.Dot(diff, Vector2.up) > 0)
                    {
                        inTransitionPort.Edge  = NodeEdge.Top;
                        toStatePort.Edge       = NodeEdge.Top;
                        outTransitionPort.Edge = NodeEdge.Bottom;
                        fromStatePort.Edge     = NodeEdge.Bottom;
                    }
                    else
                    {
                        inTransitionPort.Edge  = NodeEdge.Bottom;
                        toStatePort.Edge       = NodeEdge.Bottom;
                        outTransitionPort.Edge = NodeEdge.Top;
                        fromStatePort.Edge     = NodeEdge.Top;
                    }
                }
                inTransitionPort.PortPositionRatio  = 0.5f;
                outTransitionPort.PortPositionRatio = 0.5f;
                // Layout the graph
                iStorage.ForcedRelayoutOfTree();
                iStorage.ReduceCollisionOffset();
            }
            catch (System.Exception) {
                CancelTransaction(iStorage);
                return(null);
            }
            if (transitionPackage == null)
            {
                CancelTransaction(iStorage);
                return(null);
            }
            CloseTransaction(iStorage, "Create Transition");
            SystemEvents.AnnounceVisualScriptElementAdded(transitionPackage);
            return(transitionPackage);
        }