public virtual int AddSlot(ConcreteSlotValueType concreteValueType)
        {
            var    index = this.GetInputSlots <ISlot>().Count() + 1;
            string name  = NodeUtils.GetDuplicateSafeNameForSlot(this, concreteValueType.ToString());

            AddSlot(MaterialSlot.CreateMaterialSlot(concreteValueType.ToSlotValueType(), index, name, NodeUtils.GetHLSLSafeName(name), SlotType.Input, Vector4.zero));
            return(index);
        }
Beispiel #2
0
        public virtual void UpdateSlots()
        {
            var validNames = new List <int>();

            if (asset == null)
            {
                return;
            }

            var props = asset.inputs;

            foreach (var prop in props)
            {
                SlotValueType valueType      = prop.concreteShaderValueType.ToSlotValueType();
                var           propertyString = prop.guid.ToString();
                var           propertyIndex  = m_PropertyGuids.IndexOf(propertyString);
                if (propertyIndex < 0)
                {
                    propertyIndex = m_PropertyGuids.Count;
                    m_PropertyGuids.Add(propertyString);
                    m_PropertyIds.Add(prop.guid.GetHashCode());
                }
                var          id   = m_PropertyIds[propertyIndex];
                MaterialSlot slot = MaterialSlot.CreateMaterialSlot(valueType, id, prop.displayName, prop.referenceName, SlotType.Input, Vector4.zero, ShaderStageCapability.All);

                // Copy defaults
                switch (prop.concreteShaderValueType)
                {
                case ConcreteSlotValueType.SamplerState:
                {
                    var tSlot = slot as SamplerStateMaterialSlot;
                    var tProp = prop as SamplerStateShaderProperty;
                    if (tSlot != null && tProp != null)
                    {
                        tSlot.defaultSamplerState = tProp.value;
                    }
                }
                break;

                case ConcreteSlotValueType.Matrix4:
                {
                    var tSlot = slot as Matrix4MaterialSlot;
                    var tProp = prop as Matrix4ShaderProperty;
                    if (tSlot != null && tProp != null)
                    {
                        tSlot.value = tProp.value;
                    }
                }
                break;

                case ConcreteSlotValueType.Matrix3:
                {
                    var tSlot = slot as Matrix3MaterialSlot;
                    var tProp = prop as Matrix3ShaderProperty;
                    if (tSlot != null && tProp != null)
                    {
                        tSlot.value = tProp.value;
                    }
                }
                break;

                case ConcreteSlotValueType.Matrix2:
                {
                    var tSlot = slot as Matrix2MaterialSlot;
                    var tProp = prop as Matrix2ShaderProperty;
                    if (tSlot != null && tProp != null)
                    {
                        tSlot.value = tProp.value;
                    }
                }
                break;

                case ConcreteSlotValueType.Texture2D:
                {
                    var tSlot = slot as Texture2DInputMaterialSlot;
                    var tProp = prop as Texture2DShaderProperty;
                    if (tSlot != null && tProp != null)
                    {
                        tSlot.texture = tProp.value.texture;
                    }
                }
                break;

                case ConcreteSlotValueType.Texture2DArray:
                {
                    var tSlot = slot as Texture2DArrayInputMaterialSlot;
                    var tProp = prop as Texture2DArrayShaderProperty;
                    if (tSlot != null && tProp != null)
                    {
                        tSlot.textureArray = tProp.value.textureArray;
                    }
                }
                break;

                case ConcreteSlotValueType.Texture3D:
                {
                    var tSlot = slot as Texture3DInputMaterialSlot;
                    var tProp = prop as Texture3DShaderProperty;
                    if (tSlot != null && tProp != null)
                    {
                        tSlot.texture = tProp.value.texture;
                    }
                }
                break;

                case ConcreteSlotValueType.Cubemap:
                {
                    var tSlot = slot as CubemapInputMaterialSlot;
                    var tProp = prop as CubemapShaderProperty;
                    if (tSlot != null && tProp != null)
                    {
                        tSlot.cubemap = tProp.value.cubemap;
                    }
                }
                break;

                case ConcreteSlotValueType.Gradient:
                {
                    var tSlot = slot as GradientInputMaterialSlot;
                    var tProp = prop as GradientShaderProperty;
                    if (tSlot != null && tProp != null)
                    {
                        tSlot.value = tProp.value;
                    }
                }
                break;

                case ConcreteSlotValueType.Vector4:
                {
                    var tSlot       = slot as Vector4MaterialSlot;
                    var vector4Prop = prop as Vector4ShaderProperty;
                    var colorProp   = prop as ColorShaderProperty;
                    if (tSlot != null && vector4Prop != null)
                    {
                        tSlot.value = vector4Prop.value;
                    }
                    else if (tSlot != null && colorProp != null)
                    {
                        tSlot.value = colorProp.value;
                    }
                }
                break;

                case ConcreteSlotValueType.Vector3:
                {
                    var tSlot = slot as Vector3MaterialSlot;
                    var tProp = prop as Vector3ShaderProperty;
                    if (tSlot != null && tProp != null)
                    {
                        tSlot.value = tProp.value;
                    }
                }
                break;

                case ConcreteSlotValueType.Vector2:
                {
                    var tSlot = slot as Vector2MaterialSlot;
                    var tProp = prop as Vector2ShaderProperty;
                    if (tSlot != null && tProp != null)
                    {
                        tSlot.value = tProp.value;
                    }
                }
                break;

                case ConcreteSlotValueType.Vector1:
                {
                    var tSlot = slot as Vector1MaterialSlot;
                    var tProp = prop as Vector1ShaderProperty;
                    if (tSlot != null && tProp != null)
                    {
                        tSlot.value = tProp.value;
                    }
                }
                break;

                case ConcreteSlotValueType.Boolean:
                {
                    var tSlot = slot as BooleanMaterialSlot;
                    var tProp = prop as BooleanShaderProperty;
                    if (tSlot != null && tProp != null)
                    {
                        tSlot.value = tProp.value;
                    }
                }
                break;
                }

                AddSlot(slot);
                validNames.Add(id);
            }

            var outputStage = asset.effectiveShaderStage;

            foreach (var slot in asset.outputs)
            {
                var newSlot = MaterialSlot.CreateMaterialSlot(slot.valueType, slot.id, slot.RawDisplayName(),
                                                              slot.shaderOutputName, SlotType.Output, Vector4.zero, outputStage, slot.hidden);
                AddSlot(newSlot);
                validNames.Add(slot.id);
            }

            RemoveSlotsNameNotMatching(validNames, true);

            // sort slot order to match subgraph property order
            SetSlotOrder(validNames);
        }
