[d3d7/patch #1] firstimpl for (Get|Set)ClipPlane for d3d7

Christoph Frick frick at SC-Networks.de
Sun Jan 5 08:21:24 CST 2003


hi

this a first implementation of the (Get|Set)ClipPlane methods for d3d7. Its
inspired by the impl in the d3d8. many thanx to Lionel for helping me alot
with my first d3d patch.

ChangeLog: Implementation of (Get|Set)ClipPlane for d3d7
Licence  : LGPL

CU!

Index: dlls/ddraw/d3d_private.h
===================================================================
RCS file: /home/wine/wine/dlls/ddraw/d3d_private.h,v
retrieving revision 1.25
diff -u -r1.25 d3d_private.h
--- dlls/ddraw/d3d_private.h	3 Jan 2003 21:08:50 -0000	1.25
+++ dlls/ddraw/d3d_private.h	5 Jan 2003 14:08:30 -0000
@@ -178,6 +178,12 @@
                     IDirect3DViewportImpl* vp);
 };
 
+/* Internal structure to store the state of the clipping planes */
+typedef struct d3d7clippingplane 
+{
+    D3DVALUE plane[4];
+} d3d7clippingplane;
+
 /*****************************************************************************
  * IDirect3DDevice implementation structure
  */
@@ -218,6 +224,10 @@
     DWORD active_lights, set_lights;
     D3DLIGHT7 light_parameters[MAX_LIGHTS];
 
+    /* clipping planes */
+    DWORD max_clipping_planes;
+    d3d7clippingplane *clipping_planes;
+    
     void (*set_context)(IDirect3DDeviceImpl*);
     HRESULT (*clear)(IDirect3DDeviceImpl *This,
 		     DWORD dwCount,
Index: dlls/ddraw/mesa.c
===================================================================
RCS file: /home/wine/wine/dlls/ddraw/mesa.c,v
retrieving revision 1.32
diff -u -r1.32 mesa.c
--- dlls/ddraw/mesa.c	5 Jan 2003 01:04:55 -0000	1.32
+++ dlls/ddraw/mesa.c	5 Jan 2003 14:08:34 -0000
@@ -455,8 +455,24 @@
 	        break;
 
 	    case D3DRENDERSTATE_CLIPPING:    /* 136 */
-	        /* Nothing to do here... Even if what we receive is already clipped by the application,
-		   we cannot tell OpenGL to not re-clip it. */
+	    case D3DRENDERSTATE_CLIPPLANEENABLE: /*152*/
+		{
+		    GLint i;
+		    DWORD mask, runner;
+		    
+		    if (dwRenderStateType==D3DRENDERSTATE_CLIPPING) {
+			mask = ((dwRenderState)?(This->parent.state_block.render_state[D3DRENDERSTATE_CLIPPLANEENABLE-1]):(0x0000));
+		    } else {
+			mask = dwRenderState;
+		    }
+		    for (i = 0, runner = 1; This->parent.max_clipping_planes; i++, runner = (runner<<1)) {
+			if (mask & runner) {
+			    glEnable(GL_CLIP_PLANE0 + i);
+			} else {
+			    glDisable(GL_CLIP_PLANE0 + i);
+			}
+		    }
+		}
 	        break;
 
 	    case D3DRENDERSTATE_LIGHTING:    /* 137 */
Index: dlls/ddraw/d3ddevice/main.c
===================================================================
RCS file: /home/wine/wine/dlls/ddraw/d3ddevice/main.c,v
retrieving revision 1.32
diff -u -r1.32 main.c
--- dlls/ddraw/d3ddevice/main.c	3 Jan 2003 22:32:30 -0000	1.32
+++ dlls/ddraw/d3ddevice/main.c	5 Jan 2003 14:08:44 -0000
@@ -875,14 +875,20 @@
     return DD_OK;
 }
 
-HRESULT WINAPI
-Main_IDirect3DDeviceImpl_7_GetClipPlane(LPDIRECT3DDEVICE7 iface,
-                                        DWORD dwIndex,
-                                        D3DVALUE* pPlaneEquation)
+HRESULT  WINAPI  
+Main_IDirect3DDeviceImpl_7_GetClipPlane(LPDIRECT3DDEVICE7 iface, DWORD Index, D3DVALUE* pPlaneEquation)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
-    FIXME("(%p/%p)->(%08lx,%p): stub!\n", This, iface, dwIndex, pPlaneEquation);
-    return DD_OK;
+    ICOM_THIS(IDirect3DDeviceImpl,iface);
+
+    TRACE("(%p)->(%ld,%p)\n", This, Index, pPlaneEquation);
+
+    if (Index>=This->max_clipping_planes) {
+	return DDERR_INVALIDPARAMS;
+    }
+
+    memcpy( pPlaneEquation, This->clipping_planes[Index].plane, sizeof(D3DVALUE[4]));
+
+    return D3D_OK;
 }
 
 HRESULT WINAPI
