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); }
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); } } } }
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); }
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); }
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); }
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)); } }
internal bool ContainsSlot(MaterialSlot slot) { return(dependencies.Contains(slot.RawDisplayName())); }