using UnityEngine; using System.Text; using System.Collections; using System.Collections.Generic; namespace VolumetricFogAndMist { public class VolumetricFogSInfo { public string name = ""; public string path = ""; public List passes = new List (); public List keywords = new List (); public bool pendingChanges; public bool editedByShaderControl; public int enabledKeywordCount; public void Add (SCShaderPass pass) { passes.Add (pass); UpdateKeywords (); } public void EnableKeywords () { keywords.ForEach ((SCKeyword keyword) => keyword.enabled = true); } void UpdateKeywords () { passes.ForEach ((SCShaderPass pass) => { for (int l = 0; l < pass.keywordLines.Count; l++) { SCKeywordLine line = pass.keywordLines [l]; for (int k = 0; k < line.keywords.Count; k++) { SCKeyword keyword = line.keywords [k]; if (!keywords.Contains (keyword)) { if (SCKeywordChecker.IsValid (keyword.name)) { keywords.Add (keyword); } } } } }); enabledKeywordCount = 0; keywords.ForEach ((SCKeyword kw) => { if (kw.enabled) enabledKeywordCount++; }); } public SCKeyword GetKeyword (string name) { int kCount = keywords.Count; for (int k = 0; k < kCount; k++) { SCKeyword keyword = keywords [k]; if (keyword.name.Equals (name)) return keyword; } return new SCKeyword (name); } } public class SCShaderPass { public int pass; public List keywordLines = new List (); public int keywordCount; public void Add (SCKeywordLine keywordLine) { keywordLines.Add (keywordLine); UpdateKeywordCount (); } public void Add (List keywordLines) { this.keywordLines.AddRange (keywordLines); UpdateKeywordCount (); } void UpdateKeywordCount () { keywordCount = 0; keywordLines.ForEach ((SCKeywordLine obj) => keywordCount += obj.keywordCount); } public void Clear () { keywordCount = 0; keywordLines.Clear (); } } public class SCKeywordLine { public List keywords = new List (); public bool hasUnderscoreVariant; public SCKeyword GetKeyword (string name) { int kc = keywords.Count; for (int k = 0; k < kc; k++) { SCKeyword keyword = keywords [k]; if (keyword.name.Equals (name)) { return keyword; } } return null; } public void Add (SCKeyword keyword) { if (GetKeyword (keyword.name) != null) return; // ignore underscore keywords bool goodKeyword = false; for (int k = 0; k < keyword.name.Length; k++) { if (keyword.name [k] != '_') { goodKeyword = true; break; } } if (goodKeyword) { keywords.Add (keyword); } else { keyword.isUnderscoreKeyword = true; hasUnderscoreVariant = true; } } public void DisableKeywords () { keywords.ForEach ((SCKeyword obj) => obj.enabled = false); } public void Clear () { keywords.Clear (); } public int keywordCount { get { return keywords.Count; } } public int keywordsEnabledCount { get { int kCount = keywords.Count; int enabledCount = 0; for (int k = 0; k < kCount; k++) { if (keywords [k].enabled) enabledCount++; } return enabledCount; } } public override string ToString () { StringBuilder sb = new StringBuilder (); for (int k = 0; k < keywords.Count; k++) { if (k > 0) sb.Append (" "); sb.Append (keywords [k].name); } return sb.ToString (); } } public class SCKeyword { public string name; public bool enabled; public bool isUnderscoreKeyword; public SCKeyword (string name) { this.name = name; enabled = true; } public override bool Equals (object obj) { if (obj is SCKeyword) { SCKeyword other = (SCKeyword)obj; return name.Equals (other.name); } return false; } public override int GetHashCode () { return name.GetHashCode (); } public override string ToString () { return name; } } static class SCKeywordChecker { static Dictionary dict = new Dictionary (); static SCKeywordChecker() { string[][] kw = new string[][] { new string[] { VolumetricFog.SKW_FOG_HAZE_ON, "Sky Haze" }, new string[] { VolumetricFog.SKW_FOG_OF_WAR_ON, "Fog of War" }, new string[] { VolumetricFog.SKW_LIGHT_SCATTERING, "Light Scattering" }, new string[] { VolumetricFog.SKW_SUN_SHADOWS, "Sun Shadows" }, new string[] { VolumetricFog.SKW_FOG_VOID_BOX, "Fog Void (Box shape)" }, new string[] { VolumetricFog.SKW_FOG_VOID_SPHERE, "Fog Void (Sphere shape)" }, new string[] { VolumetricFog.SKW_FOG_AREA_BOX, "Fog Area (Box shape)" }, new string[] { VolumetricFog.SKW_FOG_AREA_SPHERE, "Fog Area (Sphere shape)" }, new string[] { VolumetricFog.SKW_FOG_BLUR, "Depth Blur" }, new string[] { VolumetricFog.SKW_FOG_USE_XY_PLANE, "Use XY Plane" }, new string[] { VolumetricFog.SKW_FOG_COMPUTE_DEPTH, "Compute Depth" } }; for (int k=0;k