Beispiel #3
0
        public virtual void UpdateSlots()
        {
            var validNames = new List <int>();

            if (referencedGraph == null)
            {
                RemoveSlotsNameNotMatching(validNames);
                return;
            }

            var props = referencedGraph.properties;

            foreach (var prop in props)
            {
                var           propType = prop.propertyType;
                SlotValueType slotType;

                switch (propType)
                {
                case PropertyType.Color:
                    slotType = SlotValueType.Vector4;
                    break;

                case PropertyType.Texture:
                    slotType = SlotValueType.Texture2D;
                    break;

                case PropertyType.Cubemap:
                    slotType = SlotValueType.Cubemap;
                    break;

                case PropertyType.Gradient:
                    slotType = SlotValueType.Gradient;
                    break;

                case PropertyType.Vector1:
                    slotType = SlotValueType.Vector1;
                    break;

                case PropertyType.Vector2:
                    slotType = SlotValueType.Vector2;
                    break;

                case PropertyType.Vector3:
                    slotType = SlotValueType.Vector3;
                    break;

                case PropertyType.Vector4:
                    slotType = SlotValueType.Vector4;
                    break;

                case PropertyType.Matrix2:
                    slotType = SlotValueType.Matrix2;
                    break;

                case PropertyType.Matrix3:
                    slotType = SlotValueType.Matrix3;
                    break;

                case PropertyType.Matrix4:
                    slotType = SlotValueType.Matrix4;
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }

                var          id   = prop.guid.GetHashCode();
                MaterialSlot slot = MaterialSlot.CreateMaterialSlot(slotType, id, prop.displayName, prop.referenceName, SlotType.Input, prop.defaultValue);
                // copy default for texture for niceness
                if (slotType == SlotValueType.Texture2D && propType == PropertyType.Texture)
                {
                    var tSlot = slot as Texture2DInputMaterialSlot;
                    var tProp = prop as TextureShaderProperty;
                    if (tSlot != null && tProp != null)
                    {
                        tSlot.texture = tProp.value.texture;
                    }
                }
                // copy default for cubemap for niceness
                else if (slotType == SlotValueType.Cubemap && propType == PropertyType.Cubemap)
                {
                    var tSlot = slot as CubemapInputMaterialSlot;
                    var tProp = prop as CubemapShaderProperty;
                    if (tSlot != null && tProp != null)
                    {
                        tSlot.cubemap = tProp.value.cubemap;
                    }
                }
                AddSlot(slot);
                validNames.Add(id);
            }

            var subGraphOutputNode = outputNode;

            if (outputNode != null)
            {
                foreach (var slot in NodeExtensions.GetInputSlots <MaterialSlot>(subGraphOutputNode))
                {
                    AddSlot(MaterialSlot.CreateMaterialSlot(slot.valueType, slot.id, slot.RawDisplayName(), slot.shaderOutputName, SlotType.Output, Vector4.zero));
                    validNames.Add(slot.id);
                }
            }

            RemoveSlotsNameNotMatching(validNames);
        }
