[D3D] Some more texturing work

Lionel Ulmer lionel.ulmer at free.fr
Mon May 19 03:07:02 CDT 2003


Note: all my latest patches are cumulative and need to be applied in
      chronological order (using the patch file name)

Changelog:
 - implement the TFACTOR texture stage state
 - support Texture matrices
 - various misc. clean-ups

-- 
		 Lionel Ulmer - http://www.bbrox.org/
-------------- next part --------------
--- dlls/ddraw_CVS/d3d_private.h	Sat May 17 17:02:36 2003
+++ dlls/ddraw/d3d_private.h	Mon May 19 00:17:20 2003
@@ -196,9 +196,17 @@
  * IDirect3DDevice implementation structure
  */
 
-#define WORLDMAT_CHANGED (0x00000001 << 0)
-#define VIEWMAT_CHANGED  (0x00000001 << 1)
-#define PROJMAT_CHANGED  (0x00000001 << 2)
+#define WORLDMAT_CHANGED (0x00000001 <<  0)
+#define VIEWMAT_CHANGED  (0x00000001 <<  1)
+#define PROJMAT_CHANGED  (0x00000001 <<  2)
+#define TEXMAT0_CHANGED  (0x00000001 <<  3)
+#define TEXMAT1_CHANGED  (0x00000001 <<  4)
+#define TEXMAT2_CHANGED  (0x00000001 <<  5)
+#define TEXMAT3_CHANGED  (0x00000001 <<  6)
+#define TEXMAT4_CHANGED  (0x00000001 <<  7)
+#define TEXMAT5_CHANGED  (0x00000001 <<  8)
+#define TEXMAT6_CHANGED  (0x00000001 <<  9)
+#define TEXMAT7_CHANGED  (0x00000001 << 10)
 
 struct IDirect3DDeviceImpl
 {
@@ -221,7 +229,8 @@
     D3DMATRIX *world_mat;
     D3DMATRIX *view_mat;
     D3DMATRIX *proj_mat;
-
+    D3DMATRIX *tex_mat[MAX_TEXTURES];
+    
     /* Current material used in D3D7 mode */
     D3DMATERIAL7 current_material;
 
--- dlls/ddraw_CVS/d3ddevice/main.c	Sun May 18 23:45:52 2003
+++ dlls/ddraw/d3ddevice/main.c	Mon May 19 09:25:25 2003
@@ -394,6 +394,22 @@
 	    matrix_changed = PROJMAT_CHANGED;
 	} break;
 
+	case D3DTRANSFORMSTATE_TEXTURE0:
+	case D3DTRANSFORMSTATE_TEXTURE1:
+	case D3DTRANSFORMSTATE_TEXTURE2:
+	case D3DTRANSFORMSTATE_TEXTURE3:
+	case D3DTRANSFORMSTATE_TEXTURE4:
+	case D3DTRANSFORMSTATE_TEXTURE5:
+	case D3DTRANSFORMSTATE_TEXTURE6:
+	case D3DTRANSFORMSTATE_TEXTURE7: {
+	    DWORD mat_num = dtstTransformStateType - D3DTRANSFORMSTATE_TEXTURE0;
+	    if (TRACE_ON(ddraw)) {
+	        TRACE(" D3DTRANSFORMSTATE_TEXTURE%ld :\n", mat_num);  dump_D3DMATRIX(lpD3DMatrix);
+	    }
+	    memcpy(This->tex_mat[mat_num], lpD3DMatrix, 16 * sizeof(float));
+	    matrix_changed = TEXMAT0_CHANGED << mat_num;
+	} break;
+	  
 	default:
 	    ERR("Unknown transform type %08x !!!\n", dtstTransformStateType);
 	    break;
@@ -437,6 +453,22 @@
 	    }
 	} break;
 
+	case D3DTRANSFORMSTATE_TEXTURE0:
+	case D3DTRANSFORMSTATE_TEXTURE1:
+	case D3DTRANSFORMSTATE_TEXTURE2:
+	case D3DTRANSFORMSTATE_TEXTURE3:
+	case D3DTRANSFORMSTATE_TEXTURE4:
+	case D3DTRANSFORMSTATE_TEXTURE5:
+	case D3DTRANSFORMSTATE_TEXTURE6:
+	case D3DTRANSFORMSTATE_TEXTURE7: {
+	    DWORD mat_num = dtstTransformStateType - D3DTRANSFORMSTATE_TEXTURE0;
+	    memcpy(lpD3DMatrix, This->tex_mat[mat_num], 16 * sizeof(D3DVALUE));
+	    if (TRACE_ON(ddraw)) {
+	        TRACE(" returning D3DTRANSFORMSTATE_TEXTURE%ld :\n", mat_num);
+		dump_D3DMATRIX(lpD3DMatrix);
+	    }
+	} break;
+	  
 	default:
 	    ERR("Unknown transform type %08x !!!\n", dtstTransformStateType);
 	    return DDERR_INVALIDPARAMS;
