aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/libraries/ode-0.9/docs/collision__trimesh_8h-source.html
blob: 488925c8235392bb25350eb00b9c40bead1b070d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Open Dynamics Engine: collision_trimesh.h Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.5.3 -->
<div class="tabs">
  <ul>
    <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
    <li><a href="modules.html"><span>Modules</span></a></li>
    <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
    <li class="current"><a href="files.html"><span>Files</span></a></li>
  </ul>
</div>
<h1>collision_trimesh.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*************************************************************************</span>
<a name="l00002"></a>00002 <span class="comment"> *                                                                       *</span>
<a name="l00003"></a>00003 <span class="comment"> * Open Dynamics Engine, Copyright (C) 2001-2003 Russell L. Smith.       *</span>
<a name="l00004"></a>00004 <span class="comment"> * All rights reserved.  Email: russ@q12.org   Web: www.q12.org          *</span>
<a name="l00005"></a>00005 <span class="comment"> *                                                                       *</span>
<a name="l00006"></a>00006 <span class="comment"> * This library is free software; you can redistribute it and/or         *</span>
<a name="l00007"></a>00007 <span class="comment"> * modify it under the terms of EITHER:                                  *</span>
<a name="l00008"></a>00008 <span class="comment"> *   (1) The GNU Lesser General Public License as published by the Free  *</span>
<a name="l00009"></a>00009 <span class="comment"> *       Software Foundation; either version 2.1 of the License, or (at  *</span>
<a name="l00010"></a>00010 <span class="comment"> *       your option) any later version. The text of the GNU Lesser      *</span>
<a name="l00011"></a>00011 <span class="comment"> *       General Public License is included with this library in the     *</span>
<a name="l00012"></a>00012 <span class="comment"> *       file LICENSE.TXT.                                               *</span>
<a name="l00013"></a>00013 <span class="comment"> *   (2) The BSD-style license that is included with this library in     *</span>
<a name="l00014"></a>00014 <span class="comment"> *       the file LICENSE-BSD.TXT.                                       *</span>
<a name="l00015"></a>00015 <span class="comment"> *                                                                       *</span>
<a name="l00016"></a>00016 <span class="comment"> * This library is distributed in the hope that it will be useful,       *</span>
<a name="l00017"></a>00017 <span class="comment"> * but WITHOUT ANY WARRANTY; without even the implied warranty of        *</span>
<a name="l00018"></a>00018 <span class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files    *</span>
<a name="l00019"></a>00019 <span class="comment"> * LICENSE.TXT and LICENSE-BSD.TXT for more details.                     *</span>
<a name="l00020"></a>00020 <span class="comment"> *                                                                       *</span>
<a name="l00021"></a>00021 <span class="comment"> *************************************************************************/</span>
<a name="l00022"></a>00022 
<a name="l00023"></a>00023 <span class="comment">/*</span>
<a name="l00024"></a>00024 <span class="comment"> * TriMesh code by Erwin de Vries.</span>
<a name="l00025"></a>00025 <span class="comment"> *</span>
<a name="l00026"></a>00026 <span class="comment"> * Trimesh data.</span>
<a name="l00027"></a>00027 <span class="comment"> * This is where the actual vertexdata (pointers), and BV tree is stored.</span>
<a name="l00028"></a>00028 <span class="comment"> * Vertices should be single precision!</span>
<a name="l00029"></a>00029 <span class="comment"> * This should be more sophisticated, so that the user can easyly implement</span>
<a name="l00030"></a>00030 <span class="comment"> * another collision library, but this is a lot of work, and also costs some</span>
<a name="l00031"></a>00031 <span class="comment"> * performance because some data has to be copied.</span>
<a name="l00032"></a>00032 <span class="comment"> */</span>
<a name="l00033"></a>00033 
<a name="l00034"></a>00034 <span class="preprocessor">#ifndef _ODE_COLLISION_TRIMESH_H_</span>
<a name="l00035"></a>00035 <span class="preprocessor"></span><span class="preprocessor">#define _ODE_COLLISION_TRIMESH_H_</span>
<a name="l00036"></a>00036 <span class="preprocessor"></span>
<a name="l00037"></a>00037 <span class="preprocessor">#ifdef __cplusplus</span>
<a name="l00038"></a>00038 <span class="preprocessor"></span><span class="keyword">extern</span> <span class="stringliteral">"C"</span> {
<a name="l00039"></a>00039 <span class="preprocessor">#endif</span>
<a name="l00040"></a>00040 <span class="preprocessor"></span>
<a name="l00041"></a>00041 <span class="comment">/*</span>
<a name="l00042"></a>00042 <span class="comment"> * Data storage for triangle meshes.</span>
<a name="l00043"></a>00043 <span class="comment"> */</span>
<a name="l00044"></a>00044 <span class="keyword">struct </span>dxTriMeshData;
<a name="l00045"></a>00045 <span class="keyword">typedef</span> <span class="keyword">struct </span>dxTriMeshData* dTriMeshDataID;
<a name="l00046"></a>00046 
<a name="l00047"></a>00047 <span class="comment">/*</span>
<a name="l00048"></a>00048 <span class="comment"> * These dont make much sense now, but they will later when we add more</span>
<a name="l00049"></a>00049 <span class="comment"> * features.</span>
<a name="l00050"></a>00050 <span class="comment"> */</span>
<a name="l00051"></a>00051 ODE_API dTriMeshDataID dGeomTriMeshDataCreate(<span class="keywordtype">void</span>);
<a name="l00052"></a>00052 ODE_API <span class="keywordtype">void</span> dGeomTriMeshDataDestroy(dTriMeshDataID g);
<a name="l00053"></a>00053 
<a name="l00054"></a>00054 
<a name="l00055"></a>00055 
<a name="l00056"></a>00056 <span class="keyword">enum</span> { TRIMESH_FACE_NORMALS };
<a name="l00057"></a>00057 ODE_API <span class="keywordtype">void</span> dGeomTriMeshDataSet(dTriMeshDataID g, <span class="keywordtype">int</span> data_id, <span class="keywordtype">void</span>* in_data);
<a name="l00058"></a>00058 ODE_API <span class="keywordtype">void</span>* dGeomTriMeshDataGet(dTriMeshDataID g, <span class="keywordtype">int</span> data_id);
<a name="l00059"></a>00059 
<a name="l00060"></a>00060 
<a name="l00061"></a>00061 
<a name="l00067"></a>00067 ODE_API <span class="keywordtype">void</span> dGeomTriMeshSetLastTransform( dGeomID g, dMatrix4 last_trans );
<a name="l00068"></a>00068 ODE_API dReal* dGeomTriMeshGetLastTransform( dGeomID g );
<a name="l00069"></a>00069 
<a name="l00070"></a>00070 <span class="comment">/*</span>
<a name="l00071"></a>00071 <span class="comment"> * Build TriMesh data with single precision used in vertex data .</span>
<a name="l00072"></a>00072 <span class="comment"> */</span>
<a name="l00073"></a>00073 ODE_API <span class="keywordtype">void</span> dGeomTriMeshDataBuildSingle(dTriMeshDataID g,
<a name="l00074"></a>00074                                  <span class="keyword">const</span> <span class="keywordtype">void</span>* Vertices, <span class="keywordtype">int</span> VertexStride, <span class="keywordtype">int</span> VertexCount, 
<a name="l00075"></a>00075                                  <span class="keyword">const</span> <span class="keywordtype">void</span>* Indices, <span class="keywordtype">int</span> IndexCount, <span class="keywordtype">int</span> TriStride);
<a name="l00076"></a>00076 <span class="comment">/* same again with a normals array (used as trimesh-trimesh optimization) */</span>
<a name="l00077"></a>00077 ODE_API <span class="keywordtype">void</span> dGeomTriMeshDataBuildSingle1(dTriMeshDataID g,
<a name="l00078"></a>00078                                   <span class="keyword">const</span> <span class="keywordtype">void</span>* Vertices, <span class="keywordtype">int</span> VertexStride, <span class="keywordtype">int</span> VertexCount, 
<a name="l00079"></a>00079                                   <span class="keyword">const</span> <span class="keywordtype">void</span>* Indices, <span class="keywordtype">int</span> IndexCount, <span class="keywordtype">int</span> TriStride,
<a name="l00080"></a>00080                                   <span class="keyword">const</span> <span class="keywordtype">void</span>* Normals);
<a name="l00081"></a>00081 <span class="comment">/*</span>
<a name="l00082"></a>00082 <span class="comment">* Build TriMesh data with double pricision used in vertex data .</span>
<a name="l00083"></a>00083 <span class="comment">*/</span>
<a name="l00084"></a>00084 ODE_API <span class="keywordtype">void</span> dGeomTriMeshDataBuildDouble(dTriMeshDataID g, 
<a name="l00085"></a>00085                                  <span class="keyword">const</span> <span class="keywordtype">void</span>* Vertices,  <span class="keywordtype">int</span> VertexStride, <span class="keywordtype">int</span> VertexCount, 
<a name="l00086"></a>00086                                  <span class="keyword">const</span> <span class="keywordtype">void</span>* Indices, <span class="keywordtype">int</span> IndexCount, <span class="keywordtype">int</span> TriStride);
<a name="l00087"></a>00087 <span class="comment">/* same again with a normals array (used as trimesh-trimesh optimization) */</span>
<a name="l00088"></a>00088 ODE_API <span class="keywordtype">void</span> dGeomTriMeshDataBuildDouble1(dTriMeshDataID g, 
<a name="l00089"></a>00089                                   <span class="keyword">const</span> <span class="keywordtype">void</span>* Vertices,  <span class="keywordtype">int</span> VertexStride, <span class="keywordtype">int</span> VertexCount, 
<a name="l00090"></a>00090                                   <span class="keyword">const</span> <span class="keywordtype">void</span>* Indices, <span class="keywordtype">int</span> IndexCount, <span class="keywordtype">int</span> TriStride,
<a name="l00091"></a>00091                                   <span class="keyword">const</span> <span class="keywordtype">void</span>* Normals);
<a name="l00092"></a>00092 
<a name="l00093"></a>00093 <span class="comment">/*</span>
<a name="l00094"></a>00094 <span class="comment"> * Simple build. Single/double precision based on dSINGLE/dDOUBLE!</span>
<a name="l00095"></a>00095 <span class="comment"> */</span>
<a name="l00096"></a>00096 ODE_API <span class="keywordtype">void</span> dGeomTriMeshDataBuildSimple(dTriMeshDataID g,
<a name="l00097"></a>00097                                  <span class="keyword">const</span> dReal* Vertices, <span class="keywordtype">int</span> VertexCount,
<a name="l00098"></a>00098                                  <span class="keyword">const</span> <span class="keywordtype">int</span>* Indices, <span class="keywordtype">int</span> IndexCount);
<a name="l00099"></a>00099 <span class="comment">/* same again with a normals array (used as trimesh-trimesh optimization) */</span>
<a name="l00100"></a>00100 ODE_API <span class="keywordtype">void</span> dGeomTriMeshDataBuildSimple1(dTriMeshDataID g,
<a name="l00101"></a>00101                                   <span class="keyword">const</span> dReal* Vertices, <span class="keywordtype">int</span> VertexCount,
<a name="l00102"></a>00102                                   <span class="keyword">const</span> <span class="keywordtype">int</span>* Indices, <span class="keywordtype">int</span> IndexCount,
<a name="l00103"></a>00103                                   <span class="keyword">const</span> <span class="keywordtype">int</span>* Normals);
<a name="l00104"></a>00104 
<a name="l00105"></a>00105 <span class="comment">/* Preprocess the trimesh data to remove mark unnecessary edges and vertices */</span>
<a name="l00106"></a>00106 ODE_API <span class="keywordtype">void</span> dGeomTriMeshDataPreprocess(dTriMeshDataID g);
<a name="l00107"></a>00107 <span class="comment">/* Get and set the internal preprocessed trimesh data buffer, for loading and saving */</span>
<a name="l00108"></a>00108 ODE_API <span class="keywordtype">void</span> dGeomTriMeshDataGetBuffer(dTriMeshDataID g, <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>** buf, <span class="keywordtype">int</span>* bufLen);
<a name="l00109"></a>00109 ODE_API <span class="keywordtype">void</span> dGeomTriMeshDataSetBuffer(dTriMeshDataID g, <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>* buf);
<a name="l00110"></a>00110 
<a name="l00111"></a>00111 
<a name="l00112"></a>00112 <span class="comment">/*</span>
<a name="l00113"></a>00113 <span class="comment"> * Per triangle callback. Allows the user to say if he wants a collision with</span>
<a name="l00114"></a>00114 <span class="comment"> * a particular triangle.</span>
<a name="l00115"></a>00115 <span class="comment"> */</span>
<a name="l00116"></a>00116 <span class="keyword">typedef</span> <span class="keywordtype">int</span> dTriCallback(dGeomID TriMesh, dGeomID RefObject, <span class="keywordtype">int</span> TriangleIndex);
<a name="l00117"></a>00117 ODE_API <span class="keywordtype">void</span> dGeomTriMeshSetCallback(dGeomID g, dTriCallback* Callback);
<a name="l00118"></a>00118 ODE_API dTriCallback* dGeomTriMeshGetCallback(dGeomID g);
<a name="l00119"></a>00119 
<a name="l00120"></a>00120 <span class="comment">/*</span>
<a name="l00121"></a>00121 <span class="comment"> * Per object callback. Allows the user to get the list of triangles in 1</span>
<a name="l00122"></a>00122 <span class="comment"> * shot. Maybe we should remove this one.</span>
<a name="l00123"></a>00123 <span class="comment"> */</span>
<a name="l00124"></a>00124 <span class="keyword">typedef</span> <span class="keywordtype">void</span> dTriArrayCallback(dGeomID TriMesh, dGeomID RefObject, <span class="keyword">const</span> <span class="keywordtype">int</span>* TriIndices, <span class="keywordtype">int</span> TriCount);
<a name="l00125"></a>00125 ODE_API <span class="keywordtype">void</span> dGeomTriMeshSetArrayCallback(dGeomID g, dTriArrayCallback* ArrayCallback);
<a name="l00126"></a>00126 ODE_API dTriArrayCallback* dGeomTriMeshGetArrayCallback(dGeomID g);
<a name="l00127"></a>00127 
<a name="l00128"></a>00128 <span class="comment">/*</span>
<a name="l00129"></a>00129 <span class="comment"> * Ray callback.</span>
<a name="l00130"></a>00130 <span class="comment"> * Allows the user to say if a ray collides with a triangle on barycentric</span>
<a name="l00131"></a>00131 <span class="comment"> * coords. The user can for example sample a texture with alpha transparency</span>
<a name="l00132"></a>00132 <span class="comment"> * to determine if a collision should occur.</span>
<a name="l00133"></a>00133 <span class="comment"> */</span>
<a name="l00134"></a>00134 <span class="keyword">typedef</span> <span class="keywordtype">int</span> dTriRayCallback(dGeomID TriMesh, dGeomID Ray, <span class="keywordtype">int</span> TriangleIndex, dReal u, dReal v);
<a name="l00135"></a>00135 ODE_API <span class="keywordtype">void</span> dGeomTriMeshSetRayCallback(dGeomID g, dTriRayCallback* Callback);
<a name="l00136"></a>00136 ODE_API dTriRayCallback* dGeomTriMeshGetRayCallback(dGeomID g);
<a name="l00137"></a>00137 
<a name="l00138"></a>00138 <span class="comment">/*</span>
<a name="l00139"></a>00139 <span class="comment"> * Trimesh class</span>
<a name="l00140"></a>00140 <span class="comment"> * Construction. Callbacks are optional.</span>
<a name="l00141"></a>00141 <span class="comment"> */</span>
<a name="l00142"></a>00142 ODE_API dGeomID dCreateTriMesh(dSpaceID space, dTriMeshDataID Data, dTriCallback* Callback, dTriArrayCallback* ArrayCallback, dTriRayCallback* RayCallback);
<a name="l00143"></a>00143 
<a name="l00144"></a>00144 ODE_API <span class="keywordtype">void</span> dGeomTriMeshSetData(dGeomID g, dTriMeshDataID Data);
<a name="l00145"></a>00145 ODE_API dTriMeshDataID dGeomTriMeshGetData(dGeomID g);
<a name="l00146"></a>00146 
<a name="l00147"></a>00147 
<a name="l00148"></a>00148 <span class="comment">// enable/disable/check temporal coherence</span>
<a name="l00149"></a>00149 ODE_API <span class="keywordtype">void</span> dGeomTriMeshEnableTC(dGeomID g, <span class="keywordtype">int</span> geomClass, <span class="keywordtype">int</span> enable);
<a name="l00150"></a>00150 ODE_API <span class="keywordtype">int</span> dGeomTriMeshIsTCEnabled(dGeomID g, <span class="keywordtype">int</span> geomClass);
<a name="l00151"></a>00151 
<a name="l00152"></a>00152 <span class="comment">/*</span>
<a name="l00153"></a>00153 <span class="comment"> * Clears the internal temporal coherence caches. When a geom has its</span>
<a name="l00154"></a>00154 <span class="comment"> * collision checked with a trimesh once, data is stored inside the trimesh.</span>
<a name="l00155"></a>00155 <span class="comment"> * With large worlds with lots of seperate objects this list could get huge.</span>
<a name="l00156"></a>00156 <span class="comment"> * We should be able to do this automagically.</span>
<a name="l00157"></a>00157 <span class="comment"> */</span>
<a name="l00158"></a>00158 ODE_API <span class="keywordtype">void</span> dGeomTriMeshClearTCCache(dGeomID g);
<a name="l00159"></a>00159 
<a name="l00160"></a>00160 
<a name="l00161"></a>00161 <span class="comment">/*</span>
<a name="l00162"></a>00162 <span class="comment"> * returns the TriMeshDataID</span>
<a name="l00163"></a>00163 <span class="comment"> */</span>
<a name="l00164"></a>00164 ODE_API dTriMeshDataID dGeomTriMeshGetTriMeshDataID(dGeomID g);
<a name="l00165"></a>00165 
<a name="l00166"></a>00166 <span class="comment">/*</span>
<a name="l00167"></a>00167 <span class="comment"> * Gets a triangle.</span>
<a name="l00168"></a>00168 <span class="comment"> */</span>
<a name="l00169"></a>00169 ODE_API <span class="keywordtype">void</span> dGeomTriMeshGetTriangle(dGeomID g, <span class="keywordtype">int</span> Index, dVector3* v0, dVector3* v1, dVector3* v2);
<a name="l00170"></a>00170 
<a name="l00171"></a>00171 <span class="comment">/*</span>
<a name="l00172"></a>00172 <span class="comment"> * Gets the point on the requested triangle and the given barycentric</span>
<a name="l00173"></a>00173 <span class="comment"> * coordinates.</span>
<a name="l00174"></a>00174 <span class="comment"> */</span>
<a name="l00175"></a>00175 ODE_API <span class="keywordtype">void</span> dGeomTriMeshGetPoint(dGeomID g, <span class="keywordtype">int</span> Index, dReal u, dReal v, dVector3 Out);
<a name="l00176"></a>00176 
<a name="l00177"></a>00177 <span class="comment">/*</span>
<a name="l00178"></a>00178 <span class="comment"></span>
<a name="l00179"></a>00179 <span class="comment">This is how the strided data works:</span>
<a name="l00180"></a>00180 <span class="comment"></span>
<a name="l00181"></a>00181 <span class="comment">struct StridedVertex{</span>
<a name="l00182"></a>00182 <span class="comment">   dVector3 Vertex;</span>
<a name="l00183"></a>00183 <span class="comment">   // Userdata</span>
<a name="l00184"></a>00184 <span class="comment">};</span>
<a name="l00185"></a>00185 <span class="comment">int VertexStride = sizeof(StridedVertex);</span>
<a name="l00186"></a>00186 <span class="comment"></span>
<a name="l00187"></a>00187 <span class="comment">struct StridedTri{</span>
<a name="l00188"></a>00188 <span class="comment">   int Indices[3];</span>
<a name="l00189"></a>00189 <span class="comment">   // Userdata</span>
<a name="l00190"></a>00190 <span class="comment">};</span>
<a name="l00191"></a>00191 <span class="comment">int TriStride = sizeof(StridedTri);</span>
<a name="l00192"></a>00192 <span class="comment"></span>
<a name="l00193"></a>00193 <span class="comment">*/</span>
<a name="l00194"></a>00194 
<a name="l00195"></a>00195 
<a name="l00196"></a>00196 ODE_API <span class="keywordtype">int</span> dGeomTriMeshGetTriangleCount (dGeomID g);
<a name="l00197"></a>00197 
<a name="l00198"></a>00198 ODE_API <span class="keywordtype">void</span> dGeomTriMeshDataUpdate(dTriMeshDataID g);
<a name="l00199"></a>00199 
<a name="l00200"></a>00200 <span class="preprocessor">#ifdef __cplusplus</span>
<a name="l00201"></a>00201 <span class="preprocessor"></span>}
<a name="l00202"></a>00202 <span class="preprocessor">#endif</span>
<a name="l00203"></a>00203 <span class="preprocessor"></span>
<a name="l00204"></a>00204 <span class="preprocessor">#endif   </span><span class="comment">/* _ODE_COLLISION_TRIMESH_H_ */</span>
<a name="l00205"></a>00205 
</pre></div><hr size="1"><address style="text-align: right;"><small>Generated on Fri Oct 12 08:36:51 2007 for Open Dynamics Engine by&nbsp;
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.3 </small></address>
</body>
</html>