예제 #1
0
        public override string GenerateShaderForOutput(int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar)
        {
            if (dataCollector.IsTemplate)
            {
                return(GetOutputVectorItem(0, outputId, dataCollector.TemplateDataCollectorInstance.GetWorldSpaceLightDir()));
            }
            ;

            //if ( m_outputPorts[ 0 ].IsLocalValue )
            //	return m_outputPorts[ 0 ].LocalValue;

            dataCollector.AddToIncludes(UniqueId, Constants.UnityCgLibFuncs);
            dataCollector.AddToInput(UniqueId, SurfaceInputs.WORLD_POS);

            string worldPos = GeneratorUtils.GenerateWorldPosition(ref dataCollector, UniqueId);

            return(GetOutputVectorItem(0, outputId, GeneratorUtils.GenerateWorldLightDirection(ref dataCollector, UniqueId, m_currentPrecisionType, worldPos)));

            //dataCollector.AddToInput( UniqueId, UIUtils.GetInputDeclarationFromType( m_currentPrecisionType, AvailableSurfaceInputs.WORLD_NORMAL ), true );

            //string result = string.Empty;
            ////if ( m_inputPorts[ 0 ].IsConnected )
            ////{
            ////	result = m_inputPorts[ 0 ].GenerateShaderForOutput( ref dataCollector, WirePortDataType.FLOAT4, ignoreLocalvar, 0, true );
            ////}
            ////else
            ////{
            //	string input = UIUtils.GetInputDeclarationFromType( m_currentPrecisionType, AvailableSurfaceInputs.WORLD_POS );
            //	dataCollector.AddToInput( UniqueId, input, true );
            //	result = Constants.InputVarStr + "." + UIUtils.GetInputValueFromType( AvailableSurfaceInputs.WORLD_POS );
            ////}
            //result = m_funcType + "( " + result + " )";
            //RegisterLocalVariable( 0, result, ref dataCollector, "worldSpaceLightDir" + OutputId );
            //return m_outputPorts[ 0 ].LocalValue;
        }
        public override string GenerateShaderForOutput(int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar)
        {
            if (dataCollector.PortCategory == MasterNodePortCategory.Fragment || dataCollector.PortCategory == MasterNodePortCategory.Debug)
            {
                base.GenerateShaderForOutput(outputId, ref dataCollector, ignoreLocalVar);
            }

            string worldPosition = GeneratorUtils.GenerateWorldPosition(ref dataCollector, UniqueId);

            return(GetOutputVectorItem(0, outputId, worldPosition));
        }
        public override string GenerateShaderForOutput(int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar)
        {
            if (dataCollector.IsTemplate)
            {
                string varName = dataCollector.TemplateDataCollectorInstance.GetWorldPos();
                return(GetOutputVectorItem(0, outputId, varName));
            }

            string worldPosition = GeneratorUtils.GenerateWorldPosition(ref dataCollector, UniqueId);

            return(GetOutputVectorItem(0, outputId, worldPosition));
        }
        public override string GenerateShaderForOutput(int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar)
        {
            if (dataCollector.IsTemplate)
            {
                string varName = (m_viewDirSpace == ViewSpace.World)? dataCollector.TemplateDataCollectorInstance.GetNormalizedViewDir():
                                 dataCollector.TemplateDataCollectorInstance.GetTangenViewDir();
                return(GetOutputVectorItem(0, outputId, varName));
            }


            if (dataCollector.PortCategory == MasterNodePortCategory.Vertex || dataCollector.PortCategory == MasterNodePortCategory.Tessellation)
            {
                if (m_viewDirSpace == ViewSpace.World)
                {
                    string precision = UIUtils.FinalPrecisionWirePortToCgType(m_currentPrecisionType, WirePortDataType.FLOAT3);
                    string worldPos  = GeneratorUtils.GenerateWorldPosition(ref dataCollector, UniqueId);

                    dataCollector.AddLocalVariable(UniqueId, precision + " worldViewDir = normalize( UnityWorldSpaceViewDir( " + worldPos + " ) );");
                    return(GetOutputVectorItem(0, outputId, "worldViewDir"));
                }
                else
                {
                    string precision      = UIUtils.FinalPrecisionWirePortToCgType(m_currentPrecisionType, WirePortDataType.FLOAT3);
                    string worldPos       = GeneratorUtils.GenerateWorldPosition(ref dataCollector, UniqueId);
                    string worldToTangent = GeneratorUtils.GenerateWorldToTangentMatrix(ref dataCollector, UniqueId, m_currentPrecisionType);

                    dataCollector.AddLocalVariable(UniqueId, precision + " tangentViewDir = mul( " + worldToTangent + ", normalize( UnityWorldSpaceViewDir( " + worldPos + " ) ) );");
                    return(GetOutputVectorItem(0, outputId, "tangentViewDir"));
                }
            }
            else
            {
                if (m_viewDirSpace == ViewSpace.World)
                {
                    if (dataCollector.DirtyNormal)
                    {
                        dataCollector.AddToInput(UniqueId, UIUtils.GetInputDeclarationFromType(m_currentPrecisionType, AvailableSurfaceInputs.WORLD_POS), true);
                        dataCollector.AddToLocalVariables(UniqueId, m_currentPrecisionType, WirePortDataType.FLOAT3, WorldDirVarStr, "normalize( UnityWorldSpaceViewDir( " + Constants.InputVarStr + ".worldPos ) )");
                        return(GetOutputVectorItem(0, outputId, WorldDirVarStr));
                    }
                    else
                    {
                        return(base.GenerateShaderForOutput(outputId, ref dataCollector, ignoreLocalVar));
                    }
                }
                else
                {
                    dataCollector.ForceNormal = true;
                    return(base.GenerateShaderForOutput(outputId, ref dataCollector, ignoreLocalVar));
                }
            }
        }
