Пример #1
0
 public static void GenerateGradient(ref string body)
 {
     body = string.Empty;
     IOUtils.AddFunctionHeader(ref body, "Gradient NewGradient(int type, int colorsLength, int alphasLength, \n\t\tfloat4 colors0, float4 colors1, float4 colors2, float4 colors3, float4 colors4, float4 colors5, float4 colors6, float4 colors7,\n\t\tfloat2 alphas0, float2 alphas1, float2 alphas2, float2 alphas3, float2 alphas4, float2 alphas5, float2 alphas6, float2 alphas7)");
     IOUtils.AddFunctionLine(ref body, "Gradient g;");
     IOUtils.AddFunctionLine(ref body, "g.type = type;");
     IOUtils.AddFunctionLine(ref body, "g.colorsLength = colorsLength;");
     IOUtils.AddFunctionLine(ref body, "g.alphasLength = alphasLength;");
     IOUtils.AddFunctionLine(ref body, "g.colors[ 0 ] = colors0;");
     IOUtils.AddFunctionLine(ref body, "g.colors[ 1 ] = colors1;");
     IOUtils.AddFunctionLine(ref body, "g.colors[ 2 ] = colors2;");
     IOUtils.AddFunctionLine(ref body, "g.colors[ 3 ] = colors3;");
     IOUtils.AddFunctionLine(ref body, "g.colors[ 4 ] = colors4;");
     IOUtils.AddFunctionLine(ref body, "g.colors[ 5 ] = colors5;");
     IOUtils.AddFunctionLine(ref body, "g.colors[ 6 ] = colors6;");
     IOUtils.AddFunctionLine(ref body, "g.colors[ 7 ] = colors7;");
     IOUtils.AddFunctionLine(ref body, "g.alphas[ 0 ] = alphas0;");
     IOUtils.AddFunctionLine(ref body, "g.alphas[ 1 ] = alphas1;");
     IOUtils.AddFunctionLine(ref body, "g.alphas[ 2 ] = alphas2;");
     IOUtils.AddFunctionLine(ref body, "g.alphas[ 3 ] = alphas3;");
     IOUtils.AddFunctionLine(ref body, "g.alphas[ 4 ] = alphas4;");
     IOUtils.AddFunctionLine(ref body, "g.alphas[ 5 ] = alphas5;");
     IOUtils.AddFunctionLine(ref body, "g.alphas[ 6 ] = alphas6;");
     IOUtils.AddFunctionLine(ref body, "g.alphas[ 7 ] = alphas7;");
     IOUtils.AddFunctionLine(ref body, "return g;");
     IOUtils.CloseFunctionBody(ref body);
 }
Пример #2
0
        public void UpdateDataCollectorForStandard(ref MasterNodeDataCollector dataCollector)
        {
#if UNITY_2018_1_OR_NEWER
            if (m_enable)
            {
                for (int i = 0; i < AdditionalUsePasses.Length; i++)
                {
                    dataCollector.AddUsePass(AdditionalUsePasses[i], false);
                }

                for (int i = 0; i < InstancedPragmas.Length; i++)
                {
                    dataCollector.AddToPragmas(-1, InstancedPragmas[i]);
                }
                string functionBody = string.Empty;

                string functionHeader = string.Format(ApplyMeshModificationFunctionStandard[0], dataCollector.SurfaceVertexStructure);
                IOUtils.AddFunctionHeader(ref functionBody, functionHeader);
                for (int i = 1; i < ApplyMeshModificationFunctionStandard.Length; i++)
                {
                    IOUtils.AddFunctionLine(ref functionBody, ApplyMeshModificationFunctionStandard[i]);
                }
                IOUtils.CloseFunctionBody(ref functionBody);

                //string inputName = "input";
                //string uvCoord = "input.texcoord";
                //string vertexNormal = "input.normal";
                //string vertexPos = "input.vertex";

                //string functionHeader = string.Format( ApplyMeshModificationFunctionDefaultTemplate[ 0 ], dataCollector.SurfaceVertexStructure, inputName );
                //IOUtils.AddFunctionHeader( ref functionBody, functionHeader );
                //IOUtils.AddFunctionLine( ref functionBody, ApplyMeshModificationFunctionDefaultTemplate[ 1 ] );
                //IOUtils.AddFunctionLine( ref functionBody,ApplyMeshModificationFunctionDefaultTemplate[ 2 ] );
                //IOUtils.AddFunctionLine( ref functionBody,string.Format( ApplyMeshModificationFunctionDefaultTemplate[ 3 ], vertexPos ) );
                //IOUtils.AddFunctionLine( ref functionBody,ApplyMeshModificationFunctionDefaultTemplate[ 4 ] );
                //IOUtils.AddFunctionLine( ref functionBody,ApplyMeshModificationFunctionDefaultTemplate[ 5 ] );
                //IOUtils.AddFunctionLine( ref functionBody,string.Format( ApplyMeshModificationFunctionDefaultTemplate[ 6 ], uvCoord ) );
                //IOUtils.AddFunctionLine( ref functionBody,string.Format( ApplyMeshModificationFunctionDefaultTemplate[ 7 ], uvCoord ) );
                //IOUtils.AddFunctionLine( ref functionBody,string.Format( ApplyMeshModificationFunctionDefaultTemplate[ 8 ], vertexPos ) );
                //IOUtils.AddFunctionLine( ref functionBody,string.Format( ApplyMeshModificationFunctionDefaultTemplate[ 9 ], vertexPos ) );
                //IOUtils.AddFunctionLine( ref functionBody,string.Format( ApplyMeshModificationFunctionDefaultTemplate[ 10 ], vertexNormal, uvCoord ) );
                //IOUtils.AddFunctionLine( ref functionBody,ApplyMeshModificationFunctionDefaultTemplate[ 11 ] );
                //IOUtils.AddFunctionLine( ref functionBody,string.Format( ApplyMeshModificationFunctionDefaultTemplate[ 12 ], inputName ) );
                //IOUtils.AddFunctionLine( ref functionBody, ApplyMeshModificationFunctionDefaultTemplate[ 13 ] );
                //IOUtils.CloseFunctionBody( ref functionBody );

                dataCollector.AddFunction(functionHeader, functionBody);
                for (int i = 0; i < InstancedGlobalsDefault.Length; i++)
                {
                    dataCollector.AddToUniforms(-1, InstancedGlobalsDefault[i]);
                }

                dataCollector.AddVertexInstruction(string.Format(ApplyMeshModificationInstructionStandard, "v"));
            }
#endif
        }
Пример #3
0
        private void GeneratePattern()
        {
            SetAdditonalTitleText(string.Format(Constants.SubTitleTypeFormatStr, PatternsStr[m_selectedPatternInt]));
            switch (m_selectedPatternInt)
            {
            default:
            case 0:
            {
                m_functionBody   = string.Empty;
                m_functionHeader = "Dither" + PatternsFuncStr[m_selectedPatternInt] + "( {0}, {1} )";
                IOUtils.AddFunctionHeader(ref m_functionBody, "inline float Dither" + PatternsFuncStr[m_selectedPatternInt] + "( int x, int y )");
                IOUtils.AddFunctionLine(ref m_functionBody, "const float dither[ 16 ] = {");
                IOUtils.AddFunctionLine(ref m_functionBody, "	 1,  9,  3, 11,");
                IOUtils.AddFunctionLine(ref m_functionBody, "	13,  5, 15,  7,");
                IOUtils.AddFunctionLine(ref m_functionBody, "	 4, 12,  2, 10,");
                IOUtils.AddFunctionLine(ref m_functionBody, "	16,  8, 14,  6 };");
                IOUtils.AddFunctionLine(ref m_functionBody, "int r = y * 4 + x;");
                IOUtils.AddFunctionLine(ref m_functionBody, "return dither[r] / 16;");
                IOUtils.CloseFunctionBody(ref m_functionBody);
            }
            break;

            case 1:
            {
                m_functionBody   = string.Empty;
                m_functionHeader = "Dither" + PatternsFuncStr[m_selectedPatternInt] + "( {0}, {1} )";
                IOUtils.AddFunctionHeader(ref m_functionBody, "inline float Dither" + PatternsFuncStr[m_selectedPatternInt] + "( int x, int y )");
                IOUtils.AddFunctionLine(ref m_functionBody, "const float dither[ 64 ] = {");
                IOUtils.AddFunctionLine(ref m_functionBody, "	 1, 49, 13, 61,  4, 52, 16, 64,");
                IOUtils.AddFunctionLine(ref m_functionBody, "	33, 17, 45, 29, 36, 20, 48, 32,");
                IOUtils.AddFunctionLine(ref m_functionBody, "	 9, 57,  5, 53, 12, 60,  8, 56,");
                IOUtils.AddFunctionLine(ref m_functionBody, "	41, 25, 37, 21, 44, 28, 40, 24,");
                IOUtils.AddFunctionLine(ref m_functionBody, "	 3, 51, 15, 63,  2, 50, 14, 62,");
                IOUtils.AddFunctionLine(ref m_functionBody, "	35, 19, 47, 31, 34, 18, 46, 30,");
                IOUtils.AddFunctionLine(ref m_functionBody, "	11, 59,  7, 55, 10, 58,  6, 54,");
                IOUtils.AddFunctionLine(ref m_functionBody, "	43, 27, 39, 23, 42, 26, 38, 22};");
                IOUtils.AddFunctionLine(ref m_functionBody, "int r = y * 8 + x;");
                IOUtils.AddFunctionLine(ref m_functionBody, "return dither[r] / 64;");
                IOUtils.CloseFunctionBody(ref m_functionBody);
            }
            break;

            case 2:
            {
                m_functionBody   = string.Empty;
                m_functionHeader = "Dither" + PatternsFuncStr[m_selectedPatternInt] + "( {0}, {1}, {2})";
                IOUtils.AddFunctionHeader(ref m_functionBody, "inline float Dither" + PatternsFuncStr[m_selectedPatternInt] + "( float4 screenPos, sampler2D noiseTexture, float4 noiseTexelSize )");
                IOUtils.AddFunctionLine(ref m_functionBody, "float dither = tex2Dlod( noiseTexture, float4( screenPos.xy * _ScreenParams.xy * noiseTexelSize.xy, 0, 0 ) ).g;");
                IOUtils.AddFunctionLine(ref m_functionBody, "float ditherRate = noiseTexelSize.x * noiseTexelSize.y;");
                IOUtils.AddFunctionLine(ref m_functionBody, "dither = ( 1 - ditherRate ) * dither + ditherRate;");
                IOUtils.AddFunctionLine(ref m_functionBody, "return dither;");
                IOUtils.CloseFunctionBody(ref m_functionBody);
            }
            break;
            }
        }
Пример #4
0
 protected override void CommonInit(int uniqueId)
 {
     base.CommonInit(uniqueId);
     IOUtils.AddFunctionHeader(ref m_functionBody, "float4 CalculateContrast( float contrastValue, float4 colorTarget )");
     IOUtils.AddFunctionLine(ref m_functionBody, "float t = 0.5 * ( 1.0 - contrastValue );");
     IOUtils.AddFunctionLine(ref m_functionBody, "return mul( float4x4( contrastValue, 0, 0, 0,0,contrastValue, 0, 0,0,0,contrastValue, 0,t, t, t, 1 ), colorTarget );");
     IOUtils.CloseFunctionBody(ref m_functionBody);
     AddPorts();
     m_textLabelWidth      = 55;
     m_useInternalPortData = true;
 }
