wined3d: Move WINED3DRS_SPECULARENABLE to the state table.
This commit is contained in:
parent
287c6247ab
commit
0772bb49e4
@ -3461,76 +3461,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetRenderState(IWineD3DDevice *iface, W
|
|||||||
case WINED3DRS_CLIPPING :
|
case WINED3DRS_CLIPPING :
|
||||||
case WINED3DRS_BLENDOP :
|
case WINED3DRS_BLENDOP :
|
||||||
case WINED3DRS_TEXTUREFACTOR :
|
case WINED3DRS_TEXTUREFACTOR :
|
||||||
StateTable[STATE_RENDER(State)].apply(STATE_RENDER(State), This->stateBlock);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WINED3DRS_SPECULARENABLE :
|
case WINED3DRS_SPECULARENABLE :
|
||||||
{
|
StateTable[STATE_RENDER(State)].apply(STATE_RENDER(State), This->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:
|
|
||||||
*
|
|
||||||
* <variable> <input> <mapping> <usage>
|
|
||||||
* 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()");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WINED3DRS_STENCILENABLE :
|
case WINED3DRS_STENCILENABLE :
|
||||||
|
@ -432,6 +432,76 @@ static void state_blendop(DWORD state, IWineD3DStateBlockImpl *stateblock) {
|
|||||||
checkGLcall("glBlendEquation");
|
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:
|
||||||
|
*
|
||||||
|
* <variable> <input> <mapping> <usage>
|
||||||
|
* 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) {
|
static void state_texfactor(DWORD state, IWineD3DStateBlockImpl *stateblock) {
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
@ -492,7 +562,7 @@ const struct StateEntry StateTable[] =
|
|||||||
{ /* 26, WINED3DRS_DITHERENABLE */ STATE_RENDER(WINED3DRS_DITHERENABLE), state_ditherenable },
|
{ /* 26, WINED3DRS_DITHERENABLE */ STATE_RENDER(WINED3DRS_DITHERENABLE), state_ditherenable },
|
||||||
{ /* 27, WINED3DRS_ALPHABLENDENABLE */ STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_blend },
|
{ /* 27, WINED3DRS_ALPHABLENDENABLE */ STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_blend },
|
||||||
{ /* 28, WINED3DRS_FOGENABLE */ STATE_RENDER(WINED3DRS_FOGENABLE), state_unknown },
|
{ /* 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 },
|
{ /* 30, WINED3DRS_ZVISIBLE */ 0 /* Not supported according to the msdn */, state_nogl },
|
||||||
{ /* 31, WINED3DRS_SUBPIXEL */ STATE_RENDER(WINED3DRS_SUBPIXEL), state_unknown },
|
{ /* 31, WINED3DRS_SUBPIXEL */ STATE_RENDER(WINED3DRS_SUBPIXEL), state_unknown },
|
||||||
{ /* 32, WINED3DRS_SUBPIXELX */ STATE_RENDER(WINED3DRS_SUBPIXELX), state_unknown },
|
{ /* 32, WINED3DRS_SUBPIXELX */ STATE_RENDER(WINED3DRS_SUBPIXELX), state_unknown },
|
||||||
|
Loading…
x
Reference in New Issue
Block a user