rigidbody: Avoid unnecessary simulation updates
[blender.git] / source / blender / makesdna / DNA_rigidbody_types.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2013 Blender Foundation
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): Joshua Leung, Sergej Reich
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 /** \file DNA_rigidbody_types.h
29  *  \ingroup DNA
30  *  \brief Types and defines for representing Rigid Body entities
31  */
32
33 #ifndef __DNA_RIGIDBODY_TYPES_H__
34 #define __DNA_RIGIDBODY_TYPES_H__
35
36 #include "DNA_listBase.h"
37
38 struct Group;
39
40 struct EffectorWeights;
41
42 /* ******************************** */
43 /* RigidBody World */
44
45 /* RigidBodyWorld (rbw)
46  *
47  * Represents a "simulation scene" existing within the parent scene.
48  */
49 typedef struct RigidBodyWorld {
50         /* Sim World Settings ------------------------------------------------------------- */
51         struct EffectorWeights *effector_weights; /* effectors info */
52
53         struct Group *group;            /* Group containing objects to use for Rigid Bodies */
54         struct Object **objects;        /* Array to access group objects by index, only used at runtime */
55         
56         struct Group *constraints;      /* Group containing objects to use for Rigid Body Constraints*/
57
58         int pad;
59         float ltime;                            /* last frame world was evaluated for (internal) */
60         
61         /* cache */
62         struct PointCache *pointcache;
63         struct ListBase ptcaches;
64         int numbodies;              /* number of objects in rigid body group */
65         
66         short steps_per_second;         /* number of simulation steps thaken per second */
67         short num_solver_iterations;/* number of constraint solver iterations made per simulation step */
68         
69         int flag;                                       /* (eRigidBodyWorld_Flag) settings for this RigidBodyWorld */
70         float time_scale;                       /* used to speed up or slow down the simulation */
71         
72         /* References to Physics Sim objects. Exist at runtime only ---------------------- */
73         void *physics_world;            /* Physics sim world (i.e. btDiscreteDynamicsWorld) */
74 } RigidBodyWorld;
75
76 /* Flags for RigidBodyWorld */
77 typedef enum eRigidBodyWorld_Flag {
78         /* should sim world be skipped when evaluating (user setting) */
79         RBW_FLAG_MUTED                          = (1 << 0),
80         /* sim data needs to be rebuilt */
81         RBW_FLAG_NEEDS_REBUILD          = (1 << 1),
82         /* usse split impulse when stepping the simulation */
83         RBW_FLAG_USE_SPLIT_IMPULSE      = (1 << 2),
84         /* need to step simulation after frame update */
85         RBW_FLAG_FRAME_UPDATE           = (1 << 3)
86 } eRigidBodyWorld_Flag;
87
88 /* ******************************** */
89 /* RigidBody Object */
90
91 /* RigidBodyObject (rbo)
92  *
93  * Represents an object participating in a RigidBody sim.
94  * This is attached to each object that is currently
95  * participating in a sim.
96  */
97 typedef struct RigidBodyOb {
98         /* References to Physics Sim objects. Exist at runtime only */
99         void *physics_object;   /* Physics object representation (i.e. btRigidBody) */
100         void *physics_shape;    /* Collision shape used by physics sim (i.e. btCollisionShape) */
101         
102         /* General Settings for this RigidBodyOb */
103         short type;                             /* (eRigidBodyOb_Type) role of RigidBody in sim  */
104         short shape;                    /* (eRigidBody_Shape) collision shape to use */ 
105         
106         int flag;                               /* (eRigidBodyOb_Flag) */
107         int col_groups;                 /* Collision groups that determines wich rigid bodies can collide with each other */
108         int pad;
109         
110         /* Physics Parameters */
111         float mass;                             /* how much object 'weighs' (i.e. absolute 'amount of stuff' it holds) */
112         
113         float friction;                 /* resistance of object to movement */
114         float restitution;              /* how 'bouncy' object is when it collides */
115         
116         float margin;                   /* tolerance for detecting collisions */ 
117         
118         float lin_damping;              /* damping for linear velocities */
119         float ang_damping;              /* damping for angular velocities */
120         
121         float lin_sleep_thresh; /* deactivation threshold for linear velocities */
122         float ang_sleep_thresh; /* deactivation threshold for angular velocities */
123         
124         float orn[4];                   /* rigid body orientation */
125         float pos[3];                   /* rigid body position */
126         float pad1;
127 } RigidBodyOb;
128
129
130 /* Participation types for RigidBodyOb */
131 typedef enum eRigidBodyOb_Type {
132         /* active geometry participant in simulation. is directly controlled by sim */
133         RBO_TYPE_ACTIVE = 0,
134         /* passive geometry participant in simulation. is directly controlled by animsys */
135         RBO_TYPE_PASSIVE
136 } eRigidBodyOb_Type;
137
138 /* Flags for RigidBodyOb */
139 typedef enum eRigidBodyOb_Flag {
140         /* rigidbody is kinematic (controlled by the animation system) */
141         RBO_FLAG_KINEMATIC                      = (1 << 0),
142         /* rigidbody needs to be validated (usually set after duplicating and not hooked up yet) */
143         RBO_FLAG_NEEDS_VALIDATE         = (1 << 1),
144         /* rigidbody shape needs refreshing (usually after exiting editmode) */
145         RBO_FLAG_NEEDS_RESHAPE          = (1 << 2),
146         /* rigidbody can be deactivated */
147         RBO_FLAG_USE_DEACTIVATION       = (1 << 3),
148         /* rigidbody is deactivated at the beginning of simulation */
149         RBO_FLAG_START_DEACTIVATED      = (1 << 4),
150         /* rigidbody is not dynamically simulated */
151         RBO_FLAG_DISABLED                       = (1 << 5),
152         /* collision margin is not embedded (only used by convex hull shapes for now) */
153         RBO_FLAG_USE_MARGIN                     = (1 << 6)
154 } eRigidBodyOb_Flag;
155
156 /* RigidBody Collision Shape */
157 typedef enum eRigidBody_Shape {
158                 /* simple box (i.e. bounding box) */
159         RB_SHAPE_BOX = 0,
160                 /* sphere */
161         RB_SHAPE_SPHERE,
162                 /* rounded "pill" shape (i.e. calcium tablets) */
163         RB_SHAPE_CAPSULE,
164                 /* cylinder (i.e. pringles can) */
165         RB_SHAPE_CYLINDER,
166                 /* cone (i.e. party hat) */
167         RB_SHAPE_CONE,
168         
169                 /* convex hull (minimal shrinkwrap encompassing all verts) */
170         RB_SHAPE_CONVEXH,
171                 /* triangulated mesh */
172         RB_SHAPE_TRIMESH,
173         
174                 /* concave mesh approximated using primitives */
175         //RB_SHAPE_COMPOUND,
176 } eRigidBody_Shape;
177
178 /* ******************************** */
179 /* RigidBody Constraint */
180
181 /* RigidBodyConstraint (rbc)
182  *
183  * Represents an constraint connecting two rigid bodies.
184  */
185 typedef struct RigidBodyCon {
186         struct Object *ob1;                     /* First object influenced by the constraint */
187         struct Object *ob2;                     /* Second object influenced by the constraint */
188
189         /* General Settings for this RigidBodyCon */
190         short type;                                     /* (eRigidBodyCon_Type) role of RigidBody in sim  */
191         short num_solver_iterations;/* number of constraint solver iterations made per simulation step */
192
193         int flag;                                       /* (eRigidBodyCon_Flag) */
194
195         float breaking_threshold;       /* breaking impulse threshold */
196         float pad;
197
198         /* limits */
199         float limit_lin_x_lower;        /* lower limit for x axis translation */
200         float limit_lin_x_upper;        /* upper limit for x axis translation */
201         float limit_lin_y_lower;        /* lower limit for y axis translation */
202         float limit_lin_y_upper;        /* upper limit for y axis translation */
203         float limit_lin_z_lower;        /* lower limit for z axis translation */
204         float limit_lin_z_upper;        /* upper limit for z axis translation */
205         float limit_ang_x_lower;        /* lower limit for x axis rotation */
206         float limit_ang_x_upper;        /* upper limit for x axis rotation */
207         float limit_ang_y_lower;        /* lower limit for y axis rotation */
208         float limit_ang_y_upper;        /* upper limit for y axis rotation */
209         float limit_ang_z_lower;        /* lower limit for z axis rotation */
210         float limit_ang_z_upper;        /* upper limit for z axis rotation */
211
212         /* spring settings */
213         /* RB_TODO document spring properties */
214         float spring_stiffness_x;
215         float spring_stiffness_y;
216         float spring_stiffness_z;
217         float spring_damping_x;
218         float spring_damping_y;
219         float spring_damping_z;
220
221         /* References to Physics Sim object. Exist at runtime only */
222         void *physics_constraint;       /* Physics object representation (i.e. btTypedConstraint) */
223 } RigidBodyCon;
224
225
226 /* Participation types for RigidBodyOb */
227 typedef enum eRigidBodyCon_Type {
228         /* lets bodies rotate around a specified point */
229         RBC_TYPE_POINT = 0,
230         /* lets bodies rotate around a specified axis */
231         RBC_TYPE_HINGE,
232         /* simulates wheel suspension */
233         RBC_TYPE_HINGE2,
234         /* restricts movent to a specified axis */
235         RBC_TYPE_SLIDER,
236         /* lets object rotate within a cpecified cone */
237         RBC_TYPE_CONE_TWIST,
238         /* allows user to specify constraint axes */
239         RBC_TYPE_6DOF,
240         /* like 6DOF but has springs */
241         RBC_TYPE_6DOF_SPRING,
242         /* simulates a universal joint */
243         RBC_TYPE_UNIVERSAL,
244         /* glues two bodies together */
245         RBC_TYPE_FIXED,
246         /* similar to slider but also allows rotation around slider axis */
247         RBC_TYPE_PISTON,
248         /* Simplified spring constraint with only once axis that's automatically placed between the connected bodies */
249         RBC_TYPE_SPRING
250 } eRigidBodyCon_Type;
251
252 /* Flags for RigidBodyCon */
253 typedef enum eRigidBodyCon_Flag {
254         /* constraint influences rigid body motion */
255         RBC_FLAG_ENABLED                                        = (1 << 0),
256         /* constraint needs to be validated */
257         RBC_FLAG_NEEDS_VALIDATE                         = (1 << 1),
258         /* allow constrained bodies to collide */
259         RBC_FLAG_DISABLE_COLLISIONS                     = (1 << 2),
260         /* constraint can break */
261         RBC_FLAG_USE_BREAKING                           = (1 << 3),
262         /* constraint use custom number of constraint solver iterations */
263         RBC_FLAG_OVERRIDE_SOLVER_ITERATIONS     = (1 << 4),
264         /* limits */
265         RBC_FLAG_USE_LIMIT_LIN_X                        = (1 << 5),
266         RBC_FLAG_USE_LIMIT_LIN_Y                        = (1 << 6),
267         RBC_FLAG_USE_LIMIT_LIN_Z                        = (1 << 7),
268         RBC_FLAG_USE_LIMIT_ANG_X                        = (1 << 8),
269         RBC_FLAG_USE_LIMIT_ANG_Y                        = (1 << 9),
270         RBC_FLAG_USE_LIMIT_ANG_Z                        = (1 << 10),
271         /* springs */
272         RBC_FLAG_USE_SPRING_X                           = (1 << 11),
273         RBC_FLAG_USE_SPRING_Y                           = (1 << 12),
274         RBC_FLAG_USE_SPRING_Z                           = (1 << 13)
275 } eRigidBodyCon_Flag;
276
277 /* ******************************** */
278
279 #endif /* __DNA_RIGIDBODY_TYPES_H__ */
280