Module: wine Branch: master Commit: 0dade7207f6ce2a21384c4e8c784efc7bd13ab06 URL: http://source.winehq.org/git/wine.git/?a=commit;h=0dade7207f6ce2a21384c4e8c7...
Author: Stefan Dösinger stefan@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 },