From c432b48a51d9449fa0b718510a76b6e622957176 Mon Sep 17 00:00:00 2001 From: David Adam Date: Thu, 15 Nov 2007 12:15:58 +0100 Subject: [PATCH] d3dx8: Implement D3DXPlaneIntersectLine. --- dlls/d3dx8/d3dx8.spec | 2 +- dlls/d3dx8/math.c | 20 ++++++++++++++++++++ dlls/d3dx8/tests/math.c | 17 ++++++++++++++++- include/d3dx8math.h | 1 + 4 files changed, 38 insertions(+), 2 deletions(-) diff --git a/dlls/d3dx8/d3dx8.spec b/dlls/d3dx8/d3dx8.spec index 37595133f44..71c55acdd6b 100644 --- a/dlls/d3dx8/d3dx8.spec +++ b/dlls/d3dx8/d3dx8.spec @@ -62,7 +62,7 @@ @ stub D3DXQuaternionSquad @ stub D3DXQuaternionBaryCentric @ stdcall D3DXPlaneNormalize(ptr ptr) -@ stub D3DXPlaneIntersectLine +@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr) @ stub D3DXPlaneFromPointNormal @ stub D3DXPlaneFromPoints @ stub D3DXPlaneTransform diff --git a/dlls/d3dx8/math.c b/dlls/d3dx8/math.c index 9a9def9e9e5..032d2db3b75 100644 --- a/dlls/d3dx8/math.c +++ b/dlls/d3dx8/math.c @@ -435,6 +435,26 @@ D3DXMATRIX* WINAPI D3DXMatrixTranspose(D3DXMATRIX *pout, CONST D3DXMATRIX *pm) /*_________________D3DXPLANE________________*/ +D3DXVECTOR3* WINAPI D3DXPlaneIntersectLine(D3DXVECTOR3 *pout, CONST D3DXPLANE *pp, CONST D3DXVECTOR3 *pv1, CONST D3DXVECTOR3 *pv2) +{ + D3DXVECTOR3 direction, normal; + FLOAT dot, temp; + + normal.x = pp->a; + normal.y = pp->b; + normal.z = pp->c; + direction.x = pv2->x - pv1->x; + direction.y = pv2->y - pv1->y; + direction.z = pv2->z - pv1->z; + dot = D3DXVec3Dot(&normal, &direction); + if ( !dot ) return NULL; + temp = ( pp->d + D3DXVec3Dot(&normal, pv1) ) / dot; + pout->x = pv1->x - temp * direction.x; + pout->y = pv1->y - temp * direction.y; + pout->z = pv1->z - temp * direction.z; + return pout; +} + D3DXPLANE* WINAPI D3DXPlaneNormalize(D3DXPLANE *pout, CONST D3DXPLANE *pp) { FLOAT norm; diff --git a/dlls/d3dx8/tests/math.c b/dlls/d3dx8/tests/math.c index e3dc06001d9..526fc00cdc1 100644 --- a/dlls/d3dx8/tests/math.c +++ b/dlls/d3dx8/tests/math.c @@ -416,6 +416,8 @@ static void D3DXMatrixTest(void) static void D3DXPlaneTest(void) { D3DXPLANE expectedplane, gotplane, nulplane, plane; + D3DXVECTOR3 expectedvec, gotvec, vec1, vec2; + LPD3DXVECTOR3 funcpointer; D3DXVECTOR4 vec; FLOAT expected, got; @@ -455,7 +457,20 @@ static void D3DXPlaneTest(void) got = D3DXPlaneDotNormal(NULL,NULL), ok( expected == got, "Expected : %f, Got : %f\n",expected, got); -/*_______________D3DXPlaneDotNormalize______________*/ +/*_______________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; + expectedvec.x = 20.0f/3.0f; expectedvec.y = 17.0f/3.0f; expectedvec.z = 14.0f/3.0f; + D3DXPlaneIntersectLine(&gotvec,&plane,&vec1,&vec2); + expect_vec3(expectedvec, gotvec); + /* Test a parallele line */ + vec1.x = 11.0f; vec1.y = 13.0f; vec1.z = 15.0f; + vec2.x = 17.0f; vec2.y = 31.0f; vec2.z = 24.0f; + expectedvec.x = 20.0f/3.0f; expectedvec.y = 17.0f/3.0f; expectedvec.z = 14.0f/3.0f; + funcpointer = D3DXPlaneIntersectLine(&gotvec,&plane,&vec1,&vec2); + ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); + +/*_______________D3DXPlaneNormalize______________*/ expectedplane.a = -3.0f/sqrt(26.0f); expectedplane.b = -1.0f/sqrt(26.0f); expectedplane.c = 4.0f/sqrt(26.0f); expectedplane.d = 7.0/sqrt(26.0f); D3DXPlaneNormalize(&gotplane, &plane); expect_plane(expectedplane, gotplane); diff --git a/include/d3dx8math.h b/include/d3dx8math.h index c92535e3d3d..7660b21594c 100644 --- a/include/d3dx8math.h +++ b/include/d3dx8math.h @@ -291,6 +291,7 @@ D3DXMATRIX* WINAPI D3DXMatrixScaling(D3DXMATRIX *pout, FLOAT sx, FLOAT sy, FLOAT D3DXMATRIX* WINAPI D3DXMatrixTranslation(D3DXMATRIX *pout, FLOAT x, FLOAT y, FLOAT z); D3DXMATRIX* WINAPI D3DXMatrixTranspose(D3DXMATRIX *pout, CONST D3DXMATRIX *pm); +D3DXVECTOR3* WINAPI D3DXPlaneIntersectLine(D3DXVECTOR3 *pout, CONST D3DXPLANE *pp, CONST D3DXVECTOR3 *pv1, CONST D3DXVECTOR3 *pv2); D3DXPLANE* WINAPI D3DXPlaneNormalize(D3DXPLANE *pout, CONST D3DXPLANE *pp); D3DXQUATERNION* WINAPI D3DXQuaternionNormalize(D3DXQUATERNION *pout, CONST D3DXQUATERNION *pq); -- 2.11.4.GIT