[dx8-15] trying to get D3DTOP_SELECTARG* working

Raphaël Junqueira fenix at club-internet.fr
Tue May 6 18:32:21 CDT 2003


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hi again,

 this thime better: with patch attached

Changelog
  - trying to get D3DTOP_SELECTARG_* working. It seems ok here (more textures 
on war3) but i'm not really sure of that code 
  - code D3DTOP_SUBTRACT: currently only if OpenGL1.3 is used. We have to use 
GL_SUBTRACT_ARB for other versions 
  - some comments on new Jason code 

Regards,
Raphael
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.1 (GNU/Linux)

iD8DBQE+uEYFp7NA3AmQTU4RAm86AJ4vv/z4vYEpARUn7z9cePIOUvTwYgCfdTbC
tHPmYfB5QkKAlIieslcLfP4=
=6b/P
-----END PGP SIGNATURE-----
-------------- next part --------------
Index: device.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/device.c,v
retrieving revision 1.45
diff -u -r1.45 device.c
--- device.c	6 May 2003 00:19:11 -0000	1.45
+++ device.c	6 May 2003 23:20:51 -0000
@@ -1004,6 +1004,71 @@
     }
 }
 
+/**
+ * @nodoc: todo
+ */
+void GetSrcAndOpFromValue(DWORD iValue, BOOL isAlphaArg, GLenum* source, GLenum* operand) 
+{
+  BOOL isAlphaReplicate = FALSE;
+  BOOL isComplement     = FALSE;
+  
+  *operand = GL_SRC_COLOR;
+  *source = GL_TEXTURE;
+  
+  /* Catch alpha replicate */
+  if (iValue & D3DTA_ALPHAREPLICATE) {
+    iValue = iValue & ~D3DTA_ALPHAREPLICATE;
+    isAlphaReplicate = TRUE;
+  }
+  
+  /* Catch Complement */
+  if (iValue & D3DTA_COMPLEMENT) {
+    iValue = iValue & ~D3DTA_COMPLEMENT;
+    isComplement = TRUE;
+  }
+  
+  /* Calculate the operand */
+  if (isAlphaReplicate && !isComplement) {
+    *operand = GL_SRC_ALPHA;
+  } else if (isAlphaReplicate && isComplement) {
+    *operand = GL_ONE_MINUS_SRC_ALPHA;
+  } else if (isComplement) {
+    if (isAlphaArg) {
+      *operand = GL_ONE_MINUS_SRC_ALPHA;
+    } else {
+      *operand = GL_ONE_MINUS_SRC_COLOR;
+    }
+  } else {
+    if (isAlphaArg) {
+      *operand = GL_SRC_ALPHA;
+    } else {
+      *operand = GL_SRC_COLOR;
+    }
+  }
+  
+  /* Calculate the source */
+  switch (iValue & D3DTA_SELECTMASK) {
+  case D3DTA_CURRENT:   *source  = GL_PREVIOUS_EXT;
+    break;
+  case D3DTA_DIFFUSE:   *source  = GL_PRIMARY_COLOR_EXT;
+    break;
+  case D3DTA_TEXTURE:   *source  = GL_TEXTURE;
+    break;
+  case D3DTA_TFACTOR:   *source  = GL_CONSTANT_EXT;
+    break;
+  case D3DTA_SPECULAR:
+    /**
+     * According to the GL_ARB_texture_env_combine specs, SPECULAR is 'Secondary color' and
+     * isnt supported until base GL supports it
+     * There is no concept of temp registers as far as I can tell
+     */
+
+  default:
+    FIXME("Unrecognized or unhandled texture arg %ld\n", iValue);
+  }
+}
+
+
 /* Apply the current values to the specified texture stage */
 void setupTextureStates(LPDIRECT3DDEVICE8 iface, DWORD Stage) {
     ICOM_THIS(IDirect3DDevice8Impl,iface); 
@@ -3399,25 +3463,27 @@
     case D3DTSS_ALPHAARG1             :
     case D3DTSS_ALPHAARG2             :
         {
-            BOOL isAlphaReplicate = FALSE;
-            BOOL isComplement     = FALSE;
+	    /*BOOL isAlphaReplicate = FALSE;
+	    BOOL isComplement     = FALSE;*/
             BOOL isAlphaArg       = (Type == D3DTSS_ALPHAARG1 || Type == D3DTSS_ALPHAARG2 || Type == D3DTSS_ALPHAARG0);
-            int  operand= GL_SRC_COLOR;
+            int  operand = GL_SRC_COLOR;
             int  source = GL_TEXTURE;
 
-            /* Catch alpha replicate */
+	    GetSrcAndOpFromValue(Value, isAlphaArg, &source, &operand);
+	    /*
+            / * Catch alpha replicate * /
             if (Value & D3DTA_ALPHAREPLICATE) {
                 Value = Value & ~D3DTA_ALPHAREPLICATE;
                 isAlphaReplicate = TRUE;
             }
 
-            /* Catch Complement */
+            / * Catch Complement * /
             if (Value & D3DTA_COMPLEMENT) {
                 Value = Value & ~D3DTA_COMPLEMENT;
                 isComplement = TRUE;
             }
 
-            /* Calculate the operand */
+            / * Calculate the operand * /
             if (isAlphaReplicate && !isComplement) {
                 operand = GL_SRC_ALPHA;
             } else if (isAlphaReplicate && isComplement) {
@@ -3436,7 +3502,7 @@
                 }
             }
 
-            /* Calculate the source */
+            / * Calculate the source * /
             switch (Value) {
             case D3DTA_CURRENT:   source  = GL_PREVIOUS_EXT;
                                   break;
@@ -3447,27 +3513,27 @@
             case D3DTA_TFACTOR:   source  = GL_CONSTANT_EXT;
                                   break;
 
-            /* According to the GL_ARB_texture_env_combine specs, SPECULAR is 'Secondary color' and
+            / * According to the GL_ARB_texture_env_combine specs, SPECULAR is 'Secondary color' and
                isnt supported until base GL supports it
-               There is no concept of temp registers as far as I can tell                          */
+               There is no concept of temp registers as far as I can tell                          * /
 
             default:
                 FIXME("Unrecognized or unhandled texture arg %ld\n", Value);
             }
-
+	    */
             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);");
