From 6d9630f397cf06939ee5035b07b49f6ebc0d5c30 Mon Sep 17 00:00:00 2001 From: Christian Costa Date: Mon, 20 Jan 2003 23:24:05 +0000 Subject: [PATCH] Make D3D1..3 lights code rely on D3D7. --- dlls/ddraw/d3d_private.h | 8 +++++ dlls/ddraw/d3dlight.c | 75 ++++++++++++++++++---------------------- dlls/ddraw/d3dviewport.c | 23 ++++++++++++ 3 files changed, 64 insertions(+), 42 deletions(-) diff --git a/dlls/ddraw/d3d_private.h b/dlls/ddraw/d3d_private.h index 3ff4fcdf422..4cc03248c53 100644 --- a/dlls/ddraw/d3d_private.h +++ b/dlls/ddraw/d3d_private.h @@ -90,8 +90,13 @@ struct IDirect3DLightImpl DWORD ref; /* IDirect3DLight fields */ IDirect3DImpl *d3d; + /* If this light is active for one viewport, put the viewport here */ + IDirect3DViewportImpl *active_viewport; D3DLIGHT2 light; + D3DLIGHT7 light7; + + DWORD dwLightIndex; /* Chained list used for adding / removing from viewports */ IDirect3DLightImpl *next; @@ -132,6 +137,9 @@ struct IDirect3DViewportImpl /* If this viewport is active for one device, put the device here */ IDirect3DDeviceImpl *active_device; + DWORD num_lights; + DWORD map_lights; + int use_vp2; union { D3DVIEWPORT vp1; diff --git a/dlls/ddraw/d3dlight.c b/dlls/ddraw/d3dlight.c index d9cba08d0eb..c3018ad74cd 100644 --- a/dlls/ddraw/d3dlight.c +++ b/dlls/ddraw/d3dlight.c @@ -79,16 +79,46 @@ static void dump_light(LPD3DLIGHT2 light) DPRINTF(" - dwSize : %ld\n", light->dwSize); } +static const float zero_value[] = { + 0.0, 0.0, 0.0, 0.0 +}; + HRESULT WINAPI Main_IDirect3DLightImpl_1_SetLight(LPDIRECT3DLIGHT iface, LPD3DLIGHT lpLight) { ICOM_THIS_FROM(IDirect3DLightImpl, IDirect3DLight, iface); + LPD3DLIGHT7 light7 = &(This->light7); TRACE("(%p/%p)->(%p)\n", This, iface, lpLight); if (TRACE_ON(ddraw)) { TRACE(" Light definition : \n"); dump_light((LPD3DLIGHT2) lpLight); } + + if ( (lpLight->dltType == 0) || (lpLight->dltType > D3DLIGHT_PARALLELPOINT) ) + return DDERR_INVALIDPARAMS; + + if ( lpLight->dltType == D3DLIGHT_PARALLELPOINT ) + FIXME("D3DLIGHT_PARALLELPOINT no supported\n"); + + /* Translate D3DLIGH2 structure to D3DLIGHT7 */ + light7->dltType = lpLight->dltType; + light7->dcvDiffuse = lpLight->dcvColor; + if ((((LPD3DLIGHT2)lpLight)->dwFlags & D3DLIGHT_NO_SPECULAR) != 0) + light7->dcvSpecular = lpLight->dcvColor; + else + light7->dcvSpecular = *(D3DCOLORVALUE*)zero_value; + light7->dcvAmbient = lpLight->dcvColor; + light7->dvPosition = lpLight->dvPosition; + light7->dvDirection = lpLight->dvDirection; + light7->dvRange = lpLight->dvRange; + light7->dvFalloff = lpLight->dvFalloff; + light7->dvAttenuation0 = lpLight->dvAttenuation0; + light7->dvAttenuation1 = lpLight->dvAttenuation1; + light7->dvAttenuation2 = lpLight->dvAttenuation2; + light7->dvTheta = lpLight->dvTheta; + light7->dvPhi = lpLight->dvPhi; + memcpy(&This->light, lpLight, lpLight->dwSize); if ((This->light.dwFlags & D3DLIGHT_ACTIVE) != 0) { This->update(This); @@ -113,50 +143,10 @@ Main_IDirect3DLightImpl_1_GetLight(LPDIRECT3DLIGHT iface, /******************************************************************************* * Light static functions */ -static const float zero_value[] = { - 0.0, 0.0, 0.0, 0.0 -}; static void update(IDirect3DLightImpl* This) { - IDirect3DLightGLImpl *glThis = (IDirect3DLightGLImpl *) This; - ENTER_GL(); - switch (glThis->parent.light.dltType) { - case D3DLIGHT_POINT: /* 1 */ - FIXME("Activating POINT - not supported yet\n"); - break; - - case D3DLIGHT_SPOT: /* 2 */ - FIXME("Activating SPOT - not supported yet\n"); - break; - - case D3DLIGHT_DIRECTIONAL: { /* 3 */ - float direction[4]; - - if (TRACE_ON(ddraw)) { - TRACE("Activating DIRECTIONAL\n"); - DPRINTF(" - direction : "); dump_D3DVECTOR(&(glThis->parent.light.dvDirection)); DPRINTF("\n"); - DPRINTF(" - color : "); dump_D3DCOLORVALUE(&(glThis->parent.light.dcvColor)); DPRINTF("\n"); - } - glLightfv(glThis->light_num, GL_AMBIENT, (float *) zero_value); - glLightfv(glThis->light_num, GL_DIFFUSE, (float *) &(glThis->parent.light.dcvColor)); - - direction[0] = -glThis->parent.light.dvDirection.u1.x; - direction[1] = -glThis->parent.light.dvDirection.u2.y; - direction[2] = -glThis->parent.light.dvDirection.u3.z; - direction[3] = 0.0; /* This is a directional light */ - - glLightfv(glThis->light_num, GL_POSITION, (float *) direction); - } break; - - case D3DLIGHT_PARALLELPOINT: /* 4 */ - FIXME("Activating PARRALLEL-POINT - not supported yet\n"); - break; - - default: - WARN("Not a known Light Type: %d\n", glThis->parent.light.dltType); - break; - } - LEAVE_GL(); + IDirect3DDeviceImpl* device = This->active_viewport->active_device; + IDirect3DDevice7_SetLight(ICOM_INTERFACE(device,IDirect3DDevice7),This->dwLightIndex,&(This->light7)); } static void activate(IDirect3DLightImpl* This) { @@ -236,6 +226,7 @@ HRESULT d3dlight_create(IDirect3DLightImpl **obj, IDirect3DImpl *d3d, GLenum lig object->activate = activate; object->desactivate = desactivate; object->update = update; + object->active_viewport = NULL; gl_object->light_num = light_num; ICOM_INIT_INTERFACE(object, IDirect3DLight, VTABLE_IDirect3DLight); diff --git a/dlls/ddraw/d3dviewport.c b/dlls/ddraw/d3dviewport.c index a0babe0c771..1103b4bdaee 100644 --- a/dlls/ddraw/d3dviewport.c +++ b/dlls/ddraw/d3dviewport.c @@ -271,13 +271,30 @@ Main_IDirect3DViewportImpl_3_2_1_AddLight(LPDIRECT3DVIEWPORT3 iface, { ICOM_THIS_FROM(IDirect3DViewportImpl, IDirect3DViewport3, iface); IDirect3DLightImpl *lpDirect3DLightImpl = ICOM_OBJECT(IDirect3DLightImpl, IDirect3DLight, lpDirect3DLight); + DWORD i = 0; + DWORD map = This->map_lights; TRACE("(%p/%p)->(%p)\n", This, iface, lpDirect3DLight); + if (This->num_lights >= 8) + return DDERR_INVALIDPARAMS; + + /* Find a light number and update both light and viewports objects accordingly */ + while(map&1) { + map>>=1; + i++; + } + lpDirect3DLightImpl->dwLightIndex = i; + This->num_lights++; + This->map_lights |= 1<next = This->lights; This->lights = lpDirect3DLightImpl; + /* Attach the light to the viewport */ + lpDirect3DLightImpl->active_viewport = This; + /* If active, activate the light */ if (This->active_device != NULL) { lpDirect3DLightImpl->activate(lpDirect3DLightImpl); @@ -301,6 +318,10 @@ Main_IDirect3DViewportImpl_3_2_1_DeleteLight(LPDIRECT3DVIEWPORT3 iface, lpDirect3DLightImpl->desactivate(lpDirect3DLightImpl); if (prev_light == NULL) This->lights = cur_light->next; else prev_light->next = cur_light->next; + /* Detach the light to the viewport */ + cur_light->active_viewport = NULL; + This->num_lights--; + This->map_lights &= ~(1<dwLightIndex); return DD_OK; } prev_light = cur_light; @@ -450,6 +471,8 @@ HRESULT d3dviewport_create(IDirect3DViewportImpl **obj, IDirect3DImpl *d3d) object->use_vp2 = 0xFF; object->next = NULL; object->lights = NULL; + object->num_lights = 0; + object->map_lights = 0; ICOM_INIT_INTERFACE(object, IDirect3DViewport3, VTABLE_IDirect3DViewport3);