public override string GenerateShaderForOutput(int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar) { dataCollector.ForceNormal = true; dataCollector.AddToInput(UniqueId, UIUtils.GetInputDeclarationFromType(m_currentPrecisionType, AvailableSurfaceInputs.WORLD_NORMAL), true); dataCollector.AddToInput(UniqueId, Constants.InternalData, false); string worldTangent = GeneratorUtils.GenerateWorldTangent(ref dataCollector, UniqueId); return(GetOutputVectorItem(0, outputId, worldTangent)); }
public override string GenerateShaderForOutput(int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar) { if (dataCollector.IsTemplate) { return(GetOutputVectorItem(0, outputId, dataCollector.TemplateDataCollectorInstance.GetWorldTangent(CurrentPrecisionType))); } if (dataCollector.PortCategory == MasterNodePortCategory.Fragment || dataCollector.PortCategory == MasterNodePortCategory.Debug) { dataCollector.ForceNormal = true; dataCollector.AddToInput(UniqueId, SurfaceInputs.WORLD_NORMAL, CurrentPrecisionType); dataCollector.AddToInput(UniqueId, SurfaceInputs.INTERNALDATA, addSemiColon: false); } string worldTangent = GeneratorUtils.GenerateWorldTangent(ref dataCollector, UniqueId); return(GetOutputVectorItem(0, outputId, worldTangent)); }
public override string GenerateShaderForOutput(int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar) { if (dataCollector.IsTemplate) { if (m_inputPorts[0].IsConnected) { if (m_outputPorts[0].IsLocalValue) { return(m_outputPorts[0].LocalValue); } string value = dataCollector.TemplateDataCollectorInstance.GetWorldNormal(m_inputPorts[0].GeneratePortInstructions(ref dataCollector)); RegisterLocalVariable(0, value, ref dataCollector, "worldNormal" + OutputId); return(m_outputPorts[0].LocalValue); } else { return(GetOutputVectorItem(0, outputId, dataCollector.TemplateDataCollectorInstance.GetWorldNormal())); } } if (dataCollector.PortCategory == MasterNodePortCategory.Fragment || dataCollector.PortCategory == MasterNodePortCategory.Debug) { dataCollector.AddToInput(UniqueId, SurfaceInputs.WORLD_NORMAL, m_currentPrecisionType); string result = string.Empty; if (m_inputPorts[0].IsConnected) { dataCollector.AddToInput(UniqueId, SurfaceInputs.INTERNALDATA, addSemiColon: false); dataCollector.ForceNormal = true; result = "WorldNormalVector( " + Constants.InputVarStr + " , " + m_inputPorts[0].GenerateShaderForOutput(ref dataCollector, WirePortDataType.FLOAT3, ignoreLocalvar) + " )"; int connCount = 0; for (int i = 0; i < m_outputPorts.Count; i++) { connCount += m_outputPorts[i].ConnectionCount; } if (connCount > 1 || outputId > 0) { dataCollector.AddToLocalVariables(UniqueId, string.Format(NormalVecDecStr, NormalVecValStr + OutputId, result)); return(GetOutputVectorItem(0, outputId, NormalVecValStr + OutputId)); } } else { if (!dataCollector.DirtyNormal) { result = Constants.InputVarStr + ".worldNormal"; } else { dataCollector.AddToInput(UniqueId, SurfaceInputs.INTERNALDATA, addSemiColon: false); result = GeneratorUtils.GenerateWorldNormal(ref dataCollector, UniqueId); dataCollector.ForceNormal = true; } } return(GetOutputVectorItem(0, outputId, result)); } else { if (m_inputPorts[0].IsConnected) { string inputTangent = m_inputPorts[0].GeneratePortInstructions(ref dataCollector); string normal = GeneratorUtils.GenerateWorldNormal(ref dataCollector, UniqueId); string tangent = GeneratorUtils.GenerateWorldTangent(ref dataCollector, UniqueId); dataCollector.AddToVertexLocalVariables(UniqueId, "float3x3 tangentToWorld = CreateTangentToWorldPerVertex( " + normal + ", " + tangent + ", " + Constants.VertexShaderInputStr + ".tangent.w );"); dataCollector.AddToVertexLocalVariables(UniqueId, "float3 tangentNormal" + OutputId + " = " + inputTangent + ";"); dataCollector.AddToVertexLocalVariables(UniqueId, "float3 modWorldNormal" + OutputId + " = (tangentToWorld[0] * tangentNormal" + OutputId + ".x + tangentToWorld[1] * tangentNormal" + OutputId + ".y + tangentToWorld[2] * tangentNormal" + OutputId + ".z);"); return(GetOutputVectorItem(0, outputId, "modWorldNormal" + OutputId)); } else { string result = GeneratorUtils.GenerateWorldNormal(ref dataCollector, UniqueId); return(GetOutputVectorItem(0, outputId, result)); } } }
public override string GenerateShaderForOutput(int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar) { if (dataCollector.IsTemplate) { if (m_inputPorts[0].IsConnected) { if (m_outputPorts[0].IsLocalValue(dataCollector.PortCategory)) { return(GetOutputVectorItem(0, outputId, m_outputPorts[0].LocalValue(dataCollector.PortCategory))); } string value = dataCollector.TemplateDataCollectorInstance.GetWorldReflection(CurrentPrecisionType, m_inputPorts[0].GeneratePortInstructions(ref dataCollector)); if (m_normalize) { value = string.Format(NormalizeFunc, value); } RegisterLocalVariable(0, value, ref dataCollector, "worldRefl" + OutputId); return(GetOutputVectorItem(0, outputId, m_outputPorts[0].LocalValue(dataCollector.PortCategory))); } else { string name; string value = dataCollector.TemplateDataCollectorInstance.GetWorldReflection(CurrentPrecisionType); if (m_normalize) { name = "normalizedWorldRefl"; value = string.Format(NormalizeFunc, value); RegisterLocalVariable(0, value, ref dataCollector, name); } else { name = value; } return(GetOutputVectorItem(0, outputId, name)); } } bool isVertex = (dataCollector.PortCategory == MasterNodePortCategory.Tessellation || dataCollector.PortCategory == MasterNodePortCategory.Vertex); if (isVertex) { if (m_inputPorts[0].IsConnected) { if (m_outputPorts[0].IsLocalValue(dataCollector.PortCategory)) { return(GetOutputVectorItem(0, outputId, m_outputPorts[0].LocalValue(dataCollector.PortCategory))); } string normal = GeneratorUtils.GenerateWorldNormal(ref dataCollector, UniqueId); string tangent = GeneratorUtils.GenerateWorldTangent(ref dataCollector, UniqueId); dataCollector.AddToVertexLocalVariables(UniqueId, "float3x3 tangentToWorld = CreateTangentToWorldPerVertex( " + normal + ", " + tangent + ", " + Constants.VertexShaderInputStr + ".tangent.w );"); string inputTangent = m_inputPorts[0].GeneratePortInstructions(ref dataCollector); dataCollector.AddToVertexLocalVariables(UniqueId, "float3 tangentNormal" + OutputId + " = " + inputTangent + ";"); string viewDir = GeneratorUtils.GenerateViewDirection(ref dataCollector, UniqueId); dataCollector.AddToVertexLocalVariables(UniqueId, "float3 modWorldNormal" + OutputId + " = ( tangentToWorld[0] * tangentNormal" + OutputId + ".x + tangentToWorld[1] * tangentNormal" + OutputId + ".y + tangentToWorld[2] * tangentNormal" + OutputId + ".z);"); string value = "reflect( -" + viewDir + ", modWorldNormal" + OutputId + " )"; if (m_normalize) { value = string.Format(NormalizeFunc, value); } RegisterLocalVariable(0, value, ref dataCollector, "modReflection" + OutputId); return(GetOutputVectorItem(0, outputId, m_outputPorts[0].LocalValue(dataCollector.PortCategory))); } else { if (m_outputPorts[0].IsLocalValue(dataCollector.PortCategory)) { return(GetOutputVectorItem(0, outputId, m_outputPorts[0].LocalValue(dataCollector.PortCategory))); } string worldNormal = GeneratorUtils.GenerateWorldNormal(ref dataCollector, UniqueId); string viewDir = GeneratorUtils.GenerateViewDirection(ref dataCollector, UniqueId); string value = "reflect( -" + viewDir + ", " + worldNormal + " )"; if (m_normalize) { value = string.Format(NormalizeFunc, value); } RegisterLocalVariable(0, value, ref dataCollector, ReflectionVecValStr + OutputId); return(GetOutputVectorItem(0, outputId, m_outputPorts[0].LocalValue(dataCollector.PortCategory))); } } else { if (m_outputPorts[0].IsLocalValue(dataCollector.PortCategory)) { return(GetOutputVectorItem(0, outputId, m_outputPorts[0].LocalValue(dataCollector.PortCategory))); } dataCollector.AddToInput(UniqueId, SurfaceInputs.WORLD_REFL, CurrentPrecisionType); string result = string.Empty; if (m_inputPorts[0].IsConnected) { dataCollector.AddToInput(UniqueId, SurfaceInputs.INTERNALDATA, addSemiColon: false); dataCollector.ForceNormal = true; result = "WorldReflectionVector( " + Constants.InputVarStr + " , " + m_inputPorts[0].GeneratePortInstructions(ref dataCollector) + " )"; if (m_normalize) { result = String.Format(NormalizeFunc, result); } int connCount = 0; for (int i = 0; i < m_outputPorts.Count; i++) { connCount += m_outputPorts[i].ConnectionCount; } if (connCount > 1) { string precisionType = UIUtils.PrecisionWirePortToCgType(UIUtils.CurrentWindow.CurrentGraph.CurrentPrecision, WirePortDataType.FLOAT3); dataCollector.AddToFragmentLocalVariables(UniqueId, string.Format(ReflectionVecDecStr, precisionType, ReflectionVecValStr + OutputId, result)); RegisterLocalVariable(0, result, ref dataCollector, ReflectionVecValStr + OutputId); return(GetOutputVectorItem(0, outputId, m_outputPorts[0].LocalValue(dataCollector.PortCategory))); } } else { dataCollector.AddToInput(UniqueId, SurfaceInputs.INTERNALDATA, addSemiColon: false); result = GeneratorUtils.GenerateWorldReflection(ref dataCollector, UniqueId, m_normalize); if (dataCollector.DirtyNormal) { dataCollector.ForceNormal = true; } } return(GetOutputVectorItem(0, outputId, result)); //RegisterLocalVariable( 0, result, ref dataCollector, "worldrefVec" + OutputId ); //return GetOutputVectorItem( 0, outputId, m_outputPorts[ 0 ].LocalValue ); } }
public override string GenerateShaderForOutput(int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar) { if (dataCollector.IsTemplate) { if (m_inputPorts[0].IsConnected) { if (m_outputPorts[0].IsLocalValue) { return(m_outputPorts[0].LocalValue); } string value = dataCollector.TemplateDataCollectorInstance.GetWorldReflection(m_inputPorts[0].GeneratePortInstructions(ref dataCollector)); RegisterLocalVariable(0, value, ref dataCollector, "worldRefl" + OutputId); return(m_outputPorts[0].LocalValue); } else { return(GetOutputVectorItem(0, outputId, dataCollector.TemplateDataCollectorInstance.GetWorldReflection())); } } bool isVertex = (dataCollector.PortCategory == MasterNodePortCategory.Tessellation || dataCollector.PortCategory == MasterNodePortCategory.Vertex); if (isVertex) { if (m_inputPorts[0].IsConnected) { if (m_outputPorts[0].IsLocalValue) { return(GetOutputVectorItem(0, outputId, m_outputPorts[0].LocalValue)); } string normal = GeneratorUtils.GenerateWorldNormal(ref dataCollector, UniqueId); string tangent = GeneratorUtils.GenerateWorldTangent(ref dataCollector, UniqueId); dataCollector.AddToVertexLocalVariables(UniqueId, "float3x3 tangentToWorld = CreateTangentToWorldPerVertex( " + normal + ", " + tangent + ", " + Constants.VertexShaderInputStr + ".tangent.w );"); string inputTangent = m_inputPorts[0].GeneratePortInstructions(ref dataCollector); dataCollector.AddToVertexLocalVariables(UniqueId, "float3 tangentNormal" + OutputId + " = " + inputTangent + ";"); string viewDir = GeneratorUtils.GenerateViewDirection(ref dataCollector, UniqueId); dataCollector.AddToVertexLocalVariables(UniqueId, "float3 modWorldNormal" + OutputId + " = ( tangentToWorld[0] * tangentNormal" + OutputId + ".x + tangentToWorld[1] * tangentNormal" + OutputId + ".y + tangentToWorld[2] * tangentNormal" + OutputId + ".z);"); RegisterLocalVariable(0, "reflect( -" + viewDir + ", modWorldNormal" + OutputId + " )", ref dataCollector, "modReflection" + OutputId); return(GetOutputVectorItem(0, outputId, m_outputPorts[0].LocalValue)); } else { if (m_outputPorts[0].IsLocalValue) { return(GetOutputVectorItem(0, outputId, m_outputPorts[0].LocalValue)); } string worldNormal = GeneratorUtils.GenerateWorldNormal(ref dataCollector, UniqueId); string viewDir = GeneratorUtils.GenerateViewDirection(ref dataCollector, UniqueId); RegisterLocalVariable(0, "reflect( -" + viewDir + ", " + worldNormal + " )", ref dataCollector, ReflectionVecValStr + OutputId); return(GetOutputVectorItem(0, outputId, m_outputPorts[0].LocalValue)); } } else { if (m_outputPorts[0].IsLocalValue) { return(GetOutputVectorItem(0, outputId, m_outputPorts[0].LocalValue)); } dataCollector.AddToInput(UniqueId, UIUtils.GetInputDeclarationFromType(m_currentPrecisionType, AvailableSurfaceInputs.WORLD_REFL), true); string result = string.Empty; if (m_inputPorts[0].IsConnected) { dataCollector.AddToInput(UniqueId, Constants.InternalData, false); dataCollector.ForceNormal = true; result = "WorldReflectionVector( " + Constants.InputVarStr + " , " + m_inputPorts[0].GenerateShaderForOutput(ref dataCollector, WirePortDataType.FLOAT3, ignoreLocalVar) + " )"; int connCount = 0; for (int i = 0; i < m_outputPorts.Count; i++) { connCount += m_outputPorts[i].ConnectionCount; } if (connCount > 1 || outputId > 0) { dataCollector.AddToLocalVariables(UniqueId, string.Format(ReflectionVecDecStr, ReflectionVecValStr + OutputId, result)); RegisterLocalVariable(0, result, ref dataCollector, ReflectionVecValStr + OutputId); return(GetOutputVectorItem(0, outputId, m_outputPorts[0].LocalValue)); } } else { dataCollector.AddToInput(UniqueId, Constants.InternalData, false); result = GeneratorUtils.GenerateWorldReflection(ref dataCollector, UniqueId); } return(GetOutputVectorItem(0, outputId, result)); //RegisterLocalVariable( 0, result, ref dataCollector, "worldrefVec" + OutputId ); //return GetOutputVectorItem( 0, outputId, m_outputPorts[ 0 ].LocalValue ); } }