- Dont set lighting during draw primitive, rely on the render state.
- Small fix for alpha testing.
- Add support to enable/disable clipping as a whole.
- Allow D3DRS_TEXTUREFACTOR to be changed once texture stage arg set
up.
- D3DTOP_DISABLE initial implementation.
diff --git a/dlls/d3d8/device.c b/dlls/d3d8/device.c
index 580fb0e..240f935 100644
--- a/dlls/d3d8/device.c
+++ b/dlls/d3d8/device.c
@@ -130,14 +130,7 @@
TRACE("Drawing with FVF = %x, (n?%d, rhw?%d, ptSize(%d), diffuse?%d, specular?%d, numTextures=%d)\n",
fvf, normal, isRHW, isPtSize, isDiffuse, isSpecular, numTextures);
- /* Only add lighting for unlit vertices */
- if (normal && !isRHW) {
- glEnable(GL_LIGHTING);
- checkGLcall("enable lighting");
- } else {
- glDisable(GL_LIGHTING);
- checkGLcall("disable lighting");
- }
+ /* Note: Dont touch lighing anymore - it is set by the appropriate render state */
if (isRHW) {
@@ -470,7 +463,6 @@
}
}
-
/* IDirect3D IUnknown parts follow: */
HRESULT WINAPI IDirect3DDevice8Impl_QueryInterface(LPDIRECT3DDEVICE8 iface,REFIID riid,LPVOID *ppobj)
{
@@ -1628,7 +1620,7 @@
default:
FIXME("Unrecognized/Unhandled D3DCMPFUNC value %ld\n", Value);
}
- break;
+ TRACE("glAlphaFunc with Parm=%x, ref=%f\n", glParm, ref);
glAlphaFunc(glParm, ref);
checkGLcall("glAlphaFunc");
}
@@ -1643,29 +1635,46 @@
checkGLcall("glGetFloatv(GL_ALPHA_TEST_FUNC, &glParm);");
ref = ((float) Value) / 255.0;
+ TRACE("glAlphaFunc with Parm=%x, ref=%f\n", glParm, ref);
glAlphaFunc(glParm, ref);
checkGLcall("glAlphaFunc");
}
break;
case D3DRS_CLIPPLANEENABLE :
+ case D3DRS_CLIPPING :
{
/* Ensure we only do the changed clip planes */
- DWORD enable = Value & ~OldValue;
- DWORD disable = ~Value & OldValue;
- if (enable & D3DCLIPPLANE0) { glEnable(GL_CLIP_PLANE0); checkGLcall("glEnable(clip plane 0)"); }
- if (enable & D3DCLIPPLANE1) { glEnable(GL_CLIP_PLANE1); checkGLcall("glEnable(clip plane 1)"); }
- if (enable & D3DCLIPPLANE2) { glEnable(GL_CLIP_PLANE2); checkGLcall("glEnable(clip plane 2)"); }
- if (enable & D3DCLIPPLANE3) { glEnable(GL_CLIP_PLANE3); checkGLcall("glEnable(clip plane 3)"); }
- if (enable & D3DCLIPPLANE4) { glEnable(GL_CLIP_PLANE4); checkGLcall("glEnable(clip plane 4)"); }
- if (enable & D3DCLIPPLANE5) { glEnable(GL_CLIP_PLANE5); checkGLcall("glEnable(clip plane 5)"); }
-
- if (disable & D3DCLIPPLANE0) { glDisable(GL_CLIP_PLANE0); checkGLcall("glDisable(clip plane 0)"); }
- if (disable & D3DCLIPPLANE1) { glDisable(GL_CLIP_PLANE1); checkGLcall("glDisable(clip plane 1)"); }
- if (disable & D3DCLIPPLANE2) { glDisable(GL_CLIP_PLANE2); checkGLcall("glDisable(clip plane 2)"); }
- if (disable & D3DCLIPPLANE3) { glDisable(GL_CLIP_PLANE3); checkGLcall("glDisable(clip plane 3)"); }
- if (disable & D3DCLIPPLANE4) { glDisable(GL_CLIP_PLANE4); checkGLcall("glDisable(clip plane 4)"); }
- if (disable & D3DCLIPPLANE5) { glDisable(GL_CLIP_PLANE5); checkGLcall("glDisable(clip plane 5)"); }
+ DWORD enable = 0xFFFFFFFF;
+ DWORD disable = 0x00000000;
+
+ /* If enabling / disabling all */
+ if (State == D3DRS_CLIPPING) {
+ if (Value) {
+ enable = This->StateBlock.renderstate[D3DRS_CLIPPLANEENABLE];
+ disable = 0x00;
+ } else {
+ disable = This->StateBlock.renderstate[D3DRS_CLIPPLANEENABLE];
+ enable = 0x00;
+ }
+ } else {
+ enable = Value & ~OldValue;
+ disable = ~Value & OldValue;
+ }
+
+ if (enable & D3DCLIPPLANE0) { glEnable(GL_CLIP_PLANE0); checkGLcall("glEnable(clip plane 0)"); }
+ if (enable & D3DCLIPPLANE1) { glEnable(GL_CLIP_PLANE1); checkGLcall("glEnable(clip plane 1)"); }
+ if (enable & D3DCLIPPLANE2) { glEnable(GL_CLIP_PLANE2); checkGLcall("glEnable(clip plane 2)"); }
+ if (enable & D3DCLIPPLANE3) { glEnable(GL_CLIP_PLANE3); checkGLcall("glEnable(clip plane 3)"); }
+ if (enable & D3DCLIPPLANE4) { glEnable(GL_CLIP_PLANE4); checkGLcall("glEnable(clip plane 4)"); }
+ if (enable & D3DCLIPPLANE5) { glEnable(GL_CLIP_PLANE5); checkGLcall("glEnable(clip plane 5)"); }
+
+ if (disable & D3DCLIPPLANE0) { glDisable(GL_CLIP_PLANE0); checkGLcall("glDisable(clip plane 0)"); }
+ if (disable & D3DCLIPPLANE1) { glDisable(GL_CLIP_PLANE1); checkGLcall("glDisable(clip plane 1)"); }
+ if (disable & D3DCLIPPLANE2) { glDisable(GL_CLIP_PLANE2); checkGLcall("glDisable(clip plane 2)"); }
+ if (disable & D3DCLIPPLANE3) { glDisable(GL_CLIP_PLANE3); checkGLcall("glDisable(clip plane 3)"); }
+ if (disable & D3DCLIPPLANE4) { glDisable(GL_CLIP_PLANE4); checkGLcall("glDisable(clip plane 4)"); }
+ if (disable & D3DCLIPPLANE5) { glDisable(GL_CLIP_PLANE5); checkGLcall("glDisable(clip plane 5)"); }
}
break;
@@ -1689,12 +1698,31 @@
case D3DRS_TEXTUREFACTOR :
{
- /* noop - Just save away the texture color for now as it applies
- to all textures whereas GL_TEXTURE_ENV_COLOR applies to active only */
+ int i;
+
+ /* Note the texture color applies to all textures whereas
+ GL_TEXTURE_ENV_COLOR applies to active only */
+ for (i=0; i<8; i++) {
+ float col[4];
+
+ if (This->StateBlock.textures[i]) {
+ glActiveTextureARB(GL_TEXTURE0_ARB + i);
+ checkGLcall("Activate texture.. to update const color");
+
+ /* Note the D3DRS value applies to all textures, but GL has one
+ per texture, so apply it now ready to be used! */
+ col[0] = ((Value >> 16) & 0xFF) / 255.0;
+ col[1] = ((Value >> 8 ) & 0xFF) / 255.0;
+ col[2] = ((Value >> 0 ) & 0xFF) / 255.0;
+ col[3] = ((Value >> 24 ) & 0xFF) / 255.0;
+ glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, &col[0]);
+ checkGLcall("glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, color);");
+ }
+ }
}
break;
- case D3DRS_SPECULARENABLE : /* Can opengl do this? */
+ case D3DRS_SPECULARENABLE :
{
if (Value) {
glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL,GL_SEPARATE_SPECULAR_COLOR);
@@ -1706,6 +1734,7 @@
}
break;
+
/* Unhandled yet...! */
case D3DRS_LINEPATTERN :
case D3DRS_LASTPIXEL :
@@ -1735,7 +1764,6 @@
case D3DRS_WRAP5 :
case D3DRS_WRAP6 :
case D3DRS_WRAP7 :
- case D3DRS_CLIPPING :
case D3DRS_FOGVERTEXMODE :
case D3DRS_COLORVERTEX :
case D3DRS_LOCALVIEWER :
@@ -2200,6 +2228,7 @@
if (textureType == D3DRTYPE_TEXTURE) {
IDirect3DTexture8Impl *pTexture2 = (IDirect3DTexture8Impl *) pTexture;
int i;
+ float col[4];
/* Standard 2D texture */
TRACE("Standard 2d texture\n");
@@ -2245,12 +2274,23 @@
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
- /*glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);*/
+
+
glEnable(GL_TEXTURE_2D);
checkGLcall("glEnable");
pTexture2->Dirty = FALSE;
}
+
+ /* Note the D3DRS value applies to all textures, but GL has one
+ per texture, so apply it now ready to be used! */
+ col[0] = ((This->StateBlock.renderstate[D3DRS_TEXTUREFACTOR]>> 16) & 0xFF) / 255.0;
+ col[1] = ((This->StateBlock.renderstate[D3DRS_TEXTUREFACTOR] >> 8 ) & 0xFF) / 255.0;
+ col[2] = ((This->StateBlock.renderstate[D3DRS_TEXTUREFACTOR] >> 0 ) & 0xFF) / 255.0;
+ col[3] = ((This->StateBlock.renderstate[D3DRS_TEXTUREFACTOR] >> 24 ) & 0xFF) / 255.0;
+ glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, &col[0]);
+ checkGLcall("glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, color);");
+
}
} else {
FIXME("(%p) : stub\n", This);
@@ -2326,8 +2366,6 @@
int operand= GL_SRC_COLOR;
int source = GL_TEXTURE;
- TRACE("Type %d : %ld\n", Type, Value);
-
/* Catch alpha replicate */
if (Value & D3DTA_ALPHAREPLICATE) {
Value = Value & ~D3DTA_ALPHAREPLICATE;
@@ -2367,20 +2405,7 @@
break;
case D3DTA_TEXTURE: source = GL_TEXTURE;
break;
- case D3DTA_TFACTOR: {
- float col[4];
-
- source = GL_CONSTANT_EXT;
-
- /* Note the D3DRS value applies to all textures, but GL has one
- per texture, so apply it now ready to be used! */
- col[0] = ((This->StateBlock.renderstate[D3DRS_TEXTUREFACTOR] >> 16) & 0xFF) / 255.0;
- col[1] = ((This->StateBlock.renderstate[D3DRS_TEXTUREFACTOR] >> 8 ) & 0xFF) / 255.0;
- col[2] = ((This->StateBlock.renderstate[D3DRS_TEXTUREFACTOR] >> 0 ) & 0xFF) / 255.0;
- col[3] = ((This->StateBlock.renderstate[D3DRS_TEXTUREFACTOR] >> 24 ) & 0xFF) / 255.0;
- glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, &col[0]);
- checkGLcall("glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, color);");
- }
+ case D3DTA_TFACTOR: source = GL_CONSTANT_EXT;
break;
/* According to the GL_ARB_texture_env_combine specs, SPECULAR is 'Secondary color' and
@@ -2392,11 +2417,13 @@
}
if (isAlphaArg) {
+ TRACE("Source %x = %x, Operand %x = %x\n", SOURCEx_ALPHA_EXT(Type), source, OPERANDx_ALPHA_EXT(Type), operand);
glTexEnvi(GL_TEXTURE_ENV, SOURCEx_ALPHA_EXT(Type), source);
checkGLcall("glTexEnvi(GL_TEXTURE_ENV, SOURCEx_ALPHA_EXT, source);");
glTexEnvi(GL_TEXTURE_ENV, OPERANDx_ALPHA_EXT(Type), operand);
checkGLcall("glTexEnvi(GL_TEXTURE_ENV, OPERANDx_ALPHA_EXT, operand);");
} else {
+ TRACE("Source %x = %x, Operand %x = %x\n", SOURCEx_RGB_EXT(Type), source, OPERANDx_RGB_EXT(Type), operand);
glTexEnvi(GL_TEXTURE_ENV, SOURCEx_RGB_EXT(Type), source);
checkGLcall("glTexEnvi(GL_TEXTURE_ENV, SOURCEx_RGB_EXT, source);");
glTexEnvi(GL_TEXTURE_ENV, OPERANDx_RGB_EXT(Type), operand);
@@ -2413,6 +2440,12 @@
int Parm = (Type == D3DTSS_ALPHAOP)? GL_COMBINE_ALPHA_EXT : GL_COMBINE_RGB_EXT;
switch (Value) {
+ case D3DTOP_DISABLE :
+ /* TODO: Disable by making this and all later levels disabled */
+ glDisable(GL_TEXTURE_2D);
+ checkGLcall("Disable GL_TEXTURE_2D");
+ break;
+
case D3DTOP_SELECTARG1 :
glTexEnvi(GL_TEXTURE_ENV, Parm, GL_REPLACE);
break;
@@ -2441,7 +2474,6 @@
case D3DTOP_SUBTRACT :
/* glTexEnvi(GL_TEXTURE_ENV, Parm, GL_SUBTRACT); Missing? */
- case D3DTOP_DISABLE :
case D3DTOP_SELECTARG2 :
/* GL_REPLACE, swap args 0 and 1? */
case D3DTOP_ADDSMOOTH :