Hi Jeff,
On Fri, 14 Jun 2019 at 09:00, Jeff Smith whydoubt@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