Пример #5
0
 public static void GenerateGradientStruct(ref string body)
 {
     body = string.Empty;
     IOUtils.AddFunctionHeader(ref body, "struct Gradient");
     IOUtils.AddFunctionLine(ref body, "int type;");
     IOUtils.AddFunctionLine(ref body, "int colorsLength;");
     IOUtils.AddFunctionLine(ref body, "int alphasLength;");
     IOUtils.AddFunctionLine(ref body, "float4 colors[8];");
     IOUtils.AddFunctionLine(ref body, "float2 alphas[8];");
     IOUtils.AddSingleLineFunction(ref body, "};\n");
 }
        void GenerateGradientSampler(bool isSrp)
        {
            m_functionBody = string.Empty;
            IOUtils.AddFunctionHeader(ref m_functionBody, "float4 SampleGradient( Gradient gradient, float time )");
            IOUtils.AddFunctionLine(ref m_functionBody, "float3 color = gradient.colors[0].rgb;");
            IOUtils.AddFunctionLine(ref m_functionBody, "UNITY_UNROLL");
            IOUtils.AddFunctionLine(ref m_functionBody, "for (int c = 1; c < 8; c++)");
            IOUtils.AddFunctionLine(ref m_functionBody, "{");
            if (isSrp)
            {
                IOUtils.AddFunctionLine(ref m_functionBody, "float colorPos = saturate((time - gradient.colors[c-1].w) / (gradient.colors[c].w - gradient.colors[c-1].w)) * step(c, gradient.colorsLength-1);");
            }
            else
            {
                IOUtils.AddFunctionLine(ref m_functionBody, "float colorPos = saturate((time - gradient.colors[c-1].w) / (gradient.colors[c].w - gradient.colors[c-1].w)) * step(c, (float)gradient.colorsLength-1);");
            }
            IOUtils.AddFunctionLine(ref m_functionBody, "color = lerp(color, gradient.colors[c].rgb, lerp(colorPos, step(0.01, colorPos), gradient.type));");
            IOUtils.AddFunctionLine(ref m_functionBody, "}");

            IOUtils.AddFunctionLine(ref m_functionBody, "#ifndef UNITY_COLORSPACE_GAMMA");
            if (isSrp)
            {
                IOUtils.AddFunctionLine(ref m_functionBody, "color = SRGBToLinear(color);");
            }
            else
            {
                IOUtils.AddFunctionLine(ref m_functionBody, "color = half3(GammaToLinearSpaceExact(color.r), GammaToLinearSpaceExact(color.g), GammaToLinearSpaceExact(color.b));");
            }
            IOUtils.AddFunctionLine(ref m_functionBody, "#endif");

            IOUtils.AddFunctionLine(ref m_functionBody, "float alpha = gradient.alphas[0].x;");
            IOUtils.AddFunctionLine(ref m_functionBody, "UNITY_UNROLL");
            IOUtils.AddFunctionLine(ref m_functionBody, "for (int a = 1; a < 8; a++)");
            IOUtils.AddFunctionLine(ref m_functionBody, "{");
            if (isSrp)
            {
                IOUtils.AddFunctionLine(ref m_functionBody, "float alphaPos = saturate((time - gradient.alphas[a-1].y) / (gradient.alphas[a].y - gradient.alphas[a-1].y)) * step(a, gradient.alphasLength-1);");
            }
            else
            {
                IOUtils.AddFunctionLine(ref m_functionBody, "float alphaPos = saturate((time - gradient.alphas[a-1].y) / (gradient.alphas[a].y - gradient.alphas[a-1].y)) * step(a, (float)gradient.alphasLength-1);");
            }
            IOUtils.AddFunctionLine(ref m_functionBody, "alpha = lerp(alpha, gradient.alphas[a].x, lerp(alphaPos, step(0.01, alphaPos), gradient.type));");
            IOUtils.AddFunctionLine(ref m_functionBody, "}");
            IOUtils.AddFunctionLine(ref m_functionBody, "return float4(color, alpha);");
            IOUtils.CloseFunctionBody(ref m_functionBody);
        }
Пример #7
0
        private void GeneratePattern()
        {
            SetAdditonalTitleText(string.Format(Constants.SubTitleTypeFormatStr, PatternsStr[m_selectedPatternInt]));
            switch (m_selectedPatternInt)
            {
            default:
            case 0:
            {
                m_functionBody   = string.Empty;
                m_functionHeader = "Dither" + PatternsFuncStr[m_selectedPatternInt] + "( {0}, {1} )";
                IOUtils.AddFunctionHeader(ref m_functionBody, "inline float Dither" + PatternsFuncStr[m_selectedPatternInt] + "( int x, int y )");
                IOUtils.AddFunctionLine(ref m_functionBody, "const float dither[ 16 ] = {");
                IOUtils.AddFunctionLine(ref m_functionBody, "	 1,  9,  3, 11,");
                IOUtils.AddFunctionLine(ref m_functionBody, "	13,  5, 15,  7,");
                IOUtils.AddFunctionLine(ref m_functionBody, "	 4, 12,  2, 10,");
                IOUtils.AddFunctionLine(ref m_functionBody, "	16,  8, 14,  6 };");
                IOUtils.AddFunctionLine(ref m_functionBody, "int r = y * 4 + x;");
                //same as dividing by 16
                IOUtils.AddFunctionLine(ref m_functionBody, "return (dither[r]-1) / 15;");
                IOUtils.CloseFunctionBody(ref m_functionBody);
            }
            break;

            case 1:
            {
                m_functionBody   = string.Empty;
                m_functionHeader = "Dither" + PatternsFuncStr[m_selectedPatternInt] + "( {0}, {1} )";
                IOUtils.AddFunctionHeader(ref m_functionBody, "inline float Dither" + PatternsFuncStr[m_selectedPatternInt] + "( int x, int y )");
                IOUtils.AddFunctionLine(ref m_functionBody, "const float dither[ 64 ] = {");
                IOUtils.AddFunctionLine(ref m_functionBody, "	 1, 49, 13, 61,  4, 52, 16, 64,");
                IOUtils.AddFunctionLine(ref m_functionBody, "	33, 17, 45, 29, 36, 20, 48, 32,");
                IOUtils.AddFunctionLine(ref m_functionBody, "	 9, 57,  5, 53, 12, 60,  8, 56,");
                IOUtils.AddFunctionLine(ref m_functionBody, "	41, 25, 37, 21, 44, 28, 40, 24,");
                IOUtils.AddFunctionLine(ref m_functionBody, "	 3, 51, 15, 63,  2, 50, 14, 62,");
                IOUtils.AddFunctionLine(ref m_functionBody, "	35, 19, 47, 31, 34, 18, 46, 30,");
                IOUtils.AddFunctionLine(ref m_functionBody, "	11, 59,  7, 55, 10, 58,  6, 54,");
                IOUtils.AddFunctionLine(ref m_functionBody, "	43, 27, 39, 23, 42, 26, 38, 22};");
                IOUtils.AddFunctionLine(ref m_functionBody, "int r = y * 8 + x;");
                //same as dividing by 64
                IOUtils.AddFunctionLine(ref m_functionBody, "return (dither[r]-1) / 63;");
                IOUtils.CloseFunctionBody(ref m_functionBody);
            }
            break;
            }
        }