Index: dlls/ddraw/d3ddevice/main.h
===================================================================
RCS file: /home/wine/wine/dlls/ddraw/d3ddevice/main.h,v
retrieving revision 1.6
diff -u -r1.6 main.h
--- dlls/ddraw/d3ddevice/main.h	3 Jan 2003 21:08:50 -0000	1.6
+++ dlls/ddraw/d3ddevice/main.h	5 Jan 2003 14:08:46 -0000
@@ -264,11 +264,6 @@
                                           BOOL* pbEnable);
 
 HRESULT WINAPI
-Main_IDirect3DDeviceImpl_7_SetClipPlane(LPDIRECT3DDEVICE7 iface,
-                                        DWORD dwIndex,
-                                        D3DVALUE* pPlaneEquation);
-
-HRESULT WINAPI
 Main_IDirect3DDeviceImpl_7_GetClipPlane(LPDIRECT3DDEVICE7 iface,
                                         DWORD dwIndex,
                                         D3DVALUE* pPlaneEquation);
Index: dlls/ddraw/d3ddevice/mesa.c
===================================================================
RCS file: /home/wine/wine/dlls/ddraw/d3ddevice/mesa.c,v
retrieving revision 1.77
diff -u -r1.77 mesa.c
--- dlls/ddraw/d3ddevice/mesa.c	5 Jan 2003 01:04:55 -0000	1.77
+++ dlls/ddraw/d3ddevice/mesa.c	5 Jan 2003 14:08:52 -0000
@@ -328,6 +328,7 @@
 	ENTER_GL();
 	glXDestroyContext(glThis->display, glThis->gl_context);
 	LEAVE_GL();
+	HeapFree(GetProcessHeap(), 0, This->clipping_planes);
 
 	HeapFree(GetProcessHeap(), 0, This);
 	return 0;
@@ -1590,6 +1591,32 @@
     return DD_OK;
 }
 
+HRESULT  WINAPI  
+GL_IDirect3DDeviceImpl_7_SetClipPlane(LPDIRECT3DDEVICE7 iface, DWORD Index, CONST D3DVALUE* pPlaneEquation) 
+{
+    ICOM_THIS(IDirect3DDeviceImpl,iface);
+    GLdouble plane[4];
+
+    TRACE("(%p)->(%ld,%p)\n", This, Index, pPlaneEquation);
+
+    if (Index>=This->max_clipping_planes) {
+	return DDERR_INVALIDPARAMS;
+    }
+
+    TRACE(" clip plane %ld : %f %f %f %f\n", Index, pPlaneEquation[0], pPlaneEquation[1], pPlaneEquation[2], pPlaneEquation[3] );
+
+    memcpy( This->clipping_planes[Index].plane, pPlaneEquation, sizeof(D3DVALUE[4]));
+    plane[0] = pPlaneEquation[0];
+    plane[1] = pPlaneEquation[1];
+    plane[2] = pPlaneEquation[2];
+    plane[3] = pPlaneEquation[3];
+
+    /* XXX: is here also code needed to handle the transformation of the world? */
+    glClipPlane( GL_CLIP_PLANE0+Index, (const GLdouble*)(&plane) );
+
+    return D3D_OK;
+}
+
 #if !defined(__STRICT_ANSI__) && defined(__GNUC__)
 # define XCAST(fun)     (typeof(VTABLE_IDirect3DDevice7.fun))
 #else
@@ -1645,7 +1672,7 @@
     XCAST(Load) Main_IDirect3DDeviceImpl_7_Load,
     XCAST(LightEnable) GL_IDirect3DDeviceImpl_7_LightEnable,
     XCAST(GetLightEnable) Main_IDirect3DDeviceImpl_7_GetLightEnable,
-    XCAST(SetClipPlane) Main_IDirect3DDeviceImpl_7_SetClipPlane,
+    XCAST(SetClipPlane) GL_IDirect3DDeviceImpl_7_SetClipPlane,
     XCAST(GetClipPlane) Main_IDirect3DDeviceImpl_7_GetClipPlane,
     XCAST(GetInfo) Main_IDirect3DDeviceImpl_7_GetInfo,
 };
@@ -2130,6 +2157,13 @@
     memcpy(object->view_mat , id_mat, 16 * sizeof(float));
     memcpy(object->proj_mat , id_mat, 16 * sizeof(float));
 
+    /* allocate the clipping planes */
+    glGetIntegerv(GL_MAX_CLIP_PLANES,(GLint*)(&object->max_clipping_planes));
+    if (object->max_clipping_planes>32) {
+	object->max_clipping_planes=32;
+    }
+    object->clipping_planes = (d3d7clippingplane*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, object->max_clipping_planes * sizeof(d3d7clippingplane));
+
     /* Initialisation */
     TRACE(" setting current context\n");
     LEAVE_GL();
@@ -2166,3 +2200,4 @@
 
     return DD_OK;
 }
+




More information about the wine-patches mailing list