Ejemplo n.º 1
0
 public void SetTextures(DeviceContext context, RenderableTexture starfield)
 {
     if (starfield != null)
     {
         context.PixelShader.SetSampler(0, texsampler);
         starfield.SetPSResource(context, 0);
     }
 }
Ejemplo n.º 2
0
        public override void SetGeomVars(DeviceContext context, RenderableGeometry geom)
        {
            RenderableTexture texture  = null;
            RenderableTexture texture2 = null;
            RenderableTexture tintpal  = null;
            RenderableTexture bumptex  = null;
            RenderableTexture spectex  = null;
            RenderableTexture detltex  = null;
            bool isdistmap             = false;

            float tntpalind = 0.0f;

            if ((geom.RenderableTextures != null) && (geom.RenderableTextures.Length > 0))
            {
                if (RenderMode == WorldRenderMode.Default)
                {
                    for (int i = 0; i < geom.RenderableTextures.Length; i++)
                    {
                        var itex = geom.RenderableTextures[i];
                        if (geom.HDTextureEnable)
                        {
                            var hdtex = geom.RenderableTexturesHD[i];
                            if ((hdtex != null) && (hdtex.IsLoaded))
                            {
                                itex = hdtex;
                            }
                        }
                        var ihash = geom.TextureParamHashes[i];
                        if (itex == null)
                        {
                            continue;
                        }
                        if (itex.Key?.NameHash == 1678728908 /*"blank"*/)
                        {
                            continue;
                        }
                        switch (ihash)
                        {
                        case MetaName.DiffuseSampler:
                        case MetaName.PlateBgSampler:
                            texture = itex;
                            break;

                        case MetaName.BumpSampler:
                        case MetaName.PlateBgBumpSampler:
                            bumptex = itex;
                            break;

                        case MetaName.SpecSampler:
                            spectex = itex;
                            break;

                        case MetaName.DetailSampler:
                            detltex = itex;
                            break;

                        case MetaName.TintPaletteSampler:
                            tintpal = itex;
                            if (tintpal.Key != null)
                            {
                                //this is slightly dodgy but VSEntityVars should have the correct value in it...
                                tntpalind = (VSEntityVars.Vars.TintPaletteIndex + 0.5f) / tintpal.Key.Height;
                            }
                            break;

                        case MetaName.distanceMapSampler:
                            texture   = itex;
                            isdistmap = true;
                            break;

                        case MetaName.DiffuseSampler2:
                            texture2 = itex;
                            break;

                        case MetaName.heightSampler:
                        case MetaName.EnvironmentSampler:
                            //case MetaName.SnowSampler0:
                            //case MetaName.SnowSampler1:
                            //case MetaName.DiffuseSampler3:
                            //case MetaName.DirtSampler:
                            //case MetaName.DirtBumpSampler:
                            break;

                        case MetaName.FlowSampler:
                        case MetaName.FogSampler:
                        case MetaName.FoamSampler:
                            if (texture == null)
                            {
                                texture = itex;
                            }
                            break;

                        default:
                            if (texture == null)
                            {
                                texture = itex;
                            }
                            break;
                        }
                    }
                }
                else if (RenderMode == WorldRenderMode.SingleTexture)
                {
                    for (int i = 0; i < geom.RenderableTextures.Length; i++)
                    {
                        var itex  = geom.RenderableTextures[i];
                        var ihash = geom.TextureParamHashes[i];
                        if (ihash == RenderTextureSampler)
                        {
                            texture = itex;
                            break;
                        }
                    }
                }
            }


            bool usediff  = ((texture != null) && (texture.ShaderResourceView != null));
            bool usediff2 = ((texture2 != null) && (texture2.ShaderResourceView != null));
            bool usebump  = ((bumptex != null) && (bumptex.ShaderResourceView != null));
            bool usespec  = ((spectex != null) && (spectex.ShaderResourceView != null));
            bool usedetl  = ((detltex != null) && (detltex.ShaderResourceView != null));
            bool usetint  = ((tintpal != null) && (tintpal.ShaderResourceView != null));

            uint tintflag = 0;

            if (usetint)
            {
                tintflag = 1;
            }

            Vector4 textureAlphaMask = Vector4.Zero;
            uint    decalflag        = DecalMode ? 1u : 0u;
            uint    windflag         = geom.EnableWind ? 1u : 0u;
            uint    emflag           = geom.IsEmissive ? 1u : 0u;
            uint    pstintflag       = tintflag;
            var     shaderName       = geom.DrawableGeom.Shader.Name;
            var     shaderFile       = geom.DrawableGeom.Shader.FileName;

            switch (shaderFile.Hash)
            {
            case 2245870123:    //trees_normal_diffspec_tnt.sps
            case 3334613197:    //trees_tnt.sps
            case 1229591973:    //{trees_normal_spec_tnt.sps}
                if (usetint)
                {
                    tintflag = 2;              //use 2nd vertex colour channel for tint...
                }
                break;

            case 3880384844:   //{decal_spec_only.sps}w
            case 600733812:    //{decal_amb_only.sps}
            case 2842248626:   //{spec_decal.sps}
            case 2457676400:   //{reflect_decal.sps}
            case 2706821972:   //{mirror_decal.sps}
                //if (RenderMode == WorldRenderMode.Default) usediff = false;
                break;

            case 2655725442:    //{decal_dirt.sps}
                textureAlphaMask = geom.DirtDecalMask;
                decalflag        = 2;
                break;
            }

            if (VSEntityVars.Vars.IsInstanced > 0)
            {
                pstintflag = 1;
                switch (shaderFile.Hash)
                {
                case 916743331:     //{grass_batch.sps}
                    windflag = 1;
                    break;

                case 3833671083:    //{normal_spec_batch.sps}
                    windflag = 0;
                    break;

                default:
                    break;
                }
            }


            PSGeomVars.Vars.EnableTexture         = (usediff ? 1u : 0u) + (usediff2 ? 2u : 0u);
            PSGeomVars.Vars.EnableTint            = pstintflag;
            PSGeomVars.Vars.EnableNormalMap       = usebump ? 1u : 0u;
            PSGeomVars.Vars.EnableSpecMap         = usespec ? 1u : 0u;
            PSGeomVars.Vars.EnableDetailMap       = usedetl ? 1u : 0u;
            PSGeomVars.Vars.IsDecal               = decalflag;
            PSGeomVars.Vars.IsEmissive            = emflag;
            PSGeomVars.Vars.IsDistMap             = isdistmap ? 1u : 0u;
            PSGeomVars.Vars.bumpiness             = geom.bumpiness;
            PSGeomVars.Vars.AlphaScale            = isdistmap ? 1.0f : AlphaScale;
            PSGeomVars.Vars.HardAlphaBlend        = 0.0f; //todo: cutouts flag!
            PSGeomVars.Vars.useTessellation       = 0.0f;
            PSGeomVars.Vars.detailSettings        = geom.detailSettings;
            PSGeomVars.Vars.specMapIntMask        = geom.specMapIntMask;
            PSGeomVars.Vars.specularIntensityMult = SpecularEnable ? geom.specularIntensityMult : 0.0f;
            PSGeomVars.Vars.specularFalloffMult   = geom.specularFalloffMult;
            PSGeomVars.Vars.specularFresnel       = geom.specularFresnel;
            PSGeomVars.Vars.wetnessMultiplier     = geom.wetnessMultiplier;
            PSGeomVars.Vars.SpecOnly              = geom.SpecOnly ? 1u : 0u;
            PSGeomVars.Vars.TextureAlphaMask      = textureAlphaMask;
            PSGeomVars.Update(context);
            PSGeomVars.SetPSCBuffer(context, 2);

            VSGeomVars.Vars.EnableTint         = tintflag;
            VSGeomVars.Vars.TintYVal           = tntpalind;
            VSGeomVars.Vars.IsDecal            = DecalMode ? 1u : 0u;
            VSGeomVars.Vars.EnableWind         = windflag;
            VSGeomVars.Vars.WindOverrideParams = geom.WindOverrideParams;
            VSGeomVars.Update(context);
            VSGeomVars.SetVSCBuffer(context, 4);

            context.VertexShader.SetSampler(0, geom.IsFragment ? texsamplertntyft : texsamplertnt);
            context.PixelShader.SetSampler(0, AnisotropicFilter ? texsampleranis : texsampler);
            if (usediff)
            {
                texture.SetPSResource(context, 0);
            }
            if (usebump)
            {
                bumptex.SetPSResource(context, 2);
            }
            if (usespec)
            {
                spectex.SetPSResource(context, 3);
            }
            if (usedetl)
            {
                detltex.SetPSResource(context, 4);
            }
            if (usediff2)
            {
                texture2.SetPSResource(context, 5);
            }
            if (usetint)
            {
                tintpal.SetVSResource(context, 0);
            }
        }
