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)); } } }
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); }
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)); }
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); }
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)); } }
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); }