1 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
3 * OPCODE - Optimized Collision Detection
4 * Copyright (C) 2001 Pierre Terdiman
5 * Homepage: http://www.codercorner.com/Opcode.htm
7 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
9 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
11 * Contains a mesh interface.
12 * \file OPC_MeshInterface.h
13 * \author Pierre Terdiman
14 * \date November, 27, 2002
16 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
18 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
20 #ifndef __OPC_MESHINTERFACE_H__
21 #define __OPC_MESHINTERFACE_H__
25 const Point
* Vertex
[3];
28 VertexPointers() { MatIdx
=-1; }
30 bool BackfaceCulling(const Point
& source
)
32 const Point
& p0
= *Vertex
[0];
33 const Point
& p1
= *Vertex
[1];
34 const Point
& p2
= *Vertex
[2];
36 // Compute normal direction
37 Point Normal
= (p2
- p1
)^(p0
- p1
);
40 return (Normal
| (source
- p0
)) >= 0.0f
;
44 #ifdef OPC_USE_CALLBACKS
45 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
47 * User-callback, called by OPCODE to request vertices from the app.
48 * \param triangle_index [in] face index for which the system is requesting the vertices
49 * \param triangle [out] triangle's vertices (must be provided by the user)
50 * \param user_data [in] user-defined data from SetCallback()
52 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
53 typedef void (*RequestCallback
) (udword triangle_index
, VertexPointers
& triangle
, void* user_data
);
56 class OPCODE_API MeshInterface
59 // Constructor / Destructor
63 inline_ udword
GetNbTriangles() const { return mNbTris
; }
64 inline_ udword
GetNbVertices() const { return mNbVerts
; }
65 inline_
void SetNbTriangles(udword nb
) { mNbTris
= nb
; }
66 inline_
void SetNbVertices(udword nb
) { mNbVerts
= nb
; }
68 #ifdef OPC_USE_CALLBACKS
71 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
73 * Callback control: setups object callback. Must provide triangle-vertices for a given triangle index.
74 * \param callback [in] user-defined callback
75 * \param user_data [in] user-defined data
76 * \return true if success
78 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
79 bool SetCallback(RequestCallback callback
, void* user_data
);
80 inline_
void* GetUserData() const { return mUserData
; }
81 inline_ RequestCallback
GetCallback() const { return mObjCallback
; }
85 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
87 * Pointers control: setups object pointers. Must provide access to faces and vertices for a given object.
88 * \param tris [in] pointer to triangles
89 * \param verts [in] pointer to vertices
90 * \return true if success
92 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
93 bool SetPointers(const IndexedTriangle
* tris
, const Point
* verts
);
94 inline_
const IndexedTriangle
* GetTris() const { return mTris
; }
95 inline_
const Point
* GetVerts() const { return mVerts
; }
100 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
103 * \param tri_stride [in] size of a triangle in bytes. The first sizeof(IndexedTriangle) bytes are used to get vertex indices.
104 * \param vertex_stride [in] size of a vertex in bytes. The first sizeof(Point) bytes are used to get vertex position.
105 * \return true if success
107 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
108 bool SetStrides(udword tri_stride
=sizeof(IndexedTriangle
), udword vertex_stride
=sizeof(Point
));
109 inline_ udword
GetTriStride() const { return mTriStride
; }
110 inline_ udword
GetVertexStride() const { return mVertexStride
; }
114 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
116 * Fetches a triangle given a triangle index.
117 * \param vp [out] required triangle's vertex pointers
118 * \param index [in] triangle index
120 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
121 inline_
void GetTriangle(VertexPointers
& vp
, udword index
) const
123 #ifdef OPC_USE_CALLBACKS
124 (mObjCallback
)(index
, vp
, mUserData
);
126 #ifdef OPC_USE_STRIDE
127 const IndexedTriangle
* T
= (const IndexedTriangle
*)(((ubyte
*)mTris
) + index
* mTriStride
);
128 vp
.Vertex
[0] = (const Point
*)(((ubyte
*)mVerts
) + T
->mVRef
[0] * mVertexStride
);
129 vp
.Vertex
[1] = (const Point
*)(((ubyte
*)mVerts
) + T
->mVRef
[1] * mVertexStride
);
130 vp
.Vertex
[2] = (const Point
*)(((ubyte
*)mVerts
) + T
->mVRef
[2] * mVertexStride
);
132 vp
.MatIdx
= T
->mMatIdx
;
134 const IndexedTriangle
* T
= &mTris
[index
];
135 vp
.Vertex
[0] = &mVerts
[T
->mVRef
[0]];
136 vp
.Vertex
[1] = &mVerts
[T
->mVRef
[1]];
137 vp
.Vertex
[2] = &mVerts
[T
->mVRef
[2]];
139 vp
.MatIdx
= T
->mMatIdx
;
144 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
146 * Remaps client's mesh according to a permutation.
147 * \param nb_indices [in] number of indices in the permutation (will be checked against number of triangles)
148 * \param permutation [in] list of triangle indices
149 * \return true if success
151 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
152 bool RemapClient(udword nb_indices
, const udword
* permutation
) const;
154 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
156 * Checks the mesh interface is valid, i.e. things have been setup correctly.
157 * \return true if valid
159 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
160 bool IsValid() const;
162 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
164 * Checks the mesh itself is valid.
165 * Currently we only look for degenerate faces.
166 * \return number of degenerate faces
168 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
169 udword
CheckTopology() const;
172 udword mNbTris
; //!< Number of triangles in the input model
173 udword mNbVerts
; //!< Number of vertices in the input model
174 #ifdef OPC_USE_CALLBACKS
176 void* mUserData
; //!< User-defined data sent to callback
177 RequestCallback mObjCallback
; //!< Object callback
180 const IndexedTriangle
* mTris
; //!< Array of indexed triangles
181 const Point
* mVerts
; //!< Array of vertices
182 #ifdef OPC_USE_STRIDE
183 udword mTriStride
; //!< Possible triangle stride in bytes [Opcode 1.3]
184 udword mVertexStride
; //!< Possible vertex stride in bytes [Opcode 1.3]
189 #endif //__OPC_MESHINTERFACE_H__