Ejemplo n.º 3
0
        public override void SetGeomVars(DeviceContext context, RenderableGeometry geom)
        {
            RenderableTexture texture = null; // ((geom.Textures != null) && (geom.Textures.Length > 0)) ? geom.Textures[0] : null;

            if ((geom.RenderableTextures != null) && (geom.RenderableTextures.Length > 0))
            {
                if (RenderMode == WorldRenderMode.Default)
                {
                    for (int i = 0; i < geom.RenderableTextures.Length; i++)
                    {
                        var itex  = geom.RenderableTextures[i];
                        var ihash = geom.TextureParamHashes[i];
                        switch (ihash)
                        {
                        case ShaderParamNames.DiffuseSampler:
                            texture = itex;
                            break;
                        }
                    }


                    ////fallback try get first texture... eventaully remove this! (helps with water for now)
                    //int index = 0;
                    //while (((texture == null) || (texture.Texture2D == null)) && (index < geom.Textures.Length))
                    //{
                    //    texture = geom.Textures[index];
                    //    index++;
                    //}
                }
                else if (RenderMode == WorldRenderMode.SingleTexture)
                {
                    for (int i = 0; i < geom.RenderableTextures.Length; i++)
                    {
                        var itex  = geom.RenderableTextures[i];
                        var ihash = geom.TextureParamHashes[i];
                        if (ihash == RenderTextureSampler)
                        {
                            texture = itex;
                            break;
                        }
                    }
                }
            }


            bool usediff = ((texture != null) && (texture.Texture2D != null) && (texture.ShaderResourceView != null));

            PSGeomVars.Vars.EnableTexture = usediff ? 1u : 0u;
            PSGeomVars.Vars.EnableTint    = 0u;
            PSGeomVars.Update(context);
            PSGeomVars.SetPSCBuffer(context, 2);

            VSGeomVars.Vars.EnableTint         = 0u;
            VSGeomVars.Vars.TintYVal           = 0u;
            VSGeomVars.Vars.IsDecal            = 0u;
            VSGeomVars.Vars.EnableWind         = 0u;
            VSGeomVars.Vars.WindOverrideParams = Vector4.Zero;
            VSGeomVars.Vars.globalAnimUV0      = Vector4.Zero;
            VSGeomVars.Vars.globalAnimUV1      = Vector4.Zero;
            VSGeomVars.Update(context);
            VSGeomVars.SetVSCBuffer(context, 4);


            //context.VertexShader.SetSampler(0, texsampler);
            context.PixelShader.SetSampler(0, texsampler);
            //context.PixelShader.SetSampler(1, texsamplerc);
            if (usediff)
            {
                texture.SetPSResource(context, 0);
                //context.PixelShader.SetShaderResource(0, difftex.ShaderResourceView);
            }
        }
