Hi Jeff, On Fri, 14 Jun 2019 at 09:00, Jeff Smith <whydoubt(a)gmail.com> wrote:
static HRESULT WINAPI d3drm_frame3_Transform(IDirect3DRMFrame3 *iface, D3DVECTOR *d, D3DVECTOR *s) { - FIXME("iface %p, d %p, s %p stub!\n", iface, d, s); + struct d3drm_frame *frame = impl_from_IDirect3DRMFrame3(iface);
- return E_NOTIMPL; + TRACE("iface %p, d %p, s %p.\n", iface, d, s); + + d->u1.x = s->u1.x * frame->transform[0][0] + s->u2.y * frame->transform[1][0] + + s->u3.z * frame->transform[2][0] + frame->transform[3][0]; + d->u2.y = s->u1.x * frame->transform[0][1] + s->u2.y * frame->transform[1][1] + + s->u3.z * frame->transform[2][1] + frame->transform[3][1]; + d->u3.z = s->u1.x * frame->transform[0][2] + s->u2.y * frame->transform[1][2] + + s->u3.z * frame->transform[2][2] + frame->transform[3][2]; + + while ((frame = frame->parent)) + { + D3DVALUE x = d->u1.x; + D3DVALUE y = d->u2.y; + D3DVALUE z = d->u3.z; + d->u1.x = x * frame->transform[0][0] + y * frame->transform[1][0] + + z * frame->transform[2][0] + frame->transform[3][0]; + d->u2.y = x * frame->transform[0][1] + y * frame->transform[1][1] + + z * frame->transform[2][1] + frame->transform[3][1]; + d->u3.z = x * frame->transform[0][2] + y * frame->transform[1][2] + + z * frame->transform[2][2] + frame->transform[3][2]; + } + + return D3DRM_OK; } This would probably benefit from a helper function along the lines of wined3d_vec4_transform() in wined3d.
+#define SET_TRANSFORM(frame, m11,m12,m13, m21,m22,m23, m31,m32,m33, m41,m42,m43) \ + { \ + D3DRMMATRIX4D matrix; \ + matrix[0][0] = D3DVAL(m11); \ + matrix[0][1] = D3DVAL(m12); \ + matrix[0][2] = D3DVAL(m13); \ + matrix[0][3] = D3DVAL(0); \ + matrix[1][0] = D3DVAL(m21); \ + matrix[1][1] = D3DVAL(m22); \ + matrix[1][2] = D3DVAL(m23); \ + matrix[1][3] = D3DVAL(0); \ + matrix[2][0] = D3DVAL(m31); \ + matrix[2][1] = D3DVAL(m32); \ + matrix[2][2] = D3DVAL(m33); \ + matrix[2][3] = D3DVAL(0); \ + matrix[3][0] = D3DVAL(m41); \ + matrix[3][1] = D3DVAL(m42); \ + matrix[3][2] = D3DVAL(m43); \ + matrix[3][3] = D3DVAL(1); \ + IDirect3DRMFrame_AddTransform(frame, D3DRMCOMBINE_REPLACE, matrix); \ + } +#define SET_VECTOR(vector, vx,vy,vz) \ + { \ + (vector).x = D3DVAL(vx); \ + (vector).y = D3DVAL(vy); \ + (vector).z = D3DVAL(vz); \ + } + +#define MAXERROR_ABS 0.000001 +#define MAXERROR_REL 0.000001 +#define CHECK(a, b) \ + { \ + if (pass) \ + { \ + if ((a < 1 && a > -1) || (b < 1 && b > -1)) \ + { \ + if (fabs((a) - (b)) > MAXERROR_ABS) \ + { \ + pass = 0; \ + } \ + } \ + else \ + { \ + if (fabs((a) - (b)) > fabs(MAXERROR_REL * (b))) \ + { \ + pass = 0; \ + } \ + } \ + } \ + } + +#define EXPECT_VECTOR(test_description, vector, vx,vy,vz) \ + { \ + int pass = 1; \ + ok(hr == D3DRM_OK, test_description ": returned hr = %x\n", hr); \ + CHECK((vector).x, vx); \ + CHECK((vector).y, vy); \ + CHECK((vector).z, vz); \ + ok(pass, test_description ": vector result is not correct\n"); \ + } I don't think any of these need to be macros. You may want to take a look at e.g. the compare_point() helper in dlls/d2d1/tests/d2d1.c as an example.
As an aside, I'd recommend sending smaller series of patches, especially when you're new to a module. Although I don't mind, it's not necessary to send patches to my codeweavers.com address, I see them here. Thanks for working on this, Henri