コード例 #1
0
        // Function to determine how much extra padding is required as a result of material properties like dilate, outline thickness, softness, glow, etc...
        public static float GetPadding(Material[] materials, bool enableExtraPadding, bool isBold)
        {
            //Debug.Log("GetPadding() called.");

            if (isInitialized == false)
            {
                GetShaderPropertyIDs();
            }

            // Return if Material is null
            if (materials == null)
            {
                return(0);
            }

            int extraPadding = enableExtraPadding ? 4 : 0;

            if (!materials[0].HasProperty(ShaderUtilities.ID_GradientScale))
            {
                return(extraPadding);   // We are using an non SDF Shader.
            }
            Vector4 padding    = Vector4.zero;
            Vector4 maxPadding = Vector4.zero;

            float faceDilate       = 0;
            float faceSoftness     = 0;
            float outlineThickness = 0;
            float scaleRatio_A     = 0;
            float scaleRatio_B     = 0;
            float scaleRatio_C     = 0;

            float glowOffset = 0;
            float glowOuter  = 0;

            float uniformPadding = 0;

            // Iterate through each of the assigned materials to find the max values to set the padding.
            for (int i = 0; i < materials.Length; i++)
            {
                // Update Shader Ratios prior to computing padding
                ShaderUtilities.UpdateShaderRatios(materials[i], isBold);

                string[] shaderKeywords = materials[i].shaderKeywords;

                if (materials[i].HasProperty(ShaderUtilities.ID_ScaleRatio_A))
                {
                    scaleRatio_A = materials[i].GetFloat(ShaderUtilities.ID_ScaleRatio_A);
                }

                if (materials[i].HasProperty(ShaderUtilities.ID_FaceDilate))
                {
                    faceDilate = materials[i].GetFloat(ShaderUtilities.ID_FaceDilate) * scaleRatio_A;
                }

                if (materials[i].HasProperty(ShaderUtilities.ID_OutlineSoftness))
                {
                    faceSoftness = materials[i].GetFloat(ShaderUtilities.ID_OutlineSoftness) * scaleRatio_A;
                }

                if (materials[i].HasProperty(ShaderUtilities.ID_OutlineWidth))
                {
                    outlineThickness = materials[i].GetFloat(ShaderUtilities.ID_OutlineWidth) * scaleRatio_A;
                }

                uniformPadding = outlineThickness + faceSoftness + faceDilate;

                // Glow padding contribution
                if (materials[i].HasProperty(ShaderUtilities.ID_GlowOffset) && shaderKeywords.Contains(ShaderUtilities.Keyword_Glow))
                {
                    if (materials[i].HasProperty(ShaderUtilities.ID_ScaleRatio_B))
                    {
                        scaleRatio_B = materials[i].GetFloat(ShaderUtilities.ID_ScaleRatio_B);
                    }

                    glowOffset = materials[i].GetFloat(ShaderUtilities.ID_GlowOffset) * scaleRatio_B;
                    glowOuter  = materials[i].GetFloat(ShaderUtilities.ID_GlowOuter) * scaleRatio_B;
                }

                uniformPadding = Mathf.Max(uniformPadding, faceDilate + glowOffset + glowOuter);

                // Underlay padding contribution
                if (materials[i].HasProperty(ShaderUtilities.ID_UnderlaySoftness) && shaderKeywords.Contains(ShaderUtilities.Keyword_Underlay))
                {
                    if (materials[i].HasProperty(ShaderUtilities.ID_ScaleRatio_C))
                    {
                        scaleRatio_C = materials[i].GetFloat(ShaderUtilities.ID_ScaleRatio_C);
                    }

                    float offsetX  = materials[i].GetFloat(ShaderUtilities.ID_UnderlayOffsetX) * scaleRatio_C;
                    float offsetY  = materials[i].GetFloat(ShaderUtilities.ID_UnderlayOffsetY) * scaleRatio_C;
                    float dilate   = materials[i].GetFloat(ShaderUtilities.ID_UnderlayDilate) * scaleRatio_C;
                    float softness = materials[i].GetFloat(ShaderUtilities.ID_UnderlaySoftness) * scaleRatio_C;

                    padding.x = Mathf.Max(padding.x, faceDilate + dilate + softness - offsetX);
                    padding.y = Mathf.Max(padding.y, faceDilate + dilate + softness - offsetY);
                    padding.z = Mathf.Max(padding.z, faceDilate + dilate + softness + offsetX);
                    padding.w = Mathf.Max(padding.w, faceDilate + dilate + softness + offsetY);
                }

                padding.x = Mathf.Max(padding.x, uniformPadding);
                padding.y = Mathf.Max(padding.y, uniformPadding);
                padding.z = Mathf.Max(padding.z, uniformPadding);
                padding.w = Mathf.Max(padding.w, uniformPadding);

                padding.x += extraPadding;
                padding.y += extraPadding;
                padding.z += extraPadding;
                padding.w += extraPadding;

                padding.x = Mathf.Min(padding.x, 1);
                padding.y = Mathf.Min(padding.y, 1);
                padding.z = Mathf.Min(padding.z, 1);
                padding.w = Mathf.Min(padding.w, 1);

                maxPadding.x = maxPadding.x < padding.x ? padding.x : maxPadding.x;
                maxPadding.y = maxPadding.y < padding.y ? padding.y : maxPadding.y;
                maxPadding.z = maxPadding.z < padding.z ? padding.z : maxPadding.z;
                maxPadding.w = maxPadding.w < padding.w ? padding.w : maxPadding.w;
            }

            float gradientScale = materials[0].GetFloat(ShaderUtilities.ID_GradientScale);

            padding *= gradientScale;

            // Set UniformPadding to the maximum value of any of its components.
            uniformPadding = Mathf.Max(padding.x, padding.y);
            uniformPadding = Mathf.Max(padding.z, uniformPadding);
            uniformPadding = Mathf.Max(padding.w, uniformPadding);

            return(uniformPadding + 0.25f);
        }