Ejemplo n.º 4
0
        public override void SetGeomVars(DeviceContext context, RenderableGeometry geom)
        {
            switch (geom.DrawableGeom.Shader.FileName.Hash)
            {
            case 4103916155:    //{clouds_animsoft.sps}
            case 1097000161:    //{clouds_altitude.sps}
            case 1481470665:    //{clouds_soft.sps}
            case 2184108982:    //{clouds_fast.sps}
            case 4192928948:    //{clouds_anim.sps}
                break;

            default:
                break;
            }

            RenderableTexture DensitySampler        = null;
            RenderableTexture NormalSampler         = null;
            RenderableTexture DetailDensitySampler  = null;
            RenderableTexture DetailNormalSampler   = null;
            RenderableTexture DetailDensity2Sampler = null;
            RenderableTexture DetailNormal2Sampler  = null;
            RenderableTexture DepthMapTexSampler    = null;


            if ((geom.RenderableTextures != null) && (geom.RenderableTextures.Length > 0))
            {
                for (int i = 0; i < geom.RenderableTextures.Length; i++)
                {
                    var itex  = geom.RenderableTextures[i];
                    var ihash = geom.TextureParamHashes[i];
                    switch (ihash)
                    {
                    case ShaderParamNames.DensitySampler:
                        DensitySampler = itex;
                        break;

                    case ShaderParamNames.normalSampler:
                        NormalSampler = itex;
                        break;

                    case ShaderParamNames.DetailDensitySampler:
                        DetailDensitySampler = itex;
                        break;

                    case ShaderParamNames.DetailNormalSampler:
                        DetailNormalSampler = itex;
                        break;

                    case ShaderParamNames.DetailDensity2Sampler:
                        DetailDensity2Sampler = itex;
                        break;

                    case ShaderParamNames.DetailNormal2Sampler:
                        DetailNormal2Sampler = itex;
                        break;

                    case ShaderParamNames.DepthMapTexSampler:
                        DepthMapTexSampler = itex;
                        break;

                    default:
                        break;
                    }
                }
            }

            bool usedens = ((DensitySampler != null) && (DensitySampler.ShaderResourceView != null));
            bool usenorm = ((NormalSampler != null) && (NormalSampler.ShaderResourceView != null));
            bool usedden = ((DetailDensitySampler != null) && (DetailDensitySampler.ShaderResourceView != null));
            bool usednrm = ((DetailNormalSampler != null) && (DetailNormalSampler.ShaderResourceView != null));
            bool useddn2 = ((DetailDensity2Sampler != null) && (DetailDensity2Sampler.ShaderResourceView != null));
            bool usednm2 = ((DetailNormal2Sampler != null) && (DetailNormal2Sampler.ShaderResourceView != null));
            bool usedept = ((DepthMapTexSampler != null) && (DepthMapTexSampler.ShaderResourceView != null));

            if (usedens)
            {
                DensitySampler.SetPSResource(context, 0);
            }
            if (usenorm)
            {
                NormalSampler.SetPSResource(context, 1);
            }
            if (usedden)
            {
                DetailDensitySampler.SetPSResource(context, 2);
            }
            if (usednrm)
            {
                DetailNormalSampler.SetPSResource(context, 3);
            }
            if (useddn2)
            {
                DetailDensity2Sampler.SetPSResource(context, 4);
            }
            if (usednm2)
            {
                DetailNormal2Sampler.SetPSResource(context, 5);
            }
            if (usedept)
            {
                DepthMapTexSampler.SetPSResource(context, 6);
            }

            context.PixelShader.SetSampler(0, AnisotropicFilter ? texsampleranis : texsampler);
        }
