void WriteProperties(string[] features, StringBuilder sb, AuxShader auxShader) { sb.AppendLine(" Properties {"); bool max4 = features.Contains("_MAX4TEXTURES"); bool max8 = features.Contains("_MAX8TEXTURES"); bool max12 = features.Contains("_MAX12TEXTURES"); bool max20 = features.Contains("_MAX20TEXTURES"); bool max24 = features.Contains("_MAX24TEXTURES"); bool max28 = features.Contains("_MAX28TEXTURES"); bool max32 = features.Contains("_MAX32TEXTURES"); // always have this for UVs sb.AppendLine(" [HideInInspector] _Control0 (\"Control0\", 2D) = \"red\" {}"); bool custom = features.Contains <string> ("_CUSTOMSPLATTEXTURES"); string controlName = "_Control"; if (custom) { controlName = "_CustomControl"; } if (custom) { sb.AppendLine(" [HideInInspector] _CustomControl0 (\"Control0\", 2D) = \"red\" {}"); } if (!features.Contains("_MICROVERTEXMESH") && !features.Contains("_MEGASPLAT")) { if (!max4) { sb.AppendLine(" [HideInInspector] " + controlName + "1 (\"Control1\", 2D) = \"black\" {}"); } if (!max4 && !max8) { sb.AppendLine(" [HideInInspector] " + controlName + "2 (\"Control2\", 2D) = \"black\" {}"); } if (!max4 && !max8 && !max12) { sb.AppendLine(" [HideInInspector] " + controlName + "3 (\"Control3\", 2D) = \"black\" {}"); } if (max20 || max24 || max28 || max32) { sb.AppendLine(" [HideInInspector] " + controlName + "4 (\"Control4\", 2D) = \"black\" {}"); } if (max24 || max28 || max32) { sb.AppendLine(" [HideInInspector] " + controlName + "5 (\"Control5\", 2D) = \"black\" {}"); } if (max28 || max32) { sb.AppendLine(" [HideInInspector] " + controlName + "6 (\"Control6\", 2D) = \"black\" {}"); } if (max32) { sb.AppendLine(" [HideInInspector] " + controlName + "7 (\"Control7\", 2D) = \"black\" {}"); } } for (int i = 0; i < extensions.Count; ++i) { var ext = extensions [i]; if (ext.GetVersion() == MicroSplatVersion) { ext.WriteProperties(features, sb); } sb.AppendLine(""); } renderLoop.WriteProperties(features, sb, auxShader); sb.AppendLine(" }"); }
public string Compile(string[] features, string name, string baseName = null, AuxShader auxShader = null) { try { EditorUtility.DisplayProgressBar("Compiling Shaders", "...", 0.5f); Init(); // get default render loop if it doesn't exist if (renderLoop == null) { for (int i = 0; i < availableRenderLoops.Count; ++i) { if (availableRenderLoops [i].GetType() == typeof(SurfaceShaderRenderLoopAdapter)) { renderLoop = availableRenderLoops [i]; } } } // TODO: this would be better if we asked the render loop if it is in the feature list, but // would require a change to interface, so wait until we have a version bump. SetPreferedRenderLoopByName(features, "_MSRENDERLOOP_UNITYLD"); SetPreferedRenderLoopByName(features, "_MSRENDERLOOP_UNITYHD"); for (int i = 0; i < extensions.Count; ++i) { var ext = extensions [i]; ext.Unpack(features); } sBuilder.Length = 0; var sb = sBuilder; sb.AppendLine("//////////////////////////////////////////////////////"); sb.AppendLine("// MicroSplat"); sb.AppendLine("// Copyright (c) Jason Booth"); sb.AppendLine("//"); sb.AppendLine("// Auto-generated shader code, don't hand edit!"); sb.AppendLine("// Compiled with MicroSplat " + MicroSplatVersion); sb.AppendLine("// Unity : " + Application.unityVersion); sb.AppendLine("// Platform : " + Application.platform); if (renderLoop != null) { sb.AppendLine("// RenderLoop : " + renderLoop.GetDisplayName()); } sb.AppendLine("//////////////////////////////////////////////////////"); sb.AppendLine(); if (auxShader == null && baseName == null) { sb.Append("Shader \"Hidden/MicroSplat/"); } else { sb.Append("Shader \"MicroSplat/"); } while (name.Contains("/")) { name = name.Substring(name.IndexOf("/") + 1); } sb.Append(name); if (auxShader != null) { sb.Append(auxShader.extension); } sb.AppendLine("\" {"); // props WriteProperties(features, sb, auxShader); renderLoop.WriteShaderHeader(features, sb, this, auxShader); for (int pass = 0; pass < renderLoop.GetNumPasses(); ++pass) { renderLoop.WritePassHeader(features, sb, this, pass, auxShader); // don't remove sb.AppendLine(); sb.AppendLine(); if (renderLoop.UseReplaceMethods() == false) { WriteFeatures(features, sb); if (renderLoop == null) { sb.AppendLine(" #define _MSRENDERLOOP_SURFACESHADER 1"); } else { sb.AppendLine(" #define " + renderLoop.GetRenderLoopKeyword() + " 1"); } } // HDRP/URP uses CBuffers, everything else just inlines.. if (renderLoop.UseReplaceMethods() == false) { renderLoop.WritePerMaterialCBuffer(features, sb, auxShader); WritePerMaterialCBuffer(features, sb); } renderLoop.WriteSharedCode(features, sb, this, pass, auxShader); if (renderLoop.UseReplaceMethods() == false) { WriteExtensions(features, sb); renderLoop.WriteVertexFunction(features, sb, this, pass, auxShader); for (int i = 0; i < extensions.Count; ++i) { var ext = extensions [i]; if (ext.GetVersion() == MicroSplatVersion) { extensions [i].WriteAfterVetrexFunctions(sb); } } } renderLoop.WriteTerrainBody(features, sb, this, pass, auxShader); renderLoop.WriteFragmentFunction(features, sb, this, pass, auxShader); } renderLoop.WriteShaderFooter(features, sb, this, auxShader, baseName); sb.AppendLine(""); renderLoop.PostProcessShader(features, sb, this, auxShader); for (int i = 0; i < extensions.Count; ++i) { var ext = extensions [i]; ext.OnPostGeneration(ref sb, features, name, baseName, auxShader); } string output = sb.ToString(); // fix newline mixing warnings.. output = System.Text.RegularExpressions.Regex.Replace(output, "\r\n?|\n", System.Environment.NewLine); EditorUtility.ClearProgressBar(); return(output); } catch { EditorUtility.ClearProgressBar(); return(""); } }
public string Compile(string[] features, string name, string baseName = null, AuxShader auxShader = null) { try { EditorUtility.DisplayProgressBar("Compiling Shaders", "...", 0.5f); Init(); // get default render loop if it doesn't exist if (renderLoop == null) { for (int i = 0; i < availableRenderLoops.Count; ++i) { if (availableRenderLoops [i].GetType() == typeof(SurfaceShaderRenderLoopAdapter)) { renderLoop = availableRenderLoops [i]; } } } // TODO: this would be better if we asked the render loop if it is in the feature list, but // would require a change to interface, so wait until we have a version bump. SetPreferedRenderLoopByName(features, "_MSRENDERLOOP_UNITYLD"); SetPreferedRenderLoopByName(features, "_MSRENDERLOOP_UNITYHD"); #if UNITY_2020_2_OR_NEWER SetPreferedRenderLoopByName(features, "_MSRENDERLOOP_UNITYURP2020"); SetPreferedRenderLoopByName(features, "_MSRENDERLOOP_UNITYHDRP2020"); #endif for (int i = 0; i < extensions.Count; ++i) { var ext = extensions [i]; ext.Unpack(features); } StringBuilder sb = renderLoop.WriteShader(features, this, auxShader, name, baseName); for (int i = 0; i < extensions.Count; ++i) { var ext = extensions [i]; ext.OnPostGeneration(ref sb, features, name, baseName, auxShader); } string output = sb.ToString(); // fix newline mixing warnings.. output = System.Text.RegularExpressions.Regex.Replace(output, "\r\n?|\n", System.Environment.NewLine); EditorUtility.ClearProgressBar(); return(output); } catch { EditorUtility.ClearProgressBar(); return(""); } }