Beispiel #4
0
        public sealed override void UpdateNodeAfterDeserialization()
        {
            var method = GetFunctionToConvert();

            if (method == null)
            {
                throw new ArgumentException("Mapped method is null on node" + this);
            }

            if (method.ReturnType != typeof(string))
            {
                throw new ArgumentException("Mapped function should return string");
            }

            // validate no duplicates
            var slotAtributes = method.GetParameters().Select(GetSlotAttribute).ToList();

            if (slotAtributes.Any(x => x == null))
            {
                throw new ArgumentException("Missing SlotAttribute on " + method.Name);
            }

            if (slotAtributes.GroupBy(x => x.slotId).Any(x => x.Count() > 1))
            {
                throw new ArgumentException("Duplicate SlotAttribute on " + method.Name);
            }

            List <MaterialSlot> slots = new List <MaterialSlot>();

            foreach (var par in method.GetParameters())
            {
                var attribute = GetSlotAttribute(par);
                var name      = GraphUtil.ConvertCamelCase(par.Name, true);

                MaterialSlot s;
                if (attribute.binding == Binding.None && !par.IsOut && par.ParameterType == typeof(Color))
                {
                    s = new ColorRGBAMaterialSlot(attribute.slotId, name, par.Name, SlotType.Input, attribute.defaultValue ?? Vector4.zero, stageCapability: attribute.stageCapability, hidden: attribute.hidden);
                }
                else if (attribute.binding == Binding.None && !par.IsOut && par.ParameterType == typeof(ColorRGBA))
                {
                    s = new ColorRGBAMaterialSlot(attribute.slotId, name, par.Name, SlotType.Input, attribute.defaultValue ?? Vector4.zero, stageCapability: attribute.stageCapability, hidden: attribute.hidden);
                }
                else if (attribute.binding == Binding.None && !par.IsOut && par.ParameterType == typeof(ColorRGB))
                {
                    s = new ColorRGBMaterialSlot(attribute.slotId, name, par.Name, SlotType.Input, attribute.defaultValue ?? Vector4.zero, ColorMode.Default, stageCapability: attribute.stageCapability, hidden: attribute.hidden);
                }
                else if (attribute.binding == Binding.None || par.IsOut)
                {
                    s = MaterialSlot.CreateMaterialSlot(
                        ConvertTypeToSlotValueType(par),
                        attribute.slotId,
                        name,
                        par.Name,
                        par.IsOut ? SlotType.Output : SlotType.Input,
                        attribute.defaultValue ?? Vector4.zero,
                        shaderStageCapability: attribute.stageCapability,
                        hidden: attribute.hidden);
                }
                else
                {
                    s = CreateBoundSlot(attribute.binding, attribute.slotId, name, par.Name, attribute.stageCapability, attribute.hidden);
                }
                slots.Add(s);

                m_Slots.Add(attribute);
            }
            foreach (var slot in slots)
            {
                AddSlot(slot);
            }
            RemoveSlotsNameNotMatching(slots.Select(x => x.id));
        }
        public virtual void UpdateSlots()
        {
            var validNames = new List <int>();

            if (subGraphData == null)
            {
                return;
            }

            var props = subGraphData.inputs;

            foreach (var prop in props)
            {
                var           propType = prop.propertyType;
                SlotValueType slotType;

                switch (propType)
                {
                case PropertyType.Color:
                    slotType = SlotValueType.Vector4;
                    break;

                case PropertyType.Texture2D:
                    slotType = SlotValueType.Texture2D;
                    break;

                case PropertyType.Texture2DArray:
                    slotType = SlotValueType.Texture2DArray;
                    break;

                case PropertyType.Texture3D:
                    slotType = SlotValueType.Texture3D;
                    break;

                case PropertyType.Cubemap:
                    slotType = SlotValueType.Cubemap;
                    break;

                case PropertyType.Gradient:
                    slotType = SlotValueType.Gradient;
                    break;

                case PropertyType.Vector1:
                    slotType = SlotValueType.Vector1;
                    break;

                case PropertyType.Vector2:
                    slotType = SlotValueType.Vector2;
                    break;

                case PropertyType.Vector3:
                    slotType = SlotValueType.Vector3;
                    break;

                case PropertyType.Vector4:
                    slotType = SlotValueType.Vector4;
                    break;

                case PropertyType.Boolean:
                    slotType = SlotValueType.Boolean;
                    break;

                case PropertyType.Matrix2:
                    slotType = SlotValueType.Matrix2;
                    break;

                case PropertyType.Matrix3:
                    slotType = SlotValueType.Matrix3;
                    break;

                case PropertyType.Matrix4:
                    slotType = SlotValueType.Matrix4;
                    break;

                case PropertyType.SamplerState:
                    slotType = SlotValueType.SamplerState;
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }

                var propertyString = prop.guid.ToString();
                var propertyIndex  = m_PropertyGuids.IndexOf(propertyString);
                if (propertyIndex < 0)
                {
                    propertyIndex = m_PropertyGuids.Count;
                    m_PropertyGuids.Add(propertyString);
                    m_PropertyIds.Add(prop.guid.GetHashCode());
                }
                var          id   = m_PropertyIds[propertyIndex];
                MaterialSlot slot = MaterialSlot.CreateMaterialSlot(slotType, id, prop.displayName, prop.referenceName, SlotType.Input, prop.defaultValue, ShaderStageCapability.All);

                // copy default for texture for niceness
                if (slotType == SlotValueType.Texture2D && propType == PropertyType.Texture2D)
                {
                    var tSlot = slot as Texture2DInputMaterialSlot;
                    var tProp = prop as TextureShaderProperty;
                    if (tSlot != null && tProp != null)
                    {
                        tSlot.texture = tProp.value.texture;
                    }
                }
                // copy default for texture array for niceness
                else if (slotType == SlotValueType.Texture2DArray && propType == PropertyType.Texture2DArray)
                {
                    var tSlot = slot as Texture2DArrayInputMaterialSlot;
                    var tProp = prop as Texture2DArrayShaderProperty;
                    if (tSlot != null && tProp != null)
                    {
                        tSlot.textureArray = tProp.value.textureArray;
                    }
                }
                // copy default for texture 3d for niceness
                else if (slotType == SlotValueType.Texture3D && propType == PropertyType.Texture3D)
                {
                    var tSlot = slot as Texture3DInputMaterialSlot;
                    var tProp = prop as Texture3DShaderProperty;
                    if (tSlot != null && tProp != null)
                    {
                        tSlot.texture = tProp.value.texture;
                    }
                }
                // copy default for cubemap for niceness
                else if (slotType == SlotValueType.Cubemap && propType == PropertyType.Cubemap)
                {
                    var tSlot = slot as CubemapInputMaterialSlot;
                    var tProp = prop as CubemapShaderProperty;
                    if (tSlot != null && tProp != null)
                    {
                        tSlot.cubemap = tProp.value.cubemap;
                    }
                }
                // copy default for gradient for niceness
                else if (slotType == SlotValueType.Gradient && propType == PropertyType.Gradient)
                {
                    var tSlot = slot as GradientInputMaterialSlot;
                    var tProp = prop as GradientShaderProperty;
                    if (tSlot != null && tProp != null)
                    {
                        tSlot.value = tProp.value;
                    }
                }
                AddSlot(slot);
                validNames.Add(id);
            }

            var outputStage = subGraphData.effectiveShaderStage;

            foreach (var slot in subGraphData.outputs)
            {
                AddSlot(MaterialSlot.CreateMaterialSlot(slot.valueType, slot.id, slot.RawDisplayName(),
                                                        slot.shaderOutputName, SlotType.Output, Vector4.zero, outputStage));
                validNames.Add(slot.id);
            }

            RemoveSlotsNameNotMatching(validNames, true);
        }
