public void AssignToMaterial(Material target, out List <Material> materials, out List <Texture2D> masks, ref Texture2D normal) { materials = null; masks = null; // Find textureset & get masks TextureSet textureSet = FindTextureSet(target.name); if (textureSet == null) { return; } masks = new List <Texture2D>(); foreach (string maskPath in textureSet.m_PackedMasks) { masks.Add(AssetDatabase.LoadAssetAtPath <Texture2D>(maskPath)); } // Find textureset shader Shader shader = FindShader(textureSet.m_Shader); materials = new List <Material>(shader.m_Materials.Count); for (int i = 0; i < shader.m_Materials.Count; i++) { materials.Add(null); } foreach (Shader.Material material in shader.m_Materials) { ProceduralMaterial loadedMaterial = material.RetrieveProceduralMaterial(); if (loadedMaterial == null) { Utils.LogError("Could not find referenced .sbsar file: " + material.m_ResourcePath + ". Make sure the file is in your Unity project and load json file again."); } MaterialConfigurationData data = new MaterialConfigurationData(); data.m_Material = loadedMaterial; ApplyMaterial(target, data, material.m_Name); int matIndex; if (int.TryParse(material.m_Name.Replace("Material", ""), out matIndex)) { matIndex--; materials[matIndex] = loadedMaterial; } } normal = AssetDatabase.LoadAssetAtPath <Texture2D>(m_MeshNormalsPath); }
void SaveUserData() { JSONClass userData = new JSONClass(); for (int i = 0; i < m_MaterialConfigurations.Count; i++) { MaterialConfigurationData data = m_MaterialConfigurations[i]; if (data.m_Material != null) { userData["mat" + (i + 1).ToString()] = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(data.m_Material)); } } AssetImporter ai = AssetImporter.GetAtPath(AssetDatabase.GetAssetPath(target)); ai.userData = userData.ToString(); }
static void ApplyMaterial(Material material, MaterialConfigurationData materialData, string matName) { ProceduralMaterial proceduralMaterial = materialData.m_Material as ProceduralMaterial; if (proceduralMaterial != null) { Utils.Log("Setting procmat " + proceduralMaterial + " on property " + matName); material.SetTexture("_" + matName + "_Color", proceduralMaterial.GetGeneratedTexture(proceduralMaterial.name + "_basecolor")); material.SetTexture("_" + matName + "_RM", proceduralMaterial.GetGeneratedTexture(proceduralMaterial.name + "_metallic")); material.SetTexture("_" + matName + "_Normal", proceduralMaterial.GetGeneratedTexture(proceduralMaterial.name + "_normal")); } else if (materialData.m_Material != null) { material.SetTexture("_" + matName + "_Color", materialData.m_Material.GetTexture("_MainTex")); material.SetTexture("_" + matName + "_RM", materialData.m_Material.GetTexture("_MetallicGlossMap")); material.SetTexture("_" + matName + "_Normal", materialData.m_Material.GetTexture("_BumpMap")); } }
public override void OnInspectorGUI() { if (!m_ProgressBarCleared) { m_ProgressBarCleared = true; EditorUtility.ClearProgressBar(); } EditorGUI.BeginChangeCheck(); // Warn if colorspace is not linear if (PlayerSettings.colorSpace != ColorSpace.Linear) { GUILayout.Label("Color space mismatch", TitlesStyle); GUILayout.BeginVertical("box"); EditorGUILayout.HelpBox("You need to set the project color space to *linear* for correct rendering. (Go to edit -> project settings -> player)", MessageType.Error); GUILayout.EndVertical(); } // Warn if colorspace is not linear if (PlayerSettings.renderingPath != RenderingPath.DeferredShading) { GUILayout.Label("Rendering path", TitlesStyle); GUILayout.BeginVertical("box"); EditorGUILayout.HelpBox("Depending on your hardware, the shader might not work. Try to set rendering path to *Deferred*. (Go to edit -> project settings -> player)", MessageType.Warning); GUILayout.EndVertical(); } if (Utils.ErrorMessages.Count > 0) { GUILayout.Label("Errors", TitlesStyle); GUILayout.BeginVertical("box"); foreach (string error in Utils.ErrorMessages) { EditorGUILayout.HelpBox(error, MessageType.Error); } GUILayout.EndVertical(); } //LOAD LAYERED MATERIAL if (GUILayout.Button("Load .json file", GUILayout.Height(50))) { Utils.ErrorMessages.Clear(); LoadJson(Target); } //Materials Slots GUILayout.Label("Materials", TitlesStyle); GUILayout.BeginVertical("box"); for (int i = 0; i < m_MaterialConfigurations.Count; i++) { OnInspectorMaterial(ref m_MaterialConfigurations[i].m_Material, i + 1); } GUILayout.EndVertical(); //Mask Slots GUILayout.Label("Masks", TitlesStyle); GUILayout.BeginVertical("box"); m_MaskTexture = (Texture2D)EditorGUILayout.ObjectField("Composite Mask", Target.GetTexture("_Mask"), typeof(Texture2D), false); Target.SetTexture("_Mask", m_MaskTexture); GUILayout.EndVertical(); //Normal Slots GUILayout.Label("Mesh", TitlesStyle); GUILayout.BeginVertical("box"); m_NormalTexture = (Texture2D)EditorGUILayout.ObjectField("Mesh normal", Target.GetTexture("BaseNormal"), typeof(Texture2D), false); Target.SetTexture("BaseNormal", m_NormalTexture); GUILayout.EndVertical(); //Shader Parameters GUILayout.Label("Parameters", TitlesStyle); GUILayout.BeginVertical("box"); bool tmp = EditorGUILayout.Toggle("Generate normals from masks", m_UseNormalFromMask); if (tmp != m_UseNormalFromMask) { m_UseNormalFromMask = tmp; SetupUseNormalFromMask(); } Object[] materialList = new Object[1]; materialList[0] = Target; for (int i = 0; i < m_MaterialConfigurations.Count; i++) { OnInspectorMaterialParameters(materialList, i + 1); } GUILayout.EndVertical(); if (EditorGUI.EndChangeCheck()) { PropertiesChanged(); SaveUserData(); for (int i = 0; i < m_MaterialConfigurations.Count; i++) { MaterialConfigurationData data = m_MaterialConfigurations[i]; if (data.m_Material != null) { ApplyMaterial(Target, data, "Material" + (i + 1).ToString()); } } } }