Stefan Dösinger : wined3d: Implement range based fog and advertize it correctly.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Aug 21 07:21:01 CDT 2007


Module: wine
Branch: master
Commit: 0dade7207f6ce2a21384c4e8c784efc7bd13ab06
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=0dade7207f6ce2a21384c4e8c784efc7bd13ab06

Author: Stefan Dösinger <stefan at codeweavers.com>
Date:   Tue Aug 21 12:30:22 2007 +0200

wined3d: Implement range based fog and advertize it correctly.

---

 dlls/wined3d/directx.c |    4 +++-
 dlls/wined3d/state.c   |   18 +++++++++++++++---
 2 files changed, 18 insertions(+), 4 deletions(-)

diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index 0522114..01e6138 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -1889,7 +1889,6 @@ static HRESULT WINAPI IWineD3DImpl_GetDeviceCaps(IWineD3D *iface, UINT Adapter,
                                       WINED3DPRASTERCAPS_ZFOG      |
                                       WINED3DPRASTERCAPS_FOGVERTEX |
                                       WINED3DPRASTERCAPS_FOGTABLE  |
-                                      WINED3DPRASTERCAPS_FOGRANGE  |
                                       WINED3DPRASTERCAPS_STIPPLE   |
                                       WINED3DPRASTERCAPS_SUBPIXEL  |
                                       WINED3DPRASTERCAPS_ZTEST     |
@@ -1902,6 +1901,9 @@ static HRESULT WINAPI IWineD3DImpl_GetDeviceCaps(IWineD3D *iface, UINT Adapter,
                             WINED3DPRASTERCAPS_ZBIAS         |
                             WINED3DPRASTERCAPS_MIPMAPLODBIAS;
     }
+    if(GL_SUPPORT(NV_FOG_DISTANCE)) {
+        *pCaps->RasterCaps         |= WINED3DPRASTERCAPS_FOGRANGE;
+    }
                         /* FIXME Add:
 			   WINED3DPRASTERCAPS_COLORPERSPECTIVE
 			   WINED3DPRASTERCAPS_STRETCHBLTMULTISAMPLE
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index be2f902..fb060c5 100644
--- a/dlls/wined3d/state.c
+++ b/dlls/wined3d/state.c
@@ -988,9 +988,21 @@ static void state_fog(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DCo
             checkGLcall("glFogf(GL_FOG_END, fogend");
         }
     }
+}
 
-    if (GL_SUPPORT(NV_FOG_DISTANCE)) {
-        glFogi(GL_FOG_DISTANCE_MODE_NV, GL_EYE_PLANE_ABSOLUTE_NV);
+static void state_rangefog(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+    if(stateblock->renderState[WINED3DRS_RANGEFOGENABLE]) {
+        if (GL_SUPPORT(NV_FOG_DISTANCE)) {
+            glFogi(GL_FOG_DISTANCE_MODE_NV, GL_EYE_RADIAL_NV);
+            checkGLcall("glFogi(GL_FOG_DISTANCE_MODE_NV, GL_EYE_RADIAL_NV)");
+        } else {
+            WARN("Range fog enabled, but not supported by this opengl implementation\n");
+        }
+    } else {
+        if (GL_SUPPORT(NV_FOG_DISTANCE)) {
+            glFogi(GL_FOG_DISTANCE_MODE_NV, GL_EYE_PLANE_ABSOLUTE_NV);
+            checkGLcall("glFogi(GL_FOG_DISTANCE_MODE_NV, GL_EYE_PLANE_ABSOLUTE_NV)");
+        }
     }
 }
 
@@ -3534,7 +3546,7 @@ const struct StateEntry StateTable[] =
     { /* 45, WINED3DRS_TEXTUREADDRESSV              */      0, /* Handled in ddraw */                           state_undefined     },
     { /* 46, WINED3DRS_MIPMAPLODBIAS                */      STATE_RENDER(WINED3DRS_MIPMAPLODBIAS),              state_mipmaplodbias },
     { /* 47, WINED3DRS_ZBIAS                        */      STATE_RENDER(WINED3DRS_ZBIAS),                      state_zbias         },
-    { /* 48, WINED3DRS_RANGEFOGENABLE               */      0,                                                  state_nogl          },
+    { /* 48, WINED3DRS_RANGEFOGENABLE               */      STATE_RENDER(WINED3DRS_RANGEFOGENABLE),             state_rangefog      },
     { /* 49, WINED3DRS_ANISOTROPY                   */      STATE_RENDER(WINED3DRS_ANISOTROPY),                 state_anisotropy    },
     { /* 50, WINED3DRS_FLUSHBATCH                   */      STATE_RENDER(WINED3DRS_FLUSHBATCH),                 state_flushbatch    },
     { /* 51, WINED3DRS_TRANSLUCENTSORTINDEPENDENT   */      STATE_RENDER(WINED3DRS_TRANSLUCENTSORTINDEPENDENT), state_translucentsi },




More information about the wine-cvs mailing list