Пример #8
0
        protected override void CommonInit(int uniqueId)
        {
            base.CommonInit(uniqueId);

            IOUtils.AddFunctionHeader(ref m_randomFuncBody, "float3 Random3 ( float3 c )");
            IOUtils.AddFunctionLine(ref m_randomFuncBody, "float fracMul = 512.0;float j = 4096.0*sin ( dot ( c, float3 ( 17.0, 59.4, 15.0 ) ) );float3 r;r.z = frac ( fracMul*j );j *= .125;r.x = frac ( fracMul*j );j *= .125;r.y = frac ( fracMul*j );return r - 0.5;");
            IOUtils.CloseFunctionBody(ref m_randomFuncBody);

            IOUtils.AddFunctionHeader(ref m_simplex3dFuncBody, "float3 Simplex3d ( float3 p )");
            IOUtils.AddFunctionLine(ref m_simplex3dFuncBody, "float F3 = 0.3333333;float G3 = 0.1666667;float3 s = floor ( p + dot ( p, F3.xxx ) );float3 x = p - s + dot ( s,  G3.xxx );float3 e = step ( ( 0.0 ).xxx, x - x.yzx );float3 i1 = e*( 1.0 - e.zxy );float3 i2 = 1.0 - e.zxy*( 1.0 - e );float3 x1 = x - i1 + G3;float3 x2 = x - i2 + 2.0*G3;float3 x3 = x - 1.0 + 3.0*G3;float4 w, d;w.x = dot ( x, x );w.y = dot ( x1, x1 );w.z = dot ( x2, x2 );w.w = dot ( x3, x3 );w = max ( 0.6 - w, 0.0 );d.x = dot ( Random3 ( s ), x );d.y = dot ( Random3 ( s + i1 ), x1 );d.z = dot ( Random3 ( s + i2 ), x2 );d.w = dot ( Random3 ( s + 1.0 ), x3 );w *= w;w *= w;d *= w;return dot ( d, ( 52.0 ).xxx ).xxx;");
            IOUtils.CloseFunctionBody(ref m_simplex3dFuncBody);

            IOUtils.AddFunctionHeader(ref m_simplex3dFractalFuncBody, "float3 Simplex3dFractal ( float3 m )");
            IOUtils.AddFunctionLine(ref m_simplex3dFractalFuncBody, "return (0.5333333*Simplex3d ( m ) + 0.2666667*Simplex3d ( 2.0*m ) + 0.1333333*Simplex3d ( 4.0*m ) + 0.0666667*Simplex3d ( 8.0*m )).xxx;");
            IOUtils.CloseFunctionBody(ref m_simplex3dFractalFuncBody);

            AddInputPort(WirePortDataType.FLOAT3, false, "Position");
            AddInputPort(WirePortDataType.FLOAT, false, "Width");
            AddOutputPort(WirePortDataType.FLOAT3, Constants.EmptyPortValue);
            m_textLabelWidth      = 35;
            m_useInternalPortData = true;
        }
        private void GeneratePOMfunction()
        {
            bool sampleThroughMacros = UIUtils.CurrentWindow.OutsideGraph.SamplingThroughMacros;

            m_functionBody = string.Empty;
            switch (m_pomTexType)
            {
            default:
            case POMTexTypes.Texture2D:
            {
                string sampleParam = sampleThroughMacros ? "TEXTURE2D_PARAM(heightMap,samplerheightMap)" : "sampler2D heightMap";
                IOUtils.AddFunctionHeader(ref m_functionBody, string.Format("inline float2 POM( {0}, float2 uvs, float2 dx, float2 dy, float3 normalWorld, float3 viewWorld, float3 viewDirTan, int minSamples, int maxSamples, float parallax, float refPlane, float2 tilling, float2 curv, int index )", sampleParam));
            }
            break;

            case POMTexTypes.Texture3D:
            {
                string sampleParam = sampleThroughMacros ? "TEXTURE3D_PARAM( heightMap,samplerheightMap) " : "sampler3D heightMap";
                IOUtils.AddFunctionHeader(ref m_functionBody, string.Format("inline float2 POM( {0}, float3 uvs, float3 dx, float3 dy, float3 normalWorld, float3 viewWorld, float3 viewDirTan, int minSamples, int maxSamples, float parallax, float refPlane, float2 tilling, float2 curv, int index )", sampleParam));
            }
            break;

            case POMTexTypes.TextureArray:
                if (UIUtils.CurrentWindow.OutsideGraph.IsSRP)
                {
                    IOUtils.AddFunctionHeader(ref m_functionBody, "inline float2 POM( TEXTURE2D_ARRAY_ARGS(heightMap,sampler##heightMap), float2 uvs, float2 dx, float2 dy, float3 normalWorld, float3 viewWorld, float3 viewDirTan, int minSamples, int maxSamples, float parallax, float refPlane, float2 tilling, float2 curv, int index )");
                }
                else
                {
                    IOUtils.AddFunctionHeader(ref m_functionBody, "inline float2 POM( UNITY_ARGS_TEX2DARRAY(heightMap), float2 uvs, float2 dx, float2 dy, float3 normalWorld, float3 viewWorld, float3 viewDirTan, int minSamples, int maxSamples, float parallax, float refPlane, float2 tilling, float2 curv, int index )");
                }
                break;
            }

            IOUtils.AddFunctionLine(ref m_functionBody, "float3 result = 0;");
            IOUtils.AddFunctionLine(ref m_functionBody, "int stepIndex = 0;");
            //IOUtils.AddFunctionLine( ref m_functionBody, "int numSteps = ( int )( minSamples + dot( viewWorld, normalWorld ) * ( maxSamples - minSamples ) );" );
            //IOUtils.AddFunctionLine( ref m_functionBody, "int numSteps = ( int )lerp( maxSamples, minSamples, length( fwidth( uvs ) ) * 10 );" );
            IOUtils.AddFunctionLine(ref m_functionBody, "int numSteps = ( int )lerp( (float)maxSamples, (float)minSamples, saturate( dot( normalWorld, viewWorld ) ) );");
            IOUtils.AddFunctionLine(ref m_functionBody, "float layerHeight = 1.0 / numSteps;");
            IOUtils.AddFunctionLine(ref m_functionBody, "float2 plane = parallax * ( viewDirTan.xy / viewDirTan.z );");

            switch (m_pomTexType)
            {
            default:
            case POMTexTypes.Texture2D:
                IOUtils.AddFunctionLine(ref m_functionBody, "uvs += refPlane * plane;");
                break;

            case POMTexTypes.Texture3D:
                IOUtils.AddFunctionLine(ref m_functionBody, "uvs.xy += refPlane * plane;");
                break;

            case POMTexTypes.TextureArray:
                IOUtils.AddFunctionLine(ref m_functionBody, "uvs += refPlane * plane;");
                break;
            }

            IOUtils.AddFunctionLine(ref m_functionBody, "float2 deltaTex = -plane * layerHeight;");
            IOUtils.AddFunctionLine(ref m_functionBody, "float2 prevTexOffset = 0;");
            IOUtils.AddFunctionLine(ref m_functionBody, "float prevRayZ = 1.0f;");
            IOUtils.AddFunctionLine(ref m_functionBody, "float prevHeight = 0.0f;");
            IOUtils.AddFunctionLine(ref m_functionBody, "float2 currTexOffset = deltaTex;");
            IOUtils.AddFunctionLine(ref m_functionBody, "float currRayZ = 1.0f - layerHeight;");
            IOUtils.AddFunctionLine(ref m_functionBody, "float currHeight = 0.0f;");
            IOUtils.AddFunctionLine(ref m_functionBody, "float intersection = 0;");
            IOUtils.AddFunctionLine(ref m_functionBody, "float2 finalTexOffset = 0;");
            IOUtils.AddFunctionLine(ref m_functionBody, "while ( stepIndex < numSteps + 1 )");
            IOUtils.AddFunctionLine(ref m_functionBody, "{");
            if (m_useCurvature)
            {
                IOUtils.AddFunctionLine(ref m_functionBody, "	result.z = dot( curv, currTexOffset * currTexOffset );");


                switch (m_pomTexType)
                {
                default:
                case POMTexTypes.Texture2D:
                {
                    if (sampleThroughMacros)
                    {
                        IOUtils.AddFunctionLine(ref m_functionBody, "	currHeight = SAMPLE_TEXTURE2D_GRAD( heightMap, samplerheightMap, uvs + currTexOffset, dx, dy )."+ m_channelTypeVal[m_selectedChannelInt] + " * ( 1 - result.z );");
                    }
                    else
                    {
                        IOUtils.AddFunctionLine(ref m_functionBody, "	currHeight = tex2Dgrad( heightMap, uvs + currTexOffset, dx, dy )."+ m_channelTypeVal[m_selectedChannelInt] + " * ( 1 - result.z );");
                    }
                }
                break;

                case POMTexTypes.Texture3D:
                {
                    if (sampleThroughMacros)
                    {
                        IOUtils.AddFunctionLine(ref m_functionBody, "	currHeight = SAMPLE_TEXTURE2D_GRAD( heightMap, samplerheightMap, uvs + float3(currTexOffset,0), dx, dy )."+ m_channelTypeVal[m_selectedChannelInt] + " * ( 1 - result.z );");
                    }
                    else
                    {
                        IOUtils.AddFunctionLine(ref m_functionBody, "	currHeight = tex3Dgrad( heightMap, uvs + float3(currTexOffset,0), dx, dy )."+ m_channelTypeVal[m_selectedChannelInt] + " * ( 1 - result.z );");
                    }
                }
                break;

                case POMTexTypes.TextureArray:
                    if (UIUtils.CurrentWindow.OutsideGraph.IsSRP)
                    {
                        IOUtils.AddFunctionLine(ref m_functionBody, "	currHeight = SAMPLE_TEXTURE2D_ARRAY_GRAD( heightMap,sampler##heightMap, uvs + currTexOffset,index, dx, dy )."+ m_channelTypeVal[m_selectedChannelInt] + " * ( 1 - result.z );");
                    }
                    else
                    {
                        IOUtils.AddFunctionLine(ref m_functionBody, "	currHeight = ASE_SAMPLE_TEX2DARRAY_GRAD( heightMap, float3(uvs + currTexOffset,index), dx, dy )."+ m_channelTypeVal[m_selectedChannelInt] + " * ( 1 - result.z );");
                    }
                    break;
                }
            }
            else
            {
                switch (m_pomTexType)
                {
                default:
                case POMTexTypes.Texture2D:
                {
                    if (sampleThroughMacros)
                    {
                        IOUtils.AddFunctionLine(ref m_functionBody, "	currHeight = SAMPLE_TEXTURE2D_GRAD( heightMap,samplerheightMap, uvs + currTexOffset, dx, dy )."+ m_channelTypeVal[m_selectedChannelInt] + ";");
                    }
                    else
                    {
                        IOUtils.AddFunctionLine(ref m_functionBody, "	currHeight = tex2Dgrad( heightMap, uvs + currTexOffset, dx, dy )."+ m_channelTypeVal[m_selectedChannelInt] + ";");
                    }
                }
                break;

                case POMTexTypes.Texture3D:
                {
                    if (sampleThroughMacros)
                    {
                        IOUtils.AddFunctionLine(ref m_functionBody, "	currHeight = SAMPLE_TEXTURE2D_GRAD( heightMap, samplerheightMap, uvs + float3(currTexOffset,0), dx, dy )."+ m_channelTypeVal[m_selectedChannelInt] + ";");
                    }
                    else
                    {
                        IOUtils.AddFunctionLine(ref m_functionBody, "	currHeight = tex3Dgrad( heightMap, uvs + float3(currTexOffset,0), dx, dy )."+ m_channelTypeVal[m_selectedChannelInt] + ";");
                    }
                }
                break;

                case POMTexTypes.TextureArray:
                    if (UIUtils.CurrentWindow.OutsideGraph.IsSRP)
                    {
                        IOUtils.AddFunctionLine(ref m_functionBody, "	currHeight = SAMPLE_TEXTURE2D_ARRAY_GRAD( heightMap, sampler##heightMap, uvs + currTexOffset,index, dx, dy )."+ m_channelTypeVal[m_selectedChannelInt] + ";");
                    }
                    else
                    {
                        IOUtils.AddFunctionLine(ref m_functionBody, "	currHeight = ASE_SAMPLE_TEX2DARRAY_GRAD( heightMap,  float3(uvs + currTexOffset,index), dx, dy )."+ m_channelTypeVal[m_selectedChannelInt] + ";");
                    }
                    break;
                }
            }
            IOUtils.AddFunctionLine(ref m_functionBody, "	if ( currHeight > currRayZ )");
            IOUtils.AddFunctionLine(ref m_functionBody, "	{");
            IOUtils.AddFunctionLine(ref m_functionBody, "		stepIndex = numSteps + 1;");
            IOUtils.AddFunctionLine(ref m_functionBody, "	}");
            IOUtils.AddFunctionLine(ref m_functionBody, "	else");
            IOUtils.AddFunctionLine(ref m_functionBody, "	{");
            IOUtils.AddFunctionLine(ref m_functionBody, "		stepIndex++;");
            IOUtils.AddFunctionLine(ref m_functionBody, "		prevTexOffset = currTexOffset;");
            IOUtils.AddFunctionLine(ref m_functionBody, "		prevRayZ = currRayZ;");
            IOUtils.AddFunctionLine(ref m_functionBody, "		prevHeight = currHeight;");
            IOUtils.AddFunctionLine(ref m_functionBody, "		currTexOffset += deltaTex;");
            if (m_useCurvature)
            {
                IOUtils.AddFunctionLine(ref m_functionBody, "		currRayZ -= layerHeight * ( 1 - result.z ) * (1+_CurvFix);");
            }
            else
            {
                IOUtils.AddFunctionLine(ref m_functionBody, "		currRayZ -= layerHeight;");
            }
            IOUtils.AddFunctionLine(ref m_functionBody, "	}");
            IOUtils.AddFunctionLine(ref m_functionBody, "}");

            if (m_sidewallSteps > 0)
            {
                IOUtils.AddFunctionLine(ref m_functionBody, "int sectionSteps = " + m_sidewallSteps + ";");
                IOUtils.AddFunctionLine(ref m_functionBody, "int sectionIndex = 0;");
                IOUtils.AddFunctionLine(ref m_functionBody, "float newZ = 0;");
                IOUtils.AddFunctionLine(ref m_functionBody, "float newHeight = 0;");
                IOUtils.AddFunctionLine(ref m_functionBody, "while ( sectionIndex < sectionSteps )");
                IOUtils.AddFunctionLine(ref m_functionBody, "{");
                IOUtils.AddFunctionLine(ref m_functionBody, "	intersection = ( prevHeight - prevRayZ ) / ( prevHeight - currHeight + currRayZ - prevRayZ );");
                IOUtils.AddFunctionLine(ref m_functionBody, "	finalTexOffset = prevTexOffset + intersection * deltaTex;");
                IOUtils.AddFunctionLine(ref m_functionBody, "	newZ = prevRayZ - intersection * layerHeight;");

                switch (m_pomTexType)
                {
                default:
                case POMTexTypes.Texture2D:
                {
                    if (sampleThroughMacros)
                    {
                        IOUtils.AddFunctionLine(ref m_functionBody, "	newHeight = SAMPLE_TEXTURE2D_GRAD( heightMap, samplerheightMap, uvs + finalTexOffset, dx, dy )."+ m_channelTypeVal[m_selectedChannelInt] + ";");
                    }
                    else
                    {
                        IOUtils.AddFunctionLine(ref m_functionBody, "	newHeight = tex2Dgrad( heightMap, uvs + finalTexOffset, dx, dy )."+ m_channelTypeVal[m_selectedChannelInt] + ";");
                    }
                }
                break;

                case POMTexTypes.Texture3D:
                {
                    if (sampleThroughMacros)
                    {
                        IOUtils.AddFunctionLine(ref m_functionBody, "	newHeight = SAMPLE_TEXTURE2D_GRAD( heightMap, samplerheightMap, uvs + float3(finalTexOffset,0), dx, dy )."+ m_channelTypeVal[m_selectedChannelInt] + ";");
                    }
                    else
                    {
                        IOUtils.AddFunctionLine(ref m_functionBody, "	newHeight = tex3Dgrad( heightMap, uvs + float3(finalTexOffset,0), dx, dy )."+ m_channelTypeVal[m_selectedChannelInt] + ";");
                    }
                }
                break;

                case POMTexTypes.TextureArray:
                    if (UIUtils.CurrentWindow.OutsideGraph.IsSRP)
                    {
                        IOUtils.AddFunctionLine(ref m_functionBody, "	newHeight = SAMPLE_TEXTURE2D_ARRAY_GRAD( heightMap, sampler##heightMap, uvs + finalTexOffset,index, dx, dy )."+ m_channelTypeVal[m_selectedChannelInt] + ";");
                    }
                    else
                    {
                        IOUtils.AddFunctionLine(ref m_functionBody, "	newHeight = ASE_SAMPLE_TEX2DARRAY_GRAD( heightMap, float3(uvs + finalTexOffset,index), dx, dy )."+ m_channelTypeVal[m_selectedChannelInt] + ";");
                    }
                    break;
                }

                IOUtils.AddFunctionLine(ref m_functionBody, "	if ( newHeight > newZ )");
                IOUtils.AddFunctionLine(ref m_functionBody, "	{");
                IOUtils.AddFunctionLine(ref m_functionBody, "		currTexOffset = finalTexOffset;");
                IOUtils.AddFunctionLine(ref m_functionBody, "		currHeight = newHeight;");
                IOUtils.AddFunctionLine(ref m_functionBody, "		currRayZ = newZ;");
                IOUtils.AddFunctionLine(ref m_functionBody, "		deltaTex = intersection * deltaTex;");
                IOUtils.AddFunctionLine(ref m_functionBody, "		layerHeight = intersection * layerHeight;");
                IOUtils.AddFunctionLine(ref m_functionBody, "	}");
                IOUtils.AddFunctionLine(ref m_functionBody, "	else");
                IOUtils.AddFunctionLine(ref m_functionBody, "	{");
                IOUtils.AddFunctionLine(ref m_functionBody, "		prevTexOffset = finalTexOffset;");
                IOUtils.AddFunctionLine(ref m_functionBody, "		prevHeight = newHeight;");
                IOUtils.AddFunctionLine(ref m_functionBody, "		prevRayZ = newZ;");
                IOUtils.AddFunctionLine(ref m_functionBody, "		deltaTex = ( 1 - intersection ) * deltaTex;");
                IOUtils.AddFunctionLine(ref m_functionBody, "		layerHeight = ( 1 - intersection ) * layerHeight;");
                IOUtils.AddFunctionLine(ref m_functionBody, "	}");
                IOUtils.AddFunctionLine(ref m_functionBody, "	sectionIndex++;");
                IOUtils.AddFunctionLine(ref m_functionBody, "}");
            }
            else
            {
                IOUtils.AddFunctionLine(ref m_functionBody, "finalTexOffset = currTexOffset;");
            }

            if (m_useCurvature)
            {
                IOUtils.AddFunctionLine(ref m_functionBody, "#ifdef UNITY_PASS_SHADOWCASTER");
                IOUtils.AddFunctionLine(ref m_functionBody, "if ( unity_LightShadowBias.z == 0.0 )");
                IOUtils.AddFunctionLine(ref m_functionBody, "{");
                IOUtils.AddFunctionLine(ref m_functionBody, "#endif");
                IOUtils.AddFunctionLine(ref m_functionBody, "	if ( result.z > 1 )");
                IOUtils.AddFunctionLine(ref m_functionBody, "		clip( -1 );");
                IOUtils.AddFunctionLine(ref m_functionBody, "#ifdef UNITY_PASS_SHADOWCASTER");
                IOUtils.AddFunctionLine(ref m_functionBody, "}");
                IOUtils.AddFunctionLine(ref m_functionBody, "#endif");
            }

            if (m_clipEnds)
            {
                IOUtils.AddFunctionLine(ref m_functionBody, "result.xy = uvs + finalTexOffset;");
                IOUtils.AddFunctionLine(ref m_functionBody, "#ifdef UNITY_PASS_SHADOWCASTER");
                IOUtils.AddFunctionLine(ref m_functionBody, "if ( unity_LightShadowBias.z == 0.0 )");
                IOUtils.AddFunctionLine(ref m_functionBody, "{");
                IOUtils.AddFunctionLine(ref m_functionBody, "#endif");
                IOUtils.AddFunctionLine(ref m_functionBody, "	if ( result.x < 0 )");
                IOUtils.AddFunctionLine(ref m_functionBody, "		clip( -1 );");
                IOUtils.AddFunctionLine(ref m_functionBody, "	if ( result.x > tilling.x )");
                IOUtils.AddFunctionLine(ref m_functionBody, "		clip( -1 );");
                IOUtils.AddFunctionLine(ref m_functionBody, "	if ( result.y < 0 )");
                IOUtils.AddFunctionLine(ref m_functionBody, "		clip( -1 );");
                IOUtils.AddFunctionLine(ref m_functionBody, "	if ( result.y > tilling.y )");
                IOUtils.AddFunctionLine(ref m_functionBody, "		clip( -1 );");
                IOUtils.AddFunctionLine(ref m_functionBody, "#ifdef UNITY_PASS_SHADOWCASTER");
                IOUtils.AddFunctionLine(ref m_functionBody, "}");
                IOUtils.AddFunctionLine(ref m_functionBody, "#endif");
                IOUtils.AddFunctionLine(ref m_functionBody, "return result.xy;");
            }
            else
            {
                IOUtils.AddFunctionLine(ref m_functionBody, "return uvs + finalTexOffset;");
            }
            IOUtils.CloseFunctionBody(ref m_functionBody);
        }