예제 #5
0
        public override string GenerateShaderForOutput(int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar)
        {
            if (m_outputPorts[0].IsLocalValue)
            {
                return(m_outputPorts[0].LocalValue);
            }

            dataCollector.AddToInput(UniqueId, UIUtils.GetInputDeclarationFromType(m_currentPrecisionType, AvailableSurfaceInputs.WORLD_POS), true);
            if (dataCollector.IsFragmentCategory)
            {
                dataCollector.AddLocalVariable(UniqueId, m_currentPrecisionType, WirePortDataType.FLOAT3, WorldDirVarStr, string.Format(WorldDirFuncStr, Constants.InputVarStr + ".worldPos"));
            }
            else
            {
                string worldPosVar = GeneratorUtils.GenerateWorldPosition(ref dataCollector, UniqueId);
                dataCollector.AddLocalVariable(UniqueId, m_currentPrecisionType, WirePortDataType.FLOAT3, WorldDirVarStr, string.Format(WorldDirFuncStr, worldPosVar));
            }

            string normal = string.Empty;

            if (m_inputPorts[0].IsConnected)
            {
                normal = m_inputPorts[0].GenerateShaderForOutput(ref dataCollector, WirePortDataType.FLOAT3, ignoreLocalvar, true);
            }
            else
            {
                dataCollector.AddToInput(UniqueId, UIUtils.GetInputDeclarationFromType(m_currentPrecisionType, AvailableSurfaceInputs.WORLD_NORMAL), true);
                dataCollector.AddToInput(UniqueId, Constants.InternalData, false);
                normal = GeneratorUtils.GenerateWorldNormal(ref dataCollector, UniqueId);
                //string normalWorld = "WorldNormalVector( " + Constants.InputVarStr + ", float3( 0, 0, 1 ) );";
                //dataCollector.AddToLocalVariables( m_uniqueId, "float3 worldNormal = "+ normalWorld );
                //normal = "worldNormal";
                //dataCollector.ForceNormal = true;
            }

            string bias  = m_inputPorts[1].GenerateShaderForOutput(ref dataCollector, WirePortDataType.FLOAT, ignoreLocalvar, true);
            string scale = m_inputPorts[2].GenerateShaderForOutput(ref dataCollector, WirePortDataType.FLOAT, ignoreLocalvar, true);
            string power = m_inputPorts[3].GenerateShaderForOutput(ref dataCollector, WirePortDataType.FLOAT, ignoreLocalvar, true);

            string ndotl = "dot( " + normal + ", " + WorldDirVarStr + " )";

            string fresnelFinalVar = FresnedFinalVar + OutputId;
            string result          = string.Format("({0} + {1}*pow( 1.0 - {2} , {3}))", bias, scale, ndotl, power);

            RegisterLocalVariable(0, result, ref dataCollector, fresnelFinalVar);
            return(m_outputPorts[0].LocalValue);
        }