@@ -486,6 +518,22 @@
 	    matrix_changed = PROJMAT_CHANGED;
 	} break;
 
+	case D3DTRANSFORMSTATE_TEXTURE0:
+	case D3DTRANSFORMSTATE_TEXTURE1:
+	case D3DTRANSFORMSTATE_TEXTURE2:
+	case D3DTRANSFORMSTATE_TEXTURE3:
+	case D3DTRANSFORMSTATE_TEXTURE4:
+	case D3DTRANSFORMSTATE_TEXTURE5:
+	case D3DTRANSFORMSTATE_TEXTURE6:
+	case D3DTRANSFORMSTATE_TEXTURE7: {
+	    DWORD mat_num = dtstTransformStateType - D3DTRANSFORMSTATE_TEXTURE0;
+	    if (TRACE_ON(ddraw)) {
+	        TRACE(" Resulting D3DTRANSFORMSTATE_TEXTURE%ld matrix is :\n", mat_num);
+	    }
+	    mat = This->tex_mat[mat_num];
+	    matrix_changed = TEXMAT0_CHANGED << mat_num;
+	} break;
+
 	default:
 	    ERR("Unknown transform type %08x !!!\n", dtstTransformStateType);
 	    return DDERR_INVALIDPARAMS;
@@ -522,27 +570,6 @@
     
     if (matrix_changed != 0x00000000) This->matrices_updated(This, matrix_changed);
     
-    return DD_OK;
-}
-
-HRESULT WINAPI
-Main_IDirect3DDeviceImpl_7_SetViewport(LPDIRECT3DDEVICE7 iface,
-                                       LPD3DVIEWPORT7 lpData)
-{
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
-    TRACE("(%p/%p)->(%p)\n", This, iface, lpData);
-
-    if (TRACE_ON(ddraw)) {
-        TRACE(" viewport is : \n");
-	TRACE("    - dwX = %ld   dwY = %ld\n",
-	      lpData->dwX, lpData->dwY);
-	TRACE("    - dwWidth = %ld   dwHeight = %ld\n",
-	      lpData->dwWidth, lpData->dwHeight);
-	TRACE("    - dvMinZ = %f   dvMaxZ = %f\n",
-	      lpData->dvMinZ, lpData->dvMaxZ);
-    }
-    This->active_viewport = *lpData;
-
     return DD_OK;
 }
 
--- dlls/ddraw_CVS/d3ddevice/mesa.c	Sun May 18 23:45:52 2003
+++ dlls/ddraw/d3ddevice/mesa.c	Mon May 19 09:55:33 2003
@@ -342,9 +342,11 @@
 	IDirectDrawSurfaceImpl *surface = This->surface, *surf;
 	
 	/* Release texture associated with the device */ 
