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
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
|
<!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: common.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 Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data Structures</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<h1>common.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,2002 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="preprocessor">#ifndef _ODE_COMMON_H_</span>
<a name="l00024"></a>00024 <span class="preprocessor"></span><span class="preprocessor">#define _ODE_COMMON_H_</span>
<a name="l00025"></a>00025 <span class="preprocessor"></span><span class="preprocessor">#include <ode/config.h></span>
<a name="l00026"></a>00026 <span class="preprocessor">#include <ode/error.h></span>
<a name="l00027"></a>00027 <span class="preprocessor">#include <math.h></span>
<a name="l00028"></a>00028
<a name="l00029"></a>00029 <span class="preprocessor">#ifdef __cplusplus</span>
<a name="l00030"></a>00030 <span class="preprocessor"></span><span class="keyword">extern</span> <span class="stringliteral">"C"</span> {
<a name="l00031"></a>00031 <span class="preprocessor">#endif</span>
<a name="l00032"></a>00032 <span class="preprocessor"></span>
<a name="l00033"></a>00033
<a name="l00034"></a>00034 <span class="comment">/* configuration stuff */</span>
<a name="l00035"></a>00035
<a name="l00036"></a>00036 <span class="comment">/* the efficient alignment. most platforms align data structures to some</span>
<a name="l00037"></a>00037 <span class="comment"> * number of bytes, but this is not always the most efficient alignment.</span>
<a name="l00038"></a>00038 <span class="comment"> * for example, many x86 compilers align to 4 bytes, but on a pentium it</span>
<a name="l00039"></a>00039 <span class="comment"> * is important to align doubles to 8 byte boundaries (for speed), and</span>
<a name="l00040"></a>00040 <span class="comment"> * the 4 floats in a SIMD register to 16 byte boundaries. many other</span>
<a name="l00041"></a>00041 <span class="comment"> * platforms have similar behavior. setting a larger alignment can waste</span>
<a name="l00042"></a>00042 <span class="comment"> * a (very) small amount of memory. NOTE: this number must be a power of</span>
<a name="l00043"></a>00043 <span class="comment"> * two. this is set to 16 by default.</span>
<a name="l00044"></a>00044 <span class="comment"> */</span>
<a name="l00045"></a>00045 <span class="preprocessor">#define EFFICIENT_ALIGNMENT 16</span>
<a name="l00046"></a>00046 <span class="preprocessor"></span>
<a name="l00047"></a>00047
<a name="l00048"></a>00048 <span class="comment">/* constants */</span>
<a name="l00049"></a>00049
<a name="l00050"></a>00050 <span class="comment">/* pi and 1/sqrt(2) are defined here if necessary because they don't get</span>
<a name="l00051"></a>00051 <span class="comment"> * defined in <math.h> on some platforms (like MS-Windows)</span>
<a name="l00052"></a>00052 <span class="comment"> */</span>
<a name="l00053"></a>00053
<a name="l00054"></a>00054 <span class="preprocessor">#ifndef M_PI</span>
<a name="l00055"></a>00055 <span class="preprocessor"></span><span class="preprocessor">#define M_PI REAL(3.1415926535897932384626433832795029)</span>
<a name="l00056"></a>00056 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00057"></a>00057 <span class="preprocessor"></span><span class="preprocessor">#ifndef M_SQRT1_2</span>
<a name="l00058"></a>00058 <span class="preprocessor"></span><span class="preprocessor">#define M_SQRT1_2 REAL(0.7071067811865475244008443621048490)</span>
<a name="l00059"></a>00059 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00060"></a>00060 <span class="preprocessor"></span>
<a name="l00061"></a>00061
<a name="l00062"></a>00062 <span class="comment">/* debugging:</span>
<a name="l00063"></a>00063 <span class="comment"> * IASSERT is an internal assertion, i.e. a consistency check. if it fails</span>
<a name="l00064"></a>00064 <span class="comment"> * we want to know where.</span>
<a name="l00065"></a>00065 <span class="comment"> * UASSERT is a user assertion, i.e. if it fails a nice error message</span>
<a name="l00066"></a>00066 <span class="comment"> * should be printed for the user.</span>
<a name="l00067"></a>00067 <span class="comment"> * AASSERT is an arguments assertion, i.e. if it fails "bad argument(s)"</span>
<a name="l00068"></a>00068 <span class="comment"> * is printed.</span>
<a name="l00069"></a>00069 <span class="comment"> * DEBUGMSG just prints out a message</span>
<a name="l00070"></a>00070 <span class="comment"> */</span>
<a name="l00071"></a>00071
<a name="l00072"></a>00072 <span class="preprocessor">#ifndef dNODEBUG</span>
<a name="l00073"></a>00073 <span class="preprocessor"></span><span class="preprocessor">#ifdef __GNUC__</span>
<a name="l00074"></a>00074 <span class="preprocessor"></span><span class="preprocessor">#define dIASSERT(a) if (!(a)) dDebug (d_ERR_IASSERT, \</span>
<a name="l00075"></a>00075 <span class="preprocessor"> "assertion \"" #a "\" failed in %s() [%s]",__FUNCTION__,__FILE__);</span>
<a name="l00076"></a>00076 <span class="preprocessor"></span><span class="preprocessor">#define dUASSERT(a,msg) if (!(a)) dDebug (d_ERR_UASSERT, \</span>
<a name="l00077"></a>00077 <span class="preprocessor"> msg " in %s()", __FUNCTION__);</span>
<a name="l00078"></a>00078 <span class="preprocessor"></span><span class="preprocessor">#define dDEBUGMSG(msg) dMessage (d_ERR_UASSERT, \</span>
<a name="l00079"></a>00079 <span class="preprocessor">msg " in %s() File %s Line %d", __FUNCTION__, __FILE__,__LINE__);</span>
<a name="l00080"></a>00080 <span class="preprocessor"></span><span class="preprocessor">#else</span>
<a name="l00081"></a>00081 <span class="preprocessor"></span><span class="preprocessor">#define dIASSERT(a) if (!(a)) dDebug (d_ERR_IASSERT, \</span>
<a name="l00082"></a>00082 <span class="preprocessor"> "assertion \"" #a "\" failed in %s:%d",__FILE__,__LINE__);</span>
<a name="l00083"></a>00083 <span class="preprocessor"></span><span class="preprocessor">#define dUASSERT(a,msg) if (!(a)) dDebug (d_ERR_UASSERT, \</span>
<a name="l00084"></a>00084 <span class="preprocessor"> msg " (%s:%d)", __FILE__,__LINE__);</span>
<a name="l00085"></a>00085 <span class="preprocessor"></span><span class="preprocessor">#define dDEBUGMSG(msg) dMessage (d_ERR_UASSERT, \</span>
<a name="l00086"></a>00086 <span class="preprocessor"> msg " (%s:%d)", __FILE__,__LINE__);</span>
<a name="l00087"></a>00087 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00088"></a>00088 <span class="preprocessor"></span><span class="preprocessor">#else</span>
<a name="l00089"></a>00089 <span class="preprocessor"></span><span class="preprocessor">#define dIASSERT(a) ;</span>
<a name="l00090"></a>00090 <span class="preprocessor"></span><span class="preprocessor">#define dUASSERT(a,msg) ;</span>
<a name="l00091"></a>00091 <span class="preprocessor"></span><span class="preprocessor">#define dDEBUGMSG(msg) ;</span>
<a name="l00092"></a>00092 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00093"></a>00093 <span class="preprocessor"></span><span class="preprocessor">#define dAASSERT(a) dUASSERT(a,"Bad argument(s)")</span>
<a name="l00094"></a>00094 <span class="preprocessor"></span>
<a name="l00095"></a>00095 <span class="comment">// Macro used to suppress unused variable warning</span>
<a name="l00096"></a>00096 <span class="preprocessor">#define dVARIABLEUSED(a) ((void)a)</span>
<a name="l00097"></a>00097 <span class="preprocessor"></span>
<a name="l00098"></a>00098 <span class="comment">/* floating point data type, vector, matrix and quaternion types */</span>
<a name="l00099"></a>00099
<a name="l00100"></a>00100 <span class="preprocessor">#if defined(dSINGLE)</span>
<a name="l00101"></a>00101 <span class="preprocessor"></span><span class="keyword">typedef</span> <span class="keywordtype">float</span> dReal;
<a name="l00102"></a>00102 <span class="preprocessor">#ifdef dDOUBLE</span>
<a name="l00103"></a>00103 <span class="preprocessor"></span><span class="preprocessor">#error You can only #define dSINGLE or dDOUBLE, not both.</span>
<a name="l00104"></a>00104 <span class="preprocessor"></span><span class="preprocessor">#endif // dDOUBLE</span>
<a name="l00105"></a>00105 <span class="preprocessor"></span><span class="preprocessor">#elif defined(dDOUBLE)</span>
<a name="l00106"></a>00106 <span class="preprocessor"></span><span class="keyword">typedef</span> <span class="keywordtype">double</span> dReal;
<a name="l00107"></a>00107 <span class="preprocessor">#else</span>
<a name="l00108"></a>00108 <span class="preprocessor"></span><span class="preprocessor">#error You must #define dSINGLE or dDOUBLE</span>
<a name="l00109"></a>00109 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00110"></a>00110 <span class="preprocessor"></span>
<a name="l00111"></a>00111 <span class="comment">// Detect if we've got both trimesh engines enabled.</span>
<a name="l00112"></a>00112 <span class="preprocessor">#if dTRIMESH_ENABLED</span>
<a name="l00113"></a>00113 <span class="preprocessor"></span><span class="preprocessor">#if dTRIMESH_OPCODE && dTRIMESH_GIMPACT</span>
<a name="l00114"></a>00114 <span class="preprocessor"></span><span class="preprocessor">#error You can only #define dTRIMESH_OPCODE or dTRIMESH_GIMPACT, not both.</span>
<a name="l00115"></a>00115 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00116"></a>00116 <span class="preprocessor"></span><span class="preprocessor">#endif // dTRIMESH_ENABLED</span>
<a name="l00117"></a>00117 <span class="preprocessor"></span>
<a name="l00118"></a>00118 <span class="comment">/* round an integer up to a multiple of 4, except that 0 and 1 are unmodified</span>
<a name="l00119"></a>00119 <span class="comment"> * (used to compute matrix leading dimensions)</span>
<a name="l00120"></a>00120 <span class="comment"> */</span>
<a name="l00121"></a>00121 <span class="preprocessor">#define dPAD(a) (((a) > 1) ? ((((a)-1)|3)+1) : (a))</span>
<a name="l00122"></a>00122 <span class="preprocessor"></span>
<a name="l00123"></a>00123 <span class="comment">/* these types are mainly just used in headers */</span>
<a name="l00124"></a>00124 <span class="keyword">typedef</span> dReal dVector3[4];
<a name="l00125"></a>00125 <span class="keyword">typedef</span> dReal dVector4[4];
<a name="l00126"></a>00126 <span class="keyword">typedef</span> dReal dMatrix3[4*3];
<a name="l00127"></a>00127 <span class="keyword">typedef</span> dReal dMatrix4[4*4];
<a name="l00128"></a>00128 <span class="keyword">typedef</span> dReal dMatrix6[8*6];
<a name="l00129"></a>00129 <span class="keyword">typedef</span> dReal dQuaternion[4];
<a name="l00130"></a>00130
<a name="l00131"></a>00131
<a name="l00132"></a>00132 <span class="comment">/* precision dependent scalar math functions */</span>
<a name="l00133"></a>00133
<a name="l00134"></a>00134 <span class="preprocessor">#if defined(dSINGLE)</span>
<a name="l00135"></a>00135 <span class="preprocessor"></span>
<a name="l00136"></a>00136 <span class="preprocessor">#define REAL(x) (x ## f) </span><span class="comment">/* form a constant */</span>
<a name="l00137"></a>00137 <span class="preprocessor">#define dRecip(x) ((1.0f/(x))) </span><span class="comment">/* reciprocal */</span>
<a name="l00138"></a>00138 <span class="preprocessor">#define dSqrt(x) (sqrtf(x)) </span><span class="comment">/* square root */</span>
<a name="l00139"></a>00139 <span class="preprocessor">#define dRecipSqrt(x) ((1.0f/sqrtf(x))) </span><span class="comment">/* reciprocal square root */</span>
<a name="l00140"></a>00140 <span class="preprocessor">#define dSin(x) (sinf(x)) </span><span class="comment">/* sine */</span>
<a name="l00141"></a>00141 <span class="preprocessor">#define dCos(x) (cosf(x)) </span><span class="comment">/* cosine */</span>
<a name="l00142"></a>00142 <span class="preprocessor">#define dFabs(x) (fabsf(x)) </span><span class="comment">/* absolute value */</span>
<a name="l00143"></a>00143 <span class="preprocessor">#define dAtan2(y,x) (atan2f(y,x)) </span><span class="comment">/* arc tangent with 2 args */</span>
<a name="l00144"></a>00144 <span class="preprocessor">#define dFMod(a,b) (fmodf(a,b)) </span><span class="comment">/* modulo */</span>
<a name="l00145"></a>00145 <span class="preprocessor">#define dFloor(x) floorf(x) </span><span class="comment">/* floor */</span>
<a name="l00146"></a>00146
<a name="l00147"></a>00147 <span class="preprocessor">#ifdef HAVE___ISNANF</span>
<a name="l00148"></a>00148 <span class="preprocessor"></span><span class="preprocessor">#define dIsNan(x) (__isnanf(x))</span>
<a name="l00149"></a>00149 <span class="preprocessor"></span><span class="preprocessor">#elif defined(HAVE__ISNANF)</span>
<a name="l00150"></a>00150 <span class="preprocessor"></span><span class="preprocessor">#define dIsNan(x) (_isnanf(x))</span>
<a name="l00151"></a>00151 <span class="preprocessor"></span><span class="preprocessor">#elif defined(HAVE_ISNANF)</span>
<a name="l00152"></a>00152 <span class="preprocessor"></span><span class="preprocessor">#define dIsNan(x) (isnanf(x))</span>
<a name="l00153"></a>00153 <span class="preprocessor"></span><span class="preprocessor">#else</span>
<a name="l00154"></a>00154 <span class="preprocessor"></span> <span class="comment">/*</span>
<a name="l00155"></a>00155 <span class="comment"> fall back to _isnan which is the VC way,</span>
<a name="l00156"></a>00156 <span class="comment"> this may seem redundant since we already checked</span>
<a name="l00157"></a>00157 <span class="comment"> for _isnan before, but if isnan is detected by</span>
<a name="l00158"></a>00158 <span class="comment"> configure but is not found during compilation</span>
<a name="l00159"></a>00159 <span class="comment"> we should always make sure we check for __isnanf,</span>
<a name="l00160"></a>00160 <span class="comment"> _isnanf and isnanf in that order before falling</span>
<a name="l00161"></a>00161 <span class="comment"> back to a default</span>
<a name="l00162"></a>00162 <span class="comment"> */</span>
<a name="l00163"></a>00163 <span class="preprocessor">#define dIsNan(x) (_isnan(x))</span>
<a name="l00164"></a>00164 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00165"></a>00165 <span class="preprocessor"></span>
<a name="l00166"></a>00166 <span class="preprocessor">#define dCopySign(a,b) ((dReal)copysignf(a,b))</span>
<a name="l00167"></a>00167 <span class="preprocessor"></span>
<a name="l00168"></a>00168 <span class="preprocessor">#elif defined(dDOUBLE)</span>
<a name="l00169"></a>00169 <span class="preprocessor"></span>
<a name="l00170"></a>00170 <span class="preprocessor">#define REAL(x) (x)</span>
<a name="l00171"></a>00171 <span class="preprocessor"></span><span class="preprocessor">#define dRecip(x) (1.0/(x))</span>
<a name="l00172"></a>00172 <span class="preprocessor"></span><span class="preprocessor">#define dSqrt(x) sqrt(x)</span>
<a name="l00173"></a>00173 <span class="preprocessor"></span><span class="preprocessor">#define dRecipSqrt(x) (1.0/sqrt(x))</span>
<a name="l00174"></a>00174 <span class="preprocessor"></span><span class="preprocessor">#define dSin(x) sin(x)</span>
<a name="l00175"></a>00175 <span class="preprocessor"></span><span class="preprocessor">#define dCos(x) cos(x)</span>
<a name="l00176"></a>00176 <span class="preprocessor"></span><span class="preprocessor">#define dFabs(x) fabs(x)</span>
<a name="l00177"></a>00177 <span class="preprocessor"></span><span class="preprocessor">#define dAtan2(y,x) atan2((y),(x))</span>
<a name="l00178"></a>00178 <span class="preprocessor"></span><span class="preprocessor">#define dFMod(a,b) (fmod((a),(b)))</span>
<a name="l00179"></a>00179 <span class="preprocessor"></span><span class="preprocessor">#define dFloor(x) floor(x)</span>
<a name="l00180"></a>00180 <span class="preprocessor"></span>
<a name="l00181"></a>00181 <span class="preprocessor">#ifdef HAVE___ISNAN</span>
<a name="l00182"></a>00182 <span class="preprocessor"></span><span class="preprocessor">#define dIsNan(x) (__isnan(x))</span>
<a name="l00183"></a>00183 <span class="preprocessor"></span><span class="preprocessor">#elif defined(HAVE__ISNAN)</span>
<a name="l00184"></a>00184 <span class="preprocessor"></span><span class="preprocessor">#define dIsNan(x) (_isnan(x))</span>
<a name="l00185"></a>00185 <span class="preprocessor"></span><span class="preprocessor">#elif defined(HAVE_ISNAN)</span>
<a name="l00186"></a>00186 <span class="preprocessor"></span><span class="preprocessor">#define dIsNan(x) (isnan(x))</span>
<a name="l00187"></a>00187 <span class="preprocessor"></span><span class="preprocessor">#else</span>
<a name="l00188"></a>00188 <span class="preprocessor"></span><span class="preprocessor">#define dIsNan(x) (_isnan(x))</span>
<a name="l00189"></a>00189 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00190"></a>00190 <span class="preprocessor"></span>
<a name="l00191"></a>00191 <span class="preprocessor">#define dCopySign(a,b) (copysign((a),(b)))</span>
<a name="l00192"></a>00192 <span class="preprocessor"></span>
<a name="l00193"></a>00193 <span class="preprocessor">#else</span>
<a name="l00194"></a>00194 <span class="preprocessor"></span><span class="preprocessor">#error You must #define dSINGLE or dDOUBLE</span>
<a name="l00195"></a>00195 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00196"></a>00196 <span class="preprocessor"></span>
<a name="l00197"></a>00197
<a name="l00198"></a>00198 <span class="comment">/* utility */</span>
<a name="l00199"></a>00199
<a name="l00200"></a>00200
<a name="l00201"></a>00201 <span class="comment">/* round something up to be a multiple of the EFFICIENT_ALIGNMENT */</span>
<a name="l00202"></a>00202
<a name="l00203"></a>00203 <span class="preprocessor">#define dEFFICIENT_SIZE(x) ((((x)-1)|(EFFICIENT_ALIGNMENT-1))+1)</span>
<a name="l00204"></a>00204 <span class="preprocessor"></span>
<a name="l00205"></a>00205
<a name="l00206"></a>00206 <span class="comment">/* alloca aligned to the EFFICIENT_ALIGNMENT. note that this can waste</span>
<a name="l00207"></a>00207 <span class="comment"> * up to 15 bytes per allocation, depending on what alloca() returns.</span>
<a name="l00208"></a>00208 <span class="comment"> */</span>
<a name="l00209"></a>00209
<a name="l00210"></a>00210 <span class="preprocessor">#define dALLOCA16(n) \</span>
<a name="l00211"></a>00211 <span class="preprocessor"> ((char*)dEFFICIENT_SIZE(((size_t)(alloca((n)+(EFFICIENT_ALIGNMENT-1))))))</span>
<a name="l00212"></a>00212 <span class="preprocessor"></span>
<a name="l00213"></a>00213
<a name="l00214"></a>00214 <span class="comment">// Use the error-checking memory allocation system. Because this system uses heap</span>
<a name="l00215"></a>00215 <span class="comment">// (malloc) instead of stack (alloca), it is slower. However, it allows you to</span>
<a name="l00216"></a>00216 <span class="comment">// simulate larger scenes, as well as handle out-of-memory errors in a somewhat</span>
<a name="l00217"></a>00217 <span class="comment">// graceful manner</span>
<a name="l00218"></a>00218
<a name="l00219"></a>00219 <span class="comment">// #define dUSE_MALLOC_FOR_ALLOCA</span>
<a name="l00220"></a>00220
<a name="l00221"></a>00221 <span class="preprocessor">#ifdef dUSE_MALLOC_FOR_ALLOCA</span>
<a name="l00222"></a>00222 <span class="preprocessor"></span><span class="keyword">enum</span> {
<a name="l00223"></a>00223 d_MEMORY_OK = 0, <span class="comment">/* no memory errors */</span>
<a name="l00224"></a>00224 d_MEMORY_OUT_OF_MEMORY <span class="comment">/* malloc failed due to out of memory error */</span>
<a name="l00225"></a>00225 };
<a name="l00226"></a>00226
<a name="l00227"></a>00227 <span class="preprocessor">#endif</span>
<a name="l00228"></a>00228 <span class="preprocessor"></span>
<a name="l00229"></a>00229
<a name="l00230"></a>00230
<a name="l00231"></a>00231 <span class="comment">/* internal object types (all prefixed with `dx') */</span>
<a name="l00232"></a>00232
<a name="l00233"></a>00233 <span class="keyword">struct </span>dxWorld; <span class="comment">/* dynamics world */</span>
<a name="l00234"></a>00234 <span class="keyword">struct </span>dxSpace; <span class="comment">/* collision space */</span>
<a name="l00235"></a>00235 <span class="keyword">struct </span>dxBody; <span class="comment">/* rigid body (dynamics object) */</span>
<a name="l00236"></a>00236 <span class="keyword">struct </span>dxGeom; <span class="comment">/* geometry (collision object) */</span>
<a name="l00237"></a>00237 <span class="keyword">struct </span>dxJoint;
<a name="l00238"></a>00238 <span class="keyword">struct </span>dxJointNode;
<a name="l00239"></a>00239 <span class="keyword">struct </span>dxJointGroup;
<a name="l00240"></a>00240
<a name="l00241"></a>00241 <span class="keyword">typedef</span> <span class="keyword">struct </span>dxWorld *dWorldID;
<a name="l00242"></a>00242 <span class="keyword">typedef</span> <span class="keyword">struct </span>dxSpace *dSpaceID;
<a name="l00243"></a>00243 <span class="keyword">typedef</span> <span class="keyword">struct </span>dxBody *dBodyID;
<a name="l00244"></a>00244 <span class="keyword">typedef</span> <span class="keyword">struct </span>dxGeom *dGeomID;
<a name="l00245"></a>00245 <span class="keyword">typedef</span> <span class="keyword">struct </span>dxJoint *dJointID;
<a name="l00246"></a>00246 <span class="keyword">typedef</span> <span class="keyword">struct </span>dxJointGroup *dJointGroupID;
<a name="l00247"></a>00247
<a name="l00248"></a>00248
<a name="l00249"></a>00249 <span class="comment">/* error numbers */</span>
<a name="l00250"></a>00250
<a name="l00251"></a>00251 <span class="keyword">enum</span> {
<a name="l00252"></a>00252 d_ERR_UNKNOWN = 0, <span class="comment">/* unknown error */</span>
<a name="l00253"></a>00253 d_ERR_IASSERT, <span class="comment">/* internal assertion failed */</span>
<a name="l00254"></a>00254 d_ERR_UASSERT, <span class="comment">/* user assertion failed */</span>
<a name="l00255"></a>00255 d_ERR_LCP <span class="comment">/* user assertion failed */</span>
<a name="l00256"></a>00256 };
<a name="l00257"></a>00257
<a name="l00258"></a>00258
<a name="l00259"></a>00259 <span class="comment">/* joint type numbers */</span>
<a name="l00260"></a>00260
<a name="l00261"></a>00261 <span class="keyword">enum</span> {
<a name="l00262"></a>00262 dJointTypeNone = 0, <span class="comment">/* or "unknown" */</span>
<a name="l00263"></a>00263 dJointTypeBall,
<a name="l00264"></a>00264 dJointTypeHinge,
<a name="l00265"></a>00265 dJointTypeSlider,
<a name="l00266"></a>00266 dJointTypeContact,
<a name="l00267"></a>00267 dJointTypeUniversal,
<a name="l00268"></a>00268 dJointTypeHinge2,
<a name="l00269"></a>00269 dJointTypeFixed,
<a name="l00270"></a>00270 dJointTypeNull,
<a name="l00271"></a>00271 dJointTypeAMotor,
<a name="l00272"></a>00272 dJointTypeLMotor,
<a name="l00273"></a>00273 dJointTypePlane2D,
<a name="l00274"></a>00274 dJointTypePR
<a name="l00275"></a>00275 };
<a name="l00276"></a>00276
<a name="l00277"></a>00277
<a name="l00278"></a>00278 <span class="comment">/* an alternative way of setting joint parameters, using joint parameter</span>
<a name="l00279"></a>00279 <span class="comment"> * structures and member constants. we don't actually do this yet.</span>
<a name="l00280"></a>00280 <span class="comment"> */</span>
<a name="l00281"></a>00281
<a name="l00282"></a>00282 <span class="comment">/*</span>
<a name="l00283"></a>00283 <span class="comment">typedef struct dLimot {</span>
<a name="l00284"></a>00284 <span class="comment"> int mode;</span>
<a name="l00285"></a>00285 <span class="comment"> dReal lostop, histop;</span>
<a name="l00286"></a>00286 <span class="comment"> dReal vel, fmax;</span>
<a name="l00287"></a>00287 <span class="comment"> dReal fudge_factor;</span>
<a name="l00288"></a>00288 <span class="comment"> dReal bounce, soft;</span>
<a name="l00289"></a>00289 <span class="comment"> dReal suspension_erp, suspension_cfm;</span>
<a name="l00290"></a>00290 <span class="comment">} dLimot;</span>
<a name="l00291"></a>00291 <span class="comment"></span>
<a name="l00292"></a>00292 <span class="comment">enum {</span>
<a name="l00293"></a>00293 <span class="comment"> dLimotLoStop = 0x0001,</span>
<a name="l00294"></a>00294 <span class="comment"> dLimotHiStop = 0x0002,</span>
<a name="l00295"></a>00295 <span class="comment"> dLimotVel = 0x0004,</span>
<a name="l00296"></a>00296 <span class="comment"> dLimotFMax = 0x0008,</span>
<a name="l00297"></a>00297 <span class="comment"> dLimotFudgeFactor = 0x0010,</span>
<a name="l00298"></a>00298 <span class="comment"> dLimotBounce = 0x0020,</span>
<a name="l00299"></a>00299 <span class="comment"> dLimotSoft = 0x0040</span>
<a name="l00300"></a>00300 <span class="comment">};</span>
<a name="l00301"></a>00301 <span class="comment">*/</span>
<a name="l00302"></a>00302
<a name="l00303"></a>00303
<a name="l00304"></a>00304 <span class="comment">/* standard joint parameter names. why are these here? - because we don't want</span>
<a name="l00305"></a>00305 <span class="comment"> * to include all the joint function definitions in joint.cpp. hmmmm.</span>
<a name="l00306"></a>00306 <span class="comment"> * MSVC complains if we call D_ALL_PARAM_NAMES_X with a blank second argument,</span>
<a name="l00307"></a>00307 <span class="comment"> * which is why we have the D_ALL_PARAM_NAMES macro as well. please copy and</span>
<a name="l00308"></a>00308 <span class="comment"> * paste between these two.</span>
<a name="l00309"></a>00309 <span class="comment"> */</span>
<a name="l00310"></a>00310
<a name="l00311"></a>00311 <span class="preprocessor">#define D_ALL_PARAM_NAMES(start) \</span>
<a name="l00312"></a>00312 <span class="preprocessor"> </span><span class="comment">/* parameters for limits and motors */</span> \
<a name="l00313"></a>00313 dParamLoStop = start, \
<a name="l00314"></a>00314 dParamHiStop, \
<a name="l00315"></a>00315 dParamVel, \
<a name="l00316"></a>00316 dParamFMax, \
<a name="l00317"></a>00317 dParamFudgeFactor, \
<a name="l00318"></a>00318 dParamBounce, \
<a name="l00319"></a>00319 dParamCFM, \
<a name="l00320"></a>00320 dParamStopERP, \
<a name="l00321"></a>00321 dParamStopCFM, \
<a name="l00322"></a>00322 <span class="comment">/* parameters for suspension */</span> \
<a name="l00323"></a>00323 dParamSuspensionERP, \
<a name="l00324"></a>00324 dParamSuspensionCFM, \
<a name="l00325"></a>00325 dParamERP, \
<a name="l00326"></a>00326
<a name="l00327"></a>00327 <span class="preprocessor">#define D_ALL_PARAM_NAMES_X(start,x) \</span>
<a name="l00328"></a>00328 <span class="preprocessor"> </span><span class="comment">/* parameters for limits and motors */</span> \
<a name="l00329"></a>00329 dParamLoStop ## x = start, \
<a name="l00330"></a>00330 dParamHiStop ## x, \
<a name="l00331"></a>00331 dParamVel ## x, \
<a name="l00332"></a>00332 dParamFMax ## x, \
<a name="l00333"></a>00333 dParamFudgeFactor ## x, \
<a name="l00334"></a>00334 dParamBounce ## x, \
<a name="l00335"></a>00335 dParamCFM ## x, \
<a name="l00336"></a>00336 dParamStopERP ## x, \
<a name="l00337"></a>00337 dParamStopCFM ## x, \
<a name="l00338"></a>00338 <span class="comment">/* parameters for suspension */</span> \
<a name="l00339"></a>00339 dParamSuspensionERP ## x, \
<a name="l00340"></a>00340 dParamSuspensionCFM ## x, \
<a name="l00341"></a>00341 dParamERP ## x,
<a name="l00342"></a>00342
<a name="l00343"></a>00343 <span class="keyword">enum</span> {
<a name="l00344"></a>00344 D_ALL_PARAM_NAMES(0)
<a name="l00345"></a>00345 D_ALL_PARAM_NAMES_X(0x100,2)
<a name="l00346"></a>00346 D_ALL_PARAM_NAMES_X(0x200,3)
<a name="l00347"></a>00347
<a name="l00348"></a>00348 <span class="comment">/* add a multiple of this constant to the basic parameter numbers to get</span>
<a name="l00349"></a>00349 <span class="comment"> * the parameters for the second, third etc axes.</span>
<a name="l00350"></a>00350 <span class="comment"> */</span>
<a name="l00351"></a>00351 dParamGroup=0x100
<a name="l00352"></a>00352 };
<a name="l00353"></a>00353
<a name="l00354"></a>00354
<a name="l00355"></a>00355 <span class="comment">/* angular motor mode numbers */</span>
<a name="l00356"></a>00356
<a name="l00357"></a>00357 enum{
<a name="l00358"></a>00358 dAMotorUser = 0,
<a name="l00359"></a>00359 dAMotorEuler = 1
<a name="l00360"></a>00360 };
<a name="l00361"></a>00361
<a name="l00362"></a>00362
<a name="l00363"></a>00363 <span class="comment">/* joint force feedback information */</span>
<a name="l00364"></a>00364
<a name="l00365"></a>00365 <span class="keyword">typedef</span> <span class="keyword">struct </span>dJointFeedback {
<a name="l00366"></a>00366 dVector3 f1; <span class="comment">/* force applied to body 1 */</span>
<a name="l00367"></a>00367 dVector3 t1; <span class="comment">/* torque applied to body 1 */</span>
<a name="l00368"></a>00368 dVector3 f2; <span class="comment">/* force applied to body 2 */</span>
<a name="l00369"></a>00369 dVector3 t2; <span class="comment">/* torque applied to body 2 */</span>
<a name="l00370"></a>00370 } dJointFeedback;
<a name="l00371"></a>00371
<a name="l00372"></a>00372
<a name="l00373"></a>00373 <span class="comment">/* private functions that must be implemented by the collision library:</span>
<a name="l00374"></a>00374 <span class="comment"> * (1) indicate that a geom has moved, (2) get the next geom in a body list.</span>
<a name="l00375"></a>00375 <span class="comment"> * these functions are called whenever the position of geoms connected to a</span>
<a name="l00376"></a>00376 <span class="comment"> * body have changed, e.g. with dBodySetPosition(), dBodySetRotation(), or</span>
<a name="l00377"></a>00377 <span class="comment"> * when the ODE step function updates the body state.</span>
<a name="l00378"></a>00378 <span class="comment"> */</span>
<a name="l00379"></a>00379
<a name="l00380"></a>00380 <span class="keywordtype">void</span> dGeomMoved (dGeomID);
<a name="l00381"></a>00381 dGeomID dGeomGetBodyNext (dGeomID);
<a name="l00382"></a>00382
<a name="l00383"></a>00383
<a name="l00384"></a>00384 <span class="preprocessor">#ifdef __cplusplus</span>
<a name="l00385"></a>00385 <span class="preprocessor"></span>}
<a name="l00386"></a>00386 <span class="preprocessor">#endif</span>
<a name="l00387"></a>00387 <span class="preprocessor"></span>
<a name="l00388"></a>00388 <span class="preprocessor">#endif</span>
</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
<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>
|