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