-	for (i = 0; i < MAX_TEXTURES; i++) 
+	for (i = 0; i < MAX_TEXTURES; i++) {
 	    if (This->current_texture[i] != NULL)
 	        IDirectDrawSurface7_Release(ICOM_INTERFACE(This->current_texture[i], IDirectDrawSurface7));
+	    HeapFree(GetProcessHeap(), 0, This->tex_mat[i]);
+	}
 
 	/* Look for the front buffer and override its surface's Flip method (if in double buffering) */
 	for (surf = surface; surf != NULL; surf = surf->surface_owner) {
@@ -1507,7 +1509,7 @@
 
 /* We need a static function for that to handle the 'special' case of 'SELECT_ARG2' */
 static BOOLEAN
-handle_color_alpha_args(DWORD dwStage, D3DTEXTURESTAGESTATETYPE d3dTexStageStateType, DWORD dwState, D3DTEXTUREOP tex_op)
+handle_color_alpha_args(IDirect3DDeviceImpl *This, DWORD dwStage, D3DTEXTURESTAGESTATETYPE d3dTexStageStateType, DWORD dwState, D3DTEXTUREOP tex_op)
 {
     BOOLEAN is_complement = FALSE;
     BOOLEAN is_alpha_replicate = FALSE;
@@ -1553,7 +1555,19 @@
         case D3DTA_CURRENT: src = GL_PREVIOUS_EXT; break;
 	case D3DTA_DIFFUSE: src = GL_PRIMARY_COLOR_EXT; break;
 	case D3DTA_TEXTURE: src = GL_TEXTURE; break;
-	case D3DTA_TFACTOR: src = GL_CONSTANT_EXT; FIXME(" no handling yet of setting of constant value !\n"); break;
+	case D3DTA_TFACTOR: {
+	    /* Get the constant value from the current rendering state */
+	    GLfloat color[4];
+	    DWORD col = This->state_block.render_state[D3DRENDERSTATE_TEXTUREFACTOR - 1];
+	    
+	    color[0] = ((col >> 16) & 0xFF) / 255.0f;
+	    color[1] = ((col >>  8) & 0xFF) / 255.0f;
+	    color[2] = ((col >>  0) & 0xFF) / 255.0f;
+	    color[3] = ((col >> 24) & 0xFF) / 255.0f;
+	    glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, color);
+	    
+	    src = GL_CONSTANT_EXT;
+	} break;
 	default: src = GL_TEXTURE; handled = FALSE; break;
     }
 
