diff --git a/dlls/d3dx9_36/Makefile.in b/dlls/d3dx9_36/Makefile.in index 0b5a3d3ac0d..7cd5c3c6108 100644 --- a/dlls/d3dx9_36/Makefile.in +++ b/dlls/d3dx9_36/Makefile.in @@ -10,6 +10,7 @@ C_SRCS = \ d3dx9_36_main.c \ font.c \ math.c \ + mesh.c \ shader.c \ sprite.c diff --git a/dlls/d3dx9_36/d3dx9_36.spec b/dlls/d3dx9_36/d3dx9_36.spec index ab198ab1a4f..813a5ad46a4 100644 --- a/dlls/d3dx9_36/d3dx9_36.spec +++ b/dlls/d3dx9_36/d3dx9_36.spec @@ -167,7 +167,7 @@ @ stdcall D3DXGetVertexShaderProfile(ptr) @ stdcall D3DXIntersect(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) d3dx8.D3DXIntersect @ stdcall D3DXIntersectSubset(ptr long ptr ptr ptr ptr ptr ptr ptr ptr ptr) d3dx8.D3DXIntersectSubset -@ stub D3DXIntersectTri +@ stdcall D3DXIntersectTri(ptr ptr ptr ptr ptr ptr ptr ptr) @ stub D3DXLoadMeshFromXA @ stub D3DXLoadMeshFromXInMemory @ stub D3DXLoadMeshFromXResource diff --git a/dlls/d3dx9_36/mesh.c b/dlls/d3dx9_36/mesh.c new file mode 100644 index 00000000000..0ecace6ccf4 --- /dev/null +++ b/dlls/d3dx9_36/mesh.c @@ -0,0 +1,72 @@ + /* + * Mesh operations specific to D3DX9. + * + * Copyright (C) 2009 David Adam + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "config.h" +#include "windef.h" +#include "wingdi.h" +#include "wine/debug.h" +#include "d3dx9.h" + +WINE_DEFAULT_DEBUG_CHANNEL(d3dx); + +/************************************************************************* + * 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) +{ + D3DXMATRIX m; + D3DXVECTOR4 vec; + + m.m[0][0] = p1->x - p0->x; + m.m[1][0] = p2->x - p0->x; + m.m[2][0] = -praydir->x; + m.m[3][0] = 0.0f; + m.m[0][1] = p1->y - p0->z; + m.m[1][1] = p2->y - p0->z; + m.m[2][1] = -praydir->y; + m.m[3][1] = 0.0f; + m.m[0][2] = p1->z - p0->z; + m.m[1][2] = p2->z - p0->z; + m.m[2][2] = -praydir->z; + m.m[3][2] = 0.0f; + m.m[0][3] = 0.0f; + m.m[1][3] = 0.0f; + m.m[2][3] = 0.0f; + m.m[3][3] = 1.0f; + + vec.x = praypos->x - p0->x; + vec.y = praypos->y - p0->y; + vec.z = praypos->z - p0->z; + vec.w = 0.0f; + + if ( D3DXMatrixInverse(&m, NULL, &m) ) + { + D3DXVec4Transform(&vec, &vec, &m); + if ( (vec.x >= 0.0f) && (vec.y >= 0.0f) && (vec.x + vec.y <= 1.0f) && (vec.z >= 0.0f) ) + { + *pu = vec.x; + *pv = vec.y; + *pdist = fabs( vec.z ); + return TRUE; + } + } + + return FALSE; +} diff --git a/include/Makefile.in b/include/Makefile.in index 23be56b20d0..5411cc0510c 100644 --- a/include/Makefile.in +++ b/include/Makefile.in @@ -144,6 +144,7 @@ SRCDIR_INCLUDES = \ d3dx9core.h \ d3dx9math.h \ d3dx9math.inl \ + d3dx9mesh.h \ d3dx9shader.h \ d3dx9tex.h \ dbghelp.h \ diff --git a/include/d3dx9mesh.h b/include/d3dx9mesh.h new file mode 100644 index 00000000000..c337ad249c5 --- /dev/null +++ b/include/d3dx9mesh.h @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2009 David Adam + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef __WINE_D3DX9MESH_H +#define __WINE_D3DX9MESH_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +HRESULT WINAPI D3DXCreateBuffer(DWORD, LPD3DXBUFFER*); +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 *); +BOOL WINAPI D3DXIntersectTri(CONST D3DXVECTOR3 *, CONST D3DXVECTOR3 *, CONST D3DXVECTOR3 *, CONST D3DXVECTOR3 *, CONST D3DXVECTOR3*, FLOAT *, FLOAT *, FLOAT *); + +#ifdef __cplusplus +} +#endif + +#endif /* __WINE_D3DX9MESH_H */