예제 #6
0
        public override string GenerateShaderForOutput(int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar)
        {
            //Forcing world pos into float precision because positions shouldn't use fixed
            m_currentPrecisionType = PrecisionType.Float;

            if (dataCollector.IsTemplate)
            {
                string varName = dataCollector.TemplateDataCollectorInstance.GetWorldPos();
                return(GetOutputVectorItem(0, outputId, varName));
            }

            if (dataCollector.PortCategory == MasterNodePortCategory.Fragment || dataCollector.PortCategory == MasterNodePortCategory.Debug)
            {
                base.GenerateShaderForOutput(outputId, ref dataCollector, ignoreLocalVar);
            }

            string worldPosition = GeneratorUtils.GenerateWorldPosition(ref dataCollector, UniqueId);

            return(GetOutputVectorItem(0, outputId, worldPosition));
        }
예제 #7
0
        public override string GenerateShaderForOutput(int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar)
        {
            if (dataCollector.IsTemplate)
            {
                dataCollector.AddToIncludes(UniqueId, Constants.UnityLightingLib);
                //string worldPos = dataCollector.TemplateDataCollectorInstance.GetWorldPos();
                string worldViewDir = dataCollector.TemplateDataCollectorInstance.GetViewDir(false, MasterNodePortCategory.Fragment);
                //string worldNormal = dataCollector.TemplateDataCollectorInstance.GetWorldNormal( PrecisionType.Float );

                string worldNormal = string.Empty;
                if (m_inputPorts[0].IsConnected)
                {
                    if (m_normalSpace == ViewSpace.Tangent)
                    {
                        worldNormal = dataCollector.TemplateDataCollectorInstance.GetWorldNormal(UniqueId, m_currentPrecisionType, m_inputPorts[0].GeneratePortInstructions(ref dataCollector), OutputId);
                    }
                    else
                    {
                        worldNormal = m_inputPorts[0].GeneratePortInstructions(ref dataCollector);
                    }
                }
                else
                {
                    worldNormal = dataCollector.TemplateDataCollectorInstance.GetWorldNormal(PrecisionType.Float, false, MasterNodePortCategory.Fragment);
                }

                string tempsmoothness = m_inputPorts[1].GeneratePortInstructions(ref dataCollector);
                string tempocclusion  = m_inputPorts[2].GeneratePortInstructions(ref dataCollector);

                dataCollector.AddLocalVariable(UniqueId, "UnityGIInput data;");
                dataCollector.AddLocalVariable(UniqueId, "UNITY_INITIALIZE_OUTPUT( UnityGIInput, data );");
                //dataCollector.AddLocalVariable( UniqueId, "data.worldPos = " + worldPos + ";" );
                //dataCollector.AddLocalVariable( UniqueId, "data.worldViewDir = " + worldViewDir + ";" );
                dataCollector.AddLocalVariable(UniqueId, "data.probeHDR[0] = unity_SpecCube0_HDR;");
                dataCollector.AddLocalVariable(UniqueId, "data.probeHDR[1] = unity_SpecCube1_HDR;");
                dataCollector.AddLocalVariable(UniqueId, "#if UNITY_SPECCUBE_BLENDING || UNITY_SPECCUBE_BOX_PROJECTION //specdataif0");
                dataCollector.AddLocalVariable(UniqueId, "\tdata.boxMin[0] = unity_SpecCube0_BoxMin;");
                dataCollector.AddLocalVariable(UniqueId, "#endif //specdataif0");
                dataCollector.AddLocalVariable(UniqueId, "#if UNITY_SPECCUBE_BOX_PROJECTION //specdataif1");
                dataCollector.AddLocalVariable(UniqueId, "\tdata.boxMax[0] = unity_SpecCube0_BoxMax;");
                dataCollector.AddLocalVariable(UniqueId, "\tdata.probePosition[0] = unity_SpecCube0_ProbePosition;");
                dataCollector.AddLocalVariable(UniqueId, "\tdata.boxMax[1] = unity_SpecCube1_BoxMax;");
                dataCollector.AddLocalVariable(UniqueId, "\tdata.boxMin[1] = unity_SpecCube1_BoxMin;");
                dataCollector.AddLocalVariable(UniqueId, "\tdata.probePosition[1] = unity_SpecCube1_ProbePosition;");
                dataCollector.AddLocalVariable(UniqueId, "#endif //specdataif1");

                dataCollector.AddLocalVariable(UniqueId, "Unity_GlossyEnvironmentData g" + OutputId + " = UnityGlossyEnvironmentSetup( " + tempsmoothness + ", " + worldViewDir + ", " + worldNormal + ", float3(0,0,0));");
                dataCollector.AddLocalVariable(UniqueId, m_currentPrecisionType, WirePortDataType.FLOAT3, "indirectSpecular" + OutputId, "UnityGI_IndirectSpecular( data, " + tempocclusion + ", " + worldNormal + ", g" + OutputId + " )");
                return("indirectSpecular" + OutputId);
            }

            if (dataCollector.GenType == PortGenType.NonCustomLighting || dataCollector.CurrentCanvasMode != NodeAvailability.CustomLighting)
            {
                return("float3(0,0,0)");
            }

            string normal = string.Empty;

            if (m_inputPorts[0].IsConnected)
            {
                dataCollector.AddToInput(UniqueId, SurfaceInputs.WORLD_NORMAL, m_currentPrecisionType);
                dataCollector.AddToInput(UniqueId, SurfaceInputs.INTERNALDATA, addSemiColon: false);
                dataCollector.ForceNormal = true;

                normal = m_inputPorts[0].GeneratePortInstructions(ref dataCollector);
                if (m_normalSpace == ViewSpace.Tangent)
                {
                    normal = "WorldNormalVector( " + Constants.InputVarStr + " , " + normal + " )";
                }

                dataCollector.AddLocalVariable(UniqueId, "float3 indirectNormal" + OutputId + " = " + normal + ";");
                normal = "indirectNormal" + OutputId;
            }
            else
            {
                if (dataCollector.IsFragmentCategory)
                {
                    dataCollector.AddToInput(UniqueId, SurfaceInputs.WORLD_NORMAL, m_currentPrecisionType);
                    if (dataCollector.DirtyNormal)
                    {
                        dataCollector.AddToInput(UniqueId, SurfaceInputs.INTERNALDATA, addSemiColon: false);
                        dataCollector.ForceNormal = true;
                    }
                }

                normal = GeneratorUtils.GenerateWorldNormal(ref dataCollector, UniqueId);
            }

            string smoothness = m_inputPorts[1].GeneratePortInstructions(ref dataCollector);
            string occlusion  = m_inputPorts[2].GeneratePortInstructions(ref dataCollector);
            string viewDir    = "data.worldViewDir";

            if (dataCollector.PortCategory == MasterNodePortCategory.Vertex || dataCollector.PortCategory == MasterNodePortCategory.Tessellation)
            {
                string worldPos = GeneratorUtils.GenerateWorldPosition(ref dataCollector, UniqueId);
                viewDir = GeneratorUtils.GenerateViewDirection(ref dataCollector, UniqueId);

                dataCollector.AddLocalVariable(UniqueId, "UnityGIInput data;");
                dataCollector.AddLocalVariable(UniqueId, "UNITY_INITIALIZE_OUTPUT( UnityGIInput, data );");
                dataCollector.AddLocalVariable(UniqueId, "data.worldPos = " + worldPos + ";");
                dataCollector.AddLocalVariable(UniqueId, "data.worldViewDir = " + viewDir + ";");
                dataCollector.AddLocalVariable(UniqueId, "data.probeHDR[0] = unity_SpecCube0_HDR;");
                dataCollector.AddLocalVariable(UniqueId, "data.probeHDR[1] = unity_SpecCube1_HDR;");
                dataCollector.AddLocalVariable(UniqueId, "#if UNITY_SPECCUBE_BLENDING || UNITY_SPECCUBE_BOX_PROJECTION //specdataif0");
                dataCollector.AddLocalVariable(UniqueId, "data.boxMin[0] = unity_SpecCube0_BoxMin;");
                dataCollector.AddLocalVariable(UniqueId, "#endif //specdataif0");
                dataCollector.AddLocalVariable(UniqueId, "#if UNITY_SPECCUBE_BOX_PROJECTION //specdataif1");
                dataCollector.AddLocalVariable(UniqueId, "data.boxMax[0] = unity_SpecCube0_BoxMax;");
                dataCollector.AddLocalVariable(UniqueId, "data.probePosition[0] = unity_SpecCube0_ProbePosition;");
                dataCollector.AddLocalVariable(UniqueId, "data.boxMax[1] = unity_SpecCube1_BoxMax;");
                dataCollector.AddLocalVariable(UniqueId, "data.boxMin[1] = unity_SpecCube1_BoxMin;");
                dataCollector.AddLocalVariable(UniqueId, "data.probePosition[1] = unity_SpecCube1_ProbePosition;");
                dataCollector.AddLocalVariable(UniqueId, "#endif //specdataif1");
            }

            dataCollector.AddLocalVariable(UniqueId, "Unity_GlossyEnvironmentData g" + OutputId + " = UnityGlossyEnvironmentSetup( " + smoothness + ", " + viewDir + ", " + normal + ", float3(0,0,0));");
            dataCollector.AddLocalVariable(UniqueId, m_currentPrecisionType, WirePortDataType.FLOAT3, "indirectSpecular" + OutputId, "UnityGI_IndirectSpecular( data, " + occlusion + ", " + normal + ", g" + OutputId + " )");

            return("indirectSpecular" + OutputId);
        }