@@ -1778,17 +1792,17 @@
 		((dwState == D3DTOP_SELECTARG2) && (prev_state != D3DTOP_SELECTARG2))) {
 	        /* Switch the arguments if needed... */
 	        if (d3dTexStageStateType == D3DTSS_COLOROP) {
-		    handle_color_alpha_args(dwStage, D3DTSS_COLORARG1,
+		    handle_color_alpha_args(This, dwStage, D3DTSS_COLORARG1,
 					    This->state_block.texture_stage_state[dwStage][D3DTSS_COLORARG1 - 1],
 					    dwState);
-		    handle_color_alpha_args(dwStage, D3DTSS_COLORARG2,
+		    handle_color_alpha_args(This, dwStage, D3DTSS_COLORARG2,
 					    This->state_block.texture_stage_state[dwStage][D3DTSS_COLORARG2 - 1],
 					    dwState);
 		} else {
-		    handle_color_alpha_args(dwStage, D3DTSS_ALPHAARG1,
+		    handle_color_alpha_args(This, dwStage, D3DTSS_ALPHAARG1,
 					    This->state_block.texture_stage_state[dwStage][D3DTSS_ALPHAARG1 - 1],
 					    dwState);
-		    handle_color_alpha_args(dwStage, D3DTSS_ALPHAARG2,
+		    handle_color_alpha_args(This, dwStage, D3DTSS_ALPHAARG2,
 					    This->state_block.texture_stage_state[dwStage][D3DTSS_ALPHAARG2 - 1],
 					    dwState);
 		}
@@ -1837,7 +1851,7 @@
 	        tex_op = This->state_block.texture_stage_state[dwStage][D3DTSS_ALPHAOP - 1];
 	    }
 	    
-	    handled = handle_color_alpha_args(dwStage, d3dTexStageStateType, dwState, tex_op);
+	    handled = handle_color_alpha_args(This, dwStage, d3dTexStageStateType, dwState, tex_op);
 	    
 	    if (handled) {
 	        TRACE(" Stage type : %s => %s%s%s\n", type, value, value_comp, value_alpha);
@@ -1921,11 +1935,14 @@
 #undef GEN_CASE
 		default: value = "UNKNOWN";
 	    }
-	    if (dwState & D3DTTFF_PROJECTED)
+	    if (dwState & D3DTTFF_PROJECTED) {
 	        projected = " | D3DTTFF_PROJECTED";
+		handled = FALSE;
+	    }
 
-	    if (dwState != D3DTTFF_DISABLE)
-	        handled = FALSE;
+	    if ((dwState & 0xFF) != D3DTTFF_DISABLE) {
+	        This->matrices_updated(This, TEXMAT0_CHANGED << dwStage);
+	    }
 
 	    if (handled == TRUE) {
 	        TRACE(" Stage type : D3DTSS_TEXTURETRANSFORMFLAGS => %s%s\n", value, projected);
@@ -2517,8 +2534,13 @@
     if (dwFlags & DDBLT_COLORFILL) {
         /* This is easy to handle for the D3D Device... */
         DWORD color = lpbltfx->u5.dwFillColor;
+	D3DRECT rect;
         TRACE(" executing D3D Device override.\n");
-	d3ddevice_clear(This->d3ddevice, 1, rdst, D3DCLEAR_TARGET, color, 0.0, 0x00000000);
+	rect.u1.x1 = rdst->left;
+	rect.u2.y1 = rdst->top;
+	rect.u3.x2 = rdst->right;
+	rect.u4.y2 = rdst->bottom;
+	d3ddevice_clear(This->d3ddevice, 1, &rect, D3DCLEAR_TARGET, color, 0.0, 0x00000000);
 	return DD_OK;
     }
     return DDERR_INVALIDPARAMS;
@@ -2584,9 +2606,26 @@
 d3ddevice_matrices_updated(IDirect3DDeviceImpl *This, DWORD matrices)
 {
     IDirect3DDeviceGLImpl *glThis = (IDirect3DDeviceGLImpl *) This;
-    if (glThis->transform_state == GL_TRANSFORM_NORMAL) {
-        /* This will force an update of the transform state at the next drawing. */
-        glThis->transform_state = GL_TRANSFORM_NONE;
+    DWORD tex_mat, tex_stage;
+    if ((matrices & (VIEWMAT_CHANGED|WORLDMAT_CHANGED|PROJMAT_CHANGED)) != 0) {
+        if (glThis->transform_state == GL_TRANSFORM_NORMAL) {
+	    /* This will force an update of the transform state at the next drawing. */
+	    glThis->transform_state = GL_TRANSFORM_NONE;
+	}
+    }
+    for (tex_mat = TEXMAT0_CHANGED, tex_stage = 0; tex_mat <= TEXMAT7_CHANGED; tex_mat <<= 1, tex_stage++) {
+        if (matrices & tex_mat) {
+	    if (This->state_block.texture_stage_state[tex_stage][D3DTSS_TEXTURETRANSFORMFLAGS - 1] != D3DTTFF_DISABLE) {
+	        if (tex_stage == 0) {
+		    /* No multi-texturing support for now ... */
+		    glMatrixMode(GL_TEXTURE);
+		    glLoadMatrixf((float *) This->tex_mat[tex_stage]);
+		}
+	    } else {
+	        glMatrixMode(GL_TEXTURE);
+		glLoadIdentity();
+	    }
+	}
     }
 }
 
@@ -2743,6 +2782,8 @@
     glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, &max_tex);
     glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, &min_tex);
     glGetTexEnviv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, &tex_env);
+    glMatrixMode(GL_TEXTURE);
+    glLoadIdentity();
     /* TODO: scissor test if ever we use it ! */
     
     if ((surf->surface_desc.u4.ddpfPixelFormat.u1.dwRGBBitCount == 16) &&
@@ -2836,7 +2877,7 @@
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, max_tex);
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, min_tex);
     glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, tex_env);
-
+    d3d_dev->matrices_updated(d3d_dev, TEXMAT0_CHANGED);
 #if 0
     /* I keep this code here as it's very useful to debug :-) */
     {
@@ -2907,6 +2948,7 @@
     HDC device_context;
     XVisualInfo *vis;
     int num;
+    int tex_num;
     XVisualInfo template;
     GLenum buffer = GL_FRONT;
     int light;
@@ -3016,7 +3058,11 @@
     memcpy(object->world_mat, id_mat, 16 * sizeof(float));
     memcpy(object->view_mat , id_mat, 16 * sizeof(float));
     memcpy(object->proj_mat , id_mat, 16 * sizeof(float));
-
+    for (tex_num = 0; tex_num < MAX_TEXTURES; tex_num++) {
+        object->tex_mat[tex_num] = (D3DMATRIX *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 16 * sizeof(float));
+	memcpy(object->tex_mat[tex_num], id_mat, 16 * sizeof(float));
+    }
+    
     /* Initialisation */
     TRACE(" setting current context\n");
     LEAVE_GL();
--- dlls/ddraw_CVS/mesa.c	Fri May 16 18:31:39 2003
+++ dlls/ddraw/mesa.c	Sun May 18 23:58:29 2003
@@ -410,6 +410,10 @@
 	        glStencilMask(dwRenderState);
 	        break;
 
+	    case D3DRENDERSTATE_TEXTUREFACTOR:      /* 60 */
+	        /* Only the storage matters... */
+	        break;
+
 	    case D3DRENDERSTATE_CLIPPING:          /* 136 */
 	    case D3DRENDERSTATE_CLIPPLANEENABLE: { /* 152 */
 		    GLint i;


More information about the wine-patches mailing list