/***************************************************************************** * IDirect3DViewport3::DeleteLight * * Deletes a light from the viewports' light list * * Params: * lpDirect3DLight: Light to delete * * Returns: * D3D_OK on success * DDERR_INVALIDPARAMS if the light wasn't found * *****************************************************************************/ static HRESULT WINAPI IDirect3DViewportImpl_DeleteLight(IDirect3DViewport3 *iface, IDirect3DLight *lpDirect3DLight) { IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface; IDirect3DLightImpl *lpDirect3DLightImpl = (IDirect3DLightImpl *)lpDirect3DLight; IDirect3DLightImpl *cur_light, *prev_light = NULL; TRACE("iface %p, light %p.\n", iface, lpDirect3DLight); EnterCriticalSection(&ddraw_cs); cur_light = This->lights; while (cur_light != NULL) { if (cur_light == lpDirect3DLightImpl) { light_deactivate(lpDirect3DLightImpl); if (!prev_light) This->lights = cur_light->next; else prev_light->next = cur_light->next; /* Detach the light from the viewport. */ cur_light->active_viewport = NULL; IDirect3DLight_Release((IDirect3DLight *)cur_light); --This->num_lights; This->map_lights &= ~(1 << lpDirect3DLightImpl->dwLightIndex); LeaveCriticalSection(&ddraw_cs); return D3D_OK; } prev_light = cur_light; cur_light = cur_light->next; } LeaveCriticalSection(&ddraw_cs); return DDERR_INVALIDPARAMS; }
static HRESULT WINAPI d3d_light_SetLight(IDirect3DLight *iface, D3DLIGHT *data) { struct d3d_light *light = impl_from_IDirect3DLight(iface); DWORD flags = data->dwSize >= sizeof(D3DLIGHT2) ? ((D3DLIGHT2 *)data)->dwFlags : D3DLIGHT_ACTIVE; D3DLIGHT7 *light7 = &light->light7; TRACE("iface %p, data %p.\n", iface, data); if ((!data->dltType) || (data->dltType > D3DLIGHT_PARALLELPOINT)) return DDERR_INVALIDPARAMS; if (data->dltType == D3DLIGHT_PARALLELPOINT) FIXME("D3DLIGHT_PARALLELPOINT not implemented.\n"); /* Translate D3DLIGHT2 structure to D3DLIGHT7. */ light7->dltType = data->dltType; light7->dcvDiffuse = data->dcvColor; if (!(flags & D3DLIGHT_NO_SPECULAR)) light7->dcvSpecular = data->dcvColor; else light7->dcvSpecular = *(const D3DCOLORVALUE *)zero_value; light7->dcvAmbient = data->dcvColor; light7->dvPosition = data->dvPosition; light7->dvDirection = data->dvDirection; light7->dvRange = data->dvRange; light7->dvFalloff = data->dvFalloff; light7->dvAttenuation0 = data->dvAttenuation0; light7->dvAttenuation1 = data->dvAttenuation1; light7->dvAttenuation2 = data->dvAttenuation2; light7->dvTheta = data->dvTheta; light7->dvPhi = data->dvPhi; wined3d_mutex_lock(); memcpy(&light->light, data, sizeof(D3DLIGHT)); if (!(light->light.dwFlags & D3DLIGHT_ACTIVE) && flags & D3DLIGHT_ACTIVE) light_activate(light); else if (light->light.dwFlags & D3DLIGHT_ACTIVE && !(flags & D3DLIGHT_ACTIVE)) light_deactivate(light); else if (flags & D3DLIGHT_ACTIVE) light_update(light); light->light.dwFlags = flags; wined3d_mutex_unlock(); return D3D_OK; }