Ejemplo n.º 5
0
        public override void SetGeomVars(DeviceContext context, RenderableGeometry geom)
        {
            RenderableTexture texture0    = null;
            RenderableTexture texture1    = null;
            RenderableTexture texture2    = null;
            RenderableTexture texture3    = null;
            RenderableTexture texture4    = null;
            RenderableTexture texturemask = null;
            RenderableTexture tintpal     = null;
            RenderableTexture normals0    = null;
            RenderableTexture normals1    = null;
            RenderableTexture normals2    = null;
            RenderableTexture normals3    = null;
            RenderableTexture normals4    = null;
            float             tntpalind   = 0.0f;
            bool usevc = true;

            if ((geom.RenderableTextures != null) && (geom.RenderableTextures.Length > 0))
            {
                for (int i = 0; i < geom.RenderableTextures.Length; i++)
                {
                    var itex = geom.RenderableTextures[i];
                    if (geom.HDTextureEnable)
                    {
                        var hdtex = geom.RenderableTexturesHD[i];
                        if ((hdtex != null) && (hdtex.IsLoaded))
                        {
                            itex = hdtex;
                        }
                    }
                    var ihash = geom.TextureParamHashes[i];
                    switch (ihash)
                    {
                    case MetaName.DiffuseSampler:
                        texture0 = itex;
                        break;

                    case MetaName.TextureSampler_layer0:
                        texture1 = itex;
                        break;

                    case MetaName.TextureSampler_layer1:
                        texture2 = itex;
                        break;

                    case MetaName.TextureSampler_layer2:
                        texture3 = itex;
                        break;

                    case MetaName.TextureSampler_layer3:
                        texture4 = itex;
                        break;

                    case MetaName.BumpSampler:
                        normals0 = itex;
                        break;

                    case MetaName.BumpSampler_layer0:
                        normals1 = itex;
                        break;

                    case MetaName.BumpSampler_layer1:
                        normals2 = itex;
                        break;

                    case MetaName.BumpSampler_layer2:
                        normals3 = itex;
                        break;

                    case MetaName.BumpSampler_layer3:
                        normals4 = itex;
                        break;

                    case MetaName.lookupSampler:
                        texturemask = itex;
                        break;

                    case MetaName.TintPaletteSampler:
                        tintpal = itex;
                        if (tintpal.Key != null)
                        {
                            //this is slightly dodgy but vsentvarsdata should have the correct value in it...
                            tntpalind = (VSEntityVars.Vars.TintPaletteIndex + 0.5f) / tintpal.Key.Height;
                        }
                        break;
                    }
                }

                //if ((geom.DiffuseSampler >= 0) && (geom.DiffuseSampler < geom.Textures.Length))
                //{
                //    texture0 = geom.Textures[geom.DiffuseSampler];
                //}
                //if ((geom.TextureSampler_layer0 >= 0) && (geom.TextureSampler_layer0 < geom.Textures.Length))
                //{
                //    texture1 = geom.Textures[geom.TextureSampler_layer0];
                //}
                //if ((geom.TextureSampler_layer1 >= 0) && (geom.TextureSampler_layer1 < geom.Textures.Length))
                //{
                //    texture2 = geom.Textures[geom.TextureSampler_layer1];
                //}
                //if ((geom.TextureSampler_layer2 >= 0) && (geom.TextureSampler_layer2 < geom.Textures.Length))
                //{
                //    texture3 = geom.Textures[geom.TextureSampler_layer2];
                //}
                //if ((geom.TextureSampler_layer3 >= 0) && (geom.TextureSampler_layer3 < geom.Textures.Length))
                //{
                //    texture4 = geom.Textures[geom.TextureSampler_layer3];
                //}
                //if ((geom.BumpSampler >= 0) && (geom.BumpSampler < geom.Textures.Length))
                //{
                //    normals0 = geom.Textures[geom.BumpSampler];
                //}
                //if ((geom.BumpSampler_layer0 >= 0) && (geom.BumpSampler_layer0 < geom.Textures.Length))
                //{
                //    normals1 = geom.Textures[geom.BumpSampler_layer0];
                //}
                //if ((geom.BumpSampler_layer1 >= 0) && (geom.BumpSampler_layer1 < geom.Textures.Length))
                //{
                //    normals2 = geom.Textures[geom.BumpSampler_layer1];
                //}
                //if ((geom.BumpSampler_layer2 >= 0) && (geom.BumpSampler_layer2 < geom.Textures.Length))
                //{
                //    normals3 = geom.Textures[geom.BumpSampler_layer2];
                //}
                //if ((geom.BumpSampler_layer3 >= 0) && (geom.BumpSampler_layer3 < geom.Textures.Length))
                //{
                //    normals4 = geom.Textures[geom.BumpSampler_layer3];
                //}
                //if ((geom.lookupSampler >= 0) && (geom.lookupSampler < geom.Textures.Length))
                //{
                //    texturemask = geom.Textures[geom.lookupSampler];
                //}
                //if ((geom.TintPaletteSampler >= 0) && (geom.TintPaletteSampler < geom.Textures.Length))
                //{
                //    tintpal = geom.Textures[geom.TintPaletteSampler];
                //    if (tintpal.Texture != null)
                //    {
                //        //this is slightly dodgy but vsentvarsdata should have the correct value in it...
                //        tntpalind = (vsentvarsdata.TintPaletteIndex + 0.5f) / tintpal.Texture.Height;
                //    }
                //}
            }

            if (RenderMode == WorldRenderMode.SingleTexture)
            {
                usevc = false;
                switch (RenderTextureSampler)
                {
                case MetaName.DiffuseSampler:
                case MetaName.BumpSampler:
                case MetaName.SpecSampler:
                    break;

                default:
                    for (int i = 0; i < geom.RenderableTextures.Length; i++)
                    {
                        var itex  = geom.RenderableTextures[i];
                        var ihash = geom.TextureParamHashes[i];
                        if (ihash == RenderTextureSampler)
                        {
                            texture0 = itex;
                            break;
                        }
                    }

                    //int directtexind = geom.GetTextureSamplerIndex(RenderTextureSampler);
                    //if ((directtexind >= 0) && (directtexind < geom.Textures.Length))
                    //{
                    //    texture0 = geom.Textures[directtexind];
                    //}
                    break;
                }
            }

            bool usediff0 = ((texture0 != null) && (texture0.ShaderResourceView != null));
            bool usediff1 = ((texture1 != null) && (texture1.ShaderResourceView != null));
            bool usediff2 = ((texture2 != null) && (texture2.ShaderResourceView != null));
            bool usediff3 = ((texture3 != null) && (texture3.ShaderResourceView != null));
            bool usediff4 = ((texture4 != null) && (texture4.ShaderResourceView != null));
            bool usemask  = ((texturemask != null) && (texturemask.ShaderResourceView != null));
            bool usetint  = ((tintpal != null) && (tintpal.ShaderResourceView != null));
            bool usenm    = (((normals0 != null) && (normals0.ShaderResourceView != null)) || ((normals1 != null) && (normals1.ShaderResourceView != null)));


            float bumpiness = 1.0f;

            if (usenm)
            {
                bumpiness = geom.bumpiness;
            }


            PSGeomVars.Vars.EnableTexture0     = usediff0 ? 1u : 0u;
            PSGeomVars.Vars.EnableTexture1     = usediff1 ? 1u : 0u;
            PSGeomVars.Vars.EnableTexture2     = usediff2 ? 1u : 0u;
            PSGeomVars.Vars.EnableTexture3     = usediff3 ? 1u : 0u;
            PSGeomVars.Vars.EnableTexture4     = usediff4 ? 1u : 0u;
            PSGeomVars.Vars.EnableTextureMask  = usemask ? 1u : 0u;
            PSGeomVars.Vars.EnableNormalMap    = usenm ? 1u : 0u;
            PSGeomVars.Vars.ShaderName         = geom.DrawableGeom.Shader.Name.Hash;
            PSGeomVars.Vars.EnableTint         = usetint ? 1u : 0u;
            PSGeomVars.Vars.EnableVertexColour = usevc ? 1u : 0u;
            PSGeomVars.Vars.bumpiness          = bumpiness;//
            PSGeomVars.Update(context);
            PSGeomVars.SetPSCBuffer(context, 2);

            VSGeomVars.Vars.EnableTint = usetint ? 1u : 0u;
            VSGeomVars.Vars.TintYVal   = tntpalind;
            VSGeomVars.Update(context);
            VSGeomVars.SetVSCBuffer(context, 4);


            context.VertexShader.SetSampler(0, texsamplertnt);
            context.PixelShader.SetSampler(0, AnisotropicFilter ? texsampleranis : texsampler);

            if (usediff0)
            {
                texture0.SetPSResource(context, 0);
            }
            if (usediff1)
            {
                texture1.SetPSResource(context, 2);
            }
            if (usediff2)
            {
                texture2.SetPSResource(context, 3);
            }
            if (usediff3)
            {
                texture3.SetPSResource(context, 4);
            }
            if (usediff4)
            {
                texture4.SetPSResource(context, 5);
            }
            if (usemask)
            {
                texturemask.SetPSResource(context, 6);
            }
            if (usetint)
            {
                tintpal.SetVSResource(context, 0);
            }
            if (normals0 != null)
            {
                normals0.SetPSResource(context, 7);
            }
            if (normals1 != null)
            {
                normals1.SetPSResource(context, 8);
            }
            if (normals2 != null)
            {
                normals2.SetPSResource(context, 9);
            }
            if (normals3 != null)
            {
                normals3.SetPSResource(context, 10);
            }
            if (normals4 != null)
            {
                normals4.SetPSResource(context, 11);
            }
        }
