From cb677f638884bf3c0732375ee9adabe114f59f62 Mon Sep 17 00:00:00 2001 From: Jason Edmeades Date: Tue, 6 May 2003 00:15:49 +0000 Subject: [PATCH] Add the beginnings of support for texture coordinates. --- dlls/d3d8/d3d8_private.h | 1 + dlls/d3d8/device.c | 181 ++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 149 insertions(+), 33 deletions(-) diff --git a/dlls/d3d8/d3d8_private.h b/dlls/d3d8/d3d8_private.h index d3975e16a57..eb2a0d86125 100644 --- a/dlls/d3d8/d3d8_private.h +++ b/dlls/d3d8/d3d8_private.h @@ -262,6 +262,7 @@ struct IDirect3DDevice8Impl D3DMATRIX lastProj; D3DMATRIX lastView; D3DMATRIX lastWorld0; + D3DMATRIX lastTexTrans[8]; /* OpenGL related */ diff --git a/dlls/d3d8/device.c b/dlls/d3d8/device.c index 5176ba289ed..92c69d22448 100644 --- a/dlls/d3d8/device.c +++ b/dlls/d3d8/device.c @@ -387,14 +387,20 @@ void DrawPrimitiveI(LPDIRECT3DDEVICE8 iface, if (TRUE == useVertexShaderFunction) { /* Nothing to do */ } else { - if (This->isMultiTexture) { + if (This->UpdateStateBlock->texture_state[textureNo][D3DTSS_TEXCOORDINDEX] > 7) { + VTRACE("Skip tex coords, as being system generated\n"); + } else { + + if (This->isMultiTexture) { #if defined(GL_VERSION_1_3) - glMultiTexCoord2f(GL_TEXTURE0 + textureNo, s, t); + glMultiTexCoord2f(GL_TEXTURE0 + textureNo, s, t); #else - glMultiTexCoord2fARB(GL_TEXTURE0_ARB + textureNo, s, t); + glMultiTexCoord2fARB(GL_TEXTURE0_ARB + textureNo, s, t); #endif - } else { - glTexCoord2f(s, t); + } else { + glTexCoord2f(s, t); + } + } } break; @@ -411,15 +417,18 @@ void DrawPrimitiveI(LPDIRECT3DDEVICE8 iface, if (TRUE == useVertexShaderFunction) { /* Nothing to do */ } else { - if (This->isMultiTexture) { + if (This->UpdateStateBlock->texture_state[textureNo][D3DTSS_TEXCOORDINDEX] > 7) { + VTRACE("Skip tex coords, as being system generated\n"); + } else { + if (This->isMultiTexture) { #if defined(GL_VERSION_1_3) - glMultiTexCoord3f(GL_TEXTURE0 + textureNo, s, t, r); + glMultiTexCoord3f(GL_TEXTURE0 + textureNo, s, t, r); #else - glMultiTexCoord3fARB(GL_TEXTURE0_ARB + textureNo, s, t, r); + glMultiTexCoord3fARB(GL_TEXTURE0_ARB + textureNo, s, t, r); #endif - - } else { - glTexCoord3f(s, t, r); + } else { + glTexCoord3f(s, t, r); + } } } break; @@ -511,16 +520,20 @@ void DrawPrimitiveI(LPDIRECT3DDEVICE8 iface, s = vertex_shader->output.oT[textureNo].x; t = vertex_shader->output.oT[textureNo].y; VTRACE(("tex:%d, s,t=%f,%f\n", textureNo, s, t)); - if (This->isMultiTexture) { + if (This->UpdateStateBlock->texture_state[textureNo][D3DTSS_TEXCOORDINDEX] > 7) { + VTRACE("Skip tex coords, as being system generated\n"); + } else { + if (This->isMultiTexture) { #if defined(GL_VERSION_1_3) - glMultiTexCoord2f(GL_TEXTURE0 + textureNo, s, t); + glMultiTexCoord2f(GL_TEXTURE0 + textureNo, s, t); #else - glMultiTexCoord2fARB(GL_TEXTURE0_ARB + textureNo, s, t); + glMultiTexCoord2fARB(GL_TEXTURE0_ARB + textureNo, s, t); #endif - /*checkGLcall("glMultiTexCoord2fARB");*/ - } else { - glTexCoord2f(s, t); - /*checkGLcall("gTexCoord2f");*/ + /*checkGLcall("glMultiTexCoord2fARB");*/ + } else { + glTexCoord2f(s, t); + /*checkGLcall("gTexCoord2f");*/ + } } break; @@ -530,16 +543,20 @@ void DrawPrimitiveI(LPDIRECT3DDEVICE8 iface, t = vertex_shader->output.oT[textureNo].y; r = vertex_shader->output.oT[textureNo].z; VTRACE(("tex:%d, s,t,r=%f,%f,%f\n", textureNo, s, t, r)); - if (This->isMultiTexture) { + if (This->UpdateStateBlock->texture_state[textureNo][D3DTSS_TEXCOORDINDEX] > 7) { + VTRACE("Skip tex coords, as being system generated\n"); + } else { + if (This->isMultiTexture) { #if defined(GL_VERSION_1_3) - glMultiTexCoord3f(GL_TEXTURE0 + textureNo, s, t, r); + glMultiTexCoord3f(GL_TEXTURE0 + textureNo, s, t, r); #else - glMultiTexCoord3fARB(GL_TEXTURE0_ARB + textureNo, s, t, r); + glMultiTexCoord3fARB(GL_TEXTURE0_ARB + textureNo, s, t, r); #endif - /*checkGLcall("glMultiTexCoord2fARB");*/ - } else { - glTexCoord3f(s, t, r); - /*checkGLcall("gTexCoord3f");*/ + /*checkGLcall("glMultiTexCoord2fARB");*/ + } else { + glTexCoord3f(s, t, r); + /*checkGLcall("gTexCoord3f");*/ + } } break; @@ -735,16 +752,24 @@ void DrawPrimitiveI(LPDIRECT3DDEVICE8 iface, enableTexture = TRUE; switch (IDirect3DBaseTexture8Impl_GetType((LPDIRECT3DBASETEXTURE8) This->StateBlock->textures[textureNo])) { case D3DRTYPE_TEXTURE: - glTexCoordPointer(2, GL_FLOAT, skip, curPos); - checkGLcall("glTexCoordPointer(2, ...)"); + if (This->UpdateStateBlock->texture_state[textureNo][D3DTSS_TEXCOORDINDEX] > 7) { + VTRACE("Skip tex coords, as being system generated\n"); + } else { + glTexCoordPointer(2, GL_FLOAT, skip, curPos); + checkGLcall("glTexCoordPointer(2, ...)"); + } curPos += 2*sizeof(float); glEnableClientState(GL_TEXTURE_COORD_ARRAY); checkGLcall("glEnableClientState(GL_TEXTURE_COORD_ARRAY);"); break; case D3DRTYPE_VOLUMETEXTURE: - glTexCoordPointer(3, GL_FLOAT, skip, curPos); - checkGLcall("glTexCoordPointer(3, ...)"); + if (This->UpdateStateBlock->texture_state[textureNo][D3DTSS_TEXCOORDINDEX] > 7) { + VTRACE("Skip tex coords, as being system generated\n"); + } else { + glTexCoordPointer(3, GL_FLOAT, skip, curPos); + checkGLcall("glTexCoordPointer(3, ...)"); + } curPos += 3*sizeof(float); glEnableClientState(GL_TEXTURE_COORD_ARRAY); checkGLcall("glEnableClientState(GL_TEXTURE_COORD_ARRAY);"); @@ -1701,6 +1726,7 @@ HRESULT WINAPI IDirect3DDevice8Impl_SetTransform(LPDIRECT3DDEVICE8 iface, D3DT int k; float f; BOOL viewChanged = TRUE; + int Stage; /* Most of this routine, comments included copied from ddraw tree initially: */ TRACE("(%p) : State=%d\n", This, d3dts); @@ -1762,8 +1788,6 @@ HRESULT WINAPI IDirect3DDevice8Impl_SetTransform(LPDIRECT3DDEVICE8 iface, D3DT case D3DTS_TEXTURE6: case D3DTS_TEXTURE7: conv_mat(lpmatrix, &This->StateBlock->transforms[d3dts]); - FIXME("Unhandled transform state for TEXTURE%d!!!\n", d3dts - D3DTS_TEXTURE0); - FIXME("must use glMatrixMode(GL_TEXTURE) before texturing\n"); break; default: @@ -1827,7 +1851,57 @@ HRESULT WINAPI IDirect3DDevice8Impl_SetTransform(LPDIRECT3DDEVICE8 iface, D3DT checkGLcall("glClipPlane"); } + /* Reapply texture transforms as based off modelview when applied */ + for (Stage=0; StageTextureUnits; Stage++) { + + /* Now apply texture transforms if not applying to the dummy textures */ + #if defined(GL_VERSION_1_3) + glActiveTexture(GL_TEXTURE0 + Stage); + #else + glActiveTextureARB(GL_TEXTURE0_ARB + Stage); + #endif + checkGLcall("glActiveTexture(GL_TEXTURE0 + Stage);"); + + glMatrixMode(GL_TEXTURE); + if (This->StateBlock->textureDimensions[Stage] == GL_TEXTURE_1D) { + glLoadIdentity(); + } else { + D3DMATRIX fred; + conv_mat(&This->StateBlock->transforms[D3DTS_TEXTURE0+Stage], &fred); + glLoadMatrixf((float *) &This->StateBlock->transforms[D3DTS_TEXTURE0+Stage].u.m[0][0]); + } + checkGLcall("Load matrix for texture"); + } + glMatrixMode(GL_MODELVIEW); /* Always leave in model view */ } + } else if (d3dts >= D3DTS_TEXTURE0 && d3dts <= D3DTS_TEXTURE7) { + /* Now apply texture transforms if not applying to the dummy textures */ + Stage = d3dts-D3DTS_TEXTURE0; + + if (memcmp(&This->lastTexTrans[Stage], &This->StateBlock->transforms[D3DTS_TEXTURE0+Stage].u.m[0][0], sizeof(D3DMATRIX))) { + memcpy(&This->lastTexTrans[Stage], &This->StateBlock->transforms[D3DTS_TEXTURE0+Stage].u.m[0][0], sizeof(D3DMATRIX)); + +#if defined(GL_VERSION_1_3) + glActiveTexture(GL_TEXTURE0 + Stage); +#else + glActiveTextureARB(GL_TEXTURE0_ARB + Stage); +#endif + checkGLcall("glActiveTexture(GL_TEXTURE0 + Stage)"); + + glMatrixMode(GL_TEXTURE); + if (This->StateBlock->textureDimensions[Stage] == GL_TEXTURE_1D) { + glLoadIdentity(); + } else { + D3DMATRIX fred; + conv_mat(&This->StateBlock->transforms[D3DTS_TEXTURE0+Stage], &fred); + glLoadMatrixf((float *) &This->StateBlock->transforms[D3DTS_TEXTURE0+Stage].u.m[0][0]); + } + checkGLcall("Load matrix for texture"); + glMatrixMode(GL_MODELVIEW); /* Always leave in model view */ + } else { + TRACE("Skipping texture transform as already correct\n"); + } + } else { TRACE("Skipping view setup as view already correct\n"); } @@ -3042,7 +3116,7 @@ HRESULT WINAPI IDirect3DDevice8Impl_SetTexture(LPDIRECT3DDEVICE8 iface, DWORD IDirect3DTexture8Impl *pTexture2 = (IDirect3DTexture8Impl *) pTexture; int i; - if (oldTxt == pTexture && pTexture2->Dirty == FALSE) { + if ((void *)oldTxt == (void *)pTexture2 && pTexture2->Dirty == FALSE) { TRACE("Skipping setting texture as old == new\n"); reapplyStates = FALSE; } else { @@ -3541,12 +3615,53 @@ HRESULT WINAPI IDirect3DDevice8Impl_SetTextureStageState(LPDIRECT3DDEVICE8 ifa } break; + case D3DTSS_TEXCOORDINDEX : + /* CameraSpacePosition means use the vertex position, transformed to camera space, + as the input texture coordinates for this stage's texture transformation. This + equates roughly to EYE_LINEAR */ + if (Value & D3DTSS_TCI_CAMERASPACEPOSITION) { + float s_plane[] = { 1.0, 0.0, 0.0, 0.0 }; + float t_plane[] = { 0.0, 1.0, 0.0, 0.0 }; + float r_plane[] = { 0.0, 0.0, 1.0, 0.0 }; + float q_plane[] = { 0.0, 0.0, 0.0, 1.0 }; + TRACE("D3DTSS_TCI_CAMERASPACEPOSITION - Set eye plane\n"); + + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + glTexGenfv(GL_S, GL_EYE_PLANE, s_plane); + glTexGenfv(GL_T, GL_EYE_PLANE, t_plane); + glTexGenfv(GL_R, GL_EYE_PLANE, r_plane); + glTexGenfv(GL_Q, GL_EYE_PLANE, q_plane); + glPopMatrix(); + + TRACE("D3DTSS_TCI_CAMERASPACEPOSITION - Set GL_TEXTURE_GEN_x and GL_x, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR\n"); + glEnable(GL_TEXTURE_GEN_S); + checkGLcall("glEnable(GL_TEXTURE_GEN_S);"); + glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); + checkGLcall("glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR)"); + glEnable(GL_TEXTURE_GEN_T); + checkGLcall("glEnable(GL_TEXTURE_GEN_T);"); + glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); + checkGLcall("glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR)"); + glEnable(GL_TEXTURE_GEN_R); + checkGLcall("glEnable(GL_TEXTURE_GEN_R);"); + glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); + checkGLcall("glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR)"); + } + + /* Todo: */ + if (Value && Value != D3DTSS_TCI_CAMERASPACEPOSITION) { + /* ? disable GL_TEXTURE_GEN_n ? */ + FIXME("Unhandled D3DTSS_TEXCOORDINDEX %lx\n", Value); + } + break; + /* Unhandled */ case D3DTSS_BUMPENVMAT00 : case D3DTSS_BUMPENVMAT01 : case D3DTSS_BUMPENVMAT10 : case D3DTSS_BUMPENVMAT11 : - case D3DTSS_TEXCOORDINDEX : case D3DTSS_MIPMAPLODBIAS : case D3DTSS_MAXMIPLEVEL : case D3DTSS_MAXANISOTROPY : -- 2.11.4.GIT