InTerra_MaterialManager.cs 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. using System.Collections.Generic;
  2. using UnityEngine;
  3. using UnityEditor;
  4. using System.Linq;
  5. namespace InTerra
  6. {
  7. public static class InTerra_MaterialManager
  8. {
  9. static bool disableUpdates = InTerra_Setting.DisableAllAutoUpdates;
  10. static bool updateDict = InTerra_Setting.DictionaryUpdate;
  11. //========================================================================================
  12. //-----------------------| MULTIPLE TERRAINS MATERIALS WARNINGS |-------------------
  13. //========================================================================================
  14. public static void MaterialTagWarnings(Terrain terrain, Material targetMat, Dictionary<Renderer, Terrain> rendTerrain, List<Material> relatedMat)
  15. {
  16. GUIStyle richTextLabelStyle = new GUIStyle(GUI.skin.label) { wordWrap = true, alignment = TextAnchor.MiddleLeft, richText = true };
  17. //-----------------------| MATERIAL NAMES/TAGS INCONSISTENCY |-------------------
  18. string terrainTag = targetMat.GetTag("TerrainName", false);
  19. bool wrongName = targetMat.name != TagsName(targetMat);
  20. bool wrongTerrainName = terrain && (terrainTag.Length > 0) && terrainTag != terrain.name;
  21. if (wrongTerrainName || wrongName)
  22. {
  23. using (new GUILayout.HorizontalScope(EditorStyles.helpBox))
  24. {
  25. EditorGUILayout.LabelField(EditorGUIUtility.IconContent("console.warnicon"), GUILayout.Height(40), GUILayout.Width(30));
  26. using (new GUILayout.VerticalScope())
  27. {
  28. if (wrongName)
  29. {
  30. EditorGUILayout.LabelField("The Material name and Tags name do not match!", richTextLabelStyle);
  31. if (wrongTerrainName)
  32. {
  33. EditorGUILayout.LabelField("The Terrain tag <b>\" " + targetMat.GetTag("TerrainName", false) + "\"</b> of this Material does not match the Terrain name \" " + terrain.name + "\" where the Material is placed. You can try to <b>Reassigne Related Materials</b> or change the Terrain tag.", richTextLabelStyle);
  34. }
  35. }
  36. else if (wrongTerrainName)
  37. {
  38. EditorGUILayout.LabelField("The Terrain Name <b>\" " + targetMat.GetTag("TerrainName", false) + "\"</b> in this Material name and Tag does not match the Terrain name <b>\" " + terrain.name + "\"</b> where the Material is placed.", richTextLabelStyle);
  39. }
  40. EditorGUILayout.Space();
  41. }
  42. }
  43. }
  44. }
  45. //========================================================================================
  46. public static void CreateRelatedMaterialsList(string baseName, List<Material> relatedMat)
  47. {
  48. Material[] materials = Resources.FindObjectsOfTypeAll(typeof(Material)) as Material[];
  49. relatedMat.Clear();
  50. foreach (Material mat in materials)
  51. {
  52. if (mat.shader != null && mat.shader.name != null && baseName.Length != 0 && baseName == mat.GetTag("BaseName", false) && !mat.name.Contains("(Instance)"))
  53. {
  54. if (!relatedMat.Contains(mat))
  55. {
  56. relatedMat.Add(mat);
  57. }
  58. }
  59. }
  60. }
  61. public static void CopyPropertiesToRelated(Material targetMat, List<Material> relatedMat)
  62. {
  63. List<Material> copyToMats = new List<Material>();
  64. foreach (Material mat in relatedMat)
  65. {
  66. if (mat != targetMat && InTerra_Data.CheckObjectShader(mat))
  67. {
  68. copyToMats.Add(mat);
  69. }
  70. }
  71. Undo.RecordObjects(copyToMats.ToArray(), "InTerra Copy Materials Properties");
  72. foreach (Material mat in copyToMats)
  73. {
  74. string baseTag = mat.GetTag("BaseName", false);
  75. string terrainTag = mat.GetTag("TerrainName", false);
  76. float customTerrainSelection = mat.GetFloat("_CustomTerrainSelection");
  77. mat.CopyPropertiesFromMaterial(targetMat);
  78. mat.SetFloat("_CustomTerrainSelection", customTerrainSelection);
  79. mat.SetOverrideTag("BaseName", baseTag);
  80. mat.SetOverrideTag("TerrainName", terrainTag);
  81. }
  82. if (!disableUpdates) InTerra_Data.UpdateTerrainData(updateDict);
  83. }
  84. static string TagsName(Material mat)
  85. {
  86. string tagName = mat.GetTag("BaseName", false) + "_" + mat.GetTag("TerrainName", false);
  87. return tagName;
  88. }
  89. public static void ReassignMaterials(string baseName, List<Material> relatedMat, Dictionary<Renderer, Terrain> rendTerrain)
  90. {
  91. foreach (Renderer rend in rendTerrain.Keys)
  92. {
  93. if (relatedMat.Contains(rend.sharedMaterial) || (baseName == rend.sharedMaterial.name))
  94. {
  95. Terrain[] terrains = Terrain.activeTerrains;
  96. foreach (Material mat in relatedMat)
  97. {
  98. Terrain matTerrain = rendTerrain[rend];
  99. Vector2 pos = new Vector2(rend.bounds.center.x, rend.bounds.center.z);
  100. if (InTerra_Data.CheckPosition(rendTerrain[rend], pos))
  101. {
  102. CheckAndReassign(baseName, mat, rend, matTerrain);
  103. }
  104. else
  105. {
  106. foreach (Terrain checkTerrain in terrains)
  107. {
  108. if (InTerra_Data.CheckPosition(checkTerrain, pos))
  109. {
  110. CheckAndReassign(baseName, mat, rend, checkTerrain);
  111. }
  112. }
  113. }
  114. }
  115. }
  116. }
  117. if (!disableUpdates) InTerra_Data.UpdateTerrainData(updateDict);
  118. }
  119. static void CheckAndReassign(string baseName, Material mat, Renderer rend, Terrain terrain)
  120. {
  121. Dictionary<Renderer, Material> objMat = new Dictionary<Renderer, Material>();
  122. if (baseName + "_" + terrain.name == TagsName(mat) && baseName + "_" + terrain.name == mat.name)
  123. {
  124. objMat.Add(rend, mat);
  125. }
  126. Undo.RecordObjects(objMat.Keys.ToArray(), "InTerra Materials Reassigned");
  127. foreach (Renderer obj in objMat.Keys)
  128. {
  129. obj.sharedMaterial = objMat[rend];
  130. }
  131. }
  132. public static void MaterialTags( ref bool changingTerrainTag, Material mat, ref Terrain terrain, MaterialEditor materialEditor, GUIStyle styleMini)
  133. {
  134. using (new GUILayout.HorizontalScope())
  135. {
  136. EditorGUILayout.LabelField("Bese Name :", styleMini, GUILayout.Width(80));
  137. EditorGUILayout.LabelField(mat.GetTag("BaseName", false), EditorStyles.helpBox, GUILayout.MinWidth(100));
  138. }
  139. using (new GUILayout.HorizontalScope())
  140. {
  141. EditorGUILayout.LabelField("Terrain Name :", styleMini, GUILayout.Width(80));
  142. if (changingTerrainTag)
  143. {
  144. if (terrain == null)
  145. {
  146. Terrain[] terrains = Terrain.activeTerrains;
  147. foreach (Terrain ter in terrains)
  148. {
  149. if (ter.name == mat.GetTag("TerrainName", false)) terrain = ter;
  150. }
  151. }
  152. EditorGUI.BeginChangeCheck();
  153. terrain = (Terrain)EditorGUILayout.ObjectField(terrain, typeof(Terrain), true, GUILayout.MinWidth(100), GUILayout.Height(22));
  154. if (EditorGUI.EndChangeCheck())
  155. {
  156. materialEditor.RegisterPropertyChangeUndo("InTerra Terrain Tag Changed");
  157. mat.SetOverrideTag("TerrainName", terrain.name);
  158. changingTerrainTag = false;
  159. }
  160. if (GUILayout.Button("Cancel"))
  161. {
  162. changingTerrainTag = false;
  163. }
  164. }
  165. else
  166. {
  167. EditorGUILayout.LabelField(mat.GetTag("TerrainName", false), EditorStyles.helpBox, GUILayout.MinWidth(100));
  168. if (GUILayout.Button("Change"))
  169. {
  170. changingTerrainTag = true;
  171. }
  172. }
  173. }
  174. }
  175. }
  176. }