Beispiel #1
0
        bool TryGetFlowNodeInput(PortAttribute portAttribute, MethodInfo method, out InputPortConfig inputPortConfig)
        {
            string portPrefix = null;

            object defaultVal = null;

            inputPortConfig = new InputPortConfig();

            if (method.GetParameters().Length > 0)
            {
                ParameterInfo parameter = method.GetParameters()[0];
                if (parameter.ParameterType.IsEnum)
                {
                    inputPortConfig.type = NodePortType.Int;

                    var values = Enum.GetValues(parameter.ParameterType);
                    if (values.Length <= 0)
                        return false;

                    defaultVal = values.GetValue(0);

                    inputPortConfig.uiConfig = "enum_int:";

                    for (int i = 0; i < values.Length; i++)
                    {
                        var value = values.GetValue(i);

                        if (i > 0 && i != inputPortConfig.uiConfig.Length)
                            inputPortConfig.uiConfig += ",";

                        inputPortConfig.uiConfig += Enum.GetName(parameter.ParameterType, value) + "=" + (int)value;
                    }
                }
                else
                    inputPortConfig.type = GetFlowNodePortType(parameter.ParameterType, out portPrefix, portAttribute);

                if (parameter.IsOptional && defaultVal == null)
                    defaultVal = parameter.DefaultValue;
                else if (defaultVal == null)
                {
                    switch (inputPortConfig.type)
                    {
                        case NodePortType.Bool:
                            defaultVal = false;
                            break;
                        case NodePortType.EntityId:
                            defaultVal = 0;
                            break;
                        case NodePortType.Float:
                            defaultVal = 0.0f;
                            break;
                        case NodePortType.Int:
                            defaultVal = 0;
                            break;
                        case NodePortType.String:
                            defaultVal = "";
                            break;
                        case NodePortType.Vec3:
                            defaultVal = Vec3.Zero;
                            break;
                    }
                }
            }
            else
                inputPortConfig.type = NodePortType.Void;

            string portName = (portAttribute.Name ?? method.Name);

            if (portPrefix != null)
                inputPortConfig.name = portPrefix + portName;
            else
                inputPortConfig.name = portName;

            inputPortConfig.defaultValue = defaultVal;
            inputPortConfig.description = portAttribute.Description;
            inputPortConfig.humanName = portAttribute.Name ?? method.Name;
            return true;
        }
Beispiel #2
0
        bool TryGetFlowNodeOutput(PortAttribute portAttribute, MemberInfo memberInfo, out OutputPortConfig outputPortConfig)
        {
            outputPortConfig = new OutputPortConfig();

            outputPortConfig.name = portAttribute.Name ?? memberInfo.Name;
            outputPortConfig.humanName = outputPortConfig.name;
            outputPortConfig.description = portAttribute.Description;

            Type type;
            if (memberInfo.MemberType == MemberTypes.Field)
                type = (memberInfo as FieldInfo).FieldType;
            else
                type = (memberInfo as PropertyInfo).PropertyType;

            if (type.Name.StartsWith("OutputPort"))
            {
                bool isGenericType = type.IsGenericType;
                Type genericType = isGenericType ? type.GetGenericArguments()[0] : typeof(void);

                string prefix;
                outputPortConfig.type = GetFlowNodePortType(genericType, out prefix, portAttribute);

                return true;
            }

            return false;
        }
Beispiel #3
0
        NodePortType GetFlowNodePortType(Type type, out string prefix, PortAttribute portAttribute)
        {
            prefix = null;

            if (type == typeof(void))
                return NodePortType.Void;
            if (type == typeof(int))
                return NodePortType.Int;
            if (type == typeof(float))
                return NodePortType.Float;
            if (type == typeof(string))
            {
                switch (portAttribute.StringPortType)
                {
                    case StringPortType.Sound:
                        prefix = "sound_";
                        break;
                    case StringPortType.DialogLine:
                        prefix = "dialogline_";
                        break;
                    case StringPortType.Texture:
                        prefix = "texture_";
                        break;
                    case StringPortType.Object:
                        prefix = "object_";
                        break;
                    case StringPortType.File:
                        prefix = "file_";
                        break;
                    case StringPortType.EquipmentPack:
                        prefix = "equip_";
                        break;
                    case StringPortType.ReverbPreset:
                        prefix = "reverbpreset_";
                        break;
                    case StringPortType.GameToken:
                        prefix = "gametoken_";
                        break;
                    case StringPortType.Material:
                        prefix = "mat_";
                        break;
                    case StringPortType.Sequence:
                        prefix = "seq_";
                        break;
                    case StringPortType.Mission:
                        prefix = "mission_";
                        break;
                    case StringPortType.Animation:
                        prefix = "anim_";
                        break;
                    case StringPortType.AnimationState:
                        prefix = "animstate_";
                        break;
                    case StringPortType.AnimationStateEx:
                        prefix = "animstateEx_";
                        break;
                    case StringPortType.Bone:
                        prefix = "bone_";
                        break;
                    case StringPortType.Attachment:
                        prefix = "attachment_";
                        break;
                    case StringPortType.Dialog:
                        prefix = "dialog_";
                        break;
                    case StringPortType.MaterialParamSlot:
                        prefix = "matparamslot_";
                        break;
                    case StringPortType.MaterialParamName:
                        prefix = "matparamname_";
                        break;
                    case StringPortType.MaterialParamCharacterAttachment:
                        prefix = "matparamcharatt_";
                        break;
                }

                return NodePortType.String;
            }
            if (type == typeof(Vec3))
                return NodePortType.Vec3;
            if (type == typeof(Color))
            {
                prefix = "color_";
                return NodePortType.Vec3; // implicit operator takes care of conversion
            }
            if (type == typeof(bool))
                return NodePortType.Bool;
            if (type == typeof(EntityId))
                return NodePortType.EntityId;
            if (type == typeof(object))
                return NodePortType.Any;

            throw new ArgumentException("Invalid flownode port type specified!");
        }