예제 #8
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));
            }
        }
예제 #9
0
        public override string GenerateShaderForOutput(int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar)
        {
            if (dataCollector.CurrentCanvasMode != NodeAvailability.CustomLighting)
            {
                return("float3(0,0,0)");
            }

            string normal = string.Empty;

            if (m_inputPorts[0].IsConnected)
            {
                dataCollector.AddToInput(UniqueId, UIUtils.GetInputDeclarationFromType(m_currentPrecisionType, AvailableSurfaceInputs.WORLD_NORMAL), true);
                dataCollector.AddToInput(UniqueId, Constants.InternalData, false);
                dataCollector.ForceNormal = true;

                normal = m_inputPorts[0].GenerateShaderForOutput(ref dataCollector, WirePortDataType.FLOAT3, ignoreLocalvar);
                if (m_normalSpace == ViewSpace.Tangent)
                {
                    normal = "WorldNormalVector( " + Constants.InputVarStr + " , " + normal + " )";
                }

                dataCollector.AddLocalVariable(UniqueId, "float3 indirectNormal" + OutputId + " = " + normal + ";");
                normal = "indirectNormal" + OutputId;
            }
            else
            {
                if (dataCollector.IsFragmentCategory)
                {
                    dataCollector.AddToInput(UniqueId, UIUtils.GetInputDeclarationFromType(m_currentPrecisionType, AvailableSurfaceInputs.WORLD_NORMAL), true);
                }

                normal = GeneratorUtils.GenerateWorldNormal(ref dataCollector, UniqueId);
            }

            string roughness = m_inputPorts[1].GeneratePortInstructions(ref dataCollector);
            string occlusion = m_inputPorts[2].GeneratePortInstructions(ref dataCollector);
            string viewDir   = "data.worldViewDir";

            if (dataCollector.PortCategory == MasterNodePortCategory.Vertex || dataCollector.PortCategory == MasterNodePortCategory.Tessellation)
            {
                string worldPos = GeneratorUtils.GenerateWorldPosition(ref dataCollector, UniqueId);
                viewDir = GeneratorUtils.GenerateViewDirection(ref dataCollector, UniqueId);

                dataCollector.AddLocalVariable(UniqueId, "UnityGIInput data;");
                dataCollector.AddLocalVariable(UniqueId, "UNITY_INITIALIZE_OUTPUT( UnityGIInput, data );");
                dataCollector.AddLocalVariable(UniqueId, "data.worldPos = " + worldPos + ";");
                dataCollector.AddLocalVariable(UniqueId, "data.worldViewDir = " + viewDir + ";");
                dataCollector.AddLocalVariable(UniqueId, "data.probeHDR[0] = unity_SpecCube0_HDR;");
                dataCollector.AddLocalVariable(UniqueId, "data.probeHDR[1] = unity_SpecCube1_HDR;");
                dataCollector.AddLocalVariable(UniqueId, "#if UNITY_SPECCUBE_BLENDING || UNITY_SPECCUBE_BOX_PROJECTION //specdataif0");
                dataCollector.AddLocalVariable(UniqueId, "data.boxMin[0] = unity_SpecCube0_BoxMin;");
                dataCollector.AddLocalVariable(UniqueId, "#endif //specdataif0");
                dataCollector.AddLocalVariable(UniqueId, "#if UNITY_SPECCUBE_BOX_PROJECTION //specdataif1");
                dataCollector.AddLocalVariable(UniqueId, "data.boxMax[0] = unity_SpecCube0_BoxMax;");
                dataCollector.AddLocalVariable(UniqueId, "data.probePosition[0] = unity_SpecCube0_ProbePosition;");
                dataCollector.AddLocalVariable(UniqueId, "data.boxMax[1] = unity_SpecCube1_BoxMax;");
                dataCollector.AddLocalVariable(UniqueId, "data.boxMin[1] = unity_SpecCube1_BoxMin;");
                dataCollector.AddLocalVariable(UniqueId, "data.probePosition[1] = unity_SpecCube1_ProbePosition;");
                dataCollector.AddLocalVariable(UniqueId, "#endif //specdataif1");
            }

            dataCollector.AddLocalVariable(UniqueId, "Unity_GlossyEnvironmentData g" + OutputId + ";");
            dataCollector.AddLocalVariable(UniqueId, "g" + OutputId + ".roughness = " + roughness + ";");
            dataCollector.AddLocalVariable(UniqueId, "g" + OutputId + ".reflUVW = reflect( -" + viewDir + ", " + normal + " );");
            dataCollector.AddLocalVariable(UniqueId, m_currentPrecisionType, WirePortDataType.FLOAT3, "indirectSpecular" + OutputId, "UnityGI_IndirectSpecular( data, " + occlusion + ", " + normal + ", g" + OutputId + " )");

            return("indirectSpecular" + OutputId);
        }