David Adam : d3dx9_36: Implement D3DXIntersectTri.

Alexandre Julliard julliard at winehq.org
Tue Feb 3 09:13:33 CST 2009


Module: wine
Branch: master
Commit: 8716c62c6eb2f2405b2d8ba7561f2727027a4ce1
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=8716c62c6eb2f2405b2d8ba7561f2727027a4ce1

Author: David Adam <david.adam.cnrs at gmail.com>
Date:   Tue Feb  3 09:36:08 2009 +0100

d3dx9_36: Implement D3DXIntersectTri.

---

 dlls/d3dx9_36/Makefile.in   |    1 +
 dlls/d3dx9_36/d3dx9_36.spec |    2 +-
 dlls/d3dx9_36/mesh.c        |   72 +++++++++++++++++++++++++++++++++++++++++++
 include/Makefile.in         |    1 +
 include/d3dx9mesh.h         |   38 ++++++++++++++++++++++
 5 files changed, 113 insertions(+), 1 deletions(-)

diff --git a/dlls/d3dx9_36/Makefile.in b/dlls/d3dx9_36/Makefile.in
index 0b5a3d3..7cd5c3c 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 ab198ab..813a5ad 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 0000000..0ecace6
--- /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 23be56b..5411cc0 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 0000000..c337ad2
--- /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 <d3dx9.h>
+
+#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 */




More information about the wine-cvs mailing list