Пример #10
0
        private void GeneratePOMfunction()
        {
            m_functionBody = string.Empty;
            if (m_useTextureArray)
            {
                IOUtils.AddFunctionHeader(ref m_functionBody, "inline float2 POM( UNITY_ARGS_TEX2DARRAY(heightMap), float2 uvs, float2 dx, float2 dy, float3 normalWorld, float3 viewWorld, float3 viewDirTan, int minSamples, int maxSamples, float parallax, float refPlane, float2 tilling, float2 curv, int index )");
            }
            else
            {
                IOUtils.AddFunctionHeader(ref m_functionBody, "inline float2 POM( sampler2D heightMap, float2 uvs, float2 dx, float2 dy, float3 normalWorld, float3 viewWorld, float3 viewDirTan, int minSamples, int maxSamples, float parallax, float refPlane, float2 tilling, float2 curv, int index )");
            }
            IOUtils.AddFunctionLine(ref m_functionBody, "float3 result = 0;");
            IOUtils.AddFunctionLine(ref m_functionBody, "int stepIndex = 0;");
            //IOUtils.AddFunctionLine( ref m_functionBody, "int numSteps = ( int )( minSamples + dot( viewWorld, normalWorld ) * ( maxSamples - minSamples ) );" );
            //IOUtils.AddFunctionLine( ref m_functionBody, "int numSteps = ( int )lerp( maxSamples, minSamples, length( fwidth( uvs ) ) * 10 );" );
            IOUtils.AddFunctionLine(ref m_functionBody, "int numSteps = ( int )lerp( (float)maxSamples, (float)minSamples, (float)dot( normalWorld, viewWorld ) );");
            IOUtils.AddFunctionLine(ref m_functionBody, "float layerHeight = 1.0 / numSteps;");
            IOUtils.AddFunctionLine(ref m_functionBody, "float2 plane = parallax * ( viewDirTan.xy / viewDirTan.z );");
            IOUtils.AddFunctionLine(ref m_functionBody, "uvs += refPlane * plane;");
            IOUtils.AddFunctionLine(ref m_functionBody, "float2 deltaTex = -plane * layerHeight;");
            IOUtils.AddFunctionLine(ref m_functionBody, "float2 prevTexOffset = 0;");
            IOUtils.AddFunctionLine(ref m_functionBody, "float prevRayZ = 1.0f;");
            IOUtils.AddFunctionLine(ref m_functionBody, "float prevHeight = 0.0f;");
            IOUtils.AddFunctionLine(ref m_functionBody, "float2 currTexOffset = deltaTex;");
            IOUtils.AddFunctionLine(ref m_functionBody, "float currRayZ = 1.0f - layerHeight;");
            IOUtils.AddFunctionLine(ref m_functionBody, "float currHeight = 0.0f;");
            IOUtils.AddFunctionLine(ref m_functionBody, "float intersection = 0;");
            IOUtils.AddFunctionLine(ref m_functionBody, "float2 finalTexOffset = 0;");
            IOUtils.AddFunctionLine(ref m_functionBody, "while ( stepIndex < numSteps + 1 )");
            IOUtils.AddFunctionLine(ref m_functionBody, "{");
            if (m_useCurvature)
            {
                IOUtils.AddFunctionLine(ref m_functionBody, "	result.z = dot( curv, currTexOffset * currTexOffset );");
                if (m_useTextureArray)
                {
                    IOUtils.AddFunctionLine(ref m_functionBody, "	currHeight = ASE_SAMPLE_TEX2DARRAY_GRAD( heightMap, float3(uvs + currTexOffset,index), dx, dy )."+ m_channelTypeVal[m_selectedChannelInt] + " * ( 1 - result.z );");
                }
                else
                {
                    IOUtils.AddFunctionLine(ref m_functionBody, "	currHeight = tex2Dgrad( heightMap, uvs + currTexOffset, dx, dy )."+ m_channelTypeVal[m_selectedChannelInt] + " * ( 1 - result.z );");
                }
            }
            else
            {
                if (m_useTextureArray)
                {
                    IOUtils.AddFunctionLine(ref m_functionBody, "	currHeight = ASE_SAMPLE_TEX2DARRAY_GRAD( heightMap,  float3(uvs + currTexOffset,index), dx, dy )."+ m_channelTypeVal[m_selectedChannelInt] + ";");
                }
                else
                {
                    IOUtils.AddFunctionLine(ref m_functionBody, "	currHeight = tex2Dgrad( heightMap, uvs + currTexOffset, dx, dy )."+ m_channelTypeVal[m_selectedChannelInt] + ";");
                }
            }
            IOUtils.AddFunctionLine(ref m_functionBody, "	if ( currHeight > currRayZ )");
            IOUtils.AddFunctionLine(ref m_functionBody, "	{");
            IOUtils.AddFunctionLine(ref m_functionBody, "		stepIndex = numSteps + 1;");
            IOUtils.AddFunctionLine(ref m_functionBody, "	}");
            IOUtils.AddFunctionLine(ref m_functionBody, "	else");
            IOUtils.AddFunctionLine(ref m_functionBody, "	{");
            IOUtils.AddFunctionLine(ref m_functionBody, "		stepIndex++;");
            IOUtils.AddFunctionLine(ref m_functionBody, "		prevTexOffset = currTexOffset;");
            IOUtils.AddFunctionLine(ref m_functionBody, "		prevRayZ = currRayZ;");
            IOUtils.AddFunctionLine(ref m_functionBody, "		prevHeight = currHeight;");
            IOUtils.AddFunctionLine(ref m_functionBody, "		currTexOffset += deltaTex;");
            if (m_useCurvature)
            {
                IOUtils.AddFunctionLine(ref m_functionBody, "		currRayZ -= layerHeight * ( 1 - result.z ) * (1+_CurvFix);");
            }
            else
            {
                IOUtils.AddFunctionLine(ref m_functionBody, "		currRayZ -= layerHeight;");
            }
            IOUtils.AddFunctionLine(ref m_functionBody, "	}");
            IOUtils.AddFunctionLine(ref m_functionBody, "}");

            if (m_sidewallSteps > 0)
            {
                IOUtils.AddFunctionLine(ref m_functionBody, "int sectionSteps = " + m_sidewallSteps + ";");
                IOUtils.AddFunctionLine(ref m_functionBody, "int sectionIndex = 0;");
                IOUtils.AddFunctionLine(ref m_functionBody, "float newZ = 0;");
                IOUtils.AddFunctionLine(ref m_functionBody, "float newHeight = 0;");
                IOUtils.AddFunctionLine(ref m_functionBody, "while ( sectionIndex < sectionSteps )");
                IOUtils.AddFunctionLine(ref m_functionBody, "{");
                IOUtils.AddFunctionLine(ref m_functionBody, "	intersection = ( prevHeight - prevRayZ ) / ( prevHeight - currHeight + currRayZ - prevRayZ );");
                IOUtils.AddFunctionLine(ref m_functionBody, "	finalTexOffset = prevTexOffset + intersection * deltaTex;");
                IOUtils.AddFunctionLine(ref m_functionBody, "	newZ = prevRayZ - intersection * layerHeight;");
                if (m_useTextureArray)
                {
                    IOUtils.AddFunctionLine(ref m_functionBody, "	newHeight = ASE_SAMPLE_TEX2DARRAY_GRAD( heightMap, float3(uvs + finalTexOffset,index), dx, dy )."+ m_channelTypeVal[m_selectedChannelInt] + ";");
                }
                else
                {
                    IOUtils.AddFunctionLine(ref m_functionBody, "	newHeight = tex2Dgrad( heightMap, uvs + finalTexOffset, dx, dy )."+ m_channelTypeVal[m_selectedChannelInt] + ";");
                }
                IOUtils.AddFunctionLine(ref m_functionBody, "	if ( newHeight > newZ )");
                IOUtils.AddFunctionLine(ref m_functionBody, "	{");
                IOUtils.AddFunctionLine(ref m_functionBody, "		currTexOffset = finalTexOffset;");
                IOUtils.AddFunctionLine(ref m_functionBody, "		currHeight = newHeight;");
                IOUtils.AddFunctionLine(ref m_functionBody, "		currRayZ = newZ;");
                IOUtils.AddFunctionLine(ref m_functionBody, "		deltaTex = intersection * deltaTex;");
                IOUtils.AddFunctionLine(ref m_functionBody, "		layerHeight = intersection * layerHeight;");
                IOUtils.AddFunctionLine(ref m_functionBody, "	}");
                IOUtils.AddFunctionLine(ref m_functionBody, "	else");
                IOUtils.AddFunctionLine(ref m_functionBody, "	{");
                IOUtils.AddFunctionLine(ref m_functionBody, "		prevTexOffset = finalTexOffset;");
                IOUtils.AddFunctionLine(ref m_functionBody, "		prevHeight = newHeight;");
                IOUtils.AddFunctionLine(ref m_functionBody, "		prevRayZ = newZ;");
                IOUtils.AddFunctionLine(ref m_functionBody, "		deltaTex = ( 1 - intersection ) * deltaTex;");
                IOUtils.AddFunctionLine(ref m_functionBody, "		layerHeight = ( 1 - intersection ) * layerHeight;");
                IOUtils.AddFunctionLine(ref m_functionBody, "	}");
                IOUtils.AddFunctionLine(ref m_functionBody, "	sectionIndex++;");
                IOUtils.AddFunctionLine(ref m_functionBody, "}");
            }
            else
            {
                IOUtils.AddFunctionLine(ref m_functionBody, "finalTexOffset = currTexOffset;");
            }

            if (m_useCurvature)
            {
                IOUtils.AddFunctionLine(ref m_functionBody, "#ifdef UNITY_PASS_SHADOWCASTER");
                IOUtils.AddFunctionLine(ref m_functionBody, "if ( unity_LightShadowBias.z == 0.0 )");
                IOUtils.AddFunctionLine(ref m_functionBody, "{");
                IOUtils.AddFunctionLine(ref m_functionBody, "#endif");
                IOUtils.AddFunctionLine(ref m_functionBody, "	if ( result.z > 1 )");
                IOUtils.AddFunctionLine(ref m_functionBody, "		clip( -1 );");
                IOUtils.AddFunctionLine(ref m_functionBody, "#ifdef UNITY_PASS_SHADOWCASTER");
                IOUtils.AddFunctionLine(ref m_functionBody, "}");
                IOUtils.AddFunctionLine(ref m_functionBody, "#endif");
            }

            if (m_clipEnds)
            {
                IOUtils.AddFunctionLine(ref m_functionBody, "result.xy = uvs + finalTexOffset;");
                IOUtils.AddFunctionLine(ref m_functionBody, "#ifdef UNITY_PASS_SHADOWCASTER");
                IOUtils.AddFunctionLine(ref m_functionBody, "if ( unity_LightShadowBias.z == 0.0 )");
                IOUtils.AddFunctionLine(ref m_functionBody, "{");
                IOUtils.AddFunctionLine(ref m_functionBody, "#endif");
                IOUtils.AddFunctionLine(ref m_functionBody, "	if ( result.x < 0 )");
                IOUtils.AddFunctionLine(ref m_functionBody, "		clip( -1 );");
                IOUtils.AddFunctionLine(ref m_functionBody, "	if ( result.x > tilling.x )");
                IOUtils.AddFunctionLine(ref m_functionBody, "		clip( -1 );");
                IOUtils.AddFunctionLine(ref m_functionBody, "	if ( result.y < 0 )");
                IOUtils.AddFunctionLine(ref m_functionBody, "		clip( -1 );");
                IOUtils.AddFunctionLine(ref m_functionBody, "	if ( result.y > tilling.y )");
                IOUtils.AddFunctionLine(ref m_functionBody, "		clip( -1 );");
                IOUtils.AddFunctionLine(ref m_functionBody, "#ifdef UNITY_PASS_SHADOWCASTER");
                IOUtils.AddFunctionLine(ref m_functionBody, "}");
                IOUtils.AddFunctionLine(ref m_functionBody, "#endif");
                IOUtils.AddFunctionLine(ref m_functionBody, "return result.xy;");
            }
            else
            {
                IOUtils.AddFunctionLine(ref m_functionBody, "return uvs + finalTexOffset;");
            }
            IOUtils.CloseFunctionBody(ref m_functionBody);
        }
