From 54d3bb28fd38badbc227d9cc0266d2ff88fd6770 Mon Sep 17 00:00:00 2001 From: David Adam Date: Mon, 19 Nov 2007 14:34:46 +0100 Subject: [PATCH] d3dx8: Implement D3DXPlaneFromPoints. --- dlls/d3dx8/d3dx8.spec | 2 +- dlls/d3dx8/math.c | 14 ++++++++++++++ dlls/d3dx8/tests/math.c | 16 +++++++++++++++- include/d3dx8math.h | 1 + 4 files changed, 31 insertions(+), 2 deletions(-) diff --git a/dlls/d3dx8/d3dx8.spec b/dlls/d3dx8/d3dx8.spec index 5b35df462f8..4dd230bae84 100644 --- a/dlls/d3dx8/d3dx8.spec +++ b/dlls/d3dx8/d3dx8.spec @@ -64,7 +64,7 @@ @ stdcall D3DXPlaneNormalize(ptr ptr) @ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr) @ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr) -@ stub D3DXPlaneFromPoints +@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr) @ stub D3DXPlaneTransform @ stub D3DXColorAdjustSaturation @ stub D3DXColorAdjustContrast diff --git a/dlls/d3dx8/math.c b/dlls/d3dx8/math.c index 875ca493a39..0727492065c 100644 --- a/dlls/d3dx8/math.c +++ b/dlls/d3dx8/math.c @@ -491,6 +491,20 @@ D3DXPLANE* WINAPI D3DXPlaneFromPointNormal(D3DXPLANE *pout, CONST D3DXVECTOR3 *p return pout; } +D3DXPLANE* WINAPI D3DXPlaneFromPoints(D3DXPLANE *pout, CONST D3DXVECTOR3 *pv1, CONST D3DXVECTOR3 *pv2, CONST D3DXVECTOR3 *pv3) +{ + D3DXVECTOR3 edge1, edge2, normal, Nnormal; + + edge1.x = 0.0f; edge1.y = 0.0f; edge1.z = 0.0f; + edge2.x = 0.0f; edge2.y = 0.0f; edge2.z = 0.0f; + D3DXVec3Subtract(&edge1, pv2, pv1); + D3DXVec3Subtract(&edge2, pv3, pv1); + D3DXVec3Cross(&normal, &edge1, &edge2); + D3DXVec3Normalize(&Nnormal, &normal); + D3DXPlaneFromPointNormal(pout, pv1, &Nnormal); + return pout; +} + D3DXVECTOR3* WINAPI D3DXPlaneIntersectLine(D3DXVECTOR3 *pout, CONST D3DXPLANE *pp, CONST D3DXVECTOR3 *pv1, CONST D3DXVECTOR3 *pv2) { D3DXVECTOR3 direction, normal; diff --git a/dlls/d3dx8/tests/math.c b/dlls/d3dx8/tests/math.c index 2811fea0c3c..05b84fbf9fc 100644 --- a/dlls/d3dx8/tests/math.c +++ b/dlls/d3dx8/tests/math.c @@ -437,12 +437,13 @@ static void D3DXMatrixTest(void) static void D3DXPlaneTest(void) { D3DXPLANE expectedplane, gotplane, nulplane, plane; - D3DXVECTOR3 expectedvec, gotvec, vec1, vec2; + D3DXVECTOR3 expectedvec, gotvec, vec1, vec2, vec3; LPD3DXVECTOR3 funcpointer; D3DXVECTOR4 vec; FLOAT expected, got; plane.a = -3.0f; plane.b = -1.0f; plane.c = 4.0f; plane.d = 7.0f; + vec.x = 2.0f; vec.y = 5.0f; vec.z = -6.0f; vec.w = 11.0f; /*_______________D3DXPlaneDot________________*/ @@ -485,6 +486,19 @@ static void D3DXPlaneTest(void) D3DXPlaneFromPointNormal(&gotplane,&vec1,&vec2); expect_plane(expectedplane, gotplane); +/*_______________D3DXPlaneFromPoints_______*/ + vec1.x = 1.0f; vec1.y = 2.0f; vec1.z = 3.0f; + vec2.x = 1.0f; vec2.y = -6.0f; vec2.z = -5.0f; + vec3.x = 83.0f; vec3.y = 74.0f; vec3.z = 65.0f; + expectedplane.a = 0.085914f; expectedplane.b = -0.704492f; expectedplane.c = 0.704492f; expectedplane.d = -0.790406f; + D3DXPlaneFromPoints(&gotplane,&vec1,&vec2,&vec3); + expect_plane(expectedplane, gotplane); + /* Test if 2 vectors are parallels */ + vec3.x = 1.0f; vec3.y = 1.0f; vec3.z = 2.0f; + expectedplane.a = 0.0f; expectedplane.b = 0.0f; expectedplane.c = 0.0f; expectedplane.d = 0.0f; + D3DXPlaneFromPoints(&gotplane,&vec1,&vec2,&vec3); + expect_plane(expectedplane, gotplane); + /*_______________D3DXPlaneIntersectLine___________*/ vec1.x = 9.0f; vec1.y = 6.0f; vec1.z = 3.0f; vec2.x = 2.0f; vec2.y = 5.0f; vec2.z = 8.0f; diff --git a/include/d3dx8math.h b/include/d3dx8math.h index 8c2cdc3614d..8082876c5cb 100644 --- a/include/d3dx8math.h +++ b/include/d3dx8math.h @@ -294,6 +294,7 @@ D3DXMATRIX* WINAPI D3DXMatrixTranslation(D3DXMATRIX *pout, FLOAT x, FLOAT y, FLO D3DXMATRIX* WINAPI D3DXMatrixTranspose(D3DXMATRIX *pout, CONST D3DXMATRIX *pm); D3DXPLANE* WINAPI D3DXPlaneFromPointNormal(D3DXPLANE *pout, CONST D3DXVECTOR3 *pvpoint, CONST D3DXVECTOR3 *pvnormal); +D3DXPLANE* WINAPI D3DXPlaneFromPoints(D3DXPLANE *pout, CONST D3DXVECTOR3 *pv1, CONST D3DXVECTOR3 *pv2, CONST D3DXVECTOR3 *pv3); D3DXVECTOR3* WINAPI D3DXPlaneIntersectLine(D3DXVECTOR3 *pout, CONST D3DXPLANE *pp, CONST D3DXVECTOR3 *pv1, CONST D3DXVECTOR3 *pv2); D3DXPLANE* WINAPI D3DXPlaneNormalize(D3DXPLANE *pout, CONST D3DXPLANE *pp);