コード例 #2
0
        public static float GetPadding(Material[] materials, bool enableExtraPadding, bool isBold)
        {
            if (!ShaderUtilities.isInitialized)
            {
                ShaderUtilities.GetShaderPropertyIDs();
            }
            if (materials == null)
            {
                return(0f);
            }
            int num = (!enableExtraPadding) ? 0 : 4;

            if (!materials[0].HasProperty(ShaderUtilities.ID_GradientScale))
            {
                return((float)num);
            }
            Vector4 a    = Vector4.zero;
            Vector4 zero = Vector4.zero;
            float   num2 = 0f;
            float   num3 = 0f;
            float   num4 = 0f;
            float   num5 = 0f;
            float   num6 = 0f;
            float   num7 = 0f;
            float   num8 = 0f;
            float   num9 = 0f;
            float   num10;

            for (int i = 0; i < materials.Length; i++)
            {
                ShaderUtilities.UpdateShaderRatios(materials[i]);
                string[] shaderKeywords = materials[i].shaderKeywords;
                if (materials[i].HasProperty(ShaderUtilities.ID_ScaleRatio_A))
                {
                    num5 = materials[i].GetFloat(ShaderUtilities.ID_ScaleRatio_A);
                }
                if (materials[i].HasProperty(ShaderUtilities.ID_FaceDilate))
                {
                    num2 = materials[i].GetFloat(ShaderUtilities.ID_FaceDilate) * num5;
                }
                if (materials[i].HasProperty(ShaderUtilities.ID_OutlineSoftness))
                {
                    num3 = materials[i].GetFloat(ShaderUtilities.ID_OutlineSoftness) * num5;
                }
                if (materials[i].HasProperty(ShaderUtilities.ID_OutlineWidth))
                {
                    num4 = materials[i].GetFloat(ShaderUtilities.ID_OutlineWidth) * num5;
                }
                num10 = num4 + num3 + num2;
                if (materials[i].HasProperty(ShaderUtilities.ID_GlowOffset) && shaderKeywords.Contains(ShaderUtilities.Keyword_Glow))
                {
                    if (materials[i].HasProperty(ShaderUtilities.ID_ScaleRatio_B))
                    {
                        num6 = materials[i].GetFloat(ShaderUtilities.ID_ScaleRatio_B);
                    }
                    num8 = materials[i].GetFloat(ShaderUtilities.ID_GlowOffset) * num6;
                    num9 = materials[i].GetFloat(ShaderUtilities.ID_GlowOuter) * num6;
                }
                num10 = Mathf.Max(num10, num2 + num8 + num9);
                if (materials[i].HasProperty(ShaderUtilities.ID_UnderlaySoftness) && shaderKeywords.Contains(ShaderUtilities.Keyword_Underlay))
                {
                    if (materials[i].HasProperty(ShaderUtilities.ID_ScaleRatio_C))
                    {
                        num7 = materials[i].GetFloat(ShaderUtilities.ID_ScaleRatio_C);
                    }
                    float num11 = materials[i].GetFloat(ShaderUtilities.ID_UnderlayOffsetX) * num7;
                    float num12 = materials[i].GetFloat(ShaderUtilities.ID_UnderlayOffsetY) * num7;
                    float num13 = materials[i].GetFloat(ShaderUtilities.ID_UnderlayDilate) * num7;
                    float num14 = materials[i].GetFloat(ShaderUtilities.ID_UnderlaySoftness) * num7;
                    a.x = Mathf.Max(a.x, num2 + num13 + num14 - num11);
                    a.y = Mathf.Max(a.y, num2 + num13 + num14 - num12);
                    a.z = Mathf.Max(a.z, num2 + num13 + num14 + num11);
                    a.w = Mathf.Max(a.w, num2 + num13 + num14 + num12);
                }
                a.x    = Mathf.Max(a.x, num10);
                a.y    = Mathf.Max(a.y, num10);
                a.z    = Mathf.Max(a.z, num10);
                a.w    = Mathf.Max(a.w, num10);
                a.x   += (float)num;
                a.y   += (float)num;
                a.z   += (float)num;
                a.w   += (float)num;
                a.x    = Mathf.Min(a.x, 1f);
                a.y    = Mathf.Min(a.y, 1f);
                a.z    = Mathf.Min(a.z, 1f);
                a.w    = Mathf.Min(a.w, 1f);
                zero.x = ((zero.x >= a.x) ? zero.x : a.x);
                zero.y = ((zero.y >= a.y) ? zero.y : a.y);
                zero.z = ((zero.z >= a.z) ? zero.z : a.z);
                zero.w = ((zero.w >= a.w) ? zero.w : a.w);
            }
            float @float = materials[0].GetFloat(ShaderUtilities.ID_GradientScale);

            a    *= @float;
            num10 = Mathf.Max(a.x, a.y);
            num10 = Mathf.Max(a.z, num10);
            num10 = Mathf.Max(a.w, num10);
            return(num10 + 0.25f);
        }