Пример #11
0
        private void GeneratePattern()
        {
            SetAdditonalTitleText(string.Format(Constants.SubTitleTypeFormatStr, PatternsStr[m_selectedPatternInt]));
            switch (m_selectedPatternInt)
            {
            default:
            case 0:
            {
                m_functionBody   = string.Empty;
                m_functionHeader = "Dither" + PatternsFuncStr[m_selectedPatternInt] + "( {0}, {1} )";
                IOUtils.AddFunctionHeader(ref m_functionBody, "inline float Dither" + PatternsFuncStr[m_selectedPatternInt] + "( int x, int y )");
                IOUtils.AddFunctionLine(ref m_functionBody, "const float dither[ 16 ] = {");
                IOUtils.AddFunctionLine(ref m_functionBody, "	 1,  9,  3, 11,");
                IOUtils.AddFunctionLine(ref m_functionBody, "	13,  5, 15,  7,");
                IOUtils.AddFunctionLine(ref m_functionBody, "	 4, 12,  2, 10,");
                IOUtils.AddFunctionLine(ref m_functionBody, "	16,  8, 14,  6 };");
                IOUtils.AddFunctionLine(ref m_functionBody, "int r = y * 4 + x;");
                IOUtils.AddFunctionLine(ref m_functionBody, "return dither[r] / 16; // same # of instructions as pre-dividing due to compiler magic");
                IOUtils.CloseFunctionBody(ref m_functionBody);
            }
            break;

            case 1:
            {
                m_functionBody   = string.Empty;
                m_functionHeader = "Dither" + PatternsFuncStr[m_selectedPatternInt] + "( {0}, {1} )";
                IOUtils.AddFunctionHeader(ref m_functionBody, "inline float Dither" + PatternsFuncStr[m_selectedPatternInt] + "( int x, int y )");
                IOUtils.AddFunctionLine(ref m_functionBody, "const float dither[ 64 ] = {");
                IOUtils.AddFunctionLine(ref m_functionBody, "	 1, 49, 13, 61,  4, 52, 16, 64,");
                IOUtils.AddFunctionLine(ref m_functionBody, "	33, 17, 45, 29, 36, 20, 48, 32,");
                IOUtils.AddFunctionLine(ref m_functionBody, "	 9, 57,  5, 53, 12, 60,  8, 56,");
                IOUtils.AddFunctionLine(ref m_functionBody, "	41, 25, 37, 21, 44, 28, 40, 24,");
                IOUtils.AddFunctionLine(ref m_functionBody, "	 3, 51, 15, 63,  2, 50, 14, 62,");
                IOUtils.AddFunctionLine(ref m_functionBody, "	35, 19, 47, 31, 34, 18, 46, 30,");
                IOUtils.AddFunctionLine(ref m_functionBody, "	11, 59,  7, 55, 10, 58,  6, 54,");
                IOUtils.AddFunctionLine(ref m_functionBody, "	43, 27, 39, 23, 42, 26, 38, 22};");
                IOUtils.AddFunctionLine(ref m_functionBody, "int r = y * 8 + x;");
                IOUtils.AddFunctionLine(ref m_functionBody, "return dither[r] / 64; // same # of instructions as pre-dividing due to compiler magic");
                IOUtils.CloseFunctionBody(ref m_functionBody);
            }
            break;

            case 2:
            {
                bool sampleThroughMacros = UIUtils.CurrentWindow.OutsideGraph.SamplingThroughMacros;

                m_functionBody   = string.Empty;
                m_functionHeader = "Dither" + PatternsFuncStr[m_selectedPatternInt] + "( {0}, {1}, {2})";

                if (sampleThroughMacros)
                {
                    IOUtils.AddFunctionHeader(ref m_functionBody, "inline float Dither" + PatternsFuncStr[m_selectedPatternInt] + "( float4 screenPos, TEXTURE2D_PARAM( noiseTexture, samplernoiseTexture ), float4 noiseTexelSize )");
                    IOUtils.AddFunctionLine(ref m_functionBody, "float dither = SAMPLE_TEXTURE2D_LOD( noiseTexture, samplernoiseTexture, float3( screenPos.xy * _ScreenParams.xy * noiseTexelSize.xy, 0 ), 0 ).g;");
                }
                else
                {
                    IOUtils.AddFunctionHeader(ref m_functionBody, "inline float Dither" + PatternsFuncStr[m_selectedPatternInt] + "( float4 screenPos, sampler2D noiseTexture, float4 noiseTexelSize )");
                    IOUtils.AddFunctionLine(ref m_functionBody, "float dither = tex2Dlod( noiseTexture, float4( screenPos.xy * _ScreenParams.xy * noiseTexelSize.xy, 0, 0 ) ).g;");
                }
                IOUtils.AddFunctionLine(ref m_functionBody, "float ditherRate = noiseTexelSize.x * noiseTexelSize.y;");
                IOUtils.AddFunctionLine(ref m_functionBody, "dither = ( 1 - ditherRate ) * dither + ditherRate;");
                IOUtils.AddFunctionLine(ref m_functionBody, "return dither;");
                IOUtils.CloseFunctionBody(ref m_functionBody);
            }
            break;
            }
        }
