[D3D 48] Miscellaneous fixes

Lionel Ulmer lionel.ulmer at free.fr
Wed Dec 25 12:50:48 CST 2002


Changelog:
 - do not use the alpha coordinates when ALPHABLEND is disabled
 - disable fogging in the XYZRHW case
 - various other small fixes

-- 
		 Lionel Ulmer - http://www.bbrox.org/
-------------- next part --------------
--- /home/ulmer/Wine/wine_base//dlls/ddraw/d3ddevice/mesa.c	2002-12-24 18:12:53.000000000 +0100
+++ /home/ulmer/Wine/wine_work//dlls/ddraw/d3ddevice/mesa.c	2002-12-25 17:19:08.000000000 +0100
@@ -710,6 +710,8 @@
 	glMultMatrixf((float *) glThis->world_mat);
 	glMatrixMode(GL_PROJECTION);
 	glLoadMatrixf((float *) glThis->proj_mat);
+
+	if (glThis->render_state.fog_on == TRUE) glEnable(GL_FOG);
     } else if ((vertex_transformed == TRUE) &&
 	       ((glThis->last_vertices_transformed == FALSE) ||
 		(glThis->matrices_changed == TRUE))) {
@@ -732,6 +734,9 @@
 	glLoadIdentity();
 	glMatrixMode(GL_PROJECTION);
 	glLoadMatrixf(trans_mat);
+
+	/* Remove also fogging... */
+	glDisable(GL_FOG);
     }
     glThis->matrices_changed = FALSE;
     
@@ -936,10 +941,15 @@
 	       (*color >> 24) & 0xFF);
 }
 inline static void handle_diffuse_and_specular(DWORD *color_d, DWORD *color_s) {
-    glColor4ub((*color_d >> 16) & 0xFF,
-	       (*color_d >>  8) & 0xFF,
-	       (*color_d >>  0) & 0xFF,
-	       (*color_d >> 24) & 0xFF);
+    handle_diffuse(color_d);
+}
+inline static void handle_diffuse_no_alpha(DWORD *color) {
+    glColor3ub((*color >> 16) & 0xFF,
+	       (*color >>  8) & 0xFF,
+	       (*color >>  0) & 0xFF);
+}
+inline static void handle_diffuse_and_specular_no_alpha(DWORD *color_d, DWORD *color_s) {
+    handle_diffuse_no_alpha(color_d);
 }
 inline static void handle_texture(D3DVALUE *coords) {
     glTexCoord2fv(coords);
@@ -1005,7 +1015,10 @@
 	    D3DVALUE *position =
 	      (D3DVALUE *) (((char *) lpD3DDrawPrimStrideData->position.lpvData) + i * lpD3DDrawPrimStrideData->position.dwStride);
 
-	    handle_diffuse_and_specular(color_d, color_s);
+	    if (glThis->render_state.alpha_blend_enable == TRUE)
+	        handle_diffuse_and_specular(color_d, color_s);
+	    else
+	        handle_diffuse_and_specular_no_alpha(color_d, color_s);
 	    handle_texture(tex_coord);
 	    handle_xyzrhw(position);
 
@@ -1040,7 +1053,10 @@
 		  (DWORD *) (((char *) lpD3DDrawPrimStrideData->diffuse.lpvData) + i * lpD3DDrawPrimStrideData->diffuse.dwStride);
 		DWORD *color_s = 
 		  (DWORD *) (((char *) lpD3DDrawPrimStrideData->specular.lpvData) + i * lpD3DDrawPrimStrideData->specular.dwStride);
-		handle_diffuse_and_specular(color_d, color_s);
+		if (glThis->render_state.alpha_blend_enable == TRUE)
+		    handle_diffuse_and_specular(color_d, color_s);
+		else
+		    handle_diffuse_and_specular_no_alpha(color_d, color_s);
 	    } else {
 	        if (d3dvtVertexType & D3DFVF_SPECULAR) { 
 		    DWORD *color_s = 
@@ -1049,7 +1065,10 @@
 		} else if (d3dvtVertexType & D3DFVF_DIFFUSE) {
 		    DWORD *color_d = 
 		      (DWORD *) (((char *) lpD3DDrawPrimStrideData->diffuse.lpvData) + i * lpD3DDrawPrimStrideData->diffuse.dwStride);
-		    handle_diffuse(color_d);
+		    if (glThis->render_state.alpha_blend_enable == TRUE)
+		        handle_diffuse(color_d);
+		    else
+		        handle_diffuse_no_alpha(color_d);
 		}
 	    }
 		
