[PATCH v2 7/7] wined3d: Implement parallel point lights in process_vertices_strided().
Paul Gofman
gofmanp at gmail.com
Fri May 17 03:51:54 CDT 2019
Signed-off-by: Paul Gofman <gofmanp at gmail.com>
---
dlls/ddraw/tests/ddraw1.c | 22 ++++++++++++++++++++++
dlls/wined3d/device.c | 29 +++++++++++++++++++++++++++++
2 files changed, 51 insertions(+)
diff --git a/dlls/ddraw/tests/ddraw1.c b/dlls/ddraw/tests/ddraw1.c
index 0dfc8c48b1..7b4917bb6e 100644
--- a/dlls/ddraw/tests/ddraw1.c
+++ b/dlls/ddraw/tests/ddraw1.c
@@ -6379,6 +6379,14 @@ static void test_specular_lighting(void)
0.0f, 0.0f, 1.0f,
M_PI / 12.0f, M_PI / 3.0f
},
+ parallelpoint =
+ {
+ sizeof(D3DLIGHT2),
+ D3DLIGHT_PARALLELPOINT,
+ {{1.0f}, {1.0f}, {1.0f}, {0.0f}},
+ {{0.5f}, {0.0f}, {-1.0f}},
+ {{0.0f}, {0.0f}, {0.0f}},
+ },
point_side =
{
sizeof(D3DLIGHT2),
@@ -6442,6 +6450,18 @@ static void test_specular_lighting(void)
{320, 360, 0x00020202},
{480, 360, 0x00000000},
},
+ expected_parallelpoint[] =
+ {
+ {160, 120, 0x00050505},
+ {320, 120, 0x002c2c2c},
+ {480, 120, 0x006e6e6e},
+ {160, 240, 0x00090909},
+ {320, 240, 0x00717171},
+ {480, 240, 0x00ffffff},
+ {160, 360, 0x00050505},
+ {320, 360, 0x002c2c2c},
+ {480, 360, 0x006e6e6e},
+ },
expected_point_far[] =
{
{160, 120, 0x00000000},
@@ -6478,11 +6498,13 @@ static void test_specular_lighting(void)
{&directional, 30.0f, expected_directional_local, ARRAY_SIZE(expected_directional_local)},
{&point, 30.0f, expected_point_local, ARRAY_SIZE(expected_point_local)},
{&spot, 30.0f, expected_spot_local, ARRAY_SIZE(expected_spot_local)},
+ {¶llelpoint, 30.0f, expected_parallelpoint, ARRAY_SIZE(expected_parallelpoint)},
{&point_side, 0.0f, expected_zero, ARRAY_SIZE(expected_zero)},
{&point_far, 1.0f, expected_point_far, ARRAY_SIZE(expected_point_far)},
{&directional, 0.0f, expected_zero, ARRAY_SIZE(expected_zero)},
{&point, 0.0f, expected_zero, ARRAY_SIZE(expected_zero)},
{&spot, 0.0f, expected_zero, ARRAY_SIZE(expected_zero)},
+ {¶llelpoint, 0.0f, expected_zero, ARRAY_SIZE(expected_zero)},
{&point_far, 0.0f, expected_zero, ARRAY_SIZE(expected_zero)},
};
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 843f63e12b..c44b5003f7 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -3305,6 +3305,9 @@ static void init_transformed_lights(struct lights_settings *ls, const struct win
case WINED3D_LIGHT_SPOT:
++ls->spot_light_count;
break;
+ case WINED3D_LIGHT_PARALLELPOINT:
+ ++ls->parallel_point_light_count;
+ break;
default:
FIXME("Unhandled light type %#x.\n", light_info->OriginalParms.type);
continue;
@@ -3377,6 +3380,22 @@ static void init_transformed_lights(struct lights_settings *ls, const struct win
light->specular = light_info->OriginalParms.specular;
++index;
}
+
+ for (i = 0; i < lights_count; ++i)
+ {
+ light_info = lights[i];
+ if (light_info->OriginalParms.type != WINED3D_LIGHT_PARALLELPOINT)
+ continue;
+
+ light = &ls->lights[index];
+
+ multiply_vector_matrix(&vec4, &light_info->position, &state->transforms[WINED3D_TS_VIEW]);
+ normalize_vec3((struct wined3d_vec3 *)&light->position, (const struct wined3d_vec3 *)&vec4);
+ light->diffuse = light_info->OriginalParms.diffuse;
+ light->ambient = light_info->OriginalParms.ambient;
+ light->specular = light_info->OriginalParms.specular;
+ ++index;
+ }
}
static void update_light_diffuse_specular(struct wined3d_color *diffuse, struct wined3d_color *specular,
@@ -3534,6 +3553,16 @@ static void compute_light(struct wined3d_color *ambient, struct wined3d_color *d
update_light_diffuse_specular(diffuse, specular, &dir, att, material_shininess,
&normal_transformed, &position_transformed_normalized, light, ls);
}
+
+ for (i = 0; i < ls->parallel_point_light_count; ++i, ++index)
+ {
+ light = &ls->lights[index];
+
+ madd_color_rgb(ambient, &light->ambient, 1.0f);
+ if (normal)
+ update_light_diffuse_specular(diffuse, specular, (const struct wined3d_vec3 *)&light->position,
+ 1.0f, material_shininess, &normal_transformed, &position_transformed_normalized, light, ls);
+ }
}
/* Context activation is done by the caller. */
--
2.21.0
More information about the wine-devel
mailing list