From 0772bb49e45a0e4d20b722006ab447ff9dd0fdaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20D=C3=B6singer?= Date: Fri, 8 Dec 2006 18:38:30 +0100 Subject: [PATCH] wined3d: Move WINED3DRS_SPECULARENABLE to the state table. --- dlls/wined3d/device.c | 70 +---------------------------------------- dlls/wined3d/state.c | 72 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 72 insertions(+), 70 deletions(-) diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index d0bdde94e69..753441ca4fb 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -3461,76 +3461,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetRenderState(IWineD3DDevice *iface, W case WINED3DRS_CLIPPING : case WINED3DRS_BLENDOP : case WINED3DRS_TEXTUREFACTOR : - StateTable[STATE_RENDER(State)].apply(STATE_RENDER(State), This->stateBlock); - break; - case WINED3DRS_SPECULARENABLE : - { - /* Originally this used glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL,GL_SEPARATE_SPECULAR_COLOR) - and (GL_LIGHT_MODEL_COLOR_CONTROL,GL_SINGLE_COLOR) to swap between enabled/disabled - specular color. This is wrong: - Separate specular color means the specular colour is maintained separately, whereas - single color means it is merged in. However in both cases they are being used to - some extent. - To disable specular color, set it explicitly to black and turn off GL_COLOR_SUM_EXT - NOTE: If not supported don't give FIXMEs the impact is really minimal and very few people are - running 1.4 yet! - */ - /* - * If register combiners are enabled, enabling / disabling GL_COLOR_SUM has no effect. - * Instead, we need to setup the FinalCombiner properly. - * - * The default setup for the FinalCombiner is: - * - * - * GL_VARIABLE_A_NV GL_FOG, GL_UNSIGNED_IDENTITY_NV GL_ALPHA - * GL_VARIABLE_B_NV GL_SPARE0_PLUS_SECONDARY_COLOR_NV GL_UNSIGNED_IDENTITY_NV GL_RGB - * GL_VARIABLE_C_NV GL_FOG GL_UNSIGNED_IDENTITY_NV GL_RGB - * GL_VARIABLE_D_NV GL_ZERO GL_UNSIGNED_IDENTITY_NV GL_RGB - * GL_VARIABLE_E_NV GL_ZERO GL_UNSIGNED_IDENTITY_NV GL_RGB - * GL_VARIABLE_F_NV GL_ZERO GL_UNSIGNED_IDENTITY_NV GL_RGB - * GL_VARIABLE_G_NV GL_SPARE0_NV GL_UNSIGNED_IDENTITY_NV GL_ALPHA - * - * That's pretty much fine as it is, except for variable B, which needs to take - * either GL_SPARE0_PLUS_SECONDARY_COLOR_NV or GL_SPARE0_NV, depending on - * whether WINED3DRS_SPECULARENABLE is enabled or not. - */ - - if (Value) { - glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, (float*) &This->updateStateBlock->material.Specular); - checkGLcall("glMaterialfv"); - if (GL_SUPPORT(EXT_SECONDARY_COLOR)) { - glEnable(GL_COLOR_SUM_EXT); - } else { - TRACE("Specular colors cannot be enabled in this version of opengl\n"); - } - checkGLcall("glEnable(GL_COLOR_SUM)"); - - if (GL_SUPPORT(NV_REGISTER_COMBINERS)) { - GL_EXTCALL(glFinalCombinerInputNV(GL_VARIABLE_B_NV, GL_SPARE0_PLUS_SECONDARY_COLOR_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB)); - checkGLcall("glFinalCombinerInputNV()"); - } - } else { - float black[4] = {0.0f, 0.0f, 0.0f, 0.0f}; - - /* for the case of enabled lighting: */ - glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, &black[0]); - checkGLcall("glMaterialfv"); - - /* for the case of disabled lighting: */ - if (GL_SUPPORT(EXT_SECONDARY_COLOR)) { - glDisable(GL_COLOR_SUM_EXT); - } else { - TRACE("Specular colors cannot be disabled in this version of opengl\n"); - } - checkGLcall("glDisable(GL_COLOR_SUM)"); - - if (GL_SUPPORT(NV_REGISTER_COMBINERS)) { - GL_EXTCALL(glFinalCombinerInputNV(GL_VARIABLE_B_NV, GL_SPARE0_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB)); - checkGLcall("glFinalCombinerInputNV()"); - } - } - } + StateTable[STATE_RENDER(State)].apply(STATE_RENDER(State), This->stateBlock); break; case WINED3DRS_STENCILENABLE : diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c index 549b1209745..a492fbed5b6 100644 --- a/dlls/wined3d/state.c +++ b/dlls/wined3d/state.c @@ -432,6 +432,76 @@ static void state_blendop(DWORD state, IWineD3DStateBlockImpl *stateblock) { checkGLcall("glBlendEquation"); } +static void +state_specularenable(DWORD state, IWineD3DStateBlockImpl *stateblock) { + /* Originally this used glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL,GL_SEPARATE_SPECULAR_COLOR) + * and (GL_LIGHT_MODEL_COLOR_CONTROL,GL_SINGLE_COLOR) to swap between enabled/disabled + * specular color. This is wrong: + * Separate specular color means the specular colour is maintained separately, whereas + * single color means it is merged in. However in both cases they are being used to + * some extent. + * To disable specular color, set it explicitly to black and turn off GL_COLOR_SUM_EXT + * NOTE: If not supported don't give FIXMEs the impact is really minimal and very few people are + * running 1.4 yet! + * + * + * If register combiners are enabled, enabling / disabling GL_COLOR_SUM has no effect. + * Instead, we need to setup the FinalCombiner properly. + * + * The default setup for the FinalCombiner is: + * + * + * GL_VARIABLE_A_NV GL_FOG, GL_UNSIGNED_IDENTITY_NV GL_ALPHA + * GL_VARIABLE_B_NV GL_SPARE0_PLUS_SECONDARY_COLOR_NV GL_UNSIGNED_IDENTITY_NV GL_RGB + * GL_VARIABLE_C_NV GL_FOG GL_UNSIGNED_IDENTITY_NV GL_RGB + * GL_VARIABLE_D_NV GL_ZERO GL_UNSIGNED_IDENTITY_NV GL_RGB + * GL_VARIABLE_E_NV GL_ZERO GL_UNSIGNED_IDENTITY_NV GL_RGB + * GL_VARIABLE_F_NV GL_ZERO GL_UNSIGNED_IDENTITY_NV GL_RGB + * GL_VARIABLE_G_NV GL_SPARE0_NV GL_UNSIGNED_IDENTITY_NV GL_ALPHA + * + * That's pretty much fine as it is, except for variable B, which needs to take + * either GL_SPARE0_PLUS_SECONDARY_COLOR_NV or GL_SPARE0_NV, depending on + * whether WINED3DRS_SPECULARENABLE is enabled or not. + */ + + TRACE("Setting specular enable state\n"); + /* TODO: Add to the material setting functions */ + if (stateblock->renderState[WINED3DRS_SPECULARENABLE]) { + glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, (float*) &stateblock->material.Specular); + checkGLcall("glMaterialfv"); + if (GL_SUPPORT(EXT_SECONDARY_COLOR)) { + glEnable(GL_COLOR_SUM_EXT); + } else { + TRACE("Specular colors cannot be enabled in this version of opengl\n"); + } + checkGLcall("glEnable(GL_COLOR_SUM)"); + + if (GL_SUPPORT(NV_REGISTER_COMBINERS)) { + GL_EXTCALL(glFinalCombinerInputNV(GL_VARIABLE_B_NV, GL_SPARE0_PLUS_SECONDARY_COLOR_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB)); + checkGLcall("glFinalCombinerInputNV()"); + } + } else { + float black[4] = {0.0f, 0.0f, 0.0f, 0.0f}; + + /* for the case of enabled lighting: */ + glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, &black[0]); + checkGLcall("glMaterialfv"); + + /* for the case of disabled lighting: */ + if (GL_SUPPORT(EXT_SECONDARY_COLOR)) { + glDisable(GL_COLOR_SUM_EXT); + } else { + TRACE("Specular colors cannot be disabled in this version of opengl\n"); + } + checkGLcall("glDisable(GL_COLOR_SUM)"); + + if (GL_SUPPORT(NV_REGISTER_COMBINERS)) { + GL_EXTCALL(glFinalCombinerInputNV(GL_VARIABLE_B_NV, GL_SPARE0_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB)); + checkGLcall("glFinalCombinerInputNV()"); + } + } +} + static void state_texfactor(DWORD state, IWineD3DStateBlockImpl *stateblock) { unsigned int i; @@ -492,7 +562,7 @@ const struct StateEntry StateTable[] = { /* 26, WINED3DRS_DITHERENABLE */ STATE_RENDER(WINED3DRS_DITHERENABLE), state_ditherenable }, { /* 27, WINED3DRS_ALPHABLENDENABLE */ STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_blend }, { /* 28, WINED3DRS_FOGENABLE */ STATE_RENDER(WINED3DRS_FOGENABLE), state_unknown }, - { /* 29, WINED3DRS_SPECULARENABLE */ STATE_RENDER(WINED3DRS_SPECULARENABLE), state_unknown }, + { /* 29, WINED3DRS_SPECULARENABLE */ STATE_RENDER(WINED3DRS_SPECULARENABLE), state_specularenable}, { /* 30, WINED3DRS_ZVISIBLE */ 0 /* Not supported according to the msdn */, state_nogl }, { /* 31, WINED3DRS_SUBPIXEL */ STATE_RENDER(WINED3DRS_SUBPIXEL), state_unknown }, { /* 32, WINED3DRS_SUBPIXELX */ STATE_RENDER(WINED3DRS_SUBPIXELX), state_unknown },