Ejemplo n.º 6
0
        public override void SetGeomVars(DeviceContext context, RenderableGeometry geom)
        {
            RenderableTexture texture = null; // ((geom.Textures != null) && (geom.Textures.Length > 0)) ? geom.Textures[0] : null;

            //trees_lod2
            //PNCCTTTT: texcoord2 seems to be 0-1 for the billboard, vertex pos is billboard root.
            //param for billboard dir... (treeLod2Normal)

            //trees_lod
            //PNCCT:


            if (geom.VertexType != VertexType.PNCCTTTT)
            {
            }

            var shader = geom.DrawableGeom.Shader;

            if (shader.Name.Hash == 1874959840)
            {
                int               nparams = 0;
                MetaName[]        hashes  = null;
                ShaderParameter[] sparams = null;

                if (shader.ParametersList != null)
                {
                    nparams = shader.ParametersList.Hashes.Length;
                    hashes  = shader.ParametersList.Hashes;
                    sparams = shader.ParametersList.Parameters;
                }

                for (int i = 0; i < nparams; i++)
                {
                    var h = (ShaderParamNames)shader.ParametersList.Hashes[i];
                    switch (h)
                    {
                    case ShaderParamNames.AlphaTest: VSGeomVars.Vars.AlphaTest = (Vector4)sparams[i].Data; break;

                    case ShaderParamNames.AlphaScale: VSGeomVars.Vars.AlphaScale = (Vector4)sparams[i].Data; break;

                    case ShaderParamNames.UseTreeNormals: VSGeomVars.Vars.UseTreeNormals = (Vector4)sparams[i].Data; break;

                    case ShaderParamNames.treeLod2Normal: VSGeomVars.Vars.treeLod2Normal = (Vector4)sparams[i].Data; break;

                    case ShaderParamNames.treeLod2Params: VSGeomVars.Vars.treeLod2Params = (Vector4)sparams[i].Data; break;
                    }
                }
            }
            else
            {
                VSGeomVars.Vars.AlphaTest      = Vector4.Zero;
                VSGeomVars.Vars.AlphaScale     = Vector4.Zero;
                VSGeomVars.Vars.UseTreeNormals = Vector4.Zero;
                VSGeomVars.Vars.treeLod2Normal = Vector4.Zero;
                VSGeomVars.Vars.treeLod2Params = Vector4.Zero;
            }

            VSGeomVars.Update(context);
            VSGeomVars.SetVSCBuffer(context, 3);

            if ((geom.RenderableTextures != null) && (geom.RenderableTextures.Length > 0))
            {
                for (int i = 0; i < geom.RenderableTextures.Length; i++)
                {
                    var itex  = geom.RenderableTextures[i];
                    var ihash = geom.TextureParamHashes[i];
                    switch (ihash)
                    {
                    case ShaderParamNames.DiffuseSampler:
                        texture = itex;
                        break;
                    }
                    if (texture != null)
                    {
                        break;
                    }
                }

                ////try get default diffuse texture
                //if ((geom.DiffuseSampler >= 0) && (geom.DiffuseSampler < geom.Textures.Length))
                //{
                //    texture = geom.Textures[geom.DiffuseSampler];
                //}
                //if ((texture == null) && (geom.TextureSampler_layer0 >= 0) && (geom.TextureSampler_layer0 < geom.Textures.Length))
                //{
                //    texture = geom.Textures[geom.TextureSampler_layer0];
                //}
                //if ((texture == null) && (geom.TextureSampler_layer1 >= 0) && (geom.TextureSampler_layer1 < geom.Textures.Length))
                //{
                //    texture = geom.Textures[geom.TextureSampler_layer1];
                //}
                //if ((texture == null) && (geom.TextureSampler_layer2 >= 0) && (geom.TextureSampler_layer2 < geom.Textures.Length))
                //{
                //    texture = geom.Textures[geom.TextureSampler_layer2];
                //}
                //if ((texture == null) && (geom.TextureSampler_layer3 >= 0) && (geom.TextureSampler_layer3 < geom.Textures.Length))
                //{
                //    texture = geom.Textures[geom.TextureSampler_layer3];
                //}

                //fallback try get first texture...
                int index = 0;
                while (((texture == null) || (texture.Texture2D == null)) && (index < geom.RenderableTextures.Length))
                {
                    texture = geom.RenderableTextures[index];
                    index++;
                }
            }


            bool usediff = ((texture != null) && (texture.Texture2D != null) && (texture.ShaderResourceView != null));

            PSEntityVars.Vars.EnableTexture = usediff ? 1u : 0u;
            PSEntityVars.Update(context);
            PSEntityVars.SetPSCBuffer(context, 1);

            if (usediff)
            {
                context.PixelShader.SetSampler(0, texsampler);
                //context.PixelShader.SetShaderResource(0, difftex.ShaderResourceView);
                texture.SetPSResource(context, 0);
            }
        }
