Commit 606441e5 authored by Stefan Dösinger's avatar Stefan Dösinger Committed by Alexandre Julliard

ddraw: Copy extra vertex data in viewport::TransformVertices.

parent cbb2f34a
...@@ -9210,7 +9210,7 @@ static void test_transform_vertices(void) ...@@ -9210,7 +9210,7 @@ static void test_transform_vertices(void)
ok(compare_vec4(&cmp[i], out[i].x, out[i].y, out[i].z, out[i].w, 4096), ok(compare_vec4(&cmp[i], out[i].x, out[i].y, out[i].z, out[i].w, 4096),
"Vertex %u differs. Got %f %f %f %f.\n", i, "Vertex %u differs. Got %f %f %f %f.\n", i,
out[i].x, out[i].y, out[i].z, out[i].w); out[i].x, out[i].y, out[i].z, out[i].w);
todo_wine ok(out[i].v1 == position_tests[i].v1 && out[i].v2 == position_tests[i].v2 ok(out[i].v1 == position_tests[i].v1 && out[i].v2 == position_tests[i].v2
&& out[i].v3 == position_tests[i].v3 && out[i].v4 == position_tests[i].v4, && out[i].v3 == position_tests[i].v3 && out[i].v4 == position_tests[i].v4,
"Vertex %u payload is %u %u %u %u.\n", i, out[i].v1, out[i].v2, out[i].v3, out[i].v4); "Vertex %u payload is %u %u %u %u.\n", i, out[i].v1, out[i].v2, out[i].v3, out[i].v4);
ok(out[i].unused3 == 0xdeadbeef && out[i].unused4 == 0xcafecafe, ok(out[i].unused3 == 0xdeadbeef && out[i].unused4 == 0xcafecafe,
......
...@@ -381,14 +381,22 @@ static HRESULT WINAPI d3d_viewport_SetViewport(IDirect3DViewport3 *iface, D3DVIE ...@@ -381,14 +381,22 @@ static HRESULT WINAPI d3d_viewport_SetViewport(IDirect3DViewport3 *iface, D3DVIE
* DDERR_INVALIDPARAMS if no clipping flag is specified * DDERR_INVALIDPARAMS if no clipping flag is specified
* *
*****************************************************************************/ *****************************************************************************/
struct transform_vertices_vertex
{
float x, y, z, w; /* w is unused in input data. */
struct
{
DWORD p[4];
} payload;
};
static HRESULT WINAPI d3d_viewport_TransformVertices(IDirect3DViewport3 *iface, static HRESULT WINAPI d3d_viewport_TransformVertices(IDirect3DViewport3 *iface,
DWORD dwVertexCount, D3DTRANSFORMDATA *lpData, DWORD dwFlags, DWORD *lpOffScreen) DWORD dwVertexCount, D3DTRANSFORMDATA *lpData, DWORD dwFlags, DWORD *lpOffScreen)
{ {
struct d3d_viewport *viewport = impl_from_IDirect3DViewport3(iface); struct d3d_viewport *viewport = impl_from_IDirect3DViewport3(iface);
D3DVIEWPORT vp = viewport->viewports.vp1; D3DVIEWPORT vp = viewport->viewports.vp1;
D3DMATRIX view_mat, world_mat, mat; D3DMATRIX view_mat, world_mat, mat;
float *in; struct transform_vertices_vertex *in, *out;
float *out;
float x, y, z, w; float x, y, z, w;
unsigned int i; unsigned int i;
D3DHVERTEX *outH; D3DHVERTEX *outH;
...@@ -420,15 +428,16 @@ static HRESULT WINAPI d3d_viewport_TransformVertices(IDirect3DViewport3 *iface, ...@@ -420,15 +428,16 @@ static HRESULT WINAPI d3d_viewport_TransformVertices(IDirect3DViewport3 *iface,
multiply_matrix(&mat, &view_mat, &world_mat); multiply_matrix(&mat, &view_mat, &world_mat);
multiply_matrix(&mat, &viewport->active_device->legacy_projection, &mat); multiply_matrix(&mat, &viewport->active_device->legacy_projection, &mat);
in = lpData->lpIn;
out = lpData->lpOut;
outH = lpData->lpHOut; outH = lpData->lpHOut;
for(i = 0; i < dwVertexCount; i++) for(i = 0; i < dwVertexCount; i++)
{ {
x = (in[0] * mat._11) + (in[1] * mat._21) + (in[2] * mat._31) + mat._41; in = (struct transform_vertices_vertex *)((char *)lpData->lpIn + lpData->dwInSize * i);
y = (in[0] * mat._12) + (in[1] * mat._22) + (in[2] * mat._32) + mat._42; out = (struct transform_vertices_vertex *)((char *)lpData->lpOut + lpData->dwOutSize * i);
z = (in[0] * mat._13) + (in[1] * mat._23) + (in[2] * mat._33) + mat._43;
w = (in[0] * mat._14) + (in[1] * mat._24) + (in[2] * mat._34) + mat._44; x = (in->x * mat._11) + (in->y * mat._21) + (in->z * mat._31) + mat._41;
y = (in->x * mat._12) + (in->y * mat._22) + (in->z * mat._32) + mat._42;
z = (in->x * mat._13) + (in->y * mat._23) + (in->z * mat._33) + mat._43;
w = (in->x * mat._14) + (in->y * mat._24) + (in->z * mat._34) + mat._44;
if(dwFlags & D3DTRANSFORM_CLIPPED) if(dwFlags & D3DTRANSFORM_CLIPPED)
{ {
...@@ -458,12 +467,10 @@ static HRESULT WINAPI d3d_viewport_TransformVertices(IDirect3DViewport3 *iface, ...@@ -458,12 +467,10 @@ static HRESULT WINAPI d3d_viewport_TransformVertices(IDirect3DViewport3 *iface,
* The exact scheme hasn't been figured out yet, but windows * The exact scheme hasn't been figured out yet, but windows
* definitely writes something there. * definitely writes something there.
*/ */
out[0] = x; out->x = x;
out[1] = y; out->y = y;
out[2] = z; out->z = z;
out[3] = w; out->w = w;
in = (float *) ((char *) in + lpData->dwInSize);
out = (float *) ((char *) out + lpData->dwOutSize);
continue; continue;
} }
} }
...@@ -471,12 +478,11 @@ static HRESULT WINAPI d3d_viewport_TransformVertices(IDirect3DViewport3 *iface, ...@@ -471,12 +478,11 @@ static HRESULT WINAPI d3d_viewport_TransformVertices(IDirect3DViewport3 *iface,
w = 1 / w; w = 1 / w;
x *= w; y *= w; z *= w; x *= w; y *= w; z *= w;
out[0] = vp.dwWidth / 2 + vp.dwX + x * vp.dvScaleX; out->x = vp.dwWidth / 2 + vp.dwX + x * vp.dvScaleX;
out[1] = vp.dwHeight / 2 + vp.dwY - y * vp.dvScaleY; out->y = vp.dwHeight / 2 + vp.dwY - y * vp.dvScaleY;
out[2] = z; out->z = z;
out[3] = w; out->w = w;
in = (float *) ((char *) in + lpData->dwInSize); out->payload = in->payload;
out = (float *) ((char *) out + lpData->dwOutSize);
} }
/* According to the d3d test, the offscreen flag is set only /* According to the d3d test, the offscreen flag is set only
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment