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