- 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                 :