David Adam : d3dx8: Implement D3DXMatrixAffineTransformation2D.
Alexandre Julliard
julliard at winehq.org
Thu Nov 13 08:51:46 CST 2008
Module: wine
Branch: master
Commit: 4f1d5c26d1fc8bbb6dbd8a34699fb80a192ae4e3
URL: http://source.winehq.org/git/wine.git/?a=commit;h=4f1d5c26d1fc8bbb6dbd8a34699fb80a192ae4e3
Author: David Adam <david.adam.cnrs at gmail.com>
Date: Wed Nov 12 18:54:50 2008 +0100
d3dx8: Implement D3DXMatrixAffineTransformation2D.
---
dlls/d3dx9_36/d3dx9_36.spec | 2 +-
dlls/d3dx9_36/math.c | 47 +++++++++++++
dlls/d3dx9_36/tests/math.c | 160 ++++++++++++++++++++++++++++++++++++++++++-
include/d3dx9math.h | 1 +
4 files changed, 208 insertions(+), 2 deletions(-)
diff --git a/dlls/d3dx9_36/d3dx9_36.spec b/dlls/d3dx9_36/d3dx9_36.spec
index 2e68ba2..9058dd7 100644
--- a/dlls/d3dx9_36/d3dx9_36.spec
+++ b/dlls/d3dx9_36/d3dx9_36.spec
@@ -197,7 +197,7 @@
@ stub D3DXLoadVolumeFromResourceW
@ stub D3DXLoadVolumeFromVolume
@ stdcall D3DXMatrixAffineTransformation(ptr long ptr ptr ptr) d3dx8.D3DXMatrixAffineTransformation
-@ stub D3DXMatrixAffineTransformation2D
+@ stdcall D3DXMatrixAffineTransformation2D(ptr long ptr long ptr)
@ stdcall D3DXMatrixDecompose(ptr ptr ptr ptr)
@ stdcall D3DXMatrixDeterminant(ptr) d3dx8.D3DXMatrixfDeterminant
@ stdcall D3DXMatrixInverse(ptr ptr ptr) d3dx8.D3DXMatrixInverse
diff --git a/dlls/d3dx9_36/math.c b/dlls/d3dx9_36/math.c
index cbfac84..b5cdde2 100644
--- a/dlls/d3dx9_36/math.c
+++ b/dlls/d3dx9_36/math.c
@@ -29,6 +29,53 @@
WINE_DEFAULT_DEBUG_CHANNEL(d3dx);
/*************************************************************************
+ * D3DXMatrixAffineTransformation2D
+ */
+D3DXMATRIX* WINAPI D3DXMatrixAffineTransformation2D(
+ D3DXMATRIX *pout, FLOAT scaling,
+ CONST D3DXVECTOR2 *protationcenter, FLOAT rotation,
+ CONST D3DXVECTOR2 *ptranslation)
+{
+ D3DXQUATERNION rot;
+ D3DXVECTOR3 rot_center, trans;
+
+ rot.w=cos(rotation/2.0f);
+ rot.x=0.0f;
+ rot.y=0.0f;
+ rot.z=sin(rotation/2.0f);
+
+ if ( protationcenter )
+ {
+ rot_center.x=protationcenter->x;
+ rot_center.y=protationcenter->y;
+ rot_center.z=0.0f;
+ }
+ else
+ {
+ rot_center.x=0.0f;
+ rot_center.y=0.0f;
+ rot_center.z=0.0f;
+ }
+
+ if ( ptranslation )
+ {
+ trans.x=ptranslation->x;
+ trans.y=ptranslation->y;
+ trans.z=0.0f;
+ }
+ else
+ {
+ trans.x=0.0f;
+ trans.y=0.0f;
+ trans.z=0.0f;
+ }
+
+ D3DXMatrixAffineTransformation(pout, scaling, &rot_center, &rot, &trans);
+
+ return pout;
+}
+
+/*************************************************************************
* D3DXMatrixDecompose
*/
HRESULT WINAPI D3DXMatrixDecompose(D3DXVECTOR3 *poutscale, D3DXQUATERNION *poutrotation, D3DXVECTOR3 *pouttranslation, D3DXMATRIX *pm)
diff --git a/dlls/d3dx9_36/tests/math.c b/dlls/d3dx9_36/tests/math.c
index ff5e110..2930d34 100644
--- a/dlls/d3dx9_36/tests/math.c
+++ b/dlls/d3dx9_36/tests/math.c
@@ -17,7 +17,7 @@
*/
#include "wine/test.h"
-#include "d3dx9math.h"
+#include "d3dx9.h"
#define ARRAY_SIZE 5
@@ -25,6 +25,38 @@
#define relative_error(exp, out) ((exp == out) ? 0.0f : (fabs(out - exp) / fabs(exp)))
+static inline BOOL compare_matrix(const D3DXMATRIX *m1, const D3DXMATRIX *m2)
+{
+ int i, j;
+
+ for (i = 0; i < 4; ++i)
+ {
+ for (j = 0; j < 4; ++j)
+ {
+ if (fabs(U(*m1).m[i][j] - U(*m2).m[i][j]) > admitted_error)
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+}
+
+#define expect_mat(expectedmat, gotmat) \
+do { \
+ const D3DXMATRIX *__m1 = (expectedmat); \
+ const D3DXMATRIX *__m2 = (gotmat); \
+ ok(compare_matrix(__m1, __m2), "Expected matrix=\n(%f,%f,%f,%f\n %f,%f,%f,%f\n %f,%f,%f,%f\n %f,%f,%f,%f\n)\n\n" \
+ "Got matrix=\n(%f,%f,%f,%f\n %f,%f,%f,%f\n %f,%f,%f,%f\n %f,%f,%f,%f)\n", \
+ U(*__m1).m[0][0], U(*__m1).m[0][1], U(*__m1).m[0][2], U(*__m1).m[0][3], \
+ U(*__m1).m[1][0], U(*__m1).m[1][1], U(*__m1).m[1][2], U(*__m1).m[1][3], \
+ U(*__m1).m[2][0], U(*__m1).m[2][1], U(*__m1).m[2][2], U(*__m1).m[2][3], \
+ U(*__m1).m[3][0], U(*__m1).m[3][1], U(*__m1).m[3][2], U(*__m1).m[3][3], \
+ U(*__m2).m[0][0], U(*__m2).m[0][1], U(*__m2).m[0][2], U(*__m2).m[0][3], \
+ U(*__m2).m[1][0], U(*__m2).m[1][1], U(*__m2).m[1][2], U(*__m2).m[1][3], \
+ U(*__m2).m[2][0], U(*__m2).m[2][1], U(*__m2).m[2][2], U(*__m2).m[2][3], \
+ U(*__m2).m[3][0], U(*__m2).m[3][1], U(*__m2).m[3][2], U(*__m2).m[3][3]); \
+} while(0)
+
#define compare_rotation(exp, got) \
ok(fabs(exp.w - got.w) < admitted_error && \
fabs(exp.x - got.x) < admitted_error && \
@@ -88,6 +120,131 @@
* says so too).
*/
+static void test_Matrix_AffineTransformation2D(void)
+{
+ D3DXMATRIX exp_mat, got_mat;
+ D3DXVECTOR2 center, position;
+ FLOAT angle, scale;
+
+ center.x = 3.0f;
+ center.y = 4.0f;
+
+ position.x = -6.0f;
+ position.y = 7.0f;
+
+ angle = D3DX_PI/3.0f;
+
+ scale = 20.0f;
+
+ exp_mat.m[0][0] = 10.0f;
+ exp_mat.m[1][0] = -17.320507f;
+ exp_mat.m[2][0] = 0.0f;
+ exp_mat.m[3][0] = -1.035898f;
+ exp_mat.m[0][1] = 17.320507f;
+ exp_mat.m[1][1] = 10.0f;
+ exp_mat.m[2][1] = 0.0f;
+ exp_mat.m[3][1] = 6.401924f;
+ exp_mat.m[0][2] = 0.0f;
+ exp_mat.m[1][2] = 0.0f;
+ exp_mat.m[2][2] = 20.0f;
+ exp_mat.m[3][2] = 0.0f;
+ exp_mat.m[0][3] = 0.0f;
+ exp_mat.m[1][3] = 0.0f;
+ exp_mat.m[2][3] = 0.0f;
+ exp_mat.m[3][3] = 1.0f;
+
+ D3DXMatrixAffineTransformation2D(&got_mat, scale, ¢er, angle, &position);
+
+ expect_mat(&exp_mat, &got_mat);
+
+/*______________*/
+
+ center.x = 3.0f;
+ center.y = 4.0f;
+
+ angle = D3DX_PI/3.0f;
+
+ scale = 20.0f;
+
+ exp_mat.m[0][0] = 10.0f;
+ exp_mat.m[1][0] = -17.320507f;
+ exp_mat.m[2][0] = 0.0f;
+ exp_mat.m[3][0] = 4.964102f;
+ exp_mat.m[0][1] = 17.320507f;
+ exp_mat.m[1][1] = 10.0f;
+ exp_mat.m[2][1] = 0.0f;
+ exp_mat.m[3][1] = -0.598076f;
+ exp_mat.m[0][2] = 0.0f;
+ exp_mat.m[1][2] = 0.0f;
+ exp_mat.m[2][2] = 20.0f;
+ exp_mat.m[3][2] = 0.0f;
+ exp_mat.m[0][3] = 0.0f;
+ exp_mat.m[1][3] = 0.0f;
+ exp_mat.m[2][3] = 0.0f;
+ exp_mat.m[3][3] = 1.0f;
+
+ D3DXMatrixAffineTransformation2D(&got_mat, scale, ¢er, angle, NULL);
+
+ expect_mat(&exp_mat, &got_mat);
+
+/*______________*/
+
+ position.x = -6.0f;
+ position.y = 7.0f;
+
+ angle = D3DX_PI/3.0f;
+
+ scale = 20.0f;
+
+ exp_mat.m[0][0] = 10.0f;
+ exp_mat.m[1][0] = -17.320507f;
+ exp_mat.m[2][0] = 0.0f;
+ exp_mat.m[3][0] = -6.0f;
+ exp_mat.m[0][1] = 17.320507f;
+ exp_mat.m[1][1] = 10.0f;
+ exp_mat.m[2][1] = 0.0f;
+ exp_mat.m[3][1] = 7.0f;
+ exp_mat.m[0][2] = 0.0f;
+ exp_mat.m[1][2] = 0.0f;
+ exp_mat.m[2][2] = 20.0f;
+ exp_mat.m[3][2] = 0.0f;
+ exp_mat.m[0][3] = 0.0f;
+ exp_mat.m[1][3] = 0.0f;
+ exp_mat.m[2][3] = 0.0f;
+ exp_mat.m[3][3] = 1.0f;
+
+ D3DXMatrixAffineTransformation2D(&got_mat, scale, NULL, angle, &position);
+
+ expect_mat(&exp_mat, &got_mat);
+
+/*______________*/
+
+ angle = 5.0f * D3DX_PI/4.0f;
+
+ scale = -20.0f;
+
+ exp_mat.m[0][0] = 14.142133f;
+ exp_mat.m[1][0] = -14.142133f;
+ exp_mat.m[2][0] = 0.0f;
+ exp_mat.m[3][0] = 0.0f;
+ exp_mat.m[0][1] = 14.142133;
+ exp_mat.m[1][1] = 14.142133f;
+ exp_mat.m[2][1] = 0.0f;
+ exp_mat.m[3][1] = 0.0f;
+ exp_mat.m[0][2] = 0.0f;
+ exp_mat.m[1][2] = 0.0f;
+ exp_mat.m[2][2] = -20.0f;
+ exp_mat.m[3][2] = 0.0f;
+ exp_mat.m[0][3] = 0.0f;
+ exp_mat.m[1][3] = 0.0f;
+ exp_mat.m[2][3] = 0.0f;
+ exp_mat.m[3][3] = 1.0f;
+
+ D3DXMatrixAffineTransformation2D(&got_mat, scale, NULL, angle, NULL);
+
+ expect_mat(&exp_mat, &got_mat);
+}
+
static void test_Matrix_Decompose(void)
{
D3DXMATRIX pm;
@@ -566,6 +723,7 @@ static void test_D3DXVec_Array(void)
START_TEST(math)
{
+ test_Matrix_AffineTransformation2D();
test_Matrix_Decompose();
test_D3DXVec_Array();
}
diff --git a/include/d3dx9math.h b/include/d3dx9math.h
index 54e7762..9992919 100644
--- a/include/d3dx9math.h
+++ b/include/d3dx9math.h
@@ -267,6 +267,7 @@ D3DXCOLOR* WINAPI D3DXColorAdjustContrast(D3DXCOLOR *pout, CONST D3DXCOLOR *pc,
D3DXCOLOR* WINAPI D3DXColorAdjustSaturation(D3DXCOLOR *pout, CONST D3DXCOLOR *pc, FLOAT s);
D3DXMATRIX* WINAPI D3DXMatrixAffineTransformation(D3DXMATRIX *pout, float scaling, D3DXVECTOR3 *rotationcenter, D3DXQUATERNION *rotation, D3DXVECTOR3 *translation);
+D3DXMATRIX* WINAPI D3DXMatrixAffineTransformation2D(D3DXMATRIX *pout, FLOAT scaling, CONST D3DXVECTOR2 *protationcenter, FLOAT rotation, CONST D3DXVECTOR2 *ptranslation);
HRESULT WINAPI D3DXMatrixDecompose(D3DXVECTOR3 *poutscale, D3DXQUATERNION *poutrotation, D3DXVECTOR3 *pouttranslation, D3DXMATRIX *pm);
FLOAT WINAPI D3DXMatrixDeterminant(CONST D3DXMATRIX *pm);
D3DXMATRIX* WINAPI D3DXMatrixInverse(D3DXMATRIX *pout, FLOAT *pdeterminant, CONST D3DXMATRIX *pm);
More information about the wine-cvs
mailing list