Exemplo n.º 1
0
        ShaderStageCapability GetSlotCapability(MaterialSlot slot)
        {
            SlotDependencyInfo dependencyInfo;

            if (slot.isInputSlot)
            {
                dependencyInfo = asset?.GetInputDependencies(slot.RawDisplayName());
            }
            else
            {
                dependencyInfo = asset?.GetOutputDependencies(slot.RawDisplayName());
            }

            if (dependencyInfo != null)
            {
                return(dependencyInfo.capabilities);
            }
            return(ShaderStageCapability.All);
        }
Exemplo n.º 2
0
        public override void GetOutputSlots <T>(MaterialSlot startingSlot, List <T> foundSlots)
        {
            var allSlots = new List <T>();

            GetOutputSlots <T>(allSlots);
            var info = asset?.GetInputDependencies(startingSlot.RawDisplayName());

            if (info != null)
            {
                foreach (var slot in allSlots)
                {
                    if (info.ContainsSlot(slot))
                    {
                        foundSlots.Add(slot);
                    }
                }
            }
        }
Exemplo n.º 3
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);
        }
Exemplo n.º 4
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);
        }
Exemplo n.º 5
0
        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);
        }
Exemplo n.º 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));
            }
        }
Exemplo n.º 7
0
 internal bool ContainsSlot(MaterialSlot slot)
 {
     return(dependencies.Contains(slot.RawDisplayName()));
 }