From 9bcd58f312af374a3345dc72e66686fbc2b2bfcd Mon Sep 17 00:00:00 2001 From: =?utf8?q?Stefan=20D=C3=B6singer?= Date: Sat, 10 Sep 2011 23:05:33 +0200 Subject: [PATCH] wined3d: Disable range fog with per-pixel fog. --- dlls/wined3d/state.c | 51 ++++++++++++++++++++++++++------------------ 1 file changed, 30 insertions(+), 21 deletions(-) diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c index 31c62a4ecb..8cf02ef450 100644 --- a/dlls/wined3d/state.c +++ b/dlls/wined3d/state.c @@ -898,6 +898,7 @@ static void state_stencilwrite(struct wined3d_context *context, const struct win static void state_fog_vertexpart(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id) { + const struct wined3d_gl_info *gl_info = context->gl_info; TRACE("context %p, state %p, state_id %#x.\n", context, state, state_id); if (!state->render_states[WINED3DRS_FOGENABLE]) @@ -912,6 +913,13 @@ static void state_fog_vertexpart(struct wined3d_context *context, const struct w checkGLcall("glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT)"); context->fog_coord = FALSE; } + + /* Range fog is only used with per-vertex fog in d3d */ + if (gl_info->supported[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)"); + } return; } @@ -926,13 +934,33 @@ static void state_fog_vertexpart(struct wined3d_context *context, const struct w checkGLcall("glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FOG_COORDINATE_EXT)"); context->fog_coord = TRUE; } - } else { + } + else + { /* Otherwise, use the fragment depth */ if(context->fog_coord) { glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT); checkGLcall("glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT)"); context->fog_coord = FALSE; } + + if (state->render_states[WINED3DRS_RANGEFOGENABLE]) + { + if (gl_info->supported[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 GL implementation.\n"); + } + } + else if (gl_info->supported[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)"); + } } } @@ -1137,24 +1165,6 @@ void state_fog_fragpart(struct wined3d_context *context, const struct wined3d_st } } -static void state_rangefog_w(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id) -{ - if (state->render_states[WINED3DRS_RANGEFOGENABLE]) - WARN("Range fog enabled, but not supported by this GL implementation.\n"); -} - -static void state_rangefog(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id) -{ - if (state->render_states[WINED3DRS_RANGEFOGENABLE]) - { - glFogi(GL_FOG_DISTANCE_MODE_NV, GL_EYE_RADIAL_NV); - checkGLcall("glFogi(GL_FOG_DISTANCE_MODE_NV, GL_EYE_RADIAL_NV)"); - } else { - glFogi(GL_FOG_DISTANCE_MODE_NV, GL_EYE_PLANE_ABSOLUTE_NV); - checkGLcall("glFogi(GL_FOG_DISTANCE_MODE_NV, GL_EYE_PLANE_ABSOLUTE_NV)"); - } -} - void state_fogcolor(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id) { float col[4]; @@ -5376,8 +5386,7 @@ const struct StateEntryTemplate ffp_vertexstate_template[] = { { STATE_RENDER(WINED3DRS_FOGENABLE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_fog_vertexpart}, WINED3D_GL_EXT_NONE }, { STATE_RENDER(WINED3DRS_FOGTABLEMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), NULL }, WINED3D_GL_EXT_NONE }, { STATE_RENDER(WINED3DRS_FOGVERTEXMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), NULL }, WINED3D_GL_EXT_NONE }, - { STATE_RENDER(WINED3DRS_RANGEFOGENABLE), { STATE_RENDER(WINED3DRS_RANGEFOGENABLE), state_rangefog }, NV_FOG_DISTANCE }, - { STATE_RENDER(WINED3DRS_RANGEFOGENABLE), { STATE_RENDER(WINED3DRS_RANGEFOGENABLE), state_rangefog_w }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_RANGEFOGENABLE), { STATE_RENDER(WINED3DRS_FOGENABLE), NULL }, WINED3D_GL_EXT_NONE }, { STATE_RENDER(WINED3DRS_CLIPPING), { STATE_RENDER(WINED3DRS_CLIPPING), state_clipping }, WINED3D_GL_EXT_NONE }, { STATE_RENDER(WINED3DRS_CLIPPLANEENABLE), { STATE_RENDER(WINED3DRS_CLIPPING), NULL }, WINED3D_GL_EXT_NONE }, { STATE_RENDER(WINED3DRS_LIGHTING), { STATE_RENDER(WINED3DRS_LIGHTING), state_lighting }, WINED3D_GL_EXT_NONE }, -- 2.32.0.93.g670b81a890