Module: wine Branch: master Commit: 540130bfa9c0e53fa3c58a8f263fabbdc44f0534 URL: http://source.winehq.org/git/wine.git/?a=commit;h=540130bfa9c0e53fa3c58a8f26...
Author: Matteo Bruni mbruni@codeweavers.com Date: Mon Apr 27 17:39:10 2015 +0200
wined3d: Store the directional light direction in the lightDirn field.
It's only an implementation detail that the direction needs to be passed to the fixed function GL pipeline as GL_POSITION.
---
dlls/wined3d/device.c | 8 ++++---- dlls/wined3d/glsl_shader.c | 5 ++++- dlls/wined3d/state.c | 7 +++++-- 3 files changed, 13 insertions(+), 7 deletions(-)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index 8572378..0ae29c7 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -1531,10 +1531,10 @@ HRESULT CDECL wined3d_device_set_light(struct wined3d_device *device,
case WINED3D_LIGHT_DIRECTIONAL: /* Direction */ - object->lightPosn[0] = -light->direction.x; - object->lightPosn[1] = -light->direction.y; - object->lightPosn[2] = -light->direction.z; - object->lightPosn[3] = 0.0f; + object->lightDirn[0] = -light->direction.x; + object->lightDirn[1] = -light->direction.y; + object->lightDirn[2] = -light->direction.z; + object->lightDirn[3] = 0.0f; object->exponent = 0.0f; object->cutoff = 180.0f; break; diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index 851fc28..e49aff7 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -7529,7 +7529,10 @@ static void glsl_vertex_pipe_view(struct wined3d_context *context, const struct { if (!(light = state->lights[k])) continue; - gl_info->gl_ops.gl.p_glLightfv(GL_LIGHT0 + light->glIndex, GL_POSITION, light->lightPosn); + if (light->OriginalParms.type == WINED3D_LIGHT_DIRECTIONAL) + gl_info->gl_ops.gl.p_glLightfv(GL_LIGHT0 + light->glIndex, GL_POSITION, light->lightDirn); + else + gl_info->gl_ops.gl.p_glLightfv(GL_LIGHT0 + light->glIndex, GL_POSITION, light->lightPosn); checkGLcall("glLightfv posn"); gl_info->gl_ops.gl.p_glLightfv(GL_LIGHT0 + light->glIndex, GL_SPOT_DIRECTION, light->lightDirn); checkGLcall("glLightfv dirn"); diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c index c938771..92c8547 100644 --- a/dlls/wined3d/state.c +++ b/dlls/wined3d/state.c @@ -3973,7 +3973,10 @@ static void transform_view(struct wined3d_context *context, const struct wined3d { if (!(light = state->lights[k])) continue; - gl_info->gl_ops.gl.p_glLightfv(GL_LIGHT0 + light->glIndex, GL_POSITION, light->lightPosn); + if (light->OriginalParms.type == WINED3D_LIGHT_DIRECTIONAL) + gl_info->gl_ops.gl.p_glLightfv(GL_LIGHT0 + light->glIndex, GL_POSITION, light->lightDirn); + else + gl_info->gl_ops.gl.p_glLightfv(GL_LIGHT0 + light->glIndex, GL_POSITION, light->lightPosn); checkGLcall("glLightfv posn"); gl_info->gl_ops.gl.p_glLightfv(GL_LIGHT0 + light->glIndex, GL_SPOT_DIRECTION, light->lightDirn); checkGLcall("glLightfv dirn"); @@ -4800,7 +4803,7 @@ void light(struct wined3d_context *context, const struct wined3d_state *state, D case WINED3D_LIGHT_DIRECTIONAL: /* Direction */ /* Note GL uses w position of 0 for direction! */ - gl_info->gl_ops.gl.p_glLightfv(GL_LIGHT0 + Index, GL_POSITION, lightInfo->lightPosn); + gl_info->gl_ops.gl.p_glLightfv(GL_LIGHT0 + Index, GL_POSITION, lightInfo->lightDirn); checkGLcall("glLightfv"); gl_info->gl_ops.gl.p_glLightf(GL_LIGHT0 + Index, GL_SPOT_CUTOFF, lightInfo->cutoff); checkGLcall("glLightf");