| /* Direct3D Viewport | 
 |    (c) 1998 Lionel ULMER | 
 |     | 
 |    This files contains the implementation of Direct3DViewport2. */ | 
 |  | 
 | #include "config.h" | 
 | #include "windows.h" | 
 | #include "wintypes.h" | 
 | #include "winerror.h" | 
 | #include "interfaces.h" | 
 | #include "heap.h" | 
 | #include "ddraw.h" | 
 | #include "d3d.h" | 
 | #include "debug.h" | 
 |  | 
 | #include "d3d_private.h" | 
 |  | 
 |  | 
 | #ifdef HAVE_MESAGL | 
 |  | 
 | static IDirect3DViewport2_VTable viewport2_vtable; | 
 |  | 
 | /******************************************************************************* | 
 |  *				Viewport1/2 static functions | 
 |  */ | 
 | static void activate(LPDIRECT3DVIEWPORT2 this) { | 
 |   LPDIRECT3DLIGHT l; | 
 |    | 
 |   /* Activate all the lights associated with this context */ | 
 |   l = this->lights; | 
 |  | 
 |   while (l != NULL) { | 
 |     l->activate(l); | 
 |     l = l->next; | 
 |   } | 
 | } | 
 |  | 
 | /******************************************************************************* | 
 |  *				Viewport1/2 Creation functions | 
 |  */ | 
 | LPDIRECT3DVIEWPORT2 d3dviewport2_create(LPDIRECT3D2 d3d) | 
 | { | 
 |   LPDIRECT3DVIEWPORT2 vp; | 
 |    | 
 |   vp = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirect3DViewport2)); | 
 |   vp->ref = 1; | 
 |   vp->lpvtbl = &viewport2_vtable; | 
 |   vp->d3d.d3d2 = d3d; | 
 |   vp->use_d3d2 = 1; | 
 |  | 
 |   vp->device.active_device2 = NULL; | 
 |   vp->activate = activate; | 
 |  | 
 |   vp->lights = NULL; | 
 |  | 
 |   vp->nextlight = GL_LIGHT0; | 
 |    | 
 |   return vp; | 
 | } | 
 |  | 
 | LPDIRECT3DVIEWPORT d3dviewport_create(LPDIRECT3D d3d) | 
 | { | 
 |   LPDIRECT3DVIEWPORT2 vp; | 
 |    | 
 |   vp = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirect3DViewport2)); | 
 |   vp->ref = 1; | 
 |   vp->lpvtbl = &viewport2_vtable; | 
 |   vp->d3d.d3d1 = d3d; | 
 |   vp->use_d3d2 = 0; | 
 |  | 
 |   vp->device.active_device1 = NULL; | 
 |   vp->activate = activate; | 
 |  | 
 |   vp->lights = NULL; | 
 |  | 
 |   vp->nextlight = GL_LIGHT0; | 
 |    | 
 |   return (LPDIRECT3DVIEWPORT) vp; | 
 | } | 
 |  | 
 | /******************************************************************************* | 
 |  *				IDirect3DViewport2 methods | 
 |  */ | 
 |  | 
 | static HRESULT WINAPI IDirect3DViewport2_QueryInterface(LPDIRECT3DVIEWPORT2 this, | 
 | 							REFIID riid, | 
 | 							LPVOID* ppvObj) | 
 | { | 
 |   char xrefiid[50]; | 
 |    | 
 |   WINE_StringFromCLSID((LPCLSID)riid,xrefiid); | 
 |   FIXME(ddraw, "(%p)->(%s,%p): stub\n", this, xrefiid,ppvObj); | 
 |    | 
 |   return S_OK; | 
 | } | 
 |  | 
 |  | 
 |  | 
 | static ULONG WINAPI IDirect3DViewport2_AddRef(LPDIRECT3DVIEWPORT2 this) | 
 | { | 
 |   TRACE(ddraw, "(%p)->()incrementing from %lu.\n", this, this->ref ); | 
 |    | 
 |   return ++(this->ref); | 
 | } | 
 |  | 
 |  | 
 |  | 
 | static ULONG WINAPI IDirect3DViewport2_Release(LPDIRECT3DVIEWPORT2 this) | 
 | { | 
 |   FIXME( ddraw, "(%p)->() decrementing from %lu.\n", this, this->ref ); | 
 |    | 
 |   if (!--(this->ref)) { | 
 |     HeapFree(GetProcessHeap(),0,this); | 
 |     return 0; | 
 |   } | 
 |    | 
 |   return this->ref; | 
 | } | 
 |  | 
 | /*** IDirect3DViewport methods ***/ | 
 | static HRESULT WINAPI IDirect3DViewport2_Initialize(LPDIRECT3DVIEWPORT2 this, | 
 | 						    LPDIRECT3D d3d) | 
 | { | 
 |   FIXME(ddraw, "(%p)->(%p): stub\n", this, d3d); | 
 |    | 
 |   return DD_OK; | 
 | } | 
 |  | 
 | static HRESULT WINAPI IDirect3DViewport2_GetViewport(LPDIRECT3DVIEWPORT2 this, | 
 | 						     LPD3DVIEWPORT lpvp) | 
 | { | 
 |   FIXME(ddraw, "(%p)->(%p): stub\n", this, lpvp); | 
 |    | 
 |   if (this->use_vp2 != 0) | 
 |     return DDERR_INVALIDPARAMS; | 
 |  | 
 |   *lpvp = this->viewport.vp1; | 
 |    | 
 |   return DD_OK; | 
 | } | 
 |  | 
 | static HRESULT WINAPI IDirect3DViewport2_SetViewport(LPDIRECT3DVIEWPORT2 this, | 
 | 						     LPD3DVIEWPORT lpvp) | 
 | { | 
 |   FIXME(ddraw, "(%p)->(%p): stub\n", this, lpvp); | 
 |  | 
 |   this->use_vp2 = 0; | 
 |   this->viewport.vp1 = *lpvp; | 
 |    | 
 |   TRACE(ddraw, "dwSize = %ld   dwX = %ld   dwY = %ld\n", | 
 | 	lpvp->dwSize, lpvp->dwX, lpvp->dwY); | 
 |   TRACE(ddraw, "dwWidth = %ld   dwHeight = %ld\n", | 
 | 	lpvp->dwWidth, lpvp->dwHeight); | 
 |   TRACE(ddraw, "dvScaleX = %f   dvScaleY = %f\n", | 
 | 	lpvp->dvScaleX, lpvp->dvScaleY); | 
 |   TRACE(ddraw, "dvMaxX = %f   dvMaxY = %f\n", | 
 | 	lpvp->dvMaxX, lpvp->dvMaxY); | 
 |   TRACE(ddraw, "dvMinZ = %f   dvMaxZ = %f\n", | 
 | 	lpvp->dvMinZ, lpvp->dvMaxZ); | 
 |  | 
 |    | 
 |   return DD_OK; | 
 | } | 
 |  | 
 | static HRESULT WINAPI IDirect3DViewport2_TransformVertices(LPDIRECT3DVIEWPORT2 this, | 
 | 							   DWORD dwVertexCount, | 
 | 							   LPD3DTRANSFORMDATA lpData, | 
 | 							   DWORD dwFlags, | 
 | 							   LPDWORD lpOffScreen) | 
 | { | 
 |   FIXME(ddraw, "(%p)->(%8ld,%p,%08lx,%p): stub\n", | 
 | 	this, dwVertexCount, lpData, dwFlags, lpOffScreen); | 
 |    | 
 |   return DD_OK; | 
 | } | 
 |  | 
 | static HRESULT WINAPI IDirect3DViewport2_LightElements(LPDIRECT3DVIEWPORT2 this, | 
 | 						       DWORD dwElementCount, | 
 | 						       LPD3DLIGHTDATA lpData) | 
 | { | 
 |   FIXME(ddraw, "(%p)->(%8ld,%p): stub\n", this, dwElementCount, lpData); | 
 |    | 
 |   return DD_OK; | 
 | } | 
 |  | 
 | static HRESULT WINAPI IDirect3DViewport2_SetBackground(LPDIRECT3DVIEWPORT2 this, | 
 | 						       D3DMATERIALHANDLE hMat) | 
 | { | 
 |   FIXME(ddraw, "(%p)->(%08lx): stub\n", this, (DWORD) hMat); | 
 |    | 
 |   return DD_OK; | 
 | } | 
 |  | 
 | static HRESULT WINAPI IDirect3DViewport2_GetBackground(LPDIRECT3DVIEWPORT2 this, | 
 | 						       LPD3DMATERIALHANDLE lphMat, | 
 | 						       LPBOOL lpValid) | 
 | { | 
 |   FIXME(ddraw, "(%p)->(%p,%p): stub\n", this, lphMat, lpValid); | 
 |    | 
 |   return DD_OK; | 
 | } | 
 |  | 
 | static HRESULT WINAPI IDirect3DViewport2_SetBackgroundDepth(LPDIRECT3DVIEWPORT2 this, | 
 | 							    LPDIRECTDRAWSURFACE lpDDSurface) | 
 | { | 
 |   FIXME(ddraw, "(%p)->(%p): stub\n", this, lpDDSurface); | 
 |    | 
 |   return DD_OK; | 
 | } | 
 |  | 
 | static HRESULT WINAPI IDirect3DViewport2_GetBackgroundDepth(LPDIRECT3DVIEWPORT2 this, | 
 | 							    LPDIRECTDRAWSURFACE* lplpDDSurface, | 
 | 							    LPBOOL lpValid) | 
 | { | 
 |   FIXME(ddraw, "(%p)->(%p,%p): stub\n", this, lplpDDSurface, lpValid); | 
 |    | 
 |   return DD_OK; | 
 | } | 
 |  | 
 | static HRESULT WINAPI IDirect3DViewport2_Clear(LPDIRECT3DVIEWPORT2 this, | 
 | 					       DWORD dwCount, | 
 | 					       LPD3DRECT lpRects, | 
 | 					       DWORD dwFlags) | 
 | { | 
 |   GLboolean ztest; | 
 |   FIXME(ddraw, "(%p)->(%8ld,%p,%08lx): stub\n", this, dwCount, lpRects, dwFlags); | 
 |  | 
 |   /* For the moment, ignore the rectangles */ | 
 |   if (this->device.active_device1 != NULL) { | 
 |     /* Get the rendering context */ | 
 |     if (this->use_d3d2) | 
 |       this->device.active_device2->set_context(this->device.active_device2); | 
 |     else | 
 |       this->device.active_device1->set_context(this->device.active_device1); | 
 |   } | 
 |  | 
 |     /* Clears the screen */ | 
 |     glGetBooleanv(GL_DEPTH_TEST, &ztest); | 
 |     glDepthMask(GL_TRUE); /* Enables Z writing to be sure to delete also the Z buffer */ | 
 |     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); | 
 |     glDepthMask(ztest); | 
 |    | 
 |   return DD_OK; | 
 | } | 
 |  | 
 | static HRESULT WINAPI IDirect3DViewport2_AddLight(LPDIRECT3DVIEWPORT2 this, | 
 | 						  LPDIRECT3DLIGHT lpLight) | 
 | { | 
 |   FIXME(ddraw, "(%p)->(%p): stub\n", this, lpLight); | 
 |  | 
 |   /* Add the light in the 'linked' chain */ | 
 |   lpLight->next = this->lights; | 
 |   this->lights = lpLight; | 
 |  | 
 |   /* If active, activate the light */ | 
 |   if (this->device.active_device1 != NULL) { | 
 |     /* Get the rendering context */ | 
 |     if (this->use_d3d2) | 
 |       this->device.active_device2->set_context(this->device.active_device2); | 
 |     else | 
 |       this->device.active_device1->set_context(this->device.active_device1); | 
 |      | 
 |     /* Activate the light */ | 
 |     lpLight->light_num = this->nextlight++; | 
 |     lpLight->activate(lpLight); | 
 |   } | 
 |    | 
 |   return DD_OK; | 
 | } | 
 |  | 
 | static HRESULT WINAPI IDirect3DViewport2_DeleteLight(LPDIRECT3DVIEWPORT2 this, | 
 | 						     LPDIRECT3DLIGHT lpLight) | 
 | { | 
 |   FIXME(ddraw, "(%p)->(%p): stub\n", this, lpLight); | 
 |    | 
 |   return DD_OK; | 
 | } | 
 |  | 
 | static HRESULT WINAPI IDirect3DViewport2_NextLight(LPDIRECT3DVIEWPORT2 this, | 
 | 						   LPDIRECT3DLIGHT lpLight, | 
 | 						   LPDIRECT3DLIGHT* lplpLight, | 
 | 						   DWORD dwFlags) | 
 | { | 
 |   FIXME(ddraw, "(%p)->(%p,%p,%08lx): stub\n", this, lpLight, lplpLight, dwFlags); | 
 |    | 
 |   return DD_OK; | 
 | } | 
 |  | 
 | /*** IDirect3DViewport2 methods ***/ | 
 | static HRESULT WINAPI IDirect3DViewport2_GetViewport2(LPDIRECT3DVIEWPORT2 this, | 
 | 						      LPD3DVIEWPORT2 lpViewport2) | 
 | { | 
 |   TRACE(ddraw, "(%p)->(%p)\n", this, lpViewport2); | 
 |  | 
 |   if (this->use_vp2 != 1) | 
 |     return DDERR_INVALIDPARAMS; | 
 |  | 
 |   *lpViewport2 = this->viewport.vp2; | 
 |    | 
 |   return DD_OK; | 
 | } | 
 |  | 
 | static HRESULT WINAPI IDirect3DViewport2_SetViewport2(LPDIRECT3DVIEWPORT2 this, | 
 | 						      LPD3DVIEWPORT2 lpViewport2) | 
 | { | 
 |   TRACE(ddraw, "(%p)->(%p)\n", this, lpViewport2); | 
 |  | 
 |   TRACE(ddraw, "dwSize = %ld   dwX = %ld   dwY = %ld\n", | 
 | 	lpViewport2->dwSize, lpViewport2->dwX, lpViewport2->dwY); | 
 |   TRACE(ddraw, "dwWidth = %ld   dwHeight = %ld\n", | 
 | 	lpViewport2->dwWidth, lpViewport2->dwHeight); | 
 |   TRACE(ddraw, "dvClipX = %f   dvClipY = %f\n", | 
 | 	lpViewport2->dvClipX, lpViewport2->dvClipY); | 
 |   TRACE(ddraw, "dvClipWidth = %f   dvClipHeight = %f\n", | 
 | 	lpViewport2->dvClipWidth, lpViewport2->dvClipHeight); | 
 |   TRACE(ddraw, "dvMinZ = %f   dvMaxZ = %f\n", | 
 | 	lpViewport2->dvMinZ, lpViewport2->dvMaxZ); | 
 |  | 
 |   this->viewport.vp2 = *lpViewport2; | 
 |   this->use_vp2 = 1; | 
 |    | 
 |   return DD_OK; | 
 | } | 
 |  | 
 |  | 
 | /******************************************************************************* | 
 |  *				IDirect3DViewport1/2 VTable | 
 |  */ | 
 | static IDirect3DViewport2_VTable viewport2_vtable = { | 
 |   /*** IUnknown methods ***/ | 
 |   IDirect3DViewport2_QueryInterface, | 
 |   IDirect3DViewport2_AddRef, | 
 |   IDirect3DViewport2_Release, | 
 |   /*** IDirect3DViewport methods ***/ | 
 |   IDirect3DViewport2_Initialize, | 
 |   IDirect3DViewport2_GetViewport, | 
 |   IDirect3DViewport2_SetViewport, | 
 |   IDirect3DViewport2_TransformVertices, | 
 |   IDirect3DViewport2_LightElements, | 
 |   IDirect3DViewport2_SetBackground, | 
 |   IDirect3DViewport2_GetBackground, | 
 |   IDirect3DViewport2_SetBackgroundDepth, | 
 |   IDirect3DViewport2_GetBackgroundDepth, | 
 |   IDirect3DViewport2_Clear, | 
 |   IDirect3DViewport2_AddLight, | 
 |   IDirect3DViewport2_DeleteLight, | 
 |   IDirect3DViewport2_NextLight, | 
 |   /*** IDirect3DViewport2 methods ***/ | 
 |   IDirect3DViewport2_GetViewport2, | 
 |   IDirect3DViewport2_SetViewport2 | 
 | }; | 
 |  | 
 | #else /* HAVE_MESAGL */ | 
 |  | 
 | LPDIRECT3DVIEWPORT d3dviewport_create(LPDIRECT3D d3d) { | 
 |   ERR(ddraw, "Should not be called...\n"); | 
 |   return NULL; | 
 | } | 
 |  | 
 | LPDIRECT3DVIEWPORT2 d3dviewport2_create(LPDIRECT3D2 d3d) { | 
 |   ERR(ddraw, "Should not be called...\n"); | 
 |   return NULL; | 
 | } | 
 |  | 
 | #endif /* HAVE_MESAGL */ |