@@ -1866,6 +1889,8 @@
     gl_object->render_state.min = GL_NEAREST;
     gl_object->render_state.alpha_ref = 0.0; /* No actual idea about the real default value... */
     gl_object->render_state.alpha_func = GL_ALWAYS; /* Here either but it seems logical */
+    gl_object->render_state.alpha_blend_enable = FALSE;
+    gl_object->render_state.fog_on = FALSE;
     
     /* Allocate memory for the matrices */
     gl_object->world_mat = (D3DMATRIX *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 16 * sizeof(float));
@@ -1884,7 +1909,6 @@
     ENTER_GL();
     TRACE(" current context set\n");
     glClearColor(0.0, 0.0, 0.0, 0.0);
-    glColor3f(1.0, 1.0, 1.0);
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
     glDrawBuffer(buffer);
     glReadBuffer(buffer);
--- /home/ulmer/Wine/wine_base//dlls/ddraw/d3dtexture.c	2002-12-24 18:31:09.000000000 +0100
+++ /home/ulmer/Wine/wine_work//dlls/ddraw/d3dtexture.c	2002-12-25 17:03:17.000000000 +0100
@@ -137,7 +137,7 @@
     return DD_OK;
 }
 
-static void
+static HRESULT
 gltex_upload_texture(IDirectDrawSurfaceImpl *This, BOOLEAN init_upload) {
     IDirect3DTextureGLImpl *glThis = (IDirect3DTextureGLImpl *) This->tex_private;
     GLuint current_texture;
@@ -148,7 +148,7 @@
 			       GLsizei width, GLenum format, GLenum type, const GLvoid *table) = NULL;
     BOOL upload_done = FALSE;
     BOOL error = FALSE;
-    GLenum format, pixel_format;
+    GLenum format = GL_RGBA, pixel_format = GL_UNSIGNED_BYTE; /* This is only to prevent warnings.. */
     VOID *surface = NULL;
 
     DDSURFACEDESC *src_d = (DDSURFACEDESC *)&(This->surface_desc);
@@ -179,7 +179,7 @@
 	if (pal == NULL) {
 	    ERR("Palettized texture Loading with a NULL palette !\n");
 	    glBindTexture(GL_TEXTURE_2D, current_texture);
-	    return;
+	    return D3DERR_INVALIDPALETTE;
 	}
 	/* Get the surface's palette */
 	for (i = 0; i < 256; i++) {
@@ -323,6 +323,7 @@
     }
 
     glBindTexture(GL_TEXTURE_2D, current_texture);
+    return DD_OK;
 }
 
 HRESULT WINAPI
@@ -462,6 +463,7 @@
     IDirectDrawSurfaceImpl *lpD3DTextureImpl = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirect3DTexture2, lpD3DTexture2);
     DWORD mem_used;
     DDSURFACEDESC *src_d, *dst_d;
+    HRESULT ret_value = D3D_OK;
     
     TRACE("(%p/%p)->(%p)\n", This, iface, lpD3DTexture2);
 
@@ -521,14 +523,14 @@
 	    /* Now, load the texture */
 	    /* d3dd->set_context(d3dd); We need to set the context somehow.... */
 	    
-	    gltex_upload_texture(This, glThis->first_unlock);
+	    ret_value = gltex_upload_texture(This, glThis->first_unlock);
 	    glThis->first_unlock = FALSE;
 	    
 	    LEAVE_GL();
 	}
     }
 
-    return D3D_OK;
+    return ret_value;
 }
 
 HRESULT WINAPI
@@ -553,7 +555,7 @@
 Thunk_IDirect3DTextureImpl_2_Release(LPDIRECT3DTEXTURE2 iface)
 {
     TRACE("(%p)->() thunking to IDirectDrawSurface7 interface.\n", iface);
-    return IDirectDrawSurface7_AddRef(COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirect3DTexture2, IDirectDrawSurface7, iface));
+    return IDirectDrawSurface7_Release(COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirect3DTexture2, IDirectDrawSurface7, iface));
 }
 
 HRESULT WINAPI
