Esempio n. 1
0
        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("   }");
        }
Esempio n. 2
0
        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("");
            }
        }