Merge branch 'blender2.7'
[blender.git] / source / blender / makesdna / DNA_rigidbody_types.h
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 2013 Blender Foundation
17  * All rights reserved.
18  */
19
20 /** \file \ingroup DNA
21  *  \brief Types and defines for representing Rigid Body entities
22  */
23
24 #ifndef __DNA_RIGIDBODY_TYPES_H__
25 #define __DNA_RIGIDBODY_TYPES_H__
26
27 #include "DNA_listBase.h"
28
29 struct Collection;
30
31 struct EffectorWeights;
32
33 /* ******************************** */
34 /* RigidBody World */
35
36 /* Container for data shared by original and evaluated copies of RigidBodyWorld */
37 typedef struct RigidBodyWorld_Shared {
38         /* cache */
39         struct PointCache *pointcache;
40         struct ListBase ptcaches;
41
42         /* References to Physics Sim objects. Exist at runtime only ---------------------- */
43         /** Physics sim world (i.e. btDiscreteDynamicsWorld). */
44         void *physics_world;
45 } RigidBodyWorld_Shared;
46
47 /* RigidBodyWorld (rbw)
48  *
49  * Represents a "simulation scene" existing within the parent scene.
50  */
51 typedef struct RigidBodyWorld {
52         /* Sim World Settings ------------------------------------------------------------- */
53         /** Effectors info. */
54         struct EffectorWeights *effector_weights;
55
56         /** Group containing objects to use for Rigid Bodies. */
57         struct Collection *group;
58         /** Array to access group objects by index, only used at runtime. */
59         struct Object **objects;
60
61         /** Group containing objects to use for Rigid Body Constraint.s*/
62         struct Collection *constraints;
63
64         int pad;
65         /** Last frame world was evaluated for (internal). */
66         float ltime;
67
68         /** This pointer is shared between all evaluated copies. */
69         struct RigidBodyWorld_Shared *shared;
70         /** Moved to shared->pointcache. */
71         struct PointCache *pointcache DNA_DEPRECATED;
72         /** Moved to shared->ptcaches. */
73         struct ListBase ptcaches DNA_DEPRECATED;
74         /** Number of objects in rigid body group. */
75         int numbodies;
76
77         /** Number of simulation steps thaken per second. */
78         short steps_per_second;
79         /** Number of constraint solver iterations made per simulation step. */
80         short num_solver_iterations;
81
82         /** (eRigidBodyWorld_Flag) settings for this RigidBodyWorld. */
83         int flag;
84         /** Used to speed up or slow down the simulation. */
85         float time_scale;
86 } RigidBodyWorld;
87
88 /* Flags for RigidBodyWorld */
89 typedef enum eRigidBodyWorld_Flag {
90         /* should sim world be skipped when evaluating (user setting) */
91         RBW_FLAG_MUTED                          = (1 << 0),
92         /* sim data needs to be rebuilt */
93         RBW_FLAG_NEEDS_REBUILD          = (1 << 1),
94         /* usse split impulse when stepping the simulation */
95         RBW_FLAG_USE_SPLIT_IMPULSE      = (1 << 2),
96 } eRigidBodyWorld_Flag;
97
98 /* ******************************** */
99 /* RigidBody Object */
100
101 /* Container for data that is shared among CoW copies.
102  *
103  * This is placed in a separate struct so that, for example, the physics_shape
104  * pointer can be replaced without having to update all CoW copies. */
105 #
106 #
107 typedef struct RigidBodyOb_Shared {
108         /* References to Physics Sim objects. Exist at runtime only */
109         /** Physics object representation (i.e. btRigidBody). */
110         void *physics_object;
111         /** Collision shape used by physics sim (i.e. btCollisionShape). */
112         void *physics_shape;
113 } RigidBodyOb_Shared;
114
115 /* RigidBodyObject (rbo)
116  *
117  * Represents an object participating in a RigidBody sim.
118  * This is attached to each object that is currently
119  * participating in a sim.
120  */
121 typedef struct RigidBodyOb {
122         /* General Settings for this RigidBodyOb */
123         /** (eRigidBodyOb_Type) role of RigidBody in sim . */
124         short type;
125         /** (eRigidBody_Shape) collision shape to use. */
126         short shape;
127
128         /** (eRigidBodyOb_Flag). */
129         int flag;
130         /** Collision groups that determines which rigid bodies can collide with each other. */
131         int col_groups;
132         /** (eRigidBody_MeshSource) mesh source for mesh based collision shapes. */
133         short mesh_source;
134         short pad;
135
136         /* Physics Parameters */
137         /** How much object 'weighs' (i.e. absolute 'amount of stuff' it holds). */
138         float mass;
139
140         /** Resistance of object to movement. */
141         float friction;
142         /** How 'bouncy' object is when it collides. */
143         float restitution;
144
145         /** Tolerance for detecting collisions. */
146         float margin;
147
148         /** Damping for linear velocities. */
149         float lin_damping;
150         /** Damping for angular velocities. */
151         float ang_damping;
152
153         /** Deactivation threshold for linear velocities. */
154         float lin_sleep_thresh;
155         /** Deactivation threshold for angular velocities. */
156         float ang_sleep_thresh;
157
158         /** Rigid body orientation. */
159         float orn[4];
160         /** Rigid body position. */
161         float pos[3];
162         float pad1;
163
164         /** This pointer is shared between all evaluated copies. */
165         struct RigidBodyOb_Shared *shared;
166 } RigidBodyOb;
167
168
169 /* Participation types for RigidBodyOb */
170 typedef enum eRigidBodyOb_Type {
171         /* active geometry participant in simulation. is directly controlled by sim */
172         RBO_TYPE_ACTIVE = 0,
173         /* passive geometry participant in simulation. is directly controlled by animsys */
174         RBO_TYPE_PASSIVE
175 } eRigidBodyOb_Type;
176
177 /* Flags for RigidBodyOb */
178 typedef enum eRigidBodyOb_Flag {
179         /* rigidbody is kinematic (controlled by the animation system) */
180         RBO_FLAG_KINEMATIC                      = (1 << 0),
181         /* rigidbody needs to be validated (usually set after duplicating and not hooked up yet) */
182         RBO_FLAG_NEEDS_VALIDATE         = (1 << 1),
183         /* rigidbody shape needs refreshing (usually after exiting editmode) */
184         RBO_FLAG_NEEDS_RESHAPE          = (1 << 2),
185         /* rigidbody can be deactivated */
186         RBO_FLAG_USE_DEACTIVATION       = (1 << 3),
187         /* rigidbody is deactivated at the beginning of simulation */
188         RBO_FLAG_START_DEACTIVATED      = (1 << 4),
189         /* rigidbody is not dynamically simulated */
190         RBO_FLAG_DISABLED                       = (1 << 5),
191         /* collision margin is not embedded (only used by convex hull shapes for now) */
192         RBO_FLAG_USE_MARGIN                     = (1 << 6),
193         /* collision shape deforms during simulation (only for passive triangle mesh shapes) */
194         RBO_FLAG_USE_DEFORM                     = (1 << 7),
195 } eRigidBodyOb_Flag;
196
197 /* RigidBody Collision Shape */
198 typedef enum eRigidBody_Shape {
199                 /* simple box (i.e. bounding box) */
200         RB_SHAPE_BOX = 0,
201                 /* sphere */
202         RB_SHAPE_SPHERE,
203                 /* rounded "pill" shape (i.e. calcium tablets) */
204         RB_SHAPE_CAPSULE,
205                 /* cylinder (i.e. pringles can) */
206         RB_SHAPE_CYLINDER,
207                 /* cone (i.e. party hat) */
208         RB_SHAPE_CONE,
209
210                 /* convex hull (minimal shrinkwrap encompassing all verts) */
211         RB_SHAPE_CONVEXH,
212                 /* triangulated mesh */
213         RB_SHAPE_TRIMESH,
214
215                 /* concave mesh approximated using primitives */
216         //RB_SHAPE_COMPOUND,
217 } eRigidBody_Shape;
218
219 typedef enum eRigidBody_MeshSource {
220         /* base mesh */
221         RBO_MESH_BASE = 0,
222         /* only deformations */
223         RBO_MESH_DEFORM,
224         /* final derived mesh */
225         RBO_MESH_FINAL
226 } eRigidBody_MeshSource;
227
228 /* ******************************** */
229 /* RigidBody Constraint */
230
231 /* RigidBodyConstraint (rbc)
232  *
233  * Represents an constraint connecting two rigid bodies.
234  */
235 typedef struct RigidBodyCon {
236         /** First object influenced by the constraint. */
237         struct Object *ob1;
238         /** Second object influenced by the constraint. */
239         struct Object *ob2;
240
241         /* General Settings for this RigidBodyCon */
242         /** (eRigidBodyCon_Type) role of RigidBody in sim . */
243         short type;
244         /** Number of constraint solver iterations made per simulation step. */
245         short num_solver_iterations;
246
247         /** (eRigidBodyCon_Flag). */
248         int flag;
249
250         /** Breaking impulse threshold. */
251         float breaking_threshold;
252         /** Spring implementation to use. */
253         char spring_type;
254         char pad[3];
255
256         /* limits */
257         /* translation limits */
258         float limit_lin_x_lower;
259         float limit_lin_x_upper;
260         float limit_lin_y_lower;
261         float limit_lin_y_upper;
262         float limit_lin_z_lower;
263         float limit_lin_z_upper;
264         /* rotation limits */
265         float limit_ang_x_lower;
266         float limit_ang_x_upper;
267         float limit_ang_y_lower;
268         float limit_ang_y_upper;
269         float limit_ang_z_lower;
270         float limit_ang_z_upper;
271
272         /* spring settings */
273         /* resistance to deformation */
274         float spring_stiffness_x;
275         float spring_stiffness_y;
276         float spring_stiffness_z;
277         float spring_stiffness_ang_x;
278         float spring_stiffness_ang_y;
279         float spring_stiffness_ang_z;
280         /* amount of velocity lost over time */
281         float spring_damping_x;
282         float spring_damping_y;
283         float spring_damping_z;
284         float spring_damping_ang_x;
285         float spring_damping_ang_y;
286         float spring_damping_ang_z;
287
288         /* motor settings */
289         /** Linear velocity the motor tries to hold. */
290         float motor_lin_target_velocity;
291         /** Angular velocity the motor tries to hold. */
292         float motor_ang_target_velocity;
293         /** Maximum force used to reach linear target velocity. */
294         float motor_lin_max_impulse;
295         /** Maximum force used to reach angular target velocity. */
296         float motor_ang_max_impulse;
297
298         /* References to Physics Sim object. Exist at runtime only */
299         /** Physics object representation (i.e. btTypedConstraint). */
300         void *physics_constraint;
301 } RigidBodyCon;
302
303
304 /* Participation types for RigidBodyOb */
305 typedef enum eRigidBodyCon_Type {
306         /** lets bodies rotate around a specified point */
307         RBC_TYPE_POINT = 0,
308         /** lets bodies rotate around a specified axis */
309         RBC_TYPE_HINGE,
310         /** simulates wheel suspension */
311         RBC_TYPE_HINGE2,
312         /** restricts movent to a specified axis */
313         RBC_TYPE_SLIDER,
314         /** lets object rotate within a cpecified cone */
315         RBC_TYPE_CONE_TWIST,
316         /** allows user to specify constraint axes */
317         RBC_TYPE_6DOF,
318         /** like 6DOF but has springs */
319         RBC_TYPE_6DOF_SPRING,
320         /** simulates a universal joint */
321         RBC_TYPE_UNIVERSAL,
322         /** glues two bodies together */
323         RBC_TYPE_FIXED,
324         /** similar to slider but also allows rotation around slider axis */
325         RBC_TYPE_PISTON,
326         /** Simplified spring constraint with only once axis that's
327          * automatically placed between the connected bodies */
328         RBC_TYPE_SPRING,
329         /** dirves bodies by applying linear and angular forces */
330         RBC_TYPE_MOTOR,
331 } eRigidBodyCon_Type;
332
333 /* Spring implementation type for RigidBodyOb */
334 typedef enum eRigidBodyCon_SpringType {
335         RBC_SPRING_TYPE1 = 0,   /* btGeneric6DofSpringConstraint */
336         RBC_SPRING_TYPE2,       /* btGeneric6DofSpring2Constraint */
337 } eRigidBodyCon_SpringType;
338
339 /* Flags for RigidBodyCon */
340 typedef enum eRigidBodyCon_Flag {
341         /* constraint influences rigid body motion */
342         RBC_FLAG_ENABLED                                        = (1 << 0),
343         /* constraint needs to be validated */
344         RBC_FLAG_NEEDS_VALIDATE                         = (1 << 1),
345         /* allow constrained bodies to collide */
346         RBC_FLAG_DISABLE_COLLISIONS                     = (1 << 2),
347         /* constraint can break */
348         RBC_FLAG_USE_BREAKING                           = (1 << 3),
349         /* constraint use custom number of constraint solver iterations */
350         RBC_FLAG_OVERRIDE_SOLVER_ITERATIONS     = (1 << 4),
351         /* limits */
352         RBC_FLAG_USE_LIMIT_LIN_X                        = (1 << 5),
353         RBC_FLAG_USE_LIMIT_LIN_Y                        = (1 << 6),
354         RBC_FLAG_USE_LIMIT_LIN_Z                        = (1 << 7),
355         RBC_FLAG_USE_LIMIT_ANG_X                        = (1 << 8),
356         RBC_FLAG_USE_LIMIT_ANG_Y                        = (1 << 9),
357         RBC_FLAG_USE_LIMIT_ANG_Z                        = (1 << 10),
358         /* springs */
359         RBC_FLAG_USE_SPRING_X                           = (1 << 11),
360         RBC_FLAG_USE_SPRING_Y                           = (1 << 12),
361         RBC_FLAG_USE_SPRING_Z                           = (1 << 13),
362         /* motors */
363         RBC_FLAG_USE_MOTOR_LIN                          = (1 << 14),
364         RBC_FLAG_USE_MOTOR_ANG                          = (1 << 15),
365         /* angular springs */
366         RBC_FLAG_USE_SPRING_ANG_X                       = (1 << 16),
367         RBC_FLAG_USE_SPRING_ANG_Y                       = (1 << 17),
368         RBC_FLAG_USE_SPRING_ANG_Z                       = (1 << 18),
369 } eRigidBodyCon_Flag;
370
371 /* ******************************** */
372
373 #endif /* __DNA_RIGIDBODY_TYPES_H__ */