Пример #12
0
        public override string GenerateShaderForOutput(int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar)
        {
            //ConfigureFunctions();
            dataCollector.AddPropertyNode(m_topTexture);
            dataCollector.AddPropertyNode(m_midTexture);
            dataCollector.AddPropertyNode(m_botTexture);

            bool isVertex = (dataCollector.PortCategory == MasterNodePortCategory.Tessellation || dataCollector.PortCategory == MasterNodePortCategory.Vertex);

            string texTop = string.Empty;
            string texMid = string.Empty;
            string texBot = string.Empty;

            if (m_inputPorts[0].IsConnected)
            {
                texTop = m_inputPorts[0].GeneratePortInstructions(ref dataCollector);
            }
            else
            {
                dataCollector.AddToUniforms(m_uniqueId, m_topTexture.GetTexture2DUniformValue());
                dataCollector.AddToProperties(m_uniqueId, m_topTexture.GetTexture2DPropertyValue(), m_topTexture.OrderIndex);
                texTop = m_topTexture.PropertyName;
            }

            if (m_selectedTriplanarType == TriplanarType.Spherical)
            {
                texMid = texTop;
                texBot = texTop;
            }
            else
            {
                if (m_inputPorts[1].IsConnected)
                {
                    texMid = m_inputPorts[1].GeneratePortInstructions(ref dataCollector);
                }
                else
                {
                    dataCollector.AddToUniforms(m_uniqueId, m_midTexture.GetTexture2DUniformValue());
                    dataCollector.AddToProperties(m_uniqueId, m_midTexture.GetTexture2DPropertyValue(), m_midTexture.OrderIndex);
                    texMid = m_midTexture.PropertyName;
                }

                if (m_inputPorts[2].IsConnected)
                {
                    texBot = m_inputPorts[2].GeneratePortInstructions(ref dataCollector);
                }
                else
                {
                    dataCollector.AddToUniforms(m_uniqueId, m_botTexture.GetTexture2DUniformValue());
                    dataCollector.AddToProperties(m_uniqueId, m_botTexture.GetTexture2DPropertyValue(), m_botTexture.OrderIndex);
                    texBot = m_botTexture.PropertyName;
                }
            }

            dataCollector.AddToInput(m_uniqueId, UIUtils.GetInputDeclarationFromType(m_currentPrecisionType, AvailableSurfaceInputs.WORLD_POS), true);
            dataCollector.AddToInput(m_uniqueId, UIUtils.GetInputDeclarationFromType(m_currentPrecisionType, AvailableSurfaceInputs.WORLD_NORMAL), true);
            string tilling = m_inputPorts[3].GeneratePortInstructions(ref dataCollector);
            string falloff = m_inputPorts[4].GeneratePortInstructions(ref dataCollector);

            dataCollector.ForceNormal = true;

            dataCollector.AddToInput(m_uniqueId, Constants.InternalData, false);

            if (m_normalCorrection)
            {
                string worldToTangent = GeneratorUtils.GenerateWorldToTangentMatrix(ref dataCollector, m_uniqueId, m_currentPrecisionType);

                string pos  = GeneratorUtils.GenerateWorldPosition(ref dataCollector, m_uniqueId);
                string norm = GeneratorUtils.GenerateWorldNormal(ref dataCollector, m_uniqueId);
                if (m_selectedTriplanarSpace == TriplanarSpace.Object)
                {
                    dataCollector.AddLocalVariable(m_uniqueId, "float3 localTangent = mul( unity_WorldToObject, float4( " + GeneratorUtils.WorldTangentStr + ", 0 ) );");
                    dataCollector.AddLocalVariable(m_uniqueId, "float3 localBitangent = mul( unity_WorldToObject, float4( " + GeneratorUtils.WorldBitangentStr + ", 0 ) );");
                    dataCollector.AddLocalVariable(m_uniqueId, "float3 localNormal = mul( unity_WorldToObject, float4( " + GeneratorUtils.WorldNormalStr + ", 0 ) );");
                    norm = "localNormal";
                    dataCollector.AddLocalVariable(m_uniqueId, "float3x3 objectToTangent = float3x3(localTangent, localBitangent, localNormal);");
                    dataCollector.AddLocalVariable(m_uniqueId, "float3 localPos = mul( unity_WorldToObject, float4( " + pos + ", 1 ) );");
                    pos            = "localPos";
                    worldToTangent = "objectToTangent";
                }

                string normalTriplanar = string.Empty;
                IOUtils.AddFunctionHeader(ref normalTriplanar, m_functionNormalHeader);
                if (m_selectedTriplanarType == TriplanarType.Spherical)
                {
                    for (int i = 0; i < m_functionNormalBody.Length; i++)
                    {
                        IOUtils.AddFunctionLine(ref normalTriplanar, m_functionNormalBody[i]);
                    }
                }
                else
                {
                    for (int i = 0; i < m_functionNormalBodyTMB.Length; i++)
                    {
                        IOUtils.AddFunctionLine(ref normalTriplanar, m_functionNormalBodyTMB[i]);
                    }
                }
                IOUtils.CloseFunctionBody(ref normalTriplanar);

                string call = dataCollector.AddFunctions(m_functionNormalCall, normalTriplanar, texTop, texMid, texBot, pos, norm, falloff, tilling, (isVertex ? "1" : "0"));
                dataCollector.AddToLocalVariables(dataCollector.PortCategory, m_uniqueId, "float3 worldTriplanarNormal" + m_uniqueId + " = " + call + ";");
                dataCollector.AddToLocalVariables(dataCollector.PortCategory, m_uniqueId, "float3 tanTriplanarNormal" + m_uniqueId + " = mul( " + worldToTangent + ", worldTriplanarNormal" + m_uniqueId + " );");
                return(GetOutputVectorItem(0, outputId, "tanTriplanarNormal" + m_uniqueId));
            }
            else
            {
                string samplingTriplanar = string.Empty;
                IOUtils.AddFunctionHeader(ref samplingTriplanar, m_functionSamplingHeader);
                if (m_selectedTriplanarType == TriplanarType.Spherical)
                {
                    for (int i = 0; i < m_functionSamplingBody.Length; i++)
                    {
                        IOUtils.AddFunctionLine(ref samplingTriplanar, m_functionSamplingBody[i]);
                    }
                }
                else
                {
                    for (int i = 0; i < m_functionSamplingBodyTMB.Length; i++)
                    {
                        IOUtils.AddFunctionLine(ref samplingTriplanar, m_functionSamplingBodyTMB[i]);
                    }
                }
                IOUtils.CloseFunctionBody(ref samplingTriplanar);

                string pos  = GeneratorUtils.GenerateWorldPosition(ref dataCollector, m_uniqueId);
                string norm = GeneratorUtils.GenerateWorldNormal(ref dataCollector, m_uniqueId);
                if (m_selectedTriplanarSpace == TriplanarSpace.Object)
                {
                    dataCollector.AddToLocalVariables(dataCollector.PortCategory, m_uniqueId, "float3 localPos = mul( unity_WorldToObject, float4( " + pos + ", 1 ) );");
                    pos = "localPos";
                    dataCollector.AddToLocalVariables(dataCollector.PortCategory, m_uniqueId, "float3 localNormal = mul( unity_WorldToObject, float4( " + norm + ", 0 ) );");
                    norm = "localNormal";
                }

                string call = dataCollector.AddFunctions(m_functionSamplingCall, samplingTriplanar, texTop, texMid, texBot, pos, norm, falloff, tilling, (isVertex ? "1" : "0"));
                dataCollector.AddToLocalVariables(dataCollector.PortCategory, m_uniqueId, "float4 triplanar" + m_uniqueId + " = " + call + ";");
                return(GetOutputVectorItem(0, outputId, "triplanar" + m_uniqueId));
            }
        }
        private void GeneratePOMfunction(ref MasterNodeDataCollector dataCollector)
        {
            ParentGraph outsideGraph = UIUtils.CurrentWindow.OutsideGraph;

            m_functionBody = string.Empty;
            switch (m_texPort.DataType)
            {
            default:
            case WirePortDataType.SAMPLER2D:
            {
                string sampleParam = string.Empty;
                sampleParam = GeneratorUtils.GetPropertyDeclaraction("heightMap", TextureType.Texture2D, ", ") + GeneratorUtils.GetSamplerDeclaraction("samplerheightMap", TextureType.Texture2D, ", ");
                IOUtils.AddFunctionHeader(ref m_functionBody, string.Format("inline float2 POM( {0}float2 uvs, float2 dx, float2 dy, float3 normalWorld, float3 viewWorld, float3 viewDirTan, int minSamples, int maxSamples, float parallax, float refPlane, float2 tilling, float2 curv, int index )", sampleParam));
            }
            break;

            case WirePortDataType.SAMPLER3D:
            {
                string sampleParam = string.Empty;
                sampleParam = GeneratorUtils.GetPropertyDeclaraction("heightMap", TextureType.Texture3D, ", ") + GeneratorUtils.GetSamplerDeclaraction("samplerheightMap", TextureType.Texture3D, ", ");
                IOUtils.AddFunctionHeader(ref m_functionBody, string.Format("inline float2 POM( {0}float3 uvs, float3 dx, float3 dy, float3 normalWorld, float3 viewWorld, float3 viewDirTan, int minSamples, int maxSamples, float parallax, float refPlane, float2 tilling, float2 curv, int index )", sampleParam));
            }
            break;

            case WirePortDataType.SAMPLER2DARRAY:
                if (outsideGraph.IsSRP)
                {
                    IOUtils.AddFunctionHeader(ref m_functionBody, "inline float2 POM( TEXTURE2D_ARRAY(heightMap), SAMPLER(samplerheightMap), float2 uvs, float2 dx, float2 dy, float3 normalWorld, float3 viewWorld, float3 viewDirTan, int minSamples, int maxSamples, float parallax, float refPlane, float2 tilling, float2 curv, int index )");
                }
                else
#if !UNITY_2018_1_OR_NEWER
                if (outsideGraph.IsStandardSurface)
                {
                    IOUtils.AddFunctionHeader(ref m_functionBody, "inline float2 POM( UNITY_ARGS_TEX2DARRAY(heightMap), float2 uvs, float2 dx, float2 dy, float3 normalWorld, float3 viewWorld, float3 viewDirTan, int minSamples, int maxSamples, float parallax, float refPlane, float2 tilling, float2 curv, int index )");
                }
                else
#endif
                { IOUtils.AddFunctionHeader(ref m_functionBody, "inline float2 POM( UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(heightMap), SamplerState samplerheightMap, float2 uvs, float2 dx, float2 dy, float3 normalWorld, float3 viewWorld, float3 viewDirTan, int minSamples, int maxSamples, float parallax, float refPlane, float2 tilling, float2 curv, int index )"); }
                break;
            }

            IOUtils.AddFunctionLine(ref m_functionBody, "float3 result = 0;");
            IOUtils.AddFunctionLine(ref m_functionBody, "int stepIndex = 0;");
            //IOUtils.AddFunctionLine( ref m_functionBody, "int numSteps = ( int )( minSamples + dot( viewWorld, normalWorld ) * ( maxSamples - minSamples ) );" );
            //IOUtils.AddFunctionLine( ref m_functionBody, "int numSteps = ( int )lerp( maxSamples, minSamples, length( fwidth( uvs ) ) * 10 );" );
            IOUtils.AddFunctionLine(ref m_functionBody, "int numSteps = ( int )lerp( (float)maxSamples, (float)minSamples, saturate( dot( normalWorld, viewWorld ) ) );");
            IOUtils.AddFunctionLine(ref m_functionBody, "float layerHeight = 1.0 / numSteps;");
            IOUtils.AddFunctionLine(ref m_functionBody, "float2 plane = parallax * ( viewDirTan.xy / viewDirTan.z );");
            IOUtils.AddFunctionLine(ref m_functionBody, "uvs.xy += refPlane * plane;");
            IOUtils.AddFunctionLine(ref m_functionBody, "float2 deltaTex = -plane * layerHeight;");
            IOUtils.AddFunctionLine(ref m_functionBody, "float2 prevTexOffset = 0;");
            IOUtils.AddFunctionLine(ref m_functionBody, "float prevRayZ = 1.0f;");
            IOUtils.AddFunctionLine(ref m_functionBody, "float prevHeight = 0.0f;");
            IOUtils.AddFunctionLine(ref m_functionBody, "float2 currTexOffset = deltaTex;");
            IOUtils.AddFunctionLine(ref m_functionBody, "float currRayZ = 1.0f - layerHeight;");
            IOUtils.AddFunctionLine(ref m_functionBody, "float currHeight = 0.0f;");
            IOUtils.AddFunctionLine(ref m_functionBody, "float intersection = 0;");
            IOUtils.AddFunctionLine(ref m_functionBody, "float2 finalTexOffset = 0;");
            IOUtils.AddFunctionLine(ref m_functionBody, "while ( stepIndex < numSteps + 1 )");
            IOUtils.AddFunctionLine(ref m_functionBody, "{");

            string textureProp = "heightMap";
            string sampleState = "samplerheightMap";

            string uvs = "uvs + currTexOffset";
            if (m_texPort.DataType == WirePortDataType.SAMPLER3D)
            {
                uvs = "float3(uvs.xy + currTexOffset, uvs.z)";
            }
            else if (m_texPort.DataType == WirePortDataType.SAMPLER2DARRAY)
            {
                uvs = outsideGraph.IsSRP ? uvs + ", index" : "float3(" + uvs + ", index)";
            }

            string samplingCall = GeneratorUtils.GenerateSamplingCall(ref dataCollector, m_texPort.DataType, textureProp, sampleState, uvs, MipType.Derivative, "dx", "dy");
            if (m_useCurvature)
            {
                IOUtils.AddFunctionLine(ref m_functionBody, " \tresult.z = dot( curv, currTexOffset * currTexOffset );");
                IOUtils.AddFunctionLine(ref m_functionBody, " \tcurrHeight = " + samplingCall + "." + m_channelTypeVal[m_selectedChannelInt] + " * ( 1 - result.z );");
            }
            else
            {
                IOUtils.AddFunctionLine(ref m_functionBody, " \tcurrHeight = " + samplingCall + "." + m_channelTypeVal[m_selectedChannelInt] + ";");
            }
            IOUtils.AddFunctionLine(ref m_functionBody, " \tif ( currHeight > currRayZ )");
            IOUtils.AddFunctionLine(ref m_functionBody, " \t{");
            IOUtils.AddFunctionLine(ref m_functionBody, " \t \tstepIndex = numSteps + 1;");
            IOUtils.AddFunctionLine(ref m_functionBody, " \t}");
            IOUtils.AddFunctionLine(ref m_functionBody, " \telse");
            IOUtils.AddFunctionLine(ref m_functionBody, " \t{");
            IOUtils.AddFunctionLine(ref m_functionBody, " \t \tstepIndex++;");
            IOUtils.AddFunctionLine(ref m_functionBody, " \t \tprevTexOffset = currTexOffset;");
            IOUtils.AddFunctionLine(ref m_functionBody, " \t \tprevRayZ = currRayZ;");
            IOUtils.AddFunctionLine(ref m_functionBody, " \t \tprevHeight = currHeight;");
            IOUtils.AddFunctionLine(ref m_functionBody, " \t \tcurrTexOffset += deltaTex;");
            if (m_useCurvature)
            {
                IOUtils.AddFunctionLine(ref m_functionBody, " \t \tcurrRayZ -= layerHeight * ( 1 - result.z ) * (1+_CurvFix);");
            }
            else
            {
                IOUtils.AddFunctionLine(ref m_functionBody, " \t \tcurrRayZ -= layerHeight;");
            }
            IOUtils.AddFunctionLine(ref m_functionBody, " \t}");
            IOUtils.AddFunctionLine(ref m_functionBody, "}");

            if (m_sidewallSteps > 0)
            {
                IOUtils.AddFunctionLine(ref m_functionBody, "int sectionSteps = " + m_sidewallSteps + ";");
                IOUtils.AddFunctionLine(ref m_functionBody, "int sectionIndex = 0;");
                IOUtils.AddFunctionLine(ref m_functionBody, "float newZ = 0;");
                IOUtils.AddFunctionLine(ref m_functionBody, "float newHeight = 0;");
                IOUtils.AddFunctionLine(ref m_functionBody, "while ( sectionIndex < sectionSteps )");
                IOUtils.AddFunctionLine(ref m_functionBody, "{");
                IOUtils.AddFunctionLine(ref m_functionBody, " \tintersection = ( prevHeight - prevRayZ ) / ( prevHeight - currHeight + currRayZ - prevRayZ );");
                IOUtils.AddFunctionLine(ref m_functionBody, " \tfinalTexOffset = prevTexOffset + intersection * deltaTex;");
                IOUtils.AddFunctionLine(ref m_functionBody, " \tnewZ = prevRayZ - intersection * layerHeight;");

                string uvs2 = "uvs + finalTexOffset";
                if (m_texPort.DataType == WirePortDataType.SAMPLER3D)
                {
                    uvs2 = "float3(uvs.xy + finalTexOffset, uvs.z)";
                }
                else if (m_texPort.DataType == WirePortDataType.SAMPLER2DARRAY)
                {
                    uvs2 = outsideGraph.IsSRP ? uvs2 + ", index" : "float3(" + uvs2 + ", index)";
                }

                string samplingCall2 = GeneratorUtils.GenerateSamplingCall(ref dataCollector, m_texPort.DataType, textureProp, sampleState, uvs2, MipType.Derivative, "dx", "dy");
                IOUtils.AddFunctionLine(ref m_functionBody, " \tnewHeight = " + samplingCall2 + "." + m_channelTypeVal[m_selectedChannelInt] + ";");

                IOUtils.AddFunctionLine(ref m_functionBody, " \tif ( newHeight > newZ )");
                IOUtils.AddFunctionLine(ref m_functionBody, " \t{");
                IOUtils.AddFunctionLine(ref m_functionBody, " \t \tcurrTexOffset = finalTexOffset;");
                IOUtils.AddFunctionLine(ref m_functionBody, " \t \tcurrHeight = newHeight;");
                IOUtils.AddFunctionLine(ref m_functionBody, " \t \tcurrRayZ = newZ;");
                IOUtils.AddFunctionLine(ref m_functionBody, " \t \tdeltaTex = intersection * deltaTex;");
                IOUtils.AddFunctionLine(ref m_functionBody, " \t \tlayerHeight = intersection * layerHeight;");
                IOUtils.AddFunctionLine(ref m_functionBody, " \t}");
                IOUtils.AddFunctionLine(ref m_functionBody, " \telse");
                IOUtils.AddFunctionLine(ref m_functionBody, " \t{");
                IOUtils.AddFunctionLine(ref m_functionBody, " \t \tprevTexOffset = finalTexOffset;");
                IOUtils.AddFunctionLine(ref m_functionBody, " \t \tprevHeight = newHeight;");
                IOUtils.AddFunctionLine(ref m_functionBody, " \t \tprevRayZ = newZ;");
                IOUtils.AddFunctionLine(ref m_functionBody, " \t \tdeltaTex = ( 1 - intersection ) * deltaTex;");
                IOUtils.AddFunctionLine(ref m_functionBody, " \t \tlayerHeight = ( 1 - intersection ) * layerHeight;");
                IOUtils.AddFunctionLine(ref m_functionBody, " \t}");
                IOUtils.AddFunctionLine(ref m_functionBody, " \tsectionIndex++;");
                IOUtils.AddFunctionLine(ref m_functionBody, "}");
            }
            else
            {
                IOUtils.AddFunctionLine(ref m_functionBody, "finalTexOffset = currTexOffset;");
            }

            if (m_useCurvature)
            {
                IOUtils.AddFunctionLine(ref m_functionBody, "#ifdef UNITY_PASS_SHADOWCASTER");
                IOUtils.AddFunctionLine(ref m_functionBody, "if ( unity_LightShadowBias.z == 0.0 )");
                IOUtils.AddFunctionLine(ref m_functionBody, "{");
                IOUtils.AddFunctionLine(ref m_functionBody, "#endif");
                IOUtils.AddFunctionLine(ref m_functionBody, " \tif ( result.z > 1 )");
                IOUtils.AddFunctionLine(ref m_functionBody, " \t \tclip( -1 );");
                IOUtils.AddFunctionLine(ref m_functionBody, "#ifdef UNITY_PASS_SHADOWCASTER");
                IOUtils.AddFunctionLine(ref m_functionBody, "}");
                IOUtils.AddFunctionLine(ref m_functionBody, "#endif");
            }

            if (m_clipEnds)
            {
                IOUtils.AddFunctionLine(ref m_functionBody, "result.xy = uvs.xy + finalTexOffset;");
                IOUtils.AddFunctionLine(ref m_functionBody, "#ifdef UNITY_PASS_SHADOWCASTER");
                IOUtils.AddFunctionLine(ref m_functionBody, "if ( unity_LightShadowBias.z == 0.0 )");
                IOUtils.AddFunctionLine(ref m_functionBody, "{");
                IOUtils.AddFunctionLine(ref m_functionBody, "#endif");
                IOUtils.AddFunctionLine(ref m_functionBody, " \tif ( result.x < 0 )");
                IOUtils.AddFunctionLine(ref m_functionBody, " \t \tclip( -1 );");
                IOUtils.AddFunctionLine(ref m_functionBody, " \tif ( result.x > tilling.x )");
                IOUtils.AddFunctionLine(ref m_functionBody, " \t \tclip( -1 );");
                IOUtils.AddFunctionLine(ref m_functionBody, " \tif ( result.y < 0 )");
                IOUtils.AddFunctionLine(ref m_functionBody, " \t \tclip( -1 );");
                IOUtils.AddFunctionLine(ref m_functionBody, " \tif ( result.y > tilling.y )");
                IOUtils.AddFunctionLine(ref m_functionBody, " \t \tclip( -1 );");
                IOUtils.AddFunctionLine(ref m_functionBody, "#ifdef UNITY_PASS_SHADOWCASTER");
                IOUtils.AddFunctionLine(ref m_functionBody, "}");
                IOUtils.AddFunctionLine(ref m_functionBody, "#endif");
                IOUtils.AddFunctionLine(ref m_functionBody, "return result.xy;");
            }
            else
            {
                IOUtils.AddFunctionLine(ref m_functionBody, "return uvs.xy + finalTexOffset;");
            }
            IOUtils.CloseFunctionBody(ref m_functionBody);
        }