+                vcheckGLcall("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);");
+                vcheckGLcall("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);");
+                vcheckGLcall("glTexEnvi(GL_TEXTURE_ENV, SOURCEx_RGB_EXT, source);");
                 glTexEnvi(GL_TEXTURE_ENV, OPERANDx_RGB_EXT(Type), operand);
-                checkGLcall("glTexEnvi(GL_TEXTURE_ENV, OPERANDx_RGB_EXT, operand);");
+                vcheckGLcall("glTexEnvi(GL_TEXTURE_ENV, OPERANDx_RGB_EXT, operand);");
             }
         }
         break;
@@ -3527,11 +3593,41 @@
                     break;
 
                 case D3DTOP_SELECTARG1                :
-                    glTexEnvi(GL_TEXTURE_ENV, Parm, GL_REPLACE);
-                    checkGLcall("glTexEnvi(GL_TEXTURE_ENV, Parm, GL_REPLACE)");
+		    {
+		        BOOL  isAlphaOp = (Type == D3DTSS_ALPHAOP);
+		        DWORD dwValue = This->StateBlock->texture_state[Stage][(isAlphaOp) ? D3DTSS_ALPHAARG1 : D3DTSS_COLORARG1];
+			GLenum source;
+			GLenum operand;			
+                        FIXME("see if D3DTOP_SELECTARG2 behavior is correct now!\n");
+                        glTexEnvi(GL_TEXTURE_ENV, Parm, GL_REPLACE);
+			checkGLcall("glTexEnvi(GL_TEXTURE_ENV, Parm, GL_REPLACE)");
+			GetSrcAndOpFromValue(dwValue, isAlphaOp, &source, &operand);
+			glTexEnvi(GL_TEXTURE_ENV, (isAlphaOp) ? GL_SOURCE0_ALPHA_EXT : GL_SOURCE0_RGB_EXT, source);
+			checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_EXT, 'source')");
+			glTexEnvi(GL_TEXTURE_ENV, (isAlphaOp) ? GL_OPERAND0_ALPHA_EXT : GL_OPERAND0_RGB_EXT, operand);
+			checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_EXT, 'operand')");
+		    }
                     break;
 
