public static Material GetStencilMaterial(Material baseMaterial, int stencilID) { if (!baseMaterial.HasProperty(ShaderUtilities.ID_StencilID)) { Debug.LogWarning("Selected Shader does not support Stencil Masking. Please select the Distance Field or Mobile Distance Field Shader."); return baseMaterial; } Material material = null; int num = m_materialList.FindIndex((MaskingMaterial item) => item.baseMaterial == baseMaterial && item.stencilID == stencilID); if (num == -1) { material = new Material(baseMaterial); material.hideFlags = HideFlags.HideAndDontSave; Material material2 = material; material2.name = material2.name + " Masking ID:" + stencilID; material.shaderKeywords = baseMaterial.shaderKeywords; ShaderUtilities.GetShaderPropertyIDs(); material.SetFloat(ShaderUtilities.ID_StencilID, (float)stencilID); material.SetFloat(ShaderUtilities.ID_StencilComp, 4f); MaskingMaterial maskingMaterial = new MaskingMaterial(); maskingMaterial.baseMaterial = baseMaterial; maskingMaterial.stencilMaterial = material; maskingMaterial.stencilID = stencilID; maskingMaterial.count = 1; m_materialList.Add(maskingMaterial); } else { material = m_materialList[num].stencilMaterial; m_materialList[num].count++; } ListMaterials(); return material; }
public static Material GetStencilMaterial(Material baseMaterial, int stencilID) { if (!baseMaterial.HasProperty(ShaderUtilities.ID_StencilID)) { Debug.LogWarning("Selected Shader does not support Stencil Masking. Please select the Distance Field or Mobile Distance Field Shader."); return(baseMaterial); } int instanceID = baseMaterial.GetInstanceID(); for (int i = 0; i < m_materialList.Count; i++) { if (m_materialList[i].baseMaterial.GetInstanceID() == instanceID && m_materialList[i].stencilID == stencilID) { m_materialList[i].count++; return(m_materialList[i].stencilMaterial); } } Material material = new Material(baseMaterial); material.hideFlags = HideFlags.HideAndDontSave; material.shaderKeywords = baseMaterial.shaderKeywords; ShaderUtilities.GetShaderPropertyIDs(); material.SetFloat(ShaderUtilities.ID_StencilID, stencilID); material.SetFloat(ShaderUtilities.ID_StencilComp, 4f); MaskingMaterial maskingMaterial = new MaskingMaterial(); maskingMaterial.baseMaterial = baseMaterial; maskingMaterial.stencilMaterial = material; maskingMaterial.stencilID = stencilID; maskingMaterial.count = 1; m_materialList.Add(maskingMaterial); return(material); }
public static void AddMaskingMaterial(Material baseMaterial, Material stencilMaterial, int stencilID) { // Check if maskingMaterial already has a base material associated with it. int index = m_materialList.FindIndex(item => item.stencilMaterial == stencilMaterial); if (index == -1) { MaskingMaterial temp = new MaskingMaterial(); temp.baseMaterial = baseMaterial; temp.stencilMaterial = stencilMaterial; temp.stencilID = stencilID; temp.count = 1; m_materialList.Add(temp); } else { stencilMaterial = m_materialList[index].stencilMaterial; m_materialList[index].count += 1; } }
/// <summary> /// Create a Masking Material Instance for the given ID /// </summary> /// <param name="baseMaterial"></param> /// <param name="stencilID"></param> /// <returns></returns> public static Material GetStencilMaterial(Material baseMaterial, int stencilID) { // Check if Material supports masking if (!baseMaterial.HasProperty(ShaderUtilities.ID_StencilID)) { Debug.LogWarning("Selected Shader does not support Stencil Masking. Please select the Distance Field or Mobile Distance Field Shader."); return(baseMaterial); } int baseMaterialID = baseMaterial.GetInstanceID(); // If baseMaterial already has a corresponding masking material, return it. for (int i = 0; i < m_materialList.Count; i++) { if (m_materialList[i].baseMaterial.GetInstanceID() == baseMaterialID && m_materialList[i].stencilID == stencilID) { m_materialList[i].count += 1; #if DEBUG_ON ListMaterials(); #endif return(m_materialList[i].stencilMaterial); } } // No matching masking material found. Create and return a new one. Material stencilMaterial; //Create new Masking Material Instance for this Base Material stencilMaterial = new Material(baseMaterial); stencilMaterial.hideFlags = HideFlags.HideAndDontSave; stencilMaterial.name += " Masking ID:" + stencilID; stencilMaterial.shaderKeywords = baseMaterial.shaderKeywords; // Set Stencil Properties ShaderUtilities.GetShaderPropertyIDs(); stencilMaterial.SetFloat(ShaderUtilities.ID_StencilID, stencilID); //stencilMaterial.SetFloat(ShaderUtilities.ID_StencilOp, 0); stencilMaterial.SetFloat(ShaderUtilities.ID_StencilComp, 4); //stencilMaterial.SetFloat(ShaderUtilities.ID_StencilReadMask, stencilID); //stencilMaterial.SetFloat(ShaderUtilities.ID_StencilWriteMask, 0); MaskingMaterial temp = new MaskingMaterial(); temp.baseMaterial = baseMaterial; temp.stencilMaterial = stencilMaterial; temp.stencilID = stencilID; temp.count = 1; m_materialList.Add(temp); #if DEBUG_ON ListMaterials(); #endif return(stencilMaterial); }
/// <summary> /// Create a Masking Material Instance for the given ID /// </summary> /// <param name="baseMaterial"></param> /// <param name="stencilID"></param> /// <returns></returns> public static Material GetStencilMaterial(Material baseMaterial, int stencilID) { // Check if Material supports masking if (!baseMaterial.HasProperty(ShaderUtilities.ID_StencilID)) { Debug.LogWarning("Selected Shader does not support Stencil Masking. Please select the Distance Field or Mobile Distance Field Shader."); return baseMaterial; } Material stencilMaterial = null; // Check if baseMaterial already has a masking material associated with it. int index = m_materialList.FindIndex(item => item.baseMaterial == baseMaterial && item.stencilID == stencilID); if (index == -1) { //Create new Masking Material Instance for this Base Material stencilMaterial = new Material(baseMaterial); stencilMaterial.hideFlags = HideFlags.HideAndDontSave; stencilMaterial.name += " Masking ID:" + stencilID; stencilMaterial.shaderKeywords = baseMaterial.shaderKeywords; // Set Stencil Properties ShaderUtilities.GetShaderPropertyIDs(); stencilMaterial.SetFloat(ShaderUtilities.ID_StencilID, stencilID); stencilMaterial.SetFloat(ShaderUtilities.ID_StencilComp, 4); MaskingMaterial temp = new MaskingMaterial(); temp.baseMaterial = baseMaterial; temp.stencilMaterial = stencilMaterial; temp.stencilID = stencilID; temp.count = 1; m_materialList.Add(temp); //Debug.Log("Masking material for " + baseMaterial.name + " DOES NOT exists. Creating new " + maskingMaterial.name + " with ID " + maskingMaterial.GetInstanceID() + " which is used " + temp.count + " time(s)."); } else { stencilMaterial = m_materialList[index].stencilMaterial; m_materialList[index].count += 1; //Debug.Log("Masking material for " + baseMaterial.name + " already exists. Passing reference to " + maskingMaterial.name + " with ID " + maskingMaterial.GetInstanceID() + " which is used " + m_materialList[index].count + " time(s)."); } // Used for Debug ListMaterials(); return stencilMaterial; }
/// <summary> /// Create a Masking Material Instance for the given ID /// </summary> /// <param name="baseMaterial"></param> /// <param name="stencilID"></param> /// <returns></returns> public static Material GetStencilMaterial(Material baseMaterial, int stencilID) { // Check if Material supports masking if (!baseMaterial.HasProperty(ShaderUtilities.ID_StencilID)) { Debug.LogWarning("Selected Shader does not support Stencil Masking. Please select the Distance Field or Mobile Distance Field Shader."); return(baseMaterial); } Material stencilMaterial = null; // Check if baseMaterial already has a masking material associated with it. int index = m_materialList.FindIndex(item => item.baseMaterial == baseMaterial && item.stencilID == stencilID); if (index == -1) { //Create new Masking Material Instance for this Base Material stencilMaterial = new Material(baseMaterial); stencilMaterial.hideFlags = HideFlags.HideAndDontSave; stencilMaterial.name += " Masking ID:" + stencilID; stencilMaterial.shaderKeywords = baseMaterial.shaderKeywords; // Set Stencil Properties ShaderUtilities.GetShaderPropertyIDs(); stencilMaterial.SetFloat(ShaderUtilities.ID_StencilID, stencilID); stencilMaterial.SetFloat(ShaderUtilities.ID_StencilComp, 4); MaskingMaterial temp = new MaskingMaterial(); temp.baseMaterial = baseMaterial; temp.stencilMaterial = stencilMaterial; temp.stencilID = stencilID; temp.count = 1; m_materialList.Add(temp); //Debug.Log("Masking material for " + baseMaterial.name + " DOES NOT exists. Creating new " + maskingMaterial.name + " with ID " + maskingMaterial.GetInstanceID() + " which is used " + temp.count + " time(s)."); } else { stencilMaterial = m_materialList[index].stencilMaterial; m_materialList[index].count += 1; //Debug.Log("Masking material for " + baseMaterial.name + " already exists. Passing reference to " + maskingMaterial.name + " with ID " + maskingMaterial.GetInstanceID() + " which is used " + m_materialList[index].count + " time(s)."); } // Used for Debug ListMaterials(); return(stencilMaterial); }
public static void AddMaskingMaterial(Material baseMaterial, Material stencilMaterial, int stencilID) { int num = m_materialList.FindIndex((MaskingMaterial item) => item.stencilMaterial == stencilMaterial); if (num == -1) { MaskingMaterial maskingMaterial = new MaskingMaterial(); maskingMaterial.baseMaterial = baseMaterial; maskingMaterial.stencilMaterial = stencilMaterial; maskingMaterial.stencilID = stencilID; maskingMaterial.count = 1; m_materialList.Add(maskingMaterial); } else { stencilMaterial = m_materialList[num].stencilMaterial; m_materialList[num].count++; } }
public static void AddMaskingMaterial(Material baseMaterial, Material stencilMaterial, int stencilID) { // Check if maskingMaterial already has a base material associated with it. int index = m_materialList.FindIndex(item => item.stencilMaterial == stencilMaterial); if (index == -1) { MaskingMaterial temp = new MaskingMaterial(); temp.baseMaterial = baseMaterial; temp.stencilMaterial = stencilMaterial; temp.stencilID = stencilID; temp.count = 1; m_materialList.Add(temp); } else { stencilMaterial = m_materialList[index].stencilMaterial; m_materialList[index].count += 1; } }
/// <summary> /// Create a Masking Material Instance for the given ID /// </summary> /// <param name="baseMaterial"></param> /// <param name="stencilID"></param> /// <returns></returns> public static Material GetStencilMaterial(Material baseMaterial, int stencilID) { // Check if Material supports masking if (!baseMaterial.HasProperty(ShaderUtilities.ID_StencilID)) { Debug.LogWarning("Selected Shader does not support Stencil Masking. Please select the Distance Field or Mobile Distance Field Shader."); return baseMaterial; } int baseMaterialID = baseMaterial.GetInstanceID(); // If baseMaterial already has a corresponding masking material, return it. for (int i = 0; i < m_materialList.Count; i++) { if (m_materialList[i].baseMaterial.GetInstanceID() == baseMaterialID && m_materialList[i].stencilID == stencilID) { m_materialList[i].count += 1; #if DEBUG_ON ListMaterials(); #endif return m_materialList[i].stencilMaterial; } } // No matching masking material found. Create and return a new one. Material stencilMaterial; //Create new Masking Material Instance for this Base Material stencilMaterial = new Material(baseMaterial); stencilMaterial.hideFlags = HideFlags.HideAndDontSave; #if UNITY_EDITOR stencilMaterial.name += " Masking ID:" + stencilID; #endif stencilMaterial.shaderKeywords = baseMaterial.shaderKeywords; // Set Stencil Properties ShaderUtilities.GetShaderPropertyIDs(); stencilMaterial.SetFloat(ShaderUtilities.ID_StencilID, stencilID); //stencilMaterial.SetFloat(ShaderUtilities.ID_StencilOp, 0); stencilMaterial.SetFloat(ShaderUtilities.ID_StencilComp, 4); //stencilMaterial.SetFloat(ShaderUtilities.ID_StencilReadMask, stencilID); //stencilMaterial.SetFloat(ShaderUtilities.ID_StencilWriteMask, 0); MaskingMaterial temp = new MaskingMaterial(); temp.baseMaterial = baseMaterial; temp.stencilMaterial = stencilMaterial; temp.stencilID = stencilID; temp.count = 1; m_materialList.Add(temp); #if DEBUG_ON ListMaterials(); #endif return stencilMaterial; }