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