diff --git a/dlls/ddraw/tests/ddraw2.c b/dlls/ddraw/tests/ddraw2.c index f81be7f3ff033d859a497766bcb573d716050b92..9d77521a4774991006e7d0d4f753d940e2fd4799 100644 --- a/dlls/ddraw/tests/ddraw2.c +++ b/dlls/ddraw/tests/ddraw2.c @@ -7101,6 +7101,17 @@ static void test_specular_lighting(void) 100.0f, 0.0f, 1.0f, 0.0f, 0.0f, + }, + point_far = + { + sizeof(D3DLIGHT2), + D3DLIGHT_POINT, + {{1.0f}, {1.0f}, {1.0f}, {0.0f}}, + {{0.0f}, {0.0f}, {0.1f}}, + {{0.0f}, {0.0f}, {0.0f}}, + 1.0f, + 0.0f, + 1.0f, 0.0f, 0.0f, }; static const struct expected_color { @@ -7166,6 +7177,18 @@ static void test_specular_lighting(void) {160, 360, 0x00000000}, {320, 360, 0x00000000}, {480, 360, 0x00000000}, + }, + expected_point_far[] = + { + {160, 120, 0x00000000}, + {320, 120, 0x00000000}, + {480, 120, 0x00000000}, + {160, 240, 0x00000000}, + {320, 240, 0x00ffffff}, + {480, 240, 0x00000000}, + {160, 360, 0x00000000}, + {320, 360, 0x00000000}, + {480, 360, 0x00000000}, }; static const struct { @@ -7186,6 +7209,8 @@ static void test_specular_lighting(void) sizeof(expected_parallelpoint) / sizeof(expected_parallelpoint[0])}, {&point_side, 0.0f, expected_point_side, sizeof(expected_point_side) / sizeof(expected_point_side[0])}, + {&point_far, 1.0f, expected_point_far, + sizeof(expected_point_far) / sizeof(expected_point_far[0])}, }; IDirect3D2 *d3d; IDirect3DDevice2 *device; diff --git a/dlls/ddraw/tests/ddraw4.c b/dlls/ddraw/tests/ddraw4.c index 47b94f7b4fcc36959f0f3b12252f48abd61a8d6d..b401544c2a8fa4b260d060b706edb64cf910e4a0 100644 --- a/dlls/ddraw/tests/ddraw4.c +++ b/dlls/ddraw/tests/ddraw4.c @@ -4156,6 +4156,17 @@ static void test_specular_lighting(void) 100.0f, 0.0f, 1.0f, 0.0f, 0.0f, + }, + point_far = + { + sizeof(D3DLIGHT2), + D3DLIGHT_POINT, + {{1.0f}, {1.0f}, {1.0f}, {0.0f}}, + {{0.0f}, {0.0f}, {0.1f}}, + {{0.0f}, {0.0f}, {0.0f}}, + 1.0f, + 0.0f, + 1.0f, 0.0f, 0.0f, }; static const struct expected_color { @@ -4221,6 +4232,18 @@ static void test_specular_lighting(void) {160, 360, 0x00000000}, {320, 360, 0x00000000}, {480, 360, 0x00000000}, + }, + expected_point_far[] = + { + {160, 120, 0x00000000}, + {320, 120, 0x00000000}, + {480, 120, 0x00000000}, + {160, 240, 0x00000000}, + {320, 240, 0x00ffffff}, + {480, 240, 0x00000000}, + {160, 360, 0x00000000}, + {320, 360, 0x00000000}, + {480, 360, 0x00000000}, }; static const struct { @@ -4246,6 +4269,8 @@ static void test_specular_lighting(void) sizeof(expected_parallelpoint) / sizeof(expected_parallelpoint[0])}, {&point_side, TRUE, 0.0f, expected_point_side, sizeof(expected_point_side) / sizeof(expected_point_side[0])}, + {&point_far, TRUE, 1.0f, expected_point_far, + sizeof(expected_point_far) / sizeof(expected_point_far[0])}, }; IDirect3D3 *d3d; IDirect3DDevice3 *device; diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index dfbe46d7bb3718f6303e4ea8d720de10e42c2f44..166a4ae44fe63671a7e31d002a952b681be0dc1a 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -7720,6 +7720,7 @@ static void shader_glsl_ffp_vertex_lighting(struct wined3d_string_buffer *buffer { shader_addline(buffer, "dst.y = (ffp_light[%u].range - dst.y) / ffp_light[%u].range;\n", idx, idx); shader_addline(buffer, "dst.z = dst.y * dst.y;\n"); + shader_addline(buffer, "if (dst.y > 0.0)\n{\n"); } else { @@ -7732,14 +7733,12 @@ static void shader_glsl_ffp_vertex_lighting(struct wined3d_string_buffer *buffer shader_addline(buffer, "ambient += ffp_light[%u].ambient.xyz * att;\n", idx); if (!settings->normal) { - if (!legacy_lighting) - shader_addline(buffer, "}\n"); + shader_addline(buffer, "}\n"); continue; } shader_addline(buffer, "dir = normalize(dir);\n"); shader_glsl_ffp_vertex_lighting_footer(buffer, settings, i); - if (!legacy_lighting) - shader_addline(buffer, "}\n"); + shader_addline(buffer, "}\n"); } for (i = 0; i < settings->spot_light_count; ++i, ++idx) @@ -7752,6 +7751,7 @@ static void shader_glsl_ffp_vertex_lighting(struct wined3d_string_buffer *buffer { shader_addline(buffer, "dst.y = (ffp_light[%u].range - dst.y) / ffp_light[%u].range;\n", idx, idx); shader_addline(buffer, "dst.z = dst.y * dst.y;\n"); + shader_addline(buffer, "if (dst.y > 0.0)\n{\n"); } else { @@ -7775,13 +7775,11 @@ static void shader_glsl_ffp_vertex_lighting(struct wined3d_string_buffer *buffer shader_addline(buffer, "ambient += ffp_light[%u].ambient.xyz * att;\n", idx); if (!settings->normal) { - if (!legacy_lighting) - shader_addline(buffer, "}\n"); + shader_addline(buffer, "}\n"); continue; } shader_glsl_ffp_vertex_lighting_footer(buffer, settings, i); - if (!legacy_lighting) - shader_addline(buffer, "}\n"); + shader_addline(buffer, "}\n"); } for (i = 0; i < settings->directional_light_count; ++i, ++idx)