705d222eb50f848c244711256a7597dba914baf0
[blender.git] / extern / ode / dist / include / ode / common.h
1 /*************************************************************************
2  *                                                                       *
3  * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith.       *
4  * All rights reserved.  Email: russ@q12.org   Web: www.q12.org          *
5  *                                                                       *
6  * This library is free software; you can redistribute it and/or         *
7  * modify it under the terms of EITHER:                                  *
8  *   (1) The GNU Lesser General Public License as published by the Free  *
9  *       Software Foundation; either version 2.1 of the License, or (at  *
10  *       your option) any later version. The text of the GNU Lesser      *
11  *       General Public License is included with this library in the     *
12  *       file LICENSE.TXT.                                               *
13  *   (2) The BSD-style license that is included with this library in     *
14  *       the file LICENSE-BSD.TXT.                                       *
15  *                                                                       *
16  * This library is distributed in the hope that it will be useful,       *
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of        *
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files    *
19  * LICENSE.TXT and LICENSE-BSD.TXT for more details.                     *
20  *                                                                       *
21  *************************************************************************/
22
23 #ifndef _ODE_COMMON_H_
24 #define _ODE_COMMON_H_
25
26 #include <ode/config.h>
27 #include <ode/error.h>
28
29 #ifdef __cplusplus
30 extern "C" {
31 #endif
32
33
34 /* configuration stuff */
35
36 /* the efficient alignment. most platforms align data structures to some
37  * number of bytes, but this is not always the most efficient alignment.
38  * for example, many x86 compilers align to 4 bytes, but on a pentium it
39  * is important to align doubles to 8 byte boundaries (for speed), and
40  * the 4 floats in a SIMD register to 16 byte boundaries. many other
41  * platforms have similar behavior. setting a larger alignment can waste
42  * a (very) small amount of memory. NOTE: this number must be a power of
43  * two. this is set to 16 by default.
44  */
45 #define EFFICIENT_ALIGNMENT 16
46
47
48 /* constants */
49
50 /* pi and 1/sqrt(2) are defined here if necessary because they don't get
51  * defined in <math.h> on some platforms (like MS-Windows)
52  */
53
54 #ifndef M_PI
55 #define M_PI REAL(3.1415926535897932384626433832795029)
56 #endif
57 #ifndef M_SQRT1_2
58 #define M_SQRT1_2 REAL(0.7071067811865475244008443621048490)
59 #endif
60
61
62 /* debugging:
63  *   IASSERT  is an internal assertion, i.e. a consistency check. if it fails
64  *            we want to know where.
65  *   UASSERT  is a user assertion, i.e. if it fails a nice error message
66  *            should be printed for the user.
67  *   AASSERT  is an arguments assertion, i.e. if it fails "bad argument(s)"
68  *            is printed.
69  *   DEBUGMSG just prints out a message
70  */
71
72 #ifndef dNODEBUG
73 #ifdef __GNUC__
74 #define dIASSERT(a) if (!(a)) dDebug (d_ERR_IASSERT, \
75   "assertion \"" #a "\" failed in %s() [%s]",__FUNCTION__,__FILE__);
76 #define dUASSERT(a,msg) if (!(a)) dDebug (d_ERR_UASSERT, \
77   msg " in %s()", __FUNCTION__);
78 #define dDEBUGMSG(msg) dMessage (d_ERR_UASSERT, \
79   msg " in %s()", __FUNCTION__);
80 #else
81 #define dIASSERT(a) if (!(a)) dDebug (d_ERR_IASSERT, \
82   "assertion \"" #a "\" failed in %s:%d",__FILE__,__LINE__);
83 #define dUASSERT(a,msg) if (!(a)) dDebug (d_ERR_UASSERT, \
84   msg " (%s:%d)", __FILE__,__LINE__);
85 #define dDEBUGMSG(msg) dMessage (d_ERR_UASSERT, \
86   msg " (%s:%d)", __FILE__,__LINE__);
87 #endif
88 #else
89 #define dIASSERT(a) ;
90 #define dUASSERT(a,msg) ;
91 #define dDEBUGMSG(msg) ;
92 #endif
93 #define dAASSERT(a) dUASSERT(a,"Bad argument(s)")
94
95 /* floating point data type, vector, matrix and quaternion types */
96
97 #if defined(dSINGLE)
98 typedef float dReal;
99 #elif defined(dDOUBLE)
100 typedef double dReal;
101 #else
102 #error You must #define dSINGLE or dDOUBLE
103 #endif
104
105
106 /* round an integer up to a multiple of 4, except that 0 and 1 are unmodified
107  * (used to compute matrix leading dimensions)
108  */
109 #define dPAD(a) (((a) > 1) ? ((((a)-1)|3)+1) : (a))
110
111 /* these types are mainly just used in headers */
112 typedef dReal dVector3[4];
113 typedef dReal dVector4[4];
114 typedef dReal dMatrix3[4*3];
115 typedef dReal dMatrix4[4*4];
116 typedef dReal dMatrix6[8*6];
117 typedef dReal dQuaternion[4];
118
119
120 /* precision dependent scalar math functions */
121
122 #if defined(dSINGLE)
123
124 #define REAL(x) (x ## f)                        /* form a constant */
125 #define dRecip(x) ((float)(1.0f/(x)))           /* reciprocal */
126 #define dSqrt(x) ((float)sqrt(x))               /* square root */
127 #define dRecipSqrt(x) ((float)(1.0f/sqrt(x)))   /* reciprocal square root */
128 #define dSin(x) ((float)sin(x))                 /* sine */
129 #define dCos(x) ((float)cos(x))                 /* cosine */
130 #define dFabs(x) ((float)fabs(x))               /* absolute value */
131 #define dAtan2(y,x) ((float)atan2((y),(x)))     /* arc tangent with 2 args */
132
133 #elif defined(dDOUBLE)
134
135 #define REAL(x) (x)
136 #define dRecip(x) (1.0/(x))
137 #define dSqrt(x) sqrt(x)
138 #define dRecipSqrt(x) (1.0/sqrt(x))
139 #define dSin(x) sin(x)
140 #define dCos(x) cos(x)
141 #define dFabs(x) fabs(x)
142 #define dAtan2(y,x) atan2((y),(x))
143
144 #else
145 #error You must #define dSINGLE or dDOUBLE
146 #endif
147
148
149 /* utility */
150
151
152 /* round something up to be a multiple of the EFFICIENT_ALIGNMENT */
153
154 #define dEFFICIENT_SIZE(x) ((((x)-1)|(EFFICIENT_ALIGNMENT-1))+1)
155
156
157 /* alloca aligned to the EFFICIENT_ALIGNMENT. note that this can waste
158  * up to 15 bytes per allocation, depending on what alloca() returns.
159  */
160
161 #define dALLOCA16(n) \
162   ((char*)dEFFICIENT_SIZE(((int)(alloca((n)+(EFFICIENT_ALIGNMENT-1))))))
163
164
165 /* internal object types (all prefixed with `dx') */
166
167 struct dxWorld;         /* dynamics world */
168 struct dxSpace;         /* collision space */
169 struct dxBody;          /* rigid body (dynamics object) */
170 struct dxGeom;          /* geometry (collision object) */
171 struct dxJoint;
172 struct dxJointNode;
173 struct dxJointGroup;
174
175 typedef struct dxWorld *dWorldID;
176 typedef struct dxSpace *dSpaceID;
177 typedef struct dxBody *dBodyID;
178 typedef struct dxGeom *dGeomID;
179 typedef struct dxJoint *dJointID;
180 typedef struct dxJointGroup *dJointGroupID;
181
182
183 /* error numbers */
184
185 enum {
186   d_ERR_UNKNOWN = 0,            /* unknown error */
187   d_ERR_IASSERT,                /* internal assertion failed */
188   d_ERR_UASSERT,                /* user assertion failed */
189   d_ERR_LCP                     /* user assertion failed */
190 };
191
192
193 /* joint type numbers */
194
195 enum {
196   dJointTypeNone = 0,           /* or "unknown" */
197   dJointTypeBall,
198   dJointTypeHinge,
199   dJointTypeSlider,
200   dJointTypeContact,
201   dJointTypeUniversal,
202   dJointTypeHinge2,
203   dJointTypeFixed,
204   dJointTypeNull,
205   dJointTypeAMotor
206 };
207
208
209 /* an alternative way of setting joint parameters, using joint parameter
210  * structures and member constants. we don't actually do this yet.
211  */
212
213 /*
214 typedef struct dLimot {
215   int mode;
216   dReal lostop, histop;
217   dReal vel, fmax;
218   dReal fudge_factor;
219   dReal bounce, soft;
220   dReal suspension_erp, suspension_cfm;
221 } dLimot;
222
223 enum {
224   dLimotLoStop          = 0x0001,
225   dLimotHiStop          = 0x0002,
226   dLimotVel             = 0x0004,
227   dLimotFMax            = 0x0008,
228   dLimotFudgeFactor     = 0x0010,
229   dLimotBounce          = 0x0020,
230   dLimotSoft            = 0x0040
231 };
232 */
233
234
235 /* standard joint parameter names. why are these here? - because we don't want
236  * to include all the joint function definitions in joint.cpp. hmmmm.
237  * MSVC complains if we call D_ALL_PARAM_NAMES_X with a blank second argument,
238  * which is why we have the D_ALL_PARAM_NAMES macro as well. please copy and
239  * paste between these two.
240  */
241
242 #define D_ALL_PARAM_NAMES(start) \
243   /* parameters for limits and motors */ \
244   dParamLoStop = start, \
245   dParamHiStop, \
246   dParamVel, \
247   dParamFMax, \
248   dParamFudgeFactor, \
249   dParamBounce, \
250   dParamCFM, \
251   dParamStopERP, \
252   dParamStopCFM, \
253   /* parameters for suspension */ \
254   dParamSuspensionERP, \
255   dParamSuspensionCFM,
256
257 #define D_ALL_PARAM_NAMES_X(start,x) \
258   /* parameters for limits and motors */ \
259   dParamLoStop ## x = start, \
260   dParamHiStop ## x, \
261   dParamVel ## x, \
262   dParamFMax ## x, \
263   dParamFudgeFactor ## x, \
264   dParamBounce ## x, \
265   dParamCFM ## x, \
266   dParamStopERP ## x, \
267   dParamStopCFM ## x, \
268   /* parameters for suspension */ \
269   dParamSuspensionERP ## x, \
270   dParamSuspensionCFM ## x,
271
272 enum {
273   D_ALL_PARAM_NAMES(0)
274   D_ALL_PARAM_NAMES_X(0x100,2)
275   D_ALL_PARAM_NAMES_X(0x200,3)
276
277   /* add a multiple of this constant to the basic parameter numbers to get
278    * the parameters for the second, third etc axes.
279    */
280   dParamGroup=0x100
281 };
282
283
284 /* angular motor mode numbers */
285
286 enum{
287   dAMotorUser = 0,
288   dAMotorEuler = 1
289 };
290
291
292 /* joint force feedback information */
293
294 typedef struct dJointFeedback {
295   dVector3 f1;          // force applied to body 1
296   dVector3 t1;          // torque applied to body 1
297   dVector3 f2;          // force applied to body 2
298   dVector3 t2;          // torque applied to body 2
299 } dJointFeedback;
300
301
302 #ifdef __cplusplus
303 }
304 #endif
305
306 #endif