// ====================================================================== // 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]); }
// ---------------------------------------------------------------------- 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); }