Пример #14
0
        public override string GenerateShaderForOutput(int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar)
        {
            if (m_outputPorts[outputId].IsLocalValue(dataCollector.PortCategory))
            {
                return(m_outputPorts[outputId].LocalValue(dataCollector.PortCategory));
            }

            if (m_useUnity)
            {
                string uvValue     = m_inputPorts[0].GeneratePortInstructions(ref dataCollector);
                string angleOffset = m_inputPorts[1].GeneratePortInstructions(ref dataCollector);
                string cellDensity = m_inputPorts[2].GeneratePortInstructions(ref dataCollector);
                dataCollector.AddFunction(UnityVoroniNoiseFunctionsBody[0], UnityVoroniNoiseFunctionsBody, false);
                string varName  = "unityVoronoy" + OutputId;
                string varValue = string.Format(UnityVoronoiNoiseFunc, uvValue, angleOffset, cellDensity);
                dataCollector.AddLocalVariable(UniqueId, CurrentPrecisionType, WirePortDataType.FLOAT2, varName, varValue);
                m_outputPorts[0].SetLocalValue(varName + ".x", dataCollector.PortCategory);
                m_outputPorts[1].SetLocalValue(varName + ".y", dataCollector.PortCategory);
                return(m_outputPorts[outputId].LocalValue(dataCollector.PortCategory));
            }
            else
            {
                string scaleValue = m_inputPorts[2].GeneratePortInstructions(ref dataCollector);

                string timeVarValue = m_inputPorts[1].GeneratePortInstructions(ref dataCollector);
                string timeVarName  = "time" + OutputId;
                dataCollector.AddLocalVariable(UniqueId, CurrentPrecisionType, WirePortDataType.FLOAT, timeVarName, timeVarValue);

                ChangeFunction(scaleValue);

                string voronoiHashFunc            = string.Empty;
                string VoronoiHashHeaderFormatted = string.Format(VoronoiHashHeader, OutputId);
                IOUtils.AddFunctionHeader(ref voronoiHashFunc, VoronoiHashHeaderFormatted);
                for (int i = 0; i < VoronoiHashBody.Length; i++)
                {
                    IOUtils.AddFunctionLine(ref voronoiHashFunc, VoronoiHashBody[i]);
                }
                IOUtils.CloseFunctionBody(ref voronoiHashFunc);
                dataCollector.AddFunction(VoronoiHashHeaderFormatted, voronoiHashFunc);

                string smoothnessName = "0";
                if (m_calculateSmoothValue)
                {
                    smoothnessName = "voronoiSmooth" + outputId;
                    string smoothnessValue = m_inputPorts[3].GeneratePortInstructions(ref dataCollector);
                    dataCollector.AddLocalVariable(UniqueId, CurrentPrecisionType, WirePortDataType.FLOAT, smoothnessName, smoothnessValue);
                }

                string voronoiFunc = string.Empty;
                IOUtils.AddFunctionHeader(ref voronoiFunc, string.Format(VoronoiHeader, OutputId));
                for (int i = 0; i < VoronoiBody.Length; i++)
                {
                    if (i == 9)
                    {
                        IOUtils.AddFunctionLine(ref voronoiFunc, string.Format(VoronoiBody[i], OutputId));
                    }
                    else
                    {
                        IOUtils.AddFunctionLine(ref voronoiFunc, VoronoiBody[i]);
                    }
                }
                IOUtils.CloseFunctionBody(ref voronoiFunc);
                dataCollector.AddFunction(string.Format(VoronoiHeader, OutputId), voronoiFunc);

                string uvs = string.Empty;
                if (m_inputPorts[0].IsConnected)
                {
                    uvs = m_inputPorts[0].GeneratePortInstructions(ref dataCollector);
                }
                else
                {
                    if (dataCollector.IsTemplate)
                    {
                        uvs = dataCollector.TemplateDataCollectorInstance.GenerateAutoUVs(0);
                    }
                    else
                    {
                        uvs = GeneratorUtils.GenerateAutoUVs(ref dataCollector, UniqueId, 0);
                    }
                }

                dataCollector.AddLocalVariable(UniqueId, string.Format("float2 coords{0} = {1} * {2};", OutputId, uvs, scaleValue));
                dataCollector.AddLocalVariable(UniqueId, string.Format("float2 id{0} = 0;", OutputId));

                if (m_octaves == 1)
                {
                    dataCollector.AddLocalVariable(UniqueId, string.Format("float voroi{0} = {1};", OutputId, string.Format(VoronoiFunc, OutputId, "coords" + OutputId, timeVarName, "id" + OutputId, smoothnessName)));
                }
                else
                {
                    dataCollector.AddLocalVariable(UniqueId, string.Format("float fade{0} = 0.5;", OutputId));
                    dataCollector.AddLocalVariable(UniqueId, string.Format("float voroi{0} = 0;", OutputId));
                    dataCollector.AddLocalVariable(UniqueId, string.Format("float rest{0} = 0;", OutputId));
                    dataCollector.AddLocalVariable(UniqueId, "for( int it = 0; it <" + m_octaves + "; it++ ){");
                    dataCollector.AddLocalVariable(UniqueId, string.Format("voroi{0} += fade{0} * voronoi{0}( coords{0}, time{0}, id{0},{1} );", OutputId, smoothnessName));
                    dataCollector.AddLocalVariable(UniqueId, string.Format("rest{0} += fade{0};", OutputId));
                    dataCollector.AddLocalVariable(UniqueId, string.Format("coords{0} *= 2;", OutputId));
                    dataCollector.AddLocalVariable(UniqueId, string.Format("fade{0} *= 0.5;", OutputId));
                    dataCollector.AddLocalVariable(UniqueId, "}");
                    dataCollector.AddLocalVariable(UniqueId, string.Format("voroi{0} /= rest{0};", OutputId));
                }
                m_outputPorts[0].SetLocalValue("voroi" + OutputId, dataCollector.PortCategory);
                m_outputPorts[1].SetLocalValue("id" + OutputId, dataCollector.PortCategory);
                return(m_outputPorts[outputId].LocalValue(dataCollector.PortCategory));
            }
        }
