Module: wine Branch: master Commit: e5425fc17bfc7e358d114e93d9a4d557ab85ef54 URL: http://source.winehq.org/git/wine.git/?a=commit;h=e5425fc17bfc7e358d114e93d9...
Author: David Adam david.adam.cnrs@gmail.com Date: Tue Feb 10 15:43:36 2009 +0100
d3dx9_36: Implement D3DXComputeBoundingSphere.
---
dlls/d3dx9_36/d3dx9_36.spec | 2 +- dlls/d3dx9_36/mesh.c | 34 ++++++++++++++++++++++++++++++++++ include/d3dx9mesh.h | 1 + 3 files changed, 36 insertions(+), 1 deletions(-)
diff --git a/dlls/d3dx9_36/d3dx9_36.spec b/dlls/d3dx9_36/d3dx9_36.spec index 2534acf..6ce5643 100644 --- a/dlls/d3dx9_36/d3dx9_36.spec +++ b/dlls/d3dx9_36/d3dx9_36.spec @@ -17,7 +17,7 @@ @ stub D3DXCompileShaderFromResourceA @ stub D3DXCompileShaderFromResourceW @ stdcall D3DXComputeBoundingBox(ptr long long ptr ptr) -@ stub D3DXComputeBoundingSphere +@ stdcall D3DXComputeBoundingSphere(ptr long long ptr ptr) @ stub D3DXComputeIMTFromPerTexelSignal @ stub D3DXComputeIMTFromPerVertexSignal @ stub D3DXComputeIMTFromSignal diff --git a/dlls/d3dx9_36/mesh.c b/dlls/d3dx9_36/mesh.c index 08d6e2f..521d694 100644 --- a/dlls/d3dx9_36/mesh.c +++ b/dlls/d3dx9_36/mesh.c @@ -55,6 +55,40 @@ HRESULT WINAPI D3DXComputeBoundingBox(CONST D3DXVECTOR3 *pfirstposition, DWORD n }
/************************************************************************* + * D3DXComputeBoundingSphere + */ +HRESULT WINAPI D3DXComputeBoundingSphere(CONST D3DXVECTOR3* pfirstposition, DWORD numvertices, DWORD dwstride, D3DXVECTOR3 *pcenter, FLOAT *pradius) +{ + D3DXVECTOR3 temp, temp1; + FLOAT d; + unsigned int i; + + if( !pfirstposition || !pcenter || !pradius ) return D3DERR_INVALIDCALL; + + temp.x = 0.0f; + temp.y = 0.0f; + temp.z = 0.0f; + temp1 = temp; + d = 0.0f; + *pradius = 0.0f; + + for(i=0; i<numvertices; i++) + { + D3DXVec3Add(&temp1, &temp, (D3DXVECTOR3*)((char*)pfirstposition + dwstride * i)); + temp = temp1; + } + + D3DXVec3Scale(pcenter, &temp, 1.0f/((FLOAT)numvertices)); + + for(i=0; i<numvertices; i++) + { + d = D3DXVec3Length(D3DXVec3Subtract(&temp, (D3DXVECTOR3*)((char*)pfirstposition + dwstride * i), pcenter)); + if ( d > *pradius ) *pradius = d; + } + return D3D_OK; +} + +/************************************************************************* * D3DXIntersectTri */ BOOL WINAPI D3DXIntersectTri(CONST D3DXVECTOR3 *p0, CONST D3DXVECTOR3 *p1, CONST D3DXVECTOR3 *p2, CONST D3DXVECTOR3 *praypos, CONST D3DXVECTOR3 *praydir, FLOAT *pu, FLOAT *pv, FLOAT *pdist) diff --git a/include/d3dx9mesh.h b/include/d3dx9mesh.h index 5cfc25e..a85f80d 100644 --- a/include/d3dx9mesh.h +++ b/include/d3dx9mesh.h @@ -30,6 +30,7 @@ UINT WINAPI D3DXGetFVFVertexSize(DWORD); BOOL WINAPI D3DXBoxBoundProbe(CONST D3DXVECTOR3 *, CONST D3DXVECTOR3 *, CONST D3DXVECTOR3 *, CONST D3DXVECTOR3 *); BOOL WINAPI D3DXSphereBoundProbe(CONST D3DXVECTOR3 *,FLOAT,CONST D3DXVECTOR3 *,CONST D3DXVECTOR3 *); HRESULT WINAPI D3DXComputeBoundingBox(CONST D3DXVECTOR3 *, DWORD, DWORD, D3DXVECTOR3 *, D3DXVECTOR3 *); +HRESULT WINAPI D3DXComputeBoundingSphere(CONST D3DXVECTOR3 *, DWORD, DWORD, D3DXVECTOR3 *, FLOAT *); BOOL WINAPI D3DXIntersectTri(CONST D3DXVECTOR3 *, CONST D3DXVECTOR3 *, CONST D3DXVECTOR3 *, CONST D3DXVECTOR3 *, CONST D3DXVECTOR3*, FLOAT *, FLOAT *, FLOAT *);
#ifdef __cplusplus