4e3919dc8298eaff277402d432279ffa79f66122
[blender.git] / extern / ode / dist / ode / src / objects.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 // object, body, and world structs.
24
25
26 #ifndef _ODE_OBJECT_H_
27 #define _ODE_OBJECT_H_
28
29 #include <ode/common.h>
30 #include <ode/memory.h>
31 #include <ode/mass.h>
32 #include "array.h"
33
34
35 // some body flags
36
37 enum {
38   dxBodyFlagFiniteRotation = 1,         // use finite rotations
39   dxBodyFlagFiniteRotationAxis = 2,     // use finite rotations only along axis
40   dxBodyDisabled = 4,                   // body is disabled
41   dxBodyNoGravity = 8                   // body is not influenced by gravity
42 };
43
44
45 // base class that does correct object allocation / deallocation
46
47 struct dBase {
48   void *operator new (size_t size) { return dAlloc (size); }
49   void operator delete (void *ptr, size_t size) { dFree (ptr,size); }
50   void *operator new[] (size_t size) { return dAlloc (size); }
51   void operator delete[] (void *ptr, size_t size) { dFree (ptr,size); }
52 };
53
54
55 // base class for bodies and joints
56
57 struct dObject : public dBase {
58   dxWorld *world;               // world this object is in
59   dObject *next;                // next object of this type in list
60   dObject **tome;               // pointer to previous object's next ptr
61   void *userdata;               // user settable data
62   int tag;                      // used by dynamics algorithms
63 };
64
65
66 struct dxBody : public dObject {
67   dxJointNode *firstjoint;      // list of attached joints
68   int flags;                    // some dxBodyFlagXXX flags
69   dMass mass;                   // mass parameters about POR
70   dMatrix3 invI;                // inverse of mass.I
71   dReal invMass;                // 1 / mass.mass
72   dVector3 pos;                 // position of POR (point of reference)
73   dQuaternion q;                // orientation quaternion
74   dMatrix3 R;                   // rotation matrix, always corresponds to q
75   dVector3 lvel,avel;           // linear and angular velocity of POR
76   dVector3 facc,tacc;           // force and torque accululators
77   dVector3 finite_rot_axis;     // finite rotation axis, unit length or 0=none
78 };
79
80
81 struct dxWorld : public dBase {
82   dxBody *firstbody;            // body linked list
83   dxJoint *firstjoint;          // joint linked list
84   int nb,nj;                    // number of bodies and joints in lists
85   dVector3 gravity;             // gravity vector (m/s/s)
86   dReal global_erp;             // global error reduction parameter
87   dReal global_cfm;             // global costraint force mixing parameter
88 };
89
90
91 #endif