From b081cbaf40519dc9556d3fab57e02a2296cf4e66 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Stefan=20D=C3=B6singer?= Date: Wed, 20 Jun 2007 14:36:32 +0200 Subject: [PATCH] wined3d: Emulate tracking of multiple material properties. --- dlls/wined3d/drawprim.c | 57 ++++++++++++++++++++++++++++++++++++++++-- dlls/wined3d/state.c | 21 ++++++++++++++++ dlls/wined3d/wined3d_private.h | 2 ++ 3 files changed, 78 insertions(+), 2 deletions(-) diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c index 1cde3a9074b..115f3e34fd4 100644 --- a/dlls/wined3d/drawprim.c +++ b/dlls/wined3d/drawprim.c @@ -510,6 +510,19 @@ static void drawStridedSlow(IWineD3DDevice *iface, WineDirect3DVertexStridedData D3DCOLOR_B_G(diffuseColor), D3DCOLOR_B_B(diffuseColor), D3DCOLOR_B_A(diffuseColor))); + + if(This->activeContext->num_untracked_materials) { + unsigned char i; + float color[4]; + color[0] = D3DCOLOR_B_R(diffuseColor) / 255.0; + color[1] = D3DCOLOR_B_G(diffuseColor) / 255.0; + color[2] = D3DCOLOR_B_B(diffuseColor) / 255.0; + color[3] = D3DCOLOR_B_A(diffuseColor) / 255.0; + + for(i = 0; i < This->activeContext->num_untracked_materials; i++) { + glMaterialfv(GL_FRONT_AND_BACK, This->activeContext->untracked_materials[i], color); + } + } } /* Specular ------------------------------- */ @@ -1030,15 +1043,55 @@ void drawPrimitive(IWineD3DDevice *iface, { GLenum glPrimType; + BOOL emulation = FALSE; + WineDirect3DVertexStridedData *strided = &This->strided_streams; + WineDirect3DVertexStridedData stridedlcl; /* Ok, Work out which primitive is requested and how many vertexes that will be */ UINT calculatedNumberOfindices = primitiveToGl(PrimitiveType, NumPrimitives, &glPrimType); if (numberOfVertices == 0 ) numberOfVertices = calculatedNumberOfindices; - if (This->useDrawStridedSlow) { + if(!This->strided_streams.u.s.position_transformed && !use_vs(This)) { + if(This->activeContext->num_untracked_materials && + This->stateBlock->renderState[WINED3DRS_LIGHTING]) { + IWineD3DVertexBufferImpl *vb; + + FIXME("Using software emulation because not all material properties could be tracked\n"); + emulation = TRUE; + + strided = &stridedlcl; + memcpy(&stridedlcl, &This->strided_streams, sizeof(stridedlcl)); + +#define FIXVBO(type) \ +if(stridedlcl.u.s.type.VBO) { \ + vb = (IWineD3DVertexBufferImpl *) This->stateBlock->streamSource[stridedlcl.u.s.type.streamNo]; \ + stridedlcl.u.s.type.VBO = 0; \ + stridedlcl.u.s.type.lpData = (BYTE *) ((unsigned long) stridedlcl.u.s.type.lpData + (unsigned long) vb->resource.allocatedMemory); \ +} + FIXVBO(position); + FIXVBO(blendWeights); + FIXVBO(blendMatrixIndices); + FIXVBO(normal); + FIXVBO(pSize); + FIXVBO(diffuse); + FIXVBO(specular); + for(i = 0; i < WINED3DDP_MAXTEXCOORD; i++) FIXVBO(texCoords[i]); + FIXVBO(position2); + FIXVBO(normal2); + FIXVBO(tangent); + FIXVBO(binormal); + FIXVBO(tessFactor); + FIXVBO(fog); + FIXVBO(depth); + FIXVBO(sample); +#undef FIXVBO + } + } + + if (This->useDrawStridedSlow || emulation) { /* Immediate mode drawing */ - drawStridedSlow(iface, &This->strided_streams, calculatedNumberOfindices, + drawStridedSlow(iface, strided, calculatedNumberOfindices, glPrimType, idxData, idxSize, minIndex, StartIdx, StartVertexIndex); } else if(This->instancedDraw) { /* Instancing emulation with mixing immediate mode and arrays */ diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c index 1c72785553c..3b7c5c97780 100644 --- a/dlls/wined3d/state.c +++ b/dlls/wined3d/state.c @@ -980,6 +980,7 @@ static void state_colormat(DWORD state, IWineD3DStateBlockImpl *stateblock, Wine isDiffuseSupplied = diffuse->lpData || diffuse->VBO; + context->num_untracked_materials = 0; if (isDiffuseSupplied && stateblock->renderState[WINED3DRS_COLORVERTEX]) { TRACE("diff %d, amb %d, emis %d, spec %d\n", stateblock->renderState[WINED3DRS_DIFFUSEMATERIALSOURCE], @@ -993,10 +994,30 @@ static void state_colormat(DWORD state, IWineD3DStateBlockImpl *stateblock, Wine } else { Parm = GL_DIFFUSE; } + if(stateblock->renderState[WINED3DRS_EMISSIVEMATERIALSOURCE] == WINED3DMCS_COLOR1) { + context->untracked_materials[context->num_untracked_materials] = GL_EMISSION; + context->num_untracked_materials++; + } + if(stateblock->renderState[WINED3DRS_SPECULARMATERIALSOURCE] == WINED3DMCS_COLOR1) { + context->untracked_materials[context->num_untracked_materials] = GL_SPECULAR; + context->num_untracked_materials++; + } } else if (stateblock->renderState[WINED3DRS_AMBIENTMATERIALSOURCE] == WINED3DMCS_COLOR1) { Parm = GL_AMBIENT; + if(stateblock->renderState[WINED3DRS_EMISSIVEMATERIALSOURCE] == WINED3DMCS_COLOR1) { + context->untracked_materials[context->num_untracked_materials] = GL_EMISSION; + context->num_untracked_materials++; + } + if(stateblock->renderState[WINED3DRS_SPECULARMATERIALSOURCE] == WINED3DMCS_COLOR1) { + context->untracked_materials[context->num_untracked_materials] = GL_SPECULAR; + context->num_untracked_materials++; + } } else if (stateblock->renderState[WINED3DRS_EMISSIVEMATERIALSOURCE] == WINED3DMCS_COLOR1) { Parm = GL_EMISSION; + if(stateblock->renderState[WINED3DRS_SPECULARMATERIALSOURCE] == WINED3DMCS_COLOR1) { + context->untracked_materials[context->num_untracked_materials] = GL_SPECULAR; + context->num_untracked_materials++; + } } else if (stateblock->renderState[WINED3DRS_SPECULARMATERIALSOURCE] == WINED3DMCS_COLOR1) { Parm = GL_SPECULAR; } diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 1c35ea471d2..3c0dfee8c1e 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -507,6 +507,8 @@ struct WineD3DContext { BOOL namedArraysLoaded, numberedArraysLoaded; BOOL lastWasPow2Texture[MAX_TEXTURES]; GLenum tracking_parm; /* Which source is tracking current colour */ + unsigned char num_untracked_materials; + GLenum untracked_materials[2]; BOOL last_was_blit, last_was_ckey; char texShaderBumpMap; -- 2.11.4.GIT