Ejemplo n.º 7
0
        public override void SetGeomVars(DeviceContext context, RenderableGeometry geom)
        {
            RenderableTexture texture = null; // ((geom.Textures != null) && (geom.Textures.Length > 0)) ? geom.Textures[0] : null;

            //RenderableTexture tintpal = null;

            //float tntpalind = 0.0f;

            if ((geom.RenderableTextures != null) && (geom.RenderableTextures.Length > 0))
            {
                for (int i = 0; i < geom.RenderableTextures.Length; i++)
                {
                    var itex  = geom.RenderableTextures[i];
                    var ihash = geom.TextureParamHashes[i];
                    switch (ihash)
                    {
                    case MetaName.DiffuseSampler:
                    case MetaName.TextureSampler_layer0:
                    case MetaName.TextureSampler_layer1:
                    case MetaName.TextureSampler_layer2:
                    case MetaName.TextureSampler_layer3:
                        texture = itex;
                        break;
                    }
                    if (texture != null)
                    {
                        break;
                    }
                }

                ////try get default diffuse texture
                //if ((geom.DiffuseSampler >= 0) && (geom.DiffuseSampler < geom.Textures.Length))
                //{
                //    texture = geom.Textures[geom.DiffuseSampler];
                //}
                //if ((texture == null) && (geom.TextureSampler_layer0 >= 0) && (geom.TextureSampler_layer0 < geom.Textures.Length))
                //{
                //    texture = geom.Textures[geom.TextureSampler_layer0];
                //}
                //if ((texture == null) && (geom.TextureSampler_layer1 >= 0) && (geom.TextureSampler_layer1 < geom.Textures.Length))
                //{
                //    texture = geom.Textures[geom.TextureSampler_layer1];
                //}
                //if ((texture == null) && (geom.TextureSampler_layer2 >= 0) && (geom.TextureSampler_layer2 < geom.Textures.Length))
                //{
                //    texture = geom.Textures[geom.TextureSampler_layer2];
                //}
                //if ((texture == null) && (geom.TextureSampler_layer3 >= 0) && (geom.TextureSampler_layer3 < geom.Textures.Length))
                //{
                //    texture = geom.Textures[geom.TextureSampler_layer3];
                //}

                //fallback try get first texture... eventaully remove this! (helps with water for now)
                int index = 0;
                while (((texture == null)) && (index < geom.RenderableTextures.Length))
                {
                    texture = geom.RenderableTextures[index];
                    index++;
                }


                //if ((geom.PaletteTexture >= 0) && (geom.PaletteTexture < geom.Textures.Length))
                //{
                //    tintpal = geom.Textures[geom.PaletteTexture];
                //    if (tintpal.Texture != null)
                //    {
                //        //this is slightly dodgy but vsentvarsdata should have the correct value in it...
                //        tntpalind = (vsentvarsdata.TintPaletteIndex + 0.5f) / tintpal.Texture.Height;
                //    }
                //}
            }


            bool usediff = ((texture != null) && (texture.ShaderResourceView != null));


            uint windflag   = 0;
            var  shaderFile = geom.DrawableGeom.Shader.FileName;

            switch (shaderFile.Hash)
            {
            case 2245870123:    //trees_normal_diffspec_tnt.sps
            case 3334613197:    //trees_tnt.sps
            case 1229591973:    //{trees_normal_spec_tnt.sps}
            case 2322653400:    //{trees.sps}
            case 3192134330:    //{trees_normal.sps}
            case 1224713457:    //{trees_normal_spec.sps}
            case 4265705004:    //{trees_normal_diffspec.sps}
                windflag = 1;
                break;
            }



            GeomVars.Vars.EnableTexture      = usediff ? 1u : 0u;
            GeomVars.Vars.EnableTint         = 0u; // usetint ? 1u : 0u;
            GeomVars.Vars.IsDecal            = 0u; // DecalMode ? 1u : 0u;
            GeomVars.Vars.EnableWind         = windflag;
            GeomVars.Vars.WindOverrideParams = geom.WindOverrideParams;
            GeomVars.Update(context);
            GeomVars.SetPSCBuffer(context, 0);
            GeomVars.SetVSCBuffer(context, 3);

            context.VertexShader.SetSampler(0, texsamplerc);
            context.PixelShader.SetSampler(0, texsampler);
            //context.PixelShader.SetSampler(1, texsamplerc);
            if (usediff)
            {
                texture.SetPSResource(context, 0);
            }
        }
