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); }
public void SetTextures(DeviceContext context, RenderableTexture starfield) { if (starfield != null) { context.PixelShader.SetSampler(0, texsampler); starfield.SetPSResource(context, 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); } }
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); } }
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); }
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; // ((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); } }
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); } }
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); } }