Пример #15
0
        private void GeneratePattern(ref MasterNodeDataCollector dataCollector)
        {
            SetAdditonalTitleText(string.Format(Constants.SubTitleTypeFormatStr, PatternsStr[m_selectedPatternInt]));
            switch (m_selectedPatternInt)
            {
            default:
            case 0:
            {
                m_functionBody   = string.Empty;
                m_functionHeader = "Dither" + PatternsFuncStr[m_selectedPatternInt] + "( {0}, {1} )";
                IOUtils.AddFunctionHeader(ref m_functionBody, "inline float Dither" + PatternsFuncStr[m_selectedPatternInt] + "( int x, int y )");
                IOUtils.AddFunctionLine(ref m_functionBody, "const float dither[ 16 ] = {");
                IOUtils.AddFunctionLine(ref m_functionBody, "	 1,  9,  3, 11,");
                IOUtils.AddFunctionLine(ref m_functionBody, "	13,  5, 15,  7,");
                IOUtils.AddFunctionLine(ref m_functionBody, "	 4, 12,  2, 10,");
                IOUtils.AddFunctionLine(ref m_functionBody, "	16,  8, 14,  6 };");
                IOUtils.AddFunctionLine(ref m_functionBody, "int r = y * 4 + x;");
                IOUtils.AddFunctionLine(ref m_functionBody, "return dither[r] / 16; // same # of instructions as pre-dividing due to compiler magic");
                IOUtils.CloseFunctionBody(ref m_functionBody);
            }
            break;

            case 1:
            {
                m_functionBody   = string.Empty;
                m_functionHeader = "Dither" + PatternsFuncStr[m_selectedPatternInt] + "( {0}, {1} )";
                IOUtils.AddFunctionHeader(ref m_functionBody, "inline float Dither" + PatternsFuncStr[m_selectedPatternInt] + "( int x, int y )");
                IOUtils.AddFunctionLine(ref m_functionBody, "const float dither[ 64 ] = {");
                IOUtils.AddFunctionLine(ref m_functionBody, "	 1, 49, 13, 61,  4, 52, 16, 64,");
                IOUtils.AddFunctionLine(ref m_functionBody, "	33, 17, 45, 29, 36, 20, 48, 32,");
                IOUtils.AddFunctionLine(ref m_functionBody, "	 9, 57,  5, 53, 12, 60,  8, 56,");
                IOUtils.AddFunctionLine(ref m_functionBody, "	41, 25, 37, 21, 44, 28, 40, 24,");
                IOUtils.AddFunctionLine(ref m_functionBody, "	 3, 51, 15, 63,  2, 50, 14, 62,");
                IOUtils.AddFunctionLine(ref m_functionBody, "	35, 19, 47, 31, 34, 18, 46, 30,");
                IOUtils.AddFunctionLine(ref m_functionBody, "	11, 59,  7, 55, 10, 58,  6, 54,");
                IOUtils.AddFunctionLine(ref m_functionBody, "	43, 27, 39, 23, 42, 26, 38, 22};");
                IOUtils.AddFunctionLine(ref m_functionBody, "int r = y * 8 + x;");
                IOUtils.AddFunctionLine(ref m_functionBody, "return dither[r] / 64; // same # of instructions as pre-dividing due to compiler magic");
                IOUtils.CloseFunctionBody(ref m_functionBody);
            }
            break;

            case 2:
            {
                ParentGraph outsideGraph = UIUtils.CurrentWindow.OutsideGraph;

                m_functionBody   = string.Empty;
                m_functionHeader = "Dither" + PatternsFuncStr[m_selectedPatternInt] + "({0}, {1}, {2})";

                IOUtils.AddFunctionHeader(ref m_functionBody, "inline float Dither" + PatternsFuncStr[m_selectedPatternInt] + "( float4 screenPos, " + GeneratorUtils.GetPropertyDeclaraction("noiseTexture", TextureType.Texture2D, ", ") + GeneratorUtils.GetSamplerDeclaraction("samplernoiseTexture", TextureType.Texture2D, ", ") + "float4 noiseTexelSize )");

                string samplingCall = GeneratorUtils.GenerateSamplingCall(ref dataCollector, WirePortDataType.SAMPLER2D, "noiseTexture", "samplernoiseTexture", "screenPos.xy * _ScreenParams.xy * noiseTexelSize.xy", MipType.MipLevel, "0");
                IOUtils.AddFunctionLine(ref m_functionBody, "float dither = " + samplingCall + ".g;");
                IOUtils.AddFunctionLine(ref m_functionBody, "float ditherRate = noiseTexelSize.x * noiseTexelSize.y;");
                IOUtils.AddFunctionLine(ref m_functionBody, "dither = ( 1 - ditherRate ) * dither + ditherRate;");
                IOUtils.AddFunctionLine(ref m_functionBody, "return dither;");
                IOUtils.CloseFunctionBody(ref m_functionBody);
            }
            break;
            }
        }
Пример #16
0
        public override string GenerateShaderForOutput(int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar)
        {
            if (m_outputPorts[0].IsLocalValue)
            {
                return(m_outputPorts[0].LocalValue);
            }
            switch (m_type)
            {
            case NoiseGeneratorType.Simplex2D:
            {
                string float3Mod289Func = string.Empty;
                IOUtils.AddSingleLineFunction(ref float3Mod289Func, Simplex2DFloat3Mod289Func);
                dataCollector.AddFunction(Simplex2DFloat3Mod289Func, float3Mod289Func);

                string float2Mod289Func = string.Empty;
                IOUtils.AddSingleLineFunction(ref float2Mod289Func, Simplex2DFloat2Mod289Func);
                dataCollector.AddFunction(Simplex2DFloat2Mod289Func, float2Mod289Func);

                string permuteFunc = string.Empty;
                IOUtils.AddSingleLineFunction(ref permuteFunc, Simplex2DPermuteFunc);
                dataCollector.AddFunction(Simplex2DPermuteFunc, permuteFunc);


                string snoiseFunc = string.Empty;
                IOUtils.AddFunctionHeader(ref snoiseFunc, SimplexNoise2DHeader);
                for (int i = 0; i < SimplexNoise2DBody.Length; i++)
                {
                    IOUtils.AddFunctionLine(ref snoiseFunc, SimplexNoise2DBody[i]);
                }
                IOUtils.CloseFunctionBody(ref snoiseFunc);
                dataCollector.AddFunction(SimplexNoise2DHeader, snoiseFunc);

                string size = m_inputPorts[0].GeneratePortInstructions(ref dataCollector);

                RegisterLocalVariable(0, string.Format(SimplexNoise2DFunc, size), ref dataCollector, ("simplePerlin2D" + m_uniqueId));
            } break;

            case NoiseGeneratorType.Simplex3D:
            {
                string float3Mod289Func = string.Empty;
                IOUtils.AddSingleLineFunction(ref float3Mod289Func, Simplex3DFloat3Mod289);
                dataCollector.AddFunction(Simplex3DFloat3Mod289, float3Mod289Func);

                string float4Mod289Func = string.Empty;
                IOUtils.AddSingleLineFunction(ref float4Mod289Func, Simplex3DFloat4Mod289);
                dataCollector.AddFunction(Simplex3DFloat4Mod289, float4Mod289Func);

                string permuteFunc = string.Empty;
                IOUtils.AddSingleLineFunction(ref permuteFunc, Simplex3DFloat4Permute);
                dataCollector.AddFunction(Simplex3DFloat4Permute, permuteFunc);

                string taylorInvSqrtFunc = string.Empty;
                IOUtils.AddSingleLineFunction(ref taylorInvSqrtFunc, TaylorInvSqrtFunc);
                dataCollector.AddFunction(TaylorInvSqrtFunc, taylorInvSqrtFunc);


                string snoiseFunc = string.Empty;
                IOUtils.AddFunctionHeader(ref snoiseFunc, SimplexNoise3DHeader);
                for (int i = 0; i < SimplexNoise3DBody.Length; i++)
                {
                    IOUtils.AddFunctionLine(ref snoiseFunc, SimplexNoise3DBody[i]);
                }
                IOUtils.CloseFunctionBody(ref snoiseFunc);
                dataCollector.AddFunction(SimplexNoise3DHeader, snoiseFunc);

                string size = m_inputPorts[0].GeneratePortInstructions(ref dataCollector);

                RegisterLocalVariable(0, string.Format(SimplexNoise3DFunc, size), ref dataCollector, ("simplePerlin3D" + m_uniqueId));
            }
            break;
            }
            return(m_outputPorts[0].LocalValue);
        }