wined3d: Move clip planes to the state table.

This commit is contained in:
Stefan Dösinger 2007-02-28 14:36:36 +01:00 committed by Alexandre Julliard
parent 38d961a749
commit 409aa73132
3 changed files with 75 additions and 24 deletions

View File

@ -2418,6 +2418,15 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetClipPlane(IWineD3DDevice *iface, DWO
This->updateStateBlock->changed.clipplane[Index] = TRUE;
This->updateStateBlock->set.clipplane[Index] = TRUE;
if(This->updateStateBlock->clipplane[Index][0] == pPlane[0] &&
This->updateStateBlock->clipplane[Index][1] == pPlane[1] &&
This->updateStateBlock->clipplane[Index][2] == pPlane[2] &&
This->updateStateBlock->clipplane[Index][3] == pPlane[3]) {
TRACE("Application is setting old values over, nothing to do\n");
return WINED3D_OK;
}
This->updateStateBlock->clipplane[Index][0] = pPlane[0];
This->updateStateBlock->clipplane[Index][1] = pPlane[1];
This->updateStateBlock->clipplane[Index][2] = pPlane[2];
@ -2429,25 +2438,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetClipPlane(IWineD3DDevice *iface, DWO
return WINED3D_OK;
}
/* Apply it */
ENTER_GL();
/* Clip Plane settings are affected by the model view in OpenGL, the View transform in direct3d */
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadMatrixf((float *) &This->stateBlock->transforms[WINED3DTS_VIEW].u.m[0][0]);
TRACE("Clipplane [%f,%f,%f,%f]\n",
This->updateStateBlock->clipplane[Index][0],
This->updateStateBlock->clipplane[Index][1],
This->updateStateBlock->clipplane[Index][2],
This->updateStateBlock->clipplane[Index][3]);
glClipPlane(GL_CLIP_PLANE0 + Index, This->updateStateBlock->clipplane[Index]);
checkGLcall("glClipPlane");
glPopMatrix();
LEAVE_GL();
IWineD3DDeviceImpl_MarkStateDirty(This, STATE_CLIPPLANE(Index));
return WINED3D_OK;
}

View File

