Module: wine Branch: master Commit: d429ff5b6917fc27cf9898b353d3c716553e6392 URL: http://source.winehq.org/git/wine.git/?a=commit;h=d429ff5b6917fc27cf9898b353...
Author: H. Verbeet hverbeet@gmail.com Date: Wed Jan 17 21:41:35 2007 +0100
wined3d: When switching color material, apply the material we were previously tracking.
This fixes a regression introduced by 329670c7f129343ef0086f76b08a40d0fd5e3242.
---
dlls/wined3d/state.c | 47 +++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 45 insertions(+), 2 deletions(-)
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c index b0f74c7..adcd9c5 100644 --- a/dlls/wined3d/state.c +++ b/dlls/wined3d/state.c @@ -812,14 +812,15 @@ static void state_fogdensity(DWORD state
/* TODO: Merge with primitive type + init_materials()!! */ static void state_colormat(DWORD state, IWineD3DStateBlockImpl *stateblock) { + IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)stateblock->wineD3DDevice; GLenum Parm = 0; - WineDirect3DStridedData *diffuse = &stateblock->wineD3DDevice->strided_streams.u.s.diffuse; + WineDirect3DStridedData *diffuse = &device->strided_streams.u.s.diffuse; BOOL isDiffuseSupplied;
/* Depends on the decoded vertex declaration to read the existance of diffuse data. * The vertex declaration will call this function if the fixed function pipeline is used. */ - if(isStateDirty(stateblock->wineD3DDevice, STATE_VDECL)) { + if(isStateDirty(device, STATE_VDECL)) { return; }
@@ -847,6 +848,9 @@ static void state_colormat(DWORD state, } }
+ /* Nothing changed, return. */ + if (Parm == device->tracking_parm) return; + if(!Parm) { glDisable(GL_COLOR_MATERIAL); checkGLcall("glDisable GL_COLOR_MATERIAL"); @@ -856,6 +860,45 @@ static void state_colormat(DWORD state, glEnable(GL_COLOR_MATERIAL); checkGLcall("glEnable(GL_COLOR_MATERIAL)"); } + + /* Apparently calls to glMaterialfv are ignored for properties we're + * tracking with glColorMaterial, so apply those here. */ + switch (device->tracking_parm) { + case GL_AMBIENT_AND_DIFFUSE: + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, (float*)&device->updateStateBlock->material.Ambient); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, (float*)&device->updateStateBlock->material.Diffuse); + checkGLcall("glMaterialfv"); + break; + + case GL_DIFFUSE: + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, (float*)&device->updateStateBlock->material.Diffuse); + checkGLcall("glMaterialfv"); + break; + + case GL_AMBIENT: + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, (float*)&device->updateStateBlock->material.Ambient); + checkGLcall("glMaterialfv"); + break; + + case GL_EMISSION: + glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, (float*)&device->updateStateBlock->material.Emissive); + checkGLcall("glMaterialfv"); + break; + + case GL_SPECULAR: + /* Only change material color if specular is enabled, otherwise it is set to black */ + if (device->stateBlock->renderState[WINED3DRS_SPECULARENABLE]) { + glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, (float*)&device->updateStateBlock->material.Specular); + checkGLcall("glMaterialfv"); + } else { + float black[4] = {0.0f, 0.0f, 0.0f, 0.0f}; + glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, &black[0]); + checkGLcall("glMaterialfv"); + } + break; + } + + device->tracking_parm = Parm; }
static void state_linepattern(DWORD state, IWineD3DStateBlockImpl *stateblock) {