=?UTF-8?Q?Rico=20Sch=C3=BCller=20?=: d3dx9: Improve D3DXMatrixAffineTransformation().
Alexandre Julliard
julliard at winehq.org
Fri Sep 28 11:39:03 CDT 2012
Module: wine
Branch: master
Commit: 945e81b341da104007bec608c7472cf36ddbea45
URL: http://source.winehq.org/git/wine.git/?a=commit;h=945e81b341da104007bec608c7472cf36ddbea45
Author: Rico Schüller <kgbricola at web.de>
Date: Fri Sep 28 08:43:26 2012 +0200
d3dx9: Improve D3DXMatrixAffineTransformation().
---
dlls/d3dx9_36/math.c | 75 +++++++++++++++++++++++++++++++++++++------------
1 files changed, 56 insertions(+), 19 deletions(-)
diff --git a/dlls/d3dx9_36/math.c b/dlls/d3dx9_36/math.c
index 2c837a8..70492fa 100644
--- a/dlls/d3dx9_36/math.c
+++ b/dlls/d3dx9_36/math.c
@@ -94,36 +94,73 @@ FLOAT WINAPI D3DXFresnelTerm(FLOAT costheta, FLOAT refractionindex)
/*_________________D3DXMatrix____________________*/
-D3DXMATRIX* WINAPI D3DXMatrixAffineTransformation(D3DXMATRIX *pout, FLOAT scaling, CONST D3DXVECTOR3 *rotationcenter, CONST D3DXQUATERNION *rotation, CONST D3DXVECTOR3 *translation)
+D3DXMATRIX * WINAPI D3DXMatrixAffineTransformation(D3DXMATRIX *out, FLOAT scaling, const D3DXVECTOR3 *rotationcenter,
+ const D3DXQUATERNION *rotation, const D3DXVECTOR3 *translation)
{
- D3DXMATRIX m1, m2, m3, m4, m5;
-
- TRACE("(%p, %f, %p, %p, %p)\n", pout, scaling, rotationcenter, rotation, translation);
+ TRACE("out %p, scaling %f, rotationcenter %p, rotation %p, translation %p\n",
+ out, scaling, rotationcenter, rotation, translation);
- D3DXMatrixScaling(&m1, scaling, scaling, scaling);
+ D3DXMatrixIdentity(out);
- if ( !rotationcenter )
+ if (rotation)
{
- D3DXMatrixIdentity(&m2);
- D3DXMatrixIdentity(&m4);
+ FLOAT temp00, temp01, temp02, temp10, temp11, temp12, temp20, temp21, temp22;
+
+ temp00 = 1.0f - 2.0f * (rotation->y * rotation->y + rotation->z * rotation->z);
+ temp01 = 2.0f * (rotation->x * rotation->y + rotation->z * rotation->w);
+ temp02 = 2.0f * (rotation->x * rotation->z - rotation->y * rotation->w);
+ temp10 = 2.0f * (rotation->x * rotation->y - rotation->z * rotation->w);
+ temp11 = 1.0f - 2.0f * (rotation->x * rotation->x + rotation->z * rotation->z);
+ temp12 = 2.0f * (rotation->y * rotation->z + rotation->x * rotation->w);
+ temp20 = 2.0f * (rotation->x * rotation->z + rotation->y * rotation->w);
+ temp21 = 2.0f * (rotation->y * rotation->z - rotation->x * rotation->w);
+ temp22 = 1.0f - 2.0f * (rotation->x * rotation->x + rotation->y * rotation->y);
+
+ out->u.m[0][0] = scaling * temp00;
+ out->u.m[0][1] = scaling * temp01;
+ out->u.m[0][2] = scaling * temp02;
+ out->u.m[1][0] = scaling * temp10;
+ out->u.m[1][1] = scaling * temp11;
+ out->u.m[1][2] = scaling * temp12;
+ out->u.m[2][0] = scaling * temp20;
+ out->u.m[2][1] = scaling * temp21;
+ out->u.m[2][2] = scaling * temp22;
+
+ if (rotationcenter)
+ {
+ FLOAT x, y, z;
+
+ x = -rotationcenter->x;
+ y = -rotationcenter->y;
+ z = -rotationcenter->z;
+
+ out->u.m[3][0] = x * temp00 + y * temp10 + z * temp20;
+ out->u.m[3][1] = x * temp01 + y * temp11 + z * temp21;
+ out->u.m[3][2] = x * temp02 + y * temp12 + z * temp22;
+ }
}
else
{
- D3DXMatrixTranslation(&m2, -rotationcenter->x, -rotationcenter->y, -rotationcenter->z);
- D3DXMatrixTranslation(&m4, rotationcenter->x, rotationcenter->y, rotationcenter->z);
+ out->u.m[0][0] = scaling;
+ out->u.m[1][1] = scaling;
+ out->u.m[2][2] = scaling;
}
- if ( !rotation ) D3DXMatrixIdentity(&m3);
- else D3DXMatrixRotationQuaternion(&m3, rotation);
+ if (rotationcenter)
+ {
+ out->u.m[3][0] += rotationcenter->x;
+ out->u.m[3][1] += rotationcenter->y;
+ out->u.m[3][2] += rotationcenter->z;
+ }
- if ( !translation ) D3DXMatrixIdentity(&m5);
- else D3DXMatrixTranslation(&m5, translation->x, translation->y, translation->z);
+ if (translation)
+ {
+ out->u.m[3][0] += translation->x;
+ out->u.m[3][1] += translation->y;
+ out->u.m[3][2] += translation->z;
+ }
- D3DXMatrixMultiply(&m1, &m1, &m2);
- D3DXMatrixMultiply(&m1, &m1, &m3);
- D3DXMatrixMultiply(&m1, &m1, &m4);
- D3DXMatrixMultiply(pout, &m1, &m5);
- return pout;
+ return out;
}
D3DXMATRIX * WINAPI D3DXMatrixAffineTransformation2D(D3DXMATRIX *out, FLOAT scaling,
More information about the wine-cvs
mailing list