+                case D3DTOP_SELECTARG2                :
+		    { 
+		        BOOL  isAlphaOp = (Type == D3DTSS_ALPHAOP);
+		        DWORD dwValue = This->StateBlock->texture_state[Stage][(isAlphaOp) ? D3DTSS_ALPHAARG2 : D3DTSS_COLORARG2];
+			GLenum source;
+			GLenum operand;
+		        FIXME("see if D3DTOP_SELECTARG2 behavior is correct now!\n");
+                        glTexEnvi(GL_TEXTURE_ENV, Parm, GL_REPLACE);
+			checkGLcall("glTexEnvi(GL_TEXTURE_ENV, Parm, GL_REPLACE)");
+			/* GL_REPLACE, swap args 0 and 1? */
+			GetSrcAndOpFromValue(dwValue, isAlphaOp, &source, &operand);
+			glTexEnvi(GL_TEXTURE_ENV, (isAlphaOp) ? GL_SOURCE0_ALPHA_EXT : GL_SOURCE0_RGB_EXT, source);
+			checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_EXT, 'source')");
+			glTexEnvi(GL_TEXTURE_ENV, (isAlphaOp) ? GL_OPERAND0_ALPHA_EXT : GL_OPERAND0_RGB_EXT, operand);
+			checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_EXT, 'operand')");
+		    }
+		    break;
+
                 case D3DTOP_MODULATE4X                : Scale = Scale * 2;  /* Drop through */
                 case D3DTOP_MODULATE2X                : Scale = Scale * 2;  /* Drop through */
                 case D3DTOP_MODULATE                  :
@@ -3570,9 +3666,17 @@
                     break;
 
                 case D3DTOP_SUBTRACT                  :
-                    /* glTexEnvi(GL_TEXTURE_ENV, Parm, GL_SUBTRACT); Missing? */
-                case D3DTOP_SELECTARG2                :
-                    /* GL_REPLACE, swap args 0 and 1? */
+#if defined(GL_VERSION_1_3)
+                    glTexEnvi(GL_TEXTURE_ENV, Parm, GL_SUBTRACT);
+		    checkGLcall("glTexEnvi(GL_TEXTURE_ENV, Parm, GL_SUBTRACT)");
+		    break;
+#else
+		    /**
+		     * @TODO: to check:
+		     *  if ARB_texture_env_combine is supported
+		     *   we can use GL_SUBTRACT_ARB here
+		     */
+#endif
                 case D3DTOP_ADDSMOOTH                 :
                 case D3DTOP_BLENDDIFFUSEALPHA         :
                 case D3DTOP_BLENDTEXTUREALPHA         :
@@ -3654,44 +3758,64 @@
         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);
+        {
+            /* 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                                                  */
+	  
+	    /**
+	     * To Jason: i don't understand what to do with the (Value & 0x00FF) index
+	     * it seems a texture coordinate index (0 <= x <= 7) seeing msdn and logs 
+	     * have you any idea ?
+	     */
+
+	    /** 
+	     * Be carefull the value of the mask 0xF0000 come from d3d8types.h infos 
+	     */
+	    switch (Value & 0xFFFFFF00) {
+	    case D3DTSS_TCI_PASSTHRU:
+	      /*Use the specified texture coordinates contained within the vertex format. This value resolves to zero.*/
+	      break;
+
+            case 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)");
+	      }
+	      break;
+
+	    default:
+	        /* Todo: */
+	        /* ? disable GL_TEXTURE_GEN_n ? */
+	        FIXME("Unhandled D3DTSS_TEXCOORDINDEX %lx\n", Value);
+	        break;
+	    }
         }
         break;
 


More information about the wine-patches mailing list