Advertisement
Guest User

Untitled

a guest
Aug 18th, 2019
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.27 KB | None | 0 0
  1.   void D3D9DeviceEx::UpdateFog() {
  2.     auto& rs = m_state.renderStates;
  3.  
  4.     bool fogEnabled = rs[D3DRS_FOGENABLE] != FALSE;
  5.  
  6.     bool pixelFog   = rs[D3DRS_FOGTABLEMODE]  != D3DFOG_NONE && fogEnabled;
  7.     bool vertexFog  = rs[D3DRS_FOGVERTEXMODE] != D3DFOG_NONE && fogEnabled && !pixelFog;
  8.  
  9.     auto UpdateFogConstants = [&](D3DFOGMODE FogMode) {
  10.       if (m_flags.test(D3D9DeviceFlag::DirtyFogColor)) {
  11.         m_flags.clr(D3D9DeviceFlag::DirtyFogColor);
  12.         UpdatePushConstant<D3D9RenderStateItem::FogColor>();
  13.       }
  14.  
  15.       if (FogMode == D3DFOG_LINEAR) {
  16.         if (m_flags.test(D3D9DeviceFlag::DirtyFogStart)) {
  17.           m_flags.clr(D3D9DeviceFlag::DirtyFogStart);
  18.           UpdatePushConstant<D3D9RenderStateItem::FogStart>();
  19.         }
  20.  
  21.         if (m_flags.test(D3D9DeviceFlag::DirtyFogEnd)) {
  22.           m_flags.clr(D3D9DeviceFlag::DirtyFogEnd);
  23.           UpdatePushConstant<D3D9RenderStateItem::FogEnd>();
  24.         }
  25.       }
  26.       else {
  27.         if (m_flags.test(D3D9DeviceFlag::DirtyFogDensity)) {
  28.           m_flags.clr(D3D9DeviceFlag::DirtyFogDensity);
  29.           UpdatePushConstant<D3D9RenderStateItem::FogDensity>();
  30.         }
  31.       }
  32.     };
  33.  
  34.     if (vertexFog) {
  35.       D3DFOGMODE mode = D3DFOGMODE(rs[D3DRS_FOGVERTEXMODE]);
  36.  
  37.       UpdateFogConstants(mode);
  38.       EmitCs([cMode = mode] (DxvkContext* ctx) {
  39.         ctx->setSpecConstant(D3D9SpecConstantId::FogEnabled,    true);
  40.         ctx->setSpecConstant(D3D9SpecConstantId::VertexFogMode, cMode);
  41.         ctx->setSpecConstant(D3D9SpecConstantId::PixelFogMode,  D3DFOG_NONE);
  42.       });
  43.     }
  44.     else if (pixelFog) {
  45.       D3DFOGMODE mode = D3DFOGMODE(rs[D3DRS_FOGTABLEMODE]);
  46.  
  47.       UpdateFogConstants(mode);
  48.       EmitCs([cMode = mode] (DxvkContext* ctx) {
  49.         ctx->setSpecConstant(D3D9SpecConstantId::FogEnabled,    true);
  50.         ctx->setSpecConstant(D3D9SpecConstantId::VertexFogMode, D3DFOG_NONE);
  51.         ctx->setSpecConstant(D3D9SpecConstantId::PixelFogMode,  cMode);
  52.       });
  53.     }
  54.     else {
  55.       EmitCs([] (DxvkContext* ctx) {
  56.         ctx->setSpecConstant(D3D9SpecConstantId::FogEnabled,    false);
  57.         ctx->setSpecConstant(D3D9SpecConstantId::VertexFogMode, D3DFOG_NONE);
  58.         ctx->setSpecConstant(D3D9SpecConstantId::PixelFogMode,  D3DFOG_NONE);
  59.       });
  60.     }
  61.   }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement