From 4ff191a7eb93fbca94bfe4651131cdb204c2082c Mon Sep 17 00:00:00 2001 From: David Adam Date: Fri, 26 Oct 2007 21:02:30 +0200 Subject: [PATCH] d3dx8: Implement D3DX*Hermite. --- dlls/d3dx8/d3dx8.spec | 6 +++--- dlls/d3dx8/math.c | 46 +++++++++++++++++++++++++++++++++++++++++ dlls/d3dx8/tests/math.c | 35 +++++++++++++++++++++++-------- include/d3dx8math.h | 3 +++ 4 files changed, 78 insertions(+), 12 deletions(-) diff --git a/dlls/d3dx8/d3dx8.spec b/dlls/d3dx8/d3dx8.spec index 362b76c168f..f29d601f9ef 100644 --- a/dlls/d3dx8/d3dx8.spec +++ b/dlls/d3dx8/d3dx8.spec @@ -1,12 +1,12 @@ @ stdcall D3DXVec2Normalize(ptr ptr) -@ stub D3DXVec2Hermite +@ stdcall D3DXVec2Hermite(ptr ptr ptr ptr ptr long) @ stub D3DXVec2CatmullRom @ stdcall D3DXVec2BaryCentric(ptr ptr ptr ptr long long) @ stub D3DXVec2Transform @ stub D3DXVec2TransformCoord @ stub D3DXVec2TransformNormal @ stdcall D3DXVec3Normalize(ptr ptr) -@ stub D3DXVec3Hermite +@ stdcall D3DXVec3Hermite(ptr ptr ptr ptr ptr long) @ stub D3DXVec3CatmullRom @ stdcall D3DXVec3BaryCentric(ptr ptr ptr ptr long long) @ stub D3DXVec3Transform @@ -16,7 +16,7 @@ @ stub D3DXVec3Unproject @ stub D3DXVec4Cross @ stdcall D3DXVec4Normalize(ptr ptr) -@ stub D3DXVec4Hermite +@ stdcall D3DXVec4Hermite(ptr ptr ptr ptr ptr long) @ stub D3DXVec4CatmullRom @ stdcall D3DXVec4BaryCentric(ptr ptr ptr ptr long long) @ stub D3DXVec4Transform diff --git a/dlls/d3dx8/math.c b/dlls/d3dx8/math.c index e10229cbdb4..780c25f27b1 100644 --- a/dlls/d3dx8/math.c +++ b/dlls/d3dx8/math.c @@ -61,6 +61,20 @@ D3DXVECTOR2* WINAPI D3DXVec2BaryCentric(D3DXVECTOR2 *pout, CONST D3DXVECTOR2 *pv return pout; } +D3DXVECTOR2* WINAPI D3DXVec2Hermite(D3DXVECTOR2 *pout, CONST D3DXVECTOR2 *pv1, CONST D3DXVECTOR2 *pt1, CONST D3DXVECTOR2 *pv2, CONST D3DXVECTOR2 *pt2, FLOAT s) +{ + FLOAT h1, h2, h3, h4; + + h1 = 2.0f * s * s * s - 3.0f * s * s + 1.0f; + h2 = s * s * s - 2.0f * s * s + s; + h3 = -2.0f * s * s * s + 3.0f * s * s; + h4 = s * s * s - s * s; + + pout->x = h1 * (pv1->x) + h2 * (pt1->x) + h3 * (pv2->x) + h4 * (pt2->x); + pout->y = h1 * (pv1->y) + h2 * (pt1->y) + h3 * (pv2->y) + h4 * (pt2->y); + return pout; +} + D3DXVECTOR2* WINAPI D3DXVec2Normalize(D3DXVECTOR2 *pout, CONST D3DXVECTOR2 *pv) { FLOAT norm; @@ -89,6 +103,21 @@ D3DXVECTOR3* WINAPI D3DXVec3BaryCentric(D3DXVECTOR3 *pout, CONST D3DXVECTOR3 *pv return pout; } +D3DXVECTOR3* WINAPI D3DXVec3Hermite(D3DXVECTOR3 *pout, CONST D3DXVECTOR3 *pv1, CONST D3DXVECTOR3 *pt1, CONST D3DXVECTOR3 *pv2, CONST D3DXVECTOR3 *pt2, FLOAT s) +{ + FLOAT h1, h2, h3, h4; + + h1 = 2.0f * s * s * s - 3.0f * s * s + 1.0f; + h2 = s * s * s - 2.0f * s * s + s; + h3 = -2.0f * s * s * s + 3.0f * s * s; + h4 = s * s * s - s * s; + + pout->x = h1 * (pv1->x) + h2 * (pt1->x) + h3 * (pv2->x) + h4 * (pt2->x); + pout->y = h1 * (pv1->y) + h2 * (pt1->y) + h3 * (pv2->y) + h4 * (pt2->y); + pout->z = h1 * (pv1->z) + h2 * (pt1->z) + h3 * (pv2->z) + h4 * (pt2->z); + return pout; +} + D3DXVECTOR3* WINAPI D3DXVec3Normalize(D3DXVECTOR3 *pout, CONST D3DXVECTOR3 *pv) { FLOAT norm; @@ -119,6 +148,23 @@ D3DXVECTOR4* WINAPI D3DXVec4BaryCentric(D3DXVECTOR4 *pout, CONST D3DXVECTOR4 *pv pout->w = (1.0f-f-g) * (pv1->w) + f * (pv2->w) + g * (pv3->w); return pout; } + +D3DXVECTOR4* WINAPI D3DXVec4Hermite(D3DXVECTOR4 *pout, CONST D3DXVECTOR4 *pv1, CONST D3DXVECTOR4 *pt1, CONST D3DXVECTOR4 *pv2, CONST D3DXVECTOR4 *pt2, FLOAT s) +{ + FLOAT h1, h2, h3, h4; + + h1 = 2.0f * s * s * s - 3.0f * s * s + 1.0f; + h2 = s * s * s - 2.0f * s * s + s; + h3 = -2.0f * s * s * s + 3.0f * s * s; + h4 = s * s * s - s * s; + + pout->x = h1 * (pv1->x) + h2 * (pt1->x) + h3 * (pv2->x) + h4 * (pt2->x); + pout->y = h1 * (pv1->y) + h2 * (pt1->y) + h3 * (pv2->y) + h4 * (pt2->y); + pout->z = h1 * (pv1->z) + h2 * (pt1->z) + h3 * (pv2->z) + h4 * (pt2->z); + pout->w = h1 * (pv1->w) + h2 * (pt1->w) + h3 * (pv2->w) + h4 * (pt2->w); + return pout; +} + D3DXVECTOR4* WINAPI D3DXVec4Normalize(D3DXVECTOR4 *pout, CONST D3DXVECTOR4 *pv) { FLOAT norm; diff --git a/dlls/d3dx8/tests/math.c b/dlls/d3dx8/tests/math.c index ea206badc76..19025314cbd 100644 --- a/dlls/d3dx8/tests/math.c +++ b/dlls/d3dx8/tests/math.c @@ -27,7 +27,7 @@ #define expect_vec(expectedvec,gotvec) ok((fabs(expectedvec.x-gotvec.x)