@@ -578,7 +580,7 @@
 Thunk_IDirect3DTextureImpl_1_Release(LPDIRECT3DTEXTURE iface)
 {
     TRACE("(%p)->() thunking to IDirectDrawSurface7 interface.\n", iface);
-    return IDirectDrawSurface7_AddRef(COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirect3DTexture, IDirectDrawSurface7, iface));
+    return IDirectDrawSurface7_Release(COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirect3DTexture, IDirectDrawSurface7, iface));
 }
 
 HRESULT WINAPI
--- /home/ulmer/Wine/wine_base//dlls/ddraw/helper.c	2002-12-22 12:06:18.000000000 +0100
+++ /home/ulmer/Wine/wine_work//dlls/ddraw/helper.c	2002-12-25 13:57:17.000000000 +0100
@@ -577,7 +577,10 @@
 {
     int i;
 
-    DDRAW_dump_surface_desc(&(surface->surface_desc));
+    if (TRACE_ON(ddraw)) {
+        DPRINTF("Dumping surface : \n");
+        DDRAW_dump_surface_desc(&(surface->surface_desc));
+    }
     
     fprintf(f, "P6\n%ld %ld\n255\n", surface->surface_desc.dwWidth, surface->surface_desc.dwHeight);
 
--- /home/ulmer/Wine/wine_base//dlls/ddraw/mesa.c	2002-12-23 18:34:52.000000000 +0100
+++ /home/ulmer/Wine/wine_work//dlls/ddraw/mesa.c	2002-12-25 17:17:56.000000000 +0100
@@ -227,8 +227,8 @@
 	        switch ((D3DTEXTUREBLEND) dwRenderState) {
 		    case D3DTBLEND_MODULATE:
 		    case D3DTBLEND_MODULATEALPHA:
-		          glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
-			  break;
+		        glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+			break;
 		    default:
 			  ERR("Unhandled texture environment %ld !\n",dwRenderState);
 		}
@@ -239,13 +239,16 @@
 		    case D3DCULL_NONE:
 		         glDisable(GL_CULL_FACE);
 			 break;
+			 /* Not sure about these... The DirectX doc is, well, pretty unclear :-) */
 		    case D3DCULL_CW:
 			 glEnable(GL_CULL_FACE);
 			 glFrontFace(GL_CW);
+			 glCullFace(GL_BACK);
 			 break;
 		    case D3DCULL_CCW:
 			 glEnable(GL_CULL_FACE);
 			 glFrontFace(GL_CCW);
+			 glCullFace(GL_BACK);
 			 break;
 		    default:
 			 ERR("Unhandled cull mode %ld !\n",dwRenderState);
@@ -274,17 +277,23 @@
 	        break;
 
 	    case D3DRENDERSTATE_ALPHABLENDENABLE:   /* 27 */
-	        if (dwRenderState)
+	        if (dwRenderState) {
 		    glEnable(GL_BLEND);
-		else
+		    rs->alpha_blend_enable = TRUE;
+		} else {
 		    glDisable(GL_BLEND);
+		    rs->alpha_blend_enable = FALSE;
+		}
 	        break;
 	      
 	    case D3DRENDERSTATE_FOGENABLE: /* 28 */
-	        if (dwRenderState)
+	        if (dwRenderState) {
 		    glEnable(GL_FOG);
-		else
+		    rs->fog_on = TRUE;
+		} else {
 		    glDisable(GL_FOG);
+		    rs->fog_on = FALSE;
+		}
 	        break;
 
 	    case D3DRENDERSTATE_SPECULARENABLE: /* 29 */
--- /home/ulmer/Wine/wine_base//dlls/ddraw/mesa_private.h	2002-12-24 15:48:08.000000000 +0100
+++ /home/ulmer/Wine/wine_work//dlls/ddraw/mesa_private.h	2002-12-25 17:17:15.000000000 +0100
@@ -67,6 +67,10 @@
     /* This is needed for the Alpha stuff */
     GLenum alpha_func;
     GLclampf alpha_ref;
+    BOOLEAN alpha_blend_enable;
+
+    /* This is needed to re-enable fogging when XYZRHW and XYZ primitives are mixed */
+    BOOLEAN fog_on;
 } RenderState;
 
 /* Common functions defined in d3dcommon.c */


More information about the wine-patches mailing list