Beispiel #6
0
        public virtual void UpdateSlots()
        {
            var validNames = new List <int>();

            if (asset == null)
            {
                return;
            }

            var props = asset.inputs;
            var toFix = new HashSet <(SlotReference from, SlotReference to)>();

            foreach (var prop in props)
            {
                SlotValueType valueType      = prop.concreteShaderValueType.ToSlotValueType();
                var           propertyString = prop.guid.ToString();
                var           propertyIndex  = m_PropertyGuids.IndexOf(propertyString);
                if (propertyIndex < 0)
                {
                    propertyIndex = m_PropertyGuids.Count;
                    m_PropertyGuids.Add(propertyString);
                    m_PropertyIds.Add(prop.guid.GetHashCode());
                }
                var id = m_PropertyIds[propertyIndex];

                //for whatever reason, it seems like shader property ids changed between 21.2a17 and 21.2b1
                //tried tracking it down, couldnt find any reason for it, so we gotta fix it in post (after we deserialize)
                List <MaterialSlot> inputs = new List <MaterialSlot>();
                MaterialSlot        found  = null;
                GetInputSlots(inputs);
                foreach (var input in inputs)
                {
                    if (input.shaderOutputName == prop.referenceName && input.id != id)
                    {
                        found = input;
                        break;
                    }
                }

                MaterialSlot slot = MaterialSlot.CreateMaterialSlot(valueType, id, prop.displayName, prop.referenceName, SlotType.Input, Vector4.zero, ShaderStageCapability.All);

                // Copy defaults
                switch (prop.concreteShaderValueType)
                {
                case ConcreteSlotValueType.SamplerState:
                {
                    var tSlot = slot as SamplerStateMaterialSlot;
                    var tProp = prop as SamplerStateShaderProperty;
                    if (tSlot != null && tProp != null)
                    {
                        tSlot.defaultSamplerState = tProp.value;
                    }
                }
                break;

                case ConcreteSlotValueType.Matrix4:
                {
                    var tSlot = slot as Matrix4MaterialSlot;
                    var tProp = prop as Matrix4ShaderProperty;
                    if (tSlot != null && tProp != null)
                    {
                        tSlot.value = tProp.value;
                    }
                }
                break;

                case ConcreteSlotValueType.Matrix3:
                {
                    var tSlot = slot as Matrix3MaterialSlot;
                    var tProp = prop as Matrix3ShaderProperty;
                    if (tSlot != null && tProp != null)
                    {
                        tSlot.value = tProp.value;
                    }
                }
                break;

                case ConcreteSlotValueType.Matrix2:
                {
                    var tSlot = slot as Matrix2MaterialSlot;
                    var tProp = prop as Matrix2ShaderProperty;
                    if (tSlot != null && tProp != null)
                    {
                        tSlot.value = tProp.value;
                    }
                }
                break;

                case ConcreteSlotValueType.Texture2D:
                {
                    var tSlot = slot as Texture2DInputMaterialSlot;
                    var tProp = prop as Texture2DShaderProperty;
                    if (tSlot != null && tProp != null)
                    {
                        tSlot.texture = tProp.value.texture;
                    }
                }
                break;

                case ConcreteSlotValueType.Texture2DArray:
                {
                    var tSlot = slot as Texture2DArrayInputMaterialSlot;
                    var tProp = prop as Texture2DArrayShaderProperty;
                    if (tSlot != null && tProp != null)
                    {
                        tSlot.textureArray = tProp.value.textureArray;
                    }
                }
                break;

                case ConcreteSlotValueType.Texture3D:
                {
                    var tSlot = slot as Texture3DInputMaterialSlot;
                    var tProp = prop as Texture3DShaderProperty;
                    if (tSlot != null && tProp != null)
                    {
                        tSlot.texture = tProp.value.texture;
                    }
                }
                break;

                case ConcreteSlotValueType.Cubemap:
                {
                    var tSlot = slot as CubemapInputMaterialSlot;
                    var tProp = prop as CubemapShaderProperty;
                    if (tSlot != null && tProp != null)
                    {
                        tSlot.cubemap = tProp.value.cubemap;
                    }
                }
                break;

                case ConcreteSlotValueType.Gradient:
                {
                    var tSlot = slot as GradientInputMaterialSlot;
                    var tProp = prop as GradientShaderProperty;
                    if (tSlot != null && tProp != null)
                    {
                        tSlot.value = tProp.value;
                    }
                }
                break;

                case ConcreteSlotValueType.Vector4:
                {
                    var tSlot       = slot as Vector4MaterialSlot;
                    var vector4Prop = prop as Vector4ShaderProperty;
                    var colorProp   = prop as ColorShaderProperty;
                    if (tSlot != null && vector4Prop != null)
                    {
                        tSlot.value = vector4Prop.value;
                    }
                    else if (tSlot != null && colorProp != null)
                    {
                        tSlot.value = colorProp.value;
                    }
                }
                break;

                case ConcreteSlotValueType.Vector3:
                {
                    var tSlot = slot as Vector3MaterialSlot;
                    var tProp = prop as Vector3ShaderProperty;
                    if (tSlot != null && tProp != null)
                    {
                        tSlot.value = tProp.value;
                    }
                }
                break;

                case ConcreteSlotValueType.Vector2:
                {
                    var tSlot = slot as Vector2MaterialSlot;
                    var tProp = prop as Vector2ShaderProperty;
                    if (tSlot != null && tProp != null)
                    {
                        tSlot.value = tProp.value;
                    }
                }
                break;

                case ConcreteSlotValueType.Vector1:
                {
                    var tSlot = slot as Vector1MaterialSlot;
                    var tProp = prop as Vector1ShaderProperty;
                    if (tSlot != null && tProp != null)
                    {
                        tSlot.value = tProp.value;
                    }
                }
                break;

                case ConcreteSlotValueType.Boolean:
                {
                    var tSlot = slot as BooleanMaterialSlot;
                    var tProp = prop as BooleanShaderProperty;
                    if (tSlot != null && tProp != null)
                    {
                        tSlot.value = tProp.value;
                    }
                }
                break;
                }

                AddSlot(slot);
                validNames.Add(id);

                if (found != null)
                {
                    List <IEdge> edges = new List <IEdge>();
                    owner.GetEdges(found.slotReference, edges);
                    foreach (var edge in edges)
                    {
                        toFix.Add((edge.outputSlot, slot.slotReference));
                    }
                }
            }

            foreach (var slot in asset.outputs)
            {
                var outputStage = GetSlotCapability(slot);
                var newSlot     = MaterialSlot.CreateMaterialSlot(slot.valueType, slot.id, slot.RawDisplayName(),
                                                                  slot.shaderOutputName, SlotType.Output, Vector4.zero, outputStage, slot.hidden);
                AddSlot(newSlot);
                validNames.Add(slot.id);
            }

            RemoveSlotsNameNotMatching(validNames, true);

            // sort slot order to match subgraph property order
            SetSlotOrder(validNames);

            foreach (var(from, to) in toFix)
            {
                //for whatever reason, in this particular error fix, GraphView will incorrectly either add two edgeViews or none
                //but it does work correctly if we dont notify GraphView of this added edge. Gross.
                owner.UnnotifyAddedEdge(owner.Connect(from, to));
            }
        }