Ejemplo n.º 8
0
        public void RenderMoon(DeviceContext context, Camera camera, Weather weather, ShaderGlobalLights lights, RenderableTexture moontex)
        {
            context.VertexShader.Set(moonvs);
            context.PixelShader.Set(moonps);


            Quaternion ori  = Quaternion.Invert(Quaternion.LookAtRH(Vector3.Zero, lights.CurrentMoonDir, lights.MoonAxis));
            Matrix     omat = ori.ToMatrix();


            VSSunMoonVars.Vars.ViewProj = Matrix.Transpose(camera.ViewProjMatrix);
            VSSunMoonVars.Vars.ViewInv  = Matrix.Transpose(omat);// camera.ViewInvMatrix);
            VSSunMoonVars.Vars.CamRel   = new Vector4(lights.CurrentMoonDir, 0);
            VSSunMoonVars.Vars.Size     = new Vector2(weather.CurrentValues.skyMoonDiscSize * 0.008f);
            VSSunMoonVars.Vars.Offset   = Vector2.Zero;
            VSSunMoonVars.Update(context);
            VSSunMoonVars.SetVSCBuffer(context, 0);

            PSSunMoonVars.Vars.Colour = new Vector4(weather.CurrentValues.skyMoonCol * weather.CurrentValues.skyMoonIten, weather.CurrentValues.skyMoonIten);
            PSSunMoonVars.Update(context);
            PSSunMoonVars.SetPSCBuffer(context, 0);

            context.PixelShader.SetSampler(0, texsampler);
            moontex.SetPSResource(context, 0);

            context.InputAssembler.InputLayout = moonlayout;
            moonquad.Draw(context);
        }