@ -2034,6 +2034,29 @@ static void transform_world(DWORD state, IWineD3DStateBlockImpl *stateblock, Win
}
}
static void clipplane(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
UINT index = state - STATE_CLIPPLANE(0);
if(isStateDirty(context, STATE_TRANSFORM(WINED3DTS_VIEW)) || index > GL_LIMITS(clipplanes)) {
return;
}
/* Clip Plane settings are affected by the model view in OpenGL, the View transform in direct3d */
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadMatrixf((float *) &stateblock->transforms[WINED3DTS_VIEW].u.m[0][0]);
TRACE("Clipplane [%f,%f,%f,%f]\n",
stateblock->clipplane[index][0],
stateblock->clipplane[index][1],
stateblock->clipplane[index][2],
stateblock->clipplane[index][3]);
glClipPlane(GL_CLIP_PLANE0 + index, stateblock->clipplane[index]);
checkGLcall("glClipPlane");
glPopMatrix();
}
static void transform_view(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
unsigned int k;
@ -2060,10 +2083,11 @@ static void transform_view(DWORD state, IWineD3DStateBlockImpl *stateblock, Wine
checkGLcall("glLightfv dirn");
}
/* Reset Clipping Planes if clipping is enabled. TODO: Call clipplane apply func */
/* Reset Clipping Planes */
for (k = 0; k < GL_LIMITS(clipplanes); k++) {
glClipPlane(GL_CLIP_PLANE0 + k, stateblock->clipplane[k]);
checkGLcall("glClipPlane");
if(!isStateDirty(context, STATE_CLIPPLANE(k))) {
clipplane(STATE_CLIPPLANE(k), stateblock, context);
}
}
if(context->last_was_rhw) {
@ -4118,5 +4142,38 @@ const struct StateEntry StateTable[] =
{ /* , STATE_ACTIVELIGHT(6) */ STATE_ACTIVELIGHT(6), light },
{ /* , STATE_ACTIVELIGHT(7) */ STATE_ACTIVELIGHT(7), light },
{ /* Scissor rect */ STATE_SCISSORRECT, scissorrect }
{ /* Scissor rect */ STATE_SCISSORRECT, scissorrect },
/* Clip planes */
{ /* STATE_CLIPPLANE(0) */ STATE_CLIPPLANE(0), clipplane },
{ /* STATE_CLIPPLANE(1) */ STATE_CLIPPLANE(1), clipplane },
{ /* STATE_CLIPPLANE(2) */ STATE_CLIPPLANE(2), clipplane },
{ /* STATE_CLIPPLANE(3) */ STATE_CLIPPLANE(3), clipplane },
{ /* STATE_CLIPPLANE(4) */ STATE_CLIPPLANE(4), clipplane },
{ /* STATE_CLIPPLANE(5) */ STATE_CLIPPLANE(5), clipplane },
{ /* STATE_CLIPPLANE(6) */ STATE_CLIPPLANE(6), clipplane },
{ /* STATE_CLIPPLANE(7) */ STATE_CLIPPLANE(7), clipplane },
{ /* STATE_CLIPPLANE(8) */ STATE_CLIPPLANE(8), clipplane },
{ /* STATE_CLIPPLANE(9) */ STATE_CLIPPLANE(9), clipplane },
{ /* STATE_CLIPPLANE(10) */ STATE_CLIPPLANE(10), clipplane },
{ /* STATE_CLIPPLANE(11) */ STATE_CLIPPLANE(11), clipplane },
{ /* STATE_CLIPPLANE(12) */ STATE_CLIPPLANE(12), clipplane },
{ /* STATE_CLIPPLANE(13) */ STATE_CLIPPLANE(13), clipplane },
{ /* STATE_CLIPPLANE(14) */ STATE_CLIPPLANE(14), clipplane },
{ /* STATE_CLIPPLANE(15) */ STATE_CLIPPLANE(15), clipplane },
{ /* STATE_CLIPPLANE(16) */ STATE_CLIPPLANE(16), clipplane },
{ /* STATE_CLIPPLANE(17) */ STATE_CLIPPLANE(17), clipplane },
{ /* STATE_CLIPPLANE(18) */ STATE_CLIPPLANE(18), clipplane },
{ /* STATE_CLIPPLANE(19) */ STATE_CLIPPLANE(19), clipplane },
{ /* STATE_CLIPPLANE(20) */ STATE_CLIPPLANE(20), clipplane },
{ /* STATE_CLIPPLANE(21) */ STATE_CLIPPLANE(21), clipplane },
{ /* STATE_CLIPPLANE(22) */ STATE_CLIPPLANE(22), clipplane },
{ /* STATE_CLIPPLANE(23) */ STATE_CLIPPLANE(23), clipplane },
{ /* STATE_CLIPPLANE(24) */ STATE_CLIPPLANE(24), clipplane },
{ /* STATE_CLIPPLANE(25) */ STATE_CLIPPLANE(25), clipplane },
{ /* STATE_CLIPPLANE(26) */ STATE_CLIPPLANE(26), clipplane },
{ /* STATE_CLIPPLANE(27) */ STATE_CLIPPLANE(27), clipplane },
{ /* STATE_CLIPPLANE(28) */ STATE_CLIPPLANE(28), clipplane },
{ /* STATE_CLIPPLANE(29) */ STATE_CLIPPLANE(29), clipplane },
{ /* STATE_CLIPPLANE(30) */ STATE_CLIPPLANE(30), clipplane },
{ /* STATE_CLIPPLANE(31) */ STATE_CLIPPLANE(31), clipplane },
};

View File

@ -479,7 +479,10 @@ typedef void (*APPLYSTATEFUNC)(DWORD state, IWineD3DStateBlockImpl *stateblock,
#define STATE_SCISSORRECT (STATE_ACTIVELIGHT(MAX_ACTIVE_LIGHTS - 1) + 1)
#define STATE_IS_SCISSORRECT(a) ((a) == STATE_SCISSORRECT)
#define STATE_HIGHEST (STATE_SCISSORRECT)
#define STATE_CLIPPLANE(a) (STATE_SCISSORRECT + 1 + (a))
#define STATE_IS_CLIPPLANE(a) ((a) >= STATE_CLIPPLANE(0) && (a) <= STATE_CLIPPLANE(MAX_CLIPPLANES - 1))
#define STATE_HIGHEST (STATE_CLIPPLANE(MAX_CLIPPLANES - 1))
struct StateEntry
{