예제 #1
0
        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));
        }
예제 #3
0
        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));
                }
            }
        }
예제 #4
0
        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 );
            }
        }