blob: 754d410f88980a063fce6735faad1a2c4206ab9c [file] [log] [blame]
/* 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;
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)->(%08x): stub\n", this, 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)
{
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 */
glDepthMask(GL_TRUE); /* Enables Z writing to be sure to delete also the Z buffer */
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}
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 */