421 lines
12 KiB
C
421 lines
12 KiB
C
/* Direct3D Viewport
|
|
* Copyright (c) 1998 Lionel ULMER
|
|
*
|
|
* This file contains the implementation of Direct3DViewport2.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
|
|
#include "config.h"
|
|
#include "windef.h"
|
|
#include "winerror.h"
|
|
#include "wine/obj_base.h"
|
|
#include "ddraw.h"
|
|
#include "d3d.h"
|
|
#include "wine/debug.h"
|
|
|
|
#include "d3d_private.h"
|
|
#include "mesa_private.h"
|
|
|
|
WINE_DEFAULT_DEBUG_CHANNEL(ddraw);
|
|
|
|
#ifdef HAVE_OPENGL
|
|
|
|
#define D3DVPRIVATE(x) mesa_d3dv_private*dvpriv=((mesa_d3dv_private*)x->private)
|
|
#define D3DLPRIVATE(x) mesa_d3dl_private*dlpriv=((mesa_d3dl_private*)x->private)
|
|
|
|
static ICOM_VTABLE(IDirect3DViewport2) viewport2_vtable;
|
|
|
|
/*******************************************************************************
|
|
* Viewport1/2 static functions
|
|
*/
|
|
static void activate(IDirect3DViewport2Impl* This) {
|
|
IDirect3DLightImpl* 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(IDirect3D2Impl* d3d2)
|
|
{
|
|
IDirect3DViewport2Impl* vp;
|
|
|
|
vp = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirect3DViewport2Impl));
|
|
vp->private = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(mesa_d3dv_private));
|
|
vp->ref = 1;
|
|
ICOM_VTBL(vp) = &viewport2_vtable;
|
|
vp->d3d.d3d2 = d3d2;
|
|
vp->use_d3d2 = 1;
|
|
|
|
vp->device.active_device2 = NULL;
|
|
vp->activate = activate;
|
|
|
|
vp->lights = NULL;
|
|
|
|
((mesa_d3dv_private *) vp->private)->nextlight = GL_LIGHT0;
|
|
|
|
return (LPDIRECT3DVIEWPORT2)vp;
|
|
}
|
|
|
|
LPDIRECT3DVIEWPORT d3dviewport_create(IDirect3DImpl* d3d1)
|
|
{
|
|
IDirect3DViewport2Impl* vp;
|
|
|
|
vp = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirect3DViewport2Impl));
|
|
vp->private = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(mesa_d3dv_private));
|
|
vp->ref = 1;
|
|
ICOM_VTBL(vp) = &viewport2_vtable;
|
|
vp->d3d.d3d1 = d3d1;
|
|
vp->use_d3d2 = 0;
|
|
|
|
vp->device.active_device1 = NULL;
|
|
vp->activate = activate;
|
|
|
|
vp->lights = NULL;
|
|
|
|
((mesa_d3dv_private *) vp->private)->nextlight = GL_LIGHT0;
|
|
|
|
return (LPDIRECT3DVIEWPORT) vp;
|
|
}
|
|
|
|
/*******************************************************************************
|
|
* IDirect3DViewport2 methods
|
|
*/
|
|
|
|
HRESULT WINAPI IDirect3DViewport2Impl_QueryInterface(LPDIRECT3DVIEWPORT2 iface,
|
|
REFIID riid,
|
|
LPVOID* ppvObj)
|
|
{
|
|
ICOM_THIS(IDirect3DViewport2Impl,iface);
|
|
|
|
FIXME("(%p)->(%s,%p): stub\n", This, debugstr_guid(riid),ppvObj);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
|
|
ULONG WINAPI IDirect3DViewport2Impl_AddRef(LPDIRECT3DVIEWPORT2 iface)
|
|
{
|
|
ICOM_THIS(IDirect3DViewport2Impl,iface);
|
|
TRACE("(%p)->()incrementing from %lu.\n", This, This->ref );
|
|
|
|
return ++(This->ref);
|
|
}
|
|
|
|
|
|
|
|
ULONG WINAPI IDirect3DViewport2Impl_Release(LPDIRECT3DVIEWPORT2 iface)
|
|
{
|
|
ICOM_THIS(IDirect3DViewport2Impl,iface);
|
|
FIXME("(%p)->() decrementing from %lu.\n", This, This->ref );
|
|
|
|
if (!--(This->ref)) {
|
|
HeapFree(GetProcessHeap(),0,This->private);
|
|
HeapFree(GetProcessHeap(),0,This);
|
|
return 0;
|
|
}
|
|
|
|
return This->ref;
|
|
}
|
|
|
|
/*** IDirect3DViewport methods ***/
|
|
HRESULT WINAPI IDirect3DViewport2Impl_Initialize(LPDIRECT3DVIEWPORT2 iface,
|
|
LPDIRECT3D d3d)
|
|
{
|
|
ICOM_THIS(IDirect3DViewport2Impl,iface);
|
|
FIXME("(%p)->(%p): stub\n", This, d3d);
|
|
|
|
return DD_OK;
|
|
}
|
|
|
|
HRESULT WINAPI IDirect3DViewport2Impl_GetViewport(LPDIRECT3DVIEWPORT2 iface,
|
|
LPD3DVIEWPORT lpvp)
|
|
{
|
|
ICOM_THIS(IDirect3DViewport2Impl,iface);
|
|
FIXME("(%p)->(%p): stub\n", This, lpvp);
|
|
|
|
if (This->use_vp2 != 0)
|
|
return DDERR_INVALIDPARAMS;
|
|
|
|
*lpvp = This->viewport.vp1;
|
|
|
|
return DD_OK;
|
|
}
|
|
|
|
HRESULT WINAPI IDirect3DViewport2Impl_SetViewport(LPDIRECT3DVIEWPORT2 iface,
|
|
LPD3DVIEWPORT lpvp)
|
|
{
|
|
ICOM_THIS(IDirect3DViewport2Impl,iface);
|
|
FIXME("(%p)->(%p): stub\n", This, lpvp);
|
|
|
|
This->use_vp2 = 0;
|
|
This->viewport.vp1 = *lpvp;
|
|
|
|
TRACE("dwSize = %ld dwX = %ld dwY = %ld\n",
|
|
lpvp->dwSize, lpvp->dwX, lpvp->dwY);
|
|
TRACE("dwWidth = %ld dwHeight = %ld\n",
|
|
lpvp->dwWidth, lpvp->dwHeight);
|
|
TRACE("dvScaleX = %f dvScaleY = %f\n",
|
|
lpvp->dvScaleX, lpvp->dvScaleY);
|
|
TRACE("dvMaxX = %f dvMaxY = %f\n",
|
|
lpvp->dvMaxX, lpvp->dvMaxY);
|
|
TRACE("dvMinZ = %f dvMaxZ = %f\n",
|
|
lpvp->dvMinZ, lpvp->dvMaxZ);
|
|
|
|
|
|
return DD_OK;
|
|
}
|
|
|
|
HRESULT WINAPI IDirect3DViewport2Impl_TransformVertices(LPDIRECT3DVIEWPORT2 iface,
|
|
DWORD dwVertexCount,
|
|
LPD3DTRANSFORMDATA lpData,
|
|
DWORD dwFlags,
|
|
LPDWORD lpOffScreen)
|
|
{
|
|
ICOM_THIS(IDirect3DViewport2Impl,iface);
|
|
FIXME("(%p)->(%8ld,%p,%08lx,%p): stub\n",
|
|
This, dwVertexCount, lpData, dwFlags, lpOffScreen);
|
|
|
|
return DD_OK;
|
|
}
|
|
|
|
HRESULT WINAPI IDirect3DViewport2Impl_LightElements(LPDIRECT3DVIEWPORT2 iface,
|
|
DWORD dwElementCount,
|
|
LPD3DLIGHTDATA lpData)
|
|
{
|
|
ICOM_THIS(IDirect3DViewport2Impl,iface);
|
|
FIXME("(%p)->(%8ld,%p): stub\n", This, dwElementCount, lpData);
|
|
|
|
return DD_OK;
|
|
}
|
|
|
|
HRESULT WINAPI IDirect3DViewport2Impl_SetBackground(LPDIRECT3DVIEWPORT2 iface,
|
|
D3DMATERIALHANDLE hMat)
|
|
{
|
|
ICOM_THIS(IDirect3DViewport2Impl,iface);
|
|
FIXME("(%p)->(%08lx): stub\n", This, (DWORD) hMat);
|
|
|
|
return DD_OK;
|
|
}
|
|
|
|
HRESULT WINAPI IDirect3DViewport2Impl_GetBackground(LPDIRECT3DVIEWPORT2 iface,
|
|
LPD3DMATERIALHANDLE lphMat,
|
|
LPBOOL lpValid)
|
|
{
|
|
ICOM_THIS(IDirect3DViewport2Impl,iface);
|
|
FIXME("(%p)->(%p,%p): stub\n", This, lphMat, lpValid);
|
|
|
|
return DD_OK;
|
|
}
|
|
|
|
HRESULT WINAPI IDirect3DViewport2Impl_SetBackgroundDepth(LPDIRECT3DVIEWPORT2 iface,
|
|
LPDIRECTDRAWSURFACE lpDDSurface)
|
|
{
|
|
ICOM_THIS(IDirect3DViewport2Impl,iface);
|
|
FIXME("(%p)->(%p): stub\n", This, lpDDSurface);
|
|
|
|
return DD_OK;
|
|
}
|
|
|
|
HRESULT WINAPI IDirect3DViewport2Impl_GetBackgroundDepth(LPDIRECT3DVIEWPORT2 iface,
|
|
LPDIRECTDRAWSURFACE* lplpDDSurface,
|
|
LPBOOL lpValid)
|
|
{
|
|
ICOM_THIS(IDirect3DViewport2Impl,iface);
|
|
FIXME("(%p)->(%p,%p): stub\n", This, lplpDDSurface, lpValid);
|
|
|
|
return DD_OK;
|
|
}
|
|
|
|
HRESULT WINAPI IDirect3DViewport2Impl_Clear(LPDIRECT3DVIEWPORT2 iface,
|
|
DWORD dwCount,
|
|
LPD3DRECT lpRects,
|
|
DWORD dwFlags)
|
|
{
|
|
ICOM_THIS(IDirect3DViewport2Impl,iface);
|
|
GLboolean ztest;
|
|
FIXME("(%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 */
|
|
ENTER_GL();
|
|
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);
|
|
LEAVE_GL();
|
|
|
|
return DD_OK;
|
|
}
|
|
|
|
HRESULT WINAPI IDirect3DViewport2Impl_AddLight(LPDIRECT3DVIEWPORT2 iface,
|
|
LPDIRECT3DLIGHT lpLight)
|
|
{
|
|
ICOM_THIS(IDirect3DViewport2Impl,iface);
|
|
IDirect3DLightImpl* ilpLight=(IDirect3DLightImpl*)lpLight;
|
|
FIXME("(%p)->(%p): stub\n", This, ilpLight);
|
|
|
|
/* Add the light in the 'linked' chain */
|
|
ilpLight->next = This->lights;
|
|
This->lights = ilpLight;
|
|
|
|
/* If active, activate the light */
|
|
if (This->device.active_device1 != NULL) {
|
|
D3DVPRIVATE(This);
|
|
D3DLPRIVATE(ilpLight);
|
|
|
|
/* 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 */
|
|
dlpriv->light_num = dvpriv->nextlight++;
|
|
ilpLight->activate(ilpLight);
|
|
}
|
|
|
|
return DD_OK;
|
|
}
|
|
|
|
HRESULT WINAPI IDirect3DViewport2Impl_DeleteLight(LPDIRECT3DVIEWPORT2 iface,
|
|
LPDIRECT3DLIGHT lpLight)
|
|
{
|
|
ICOM_THIS(IDirect3DViewport2Impl,iface);
|
|
IDirect3DLightImpl** currentlplpLight;
|
|
TRACE("(%p)->(%p): stub\n", This, lpLight);
|
|
|
|
currentlplpLight = &(This->lights);
|
|
while(*currentlplpLight) {
|
|
if (*currentlplpLight == (IDirect3DLightImpl*)lpLight) {
|
|
*currentlplpLight = (*currentlplpLight)->next;
|
|
return DD_OK;
|
|
}
|
|
currentlplpLight = &((*currentlplpLight)->next);
|
|
}
|
|
|
|
return DDERR_INVALIDOBJECT;
|
|
}
|
|
|
|
HRESULT WINAPI IDirect3DViewport2Impl_NextLight(LPDIRECT3DVIEWPORT2 iface,
|
|
LPDIRECT3DLIGHT lpLight,
|
|
LPDIRECT3DLIGHT* lplpLight,
|
|
DWORD dwFlags)
|
|
{
|
|
ICOM_THIS(IDirect3DViewport2Impl,iface);
|
|
FIXME("(%p)->(%p,%p,%08lx): stub\n", This, lpLight, lplpLight, dwFlags);
|
|
|
|
return DD_OK;
|
|
}
|
|
|
|
/*** IDirect3DViewport2 methods ***/
|
|
HRESULT WINAPI IDirect3DViewport2Impl_GetViewport2(LPDIRECT3DVIEWPORT2 iface,
|
|
LPD3DVIEWPORT2 lpViewport2)
|
|
{
|
|
ICOM_THIS(IDirect3DViewport2Impl,iface);
|
|
TRACE("(%p)->(%p)\n", This, lpViewport2);
|
|
|
|
if (This->use_vp2 != 1)
|
|
return DDERR_INVALIDPARAMS;
|
|
|
|
*lpViewport2 = This->viewport.vp2;
|
|
|
|
return DD_OK;
|
|
}
|
|
|
|
HRESULT WINAPI IDirect3DViewport2Impl_SetViewport2(LPDIRECT3DVIEWPORT2 iface,
|
|
LPD3DVIEWPORT2 lpViewport2)
|
|
{
|
|
ICOM_THIS(IDirect3DViewport2Impl,iface);
|
|
TRACE("(%p)->(%p)\n", This, lpViewport2);
|
|
|
|
TRACE("dwSize = %ld dwX = %ld dwY = %ld\n",
|
|
lpViewport2->dwSize, lpViewport2->dwX, lpViewport2->dwY);
|
|
TRACE("dwWidth = %ld dwHeight = %ld\n",
|
|
lpViewport2->dwWidth, lpViewport2->dwHeight);
|
|
TRACE("dvClipX = %f dvClipY = %f\n",
|
|
lpViewport2->dvClipX, lpViewport2->dvClipY);
|
|
TRACE("dvClipWidth = %f dvClipHeight = %f\n",
|
|
lpViewport2->dvClipWidth, lpViewport2->dvClipHeight);
|
|
TRACE("dvMinZ = %f dvMaxZ = %f\n",
|
|
lpViewport2->dvMinZ, lpViewport2->dvMaxZ);
|
|
|
|
This->viewport.vp2 = *lpViewport2;
|
|
This->use_vp2 = 1;
|
|
|
|
return DD_OK;
|
|
}
|
|
|
|
|
|
/*******************************************************************************
|
|
* IDirect3DViewport1/2 VTable
|
|
*/
|
|
static ICOM_VTABLE(IDirect3DViewport2) viewport2_vtable =
|
|
{
|
|
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
|
/*** IUnknown methods ***/
|
|
IDirect3DViewport2Impl_QueryInterface,
|
|
IDirect3DViewport2Impl_AddRef,
|
|
IDirect3DViewport2Impl_Release,
|
|
/*** IDirect3DViewport methods ***/
|
|
IDirect3DViewport2Impl_Initialize,
|
|
IDirect3DViewport2Impl_GetViewport,
|
|
IDirect3DViewport2Impl_SetViewport,
|
|
IDirect3DViewport2Impl_TransformVertices,
|
|
IDirect3DViewport2Impl_LightElements,
|
|
IDirect3DViewport2Impl_SetBackground,
|
|
IDirect3DViewport2Impl_GetBackground,
|
|
IDirect3DViewport2Impl_SetBackgroundDepth,
|
|
IDirect3DViewport2Impl_GetBackgroundDepth,
|
|
IDirect3DViewport2Impl_Clear,
|
|
IDirect3DViewport2Impl_AddLight,
|
|
IDirect3DViewport2Impl_DeleteLight,
|
|
IDirect3DViewport2Impl_NextLight,
|
|
/*** IDirect3DViewport2 methods ***/
|
|
IDirect3DViewport2Impl_GetViewport2,
|
|
IDirect3DViewport2Impl_SetViewport2
|
|
};
|
|
|
|
#else /* HAVE_OPENGL */
|
|
|
|
LPDIRECT3DVIEWPORT d3dviewport_create(IDirect3DImpl* d3d1) {
|
|
ERR("Should not be called...\n");
|
|
return NULL;
|
|
}
|
|
|
|
LPDIRECT3DVIEWPORT2 d3dviewport2_create(IDirect3D2Impl* d3d2) {
|
|
ERR("Should not be called...\n");
|
|
return NULL;
|
|
}
|
|
|
|
#endif /* HAVE_OPENGL */
|