示例#1
0
文件: viewport.c 项目: mikekap/wine
/*****************************************************************************
 * 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;
}
示例#2
0
文件: light.c 项目: VOID001/wine-void
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;
}