Ejemplo n.º 9
0
        public override void SetGeomVars(DeviceContext context, RenderableGeometry geom)
        {
            RenderableTexture texture = null;
            RenderableTexture bumptex = null;
            RenderableTexture flowtex = null;
            RenderableTexture foamtex = null;
            RenderableTexture fogtex  = null;

            if ((geom.RenderableTextures != null) && (geom.RenderableTextures.Length > 0))
            {
                if (RenderMode == WorldRenderMode.Default)
                {
                    for (int i = 0; i < geom.RenderableTextures.Length; i++)
                    {
                        var itex  = geom.RenderableTextures[i];
                        var ihash = geom.TextureParamHashes[i];
                        if (itex == null)
                        {
                            continue;
                        }
                        switch (ihash)
                        {
                        case ShaderParamNames.DiffuseSampler:
                            texture = itex;
                            break;

                        case ShaderParamNames.BumpSampler:
                            bumptex = itex;
                            break;

                        case ShaderParamNames.FlowSampler:
                            flowtex = itex;
                            break;

                        case ShaderParamNames.FoamSampler:
                            foamtex = itex;
                            break;

                        case ShaderParamNames.FogSampler:
                            fogtex = itex;
                            break;

                        default:
                            if (texture == null)
                            {
                                texture = itex;
                            }
                            break;
                        }
                    }
                }
                else if (RenderMode == WorldRenderMode.SingleTexture)
                {
                    for (int i = 0; i < geom.RenderableTextures.Length; i++)
                    {
                        var itex  = geom.RenderableTextures[i];
                        var ihash = geom.TextureParamHashes[i];
                        if (ihash == RenderTextureSampler)
                        {
                            texture = itex;
                            break;
                        }
                    }
                }
            }


            bool usediff = ((texture != null) && (texture.ShaderResourceView != null));
            bool usebump = ((bumptex != null) && (bumptex.ShaderResourceView != null));
            bool useflow = ((flowtex != null) && (flowtex.ShaderResourceView != null));
            bool usefoam = ((foamtex != null) && (foamtex.ShaderResourceView != null));
            bool usefog  = ((fogtex != null) && (fogtex.ShaderResourceView != null));

            uint shaderMode = 0;
            var  shaderFile = geom.DrawableGeom.Shader.FileName;

            switch (shaderFile.Hash)
            {
            case 1529202445:    //{water_river.sps}
            case 4064804434:    //{water_riverlod.sps}
            case 2871265627:    //{water_riverocean.sps}
            case 1507348828:    //{water_rivershallow.sps}
            case 3945561843:    //{water_fountain.sps}
            case 4234404348:    //{water_shallow.sps}
            case 1077877097:    //{water_poolenv.sps}
                break;

            case 1471966282:    //{water_decal.sps} (should this be in decal batch?)
            case 3053856997:    //{water_riverfoam.sps}
                shaderMode = 1;
                break;

            case 3066724854:    //{water_terrainfoam.sps}
                shaderMode = 2;
                break;

            default:
                break;
            }


            PSGeomVars.Vars.EnableTexture     = usediff ? 1u : 0u;
            PSGeomVars.Vars.EnableBumpMap     = usebump ? 1u : 0u;
            PSGeomVars.Vars.EnableFoamMap     = usefoam ? 1u : 0u;
            PSGeomVars.Vars.ShaderMode        = shaderMode;
            PSGeomVars.Vars.SpecularIntensity = SpecularEnable ? 1.0f : 0.0f; // geom.specularIntensityMult;
            PSGeomVars.Vars.SpecularFalloff   = 1.0f;                         // geom.specularFalloffMult;
            PSGeomVars.Vars.WaveOffset        = geom.WaveOffset;              //for terrainfoam
            PSGeomVars.Vars.WaterHeight       = geom.WaterHeight;             //for terrainfoam
            PSGeomVars.Vars.WaveMovement      = geom.WaveMovement;            //for terrainfoam
            PSGeomVars.Vars.HeightOpacity     = geom.HeightOpacity;           //for terrainfoam
            PSGeomVars.Vars.RippleSpeed       = geom.RippleSpeed;
            PSGeomVars.Vars.RippleScale       = geom.RippleScale;
            PSGeomVars.Vars.RippleBumpiness   = geom.RippleBumpiness;
            PSGeomVars.Update(context);
            PSGeomVars.SetPSCBuffer(context, 2);

            VSGeomVars.Vars.EnableFlow  = useflow ? 1u : 0u;
            VSGeomVars.Vars.ShaderMode  = shaderMode;
            VSGeomVars.Vars.WaterParams = Vector4.Zero;
            VSGeomVars.Vars.RippleSpeed = geom.RippleSpeed;
            VSGeomVars.Update(context);
            VSGeomVars.SetVSCBuffer(context, 3);

            context.VertexShader.SetSampler(0, texsamplerflow);
            context.PixelShader.SetSampler(0, AnisotropicFilter ? texsampleranis : texsampler);
            if (usediff)
            {
                texture.SetPSResource(context, 0);
            }
            if (usebump)
            {
                bumptex.SetPSResource(context, 2);
            }
            if (usefoam)
            {
                foamtex.SetPSResource(context, 3);
            }
            if (useflow)
            {
                flowtex.SetVSResource(context, 0);
            }
        }