// =================================================================== /// Returns the allowed types of variable the given port can support. /// /// @param port The port used to filter the types of variable. /// @return The filtered port specification. /// public static Enum GetAllowedPortSpecification(iCS_EditorObject port) { var producerPort = GetProducerPort(port); if (MustBeATypeVariable(producerPort)) { return(TypeVariables.PublicVariable); } if (MustBeAParameter(producerPort)) { return(ParameterVariable.Parameter); } if (producerPort.IsInDataOrControlPort) { var isFunctionDefinition = producerPort.ParentNode.IsFunctionDefinition; var runtimeType = producerPort.RuntimeType; if (iCS_Types.IsA <UnityEngine.Object>(runtimeType)) { if (runtimeType == typeof(GameObject) || runtimeType == typeof(Transform)) { if (isFunctionDefinition) { return(InFunctionDefinitionOwnerAndUnityObjectVariableType.PublicVariable); } return(InOwnerAndUnityObjectVariableType.PublicVariable); } else { if (isFunctionDefinition) { return(InFunctionDefinitionUnityObjectVariableType.PublicVariable); } if (GraphInfo.IsLocalType(producerPort)) { return(InOwnerAndUnityObjectVariableType.Owner); } return(InUnityObjectVariableType.PublicVariable); } } else { if (isFunctionDefinition) { return(InFunctionDefinitionVariableType.PublicVariable); } if (GraphInfo.IsLocalType(producerPort)) { return(InTypeVariableWithOwner.Owner); } return(InVariableType.PublicVariable); } } else if (producerPort.IsOutDataOrControlPort) { return(OutVariableType.PublicVariable); } return(TypeVariables.PublicVariable); }
// ====================================================================== /// Sets the default port specification for the given port. /// /// @param p The port on which to set the default port specification. /// public static void SetDefaultPortSpec(iCS_EditorObject p) { // -- Setup spec for control ports. -- var parentNode = p.ParentNode; var producerPort = GraphInfo.GetProducerPort(p); // -- Only valid for the producer port. -- if (producerPort != p) { return; } // -- Determine default port spec. -- if (parentNode.IsFunctionDefinition) { if (p.IsInDataOrControlPort) { GraphEditor.SetPortSpec(p, PortSpecification.Parameter); } } else if (parentNode.IsEventHandler) { if (p.IsFixDataPort) { GraphEditor.SetPortSpec(p, PortSpecification.Parameter); } else { GraphEditor.SetPortSpec(p, PortSpecification.PublicVariable); } } else if (parentNode.IsVariableDefinition) { if (p.IsOutDataOrControlPort) { GraphEditor.SetPortSpec(p, PortSpecification.PublicVariable); } else if (p.IsInDataOrControlPort) { GraphEditor.SetPortSpec(p, PortSpecification.Constant); } } else if (parentNode.IsConstructor) { if (p.IsInDataOrControlPort) { GraphEditor.SetPortSpec(p, PortSpecification.Constant); } else if (p.IsOutDataOrControlPort) { // -- Determine if this is a local variable of not. -- bool isLocal = false; parentNode.ForEachChildPort( cp => { if (cp.IsInDataOrControlPort) { if (cp.ProducerPort != null) { isLocal = true; } } } ); if (isLocal) { GraphEditor.SetPortSpec(p, PortSpecification.LocalVariable); } else { GraphEditor.SetPortSpec(p, PortSpecification.PublicVariable); } } } // TODO: Needs to be verified... else if (parentNode.IsKindOfFunction) { if (p.IsInDataOrControlPort) { var initialValue = p.Value; if (initialValue != null) { GraphEditor.SetPortSpec(p, PortSpecification.Constant); } else { var runtimeType = p.RuntimeType; if (p.IsTargetPort && (runtimeType == typeof(GameObject) || runtimeType == typeof(Transform) || GraphInfo.IsLocalType(p))) { GraphEditor.SetPortSpec(p, PortSpecification.Owner); p.Value = null; } else { GraphEditor.SetPortSpec(p, PortSpecification.PublicVariable); } } } else if (p.IsOutDataOrControlPort) { if (GraphInfo.MustBeATypeVariable(p)) { GraphEditor.SetPortSpec(p, PortSpecification.PrivateVariable); } else { GraphEditor.SetPortSpec(p, PortSpecification.LocalVariable); } } } else if (parentNode.IsInstanceNode) { if (p.IsInDataOrControlPort) { var runtimeType = p.RuntimeType; if (p.IsTargetPort && (runtimeType == typeof(GameObject) || runtimeType == typeof(Transform) || GraphInfo.IsLocalType(p))) { GraphEditor.SetPortSpec(p, PortSpecification.Owner); p.Value = null; } else { GraphEditor.SetPortSpec(p, PortSpecification.PublicVariable); } } } else if (parentNode.IsKindOfPackage) { if (p.IsInDataOrControlPort) { GraphEditor.SetPortSpec(p, PortSpecification.PublicVariable); } } else { GraphEditor.SetPortSpec(p, PortSpecification.LocalVariable); } }
// ---------------------------------------------------------------------- /// Performs a snaity check on the visual script object. /// /// @param serviceKey The service key to use when registering with the /// error controller. /// @return _true_ is return if object is sane. _false_ otherwise. /// public bool SanityCheck(string serviceKey) { var visualScript = IStorage.VisualScript; // Verify that the runtime portion still exists. if (IsKindOfFunction) { var runtimeType = RuntimeType; var memberInfo = runtimeType != null?LibraryController.LibraryDatabase.GetLibraryType(runtimeType) : null; if (memberInfo == null && !GraphInfo.IsLocalType(this)) { var message = "Unable to find the runtime code for " + FullName; ErrorController.AddError(serviceKey, message, visualScript, InstanceId); return(false); } } if (IsTargetPort) { if (ProducerPort == null || ProducerPort == this) { var parentNode = ParentNode; if (parentNode.IsKindOfFunction) { if (!IsOwner && !IsTypeVariable) { var message = "<color=red><b>Value</b></color> for <b>Target</b> port is not valid for node: <b>" + FullName + "</b>"; ErrorController.AddError(serviceKey, message, visualScript, InstanceId); return(false); } else { if (parentNode.IsFunction("get_transform", "GameObject", "UnityEngine")) { var message = "When <b>'Target'</b> is set to <b>'Owner'</b>, the generated code has no effect. The node can be removed safely: <b>" + ParentNode.FullName + "</b>"; ErrorController.AddWarning(serviceKey, message, visualScript, ParentNode.InstanceId); } } } } } if (IsEnablePort) { var producerPort = SegmentProducerPort; if (producerPort != this) { // -- Verify for unnecessary OR function -- var producerNode = producerPort.ParentNode; if (producerNode.IsFunction("Or", "iCS_Boolean", "")) { if (producerPort.SegmentEndConsumerPorts.Length <= 1) { var message = "Consider using additional 'Enable(s)' ports instead of an OR function. => " + producerNode.FullName; ErrorController.AddWarning(serviceKey, message, visualScript, producerNode.InstanceId); ErrorController.AddWarning(serviceKey, message, visualScript, producerNode.InstanceId); } } // -- Verify for unnecessary trigger->enble binding when // data flow already exist -- var parentNode = ParentNode; if (producerPort.IsTriggerPort && producerNode.IsKindOfFunction && parentNode.IsKindOfFunction) { bool doesDataFlowExist = false; parentNode.ForEachChildPort( p => { if (p.IsInDataPort) { var pp = p.SegmentProducerPort; if (pp.ParentNode == producerNode) { doesDataFlowExist = true; } } } ); if (doesDataFlowExist) { var message = "<b>Trigger</b> to <b>Enable</b> connection not needed since data flow already exist between nodes. Consider removing the control flow."; ErrorController.AddWarning(serviceKey, message, visualScript, InstanceId); ErrorController.AddWarning(serviceKey, message, visualScript, producerPort.InstanceId); } // -- Determine if self to target connection should be used for // sequencing operation on same object. var producerNodeTargetPort = producerNode.TargetPort; var parentNodeTargetPort = parentNode.TargetPort; if (producerNodeTargetPort != null && parentNodeTargetPort != null) { var targetProducerPort = parentNodeTargetPort.SegmentProducerPort; if (producerNodeTargetPort.SegmentProducerPort == targetProducerPort) { var targetProducerNode = targetProducerPort.ParentNode; var producerNodeSelfPort = producerNode.SelfPort; var message = "Consider connecting the <b>Self</b> port of '<b>" + producerNode.DisplayName + "</b>' to the <b>Target</b> port of '<b>" + parentNode.DisplayName + "</b> to sequence operations on <b>" + targetProducerNode.DisplayName + "</b>."; ErrorController.AddWarning(serviceKey, message, visualScript, parentNodeTargetPort.InstanceId); ErrorController.AddWarning(serviceKey, message, visualScript, producerNodeSelfPort.InstanceId); } } } } } return(true); }