Merge branch 'blender2.7'
[blender.git] / source / blender / makesdna / DNA_object_force_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) 2004-2005 by Blender Foundation
17  * All rights reserved.
18  */
19
20 /** \file \ingroup DNA
21  */
22
23 #ifndef __DNA_OBJECT_FORCE_TYPES_H__
24 #define __DNA_OBJECT_FORCE_TYPES_H__
25
26 #ifdef __cplusplus
27 extern "C" {
28 #endif
29
30 #include "DNA_listBase.h"
31 #include "DNA_defs.h"
32
33 /* pd->forcefield:  Effector Fields types */
34 typedef enum ePFieldType {
35         /** (this is used for general effector weight). */
36         PFIELD_NULL   = 0,
37         /** Force away/towards a point depending on force strength. */
38         PFIELD_FORCE  = 1,
39         /** Force around the effector normal. */
40         PFIELD_VORTEX = 2,
41         /** Force from the cross product of effector normal and point velocity. */
42         PFIELD_MAGNET = 3,
43         /** Force away and towards a point depending which side of the effector normal the point is. */
44         PFIELD_WIND   = 4,
45         /** Force along curve for dynamics, a shaping curve for hair paths. */
46         PFIELD_GUIDE      = 5,
47         /** Force based on texture values calculated at point coordinates. */
48         PFIELD_TEXTURE    = 6,
49         /** Force of a harmonic (damped) oscillator. */
50         PFIELD_HARMONIC   = 7,
51         /** Force away/towards a point depending on point charge. */
52         PFIELD_CHARGE     = 8,
53         /** Force due to a Lennard-Jones potential. */
54         PFIELD_LENNARDJ   = 9,
55         /** Defines predator / goal for boids. */
56         PFIELD_BOID       = 10,
57         /** Force defined by BLI_gTurbulence. */
58         PFIELD_TURBULENCE = 11,
59         /** Linear & quadratic drag. */
60         PFIELD_DRAG       = 12,
61         /** Force based on smoke simulation air flow. */
62         PFIELD_SMOKEFLOW  = 13,
63
64         NUM_PFIELD_TYPES
65 } ePFieldType;
66
67 typedef struct PartDeflect {
68         /** General settings flag. */
69         int       flag;
70         /** Deflection flag - does mesh deflect particles. */
71         short deflect;
72         /** Force field type, do the vertices attract / repel particles? */
73         short forcefield;
74         /** Fall-off type. */
75         short falloff;
76         /** Point, plane or surface. */
77         short shape;
78         /** Texture effector. */
79         short tex_mode;
80         /** For curve guide. */
81         short kink, kink_axis;
82         short zdir;
83
84         /* Main effector values */
85         /** The strength of the force (+ or - ). */
86         float f_strength;
87         /** Damping ratio of the harmonic effector. */
88         float f_damp;
89         /**
90          * How much force is converted into "air flow", i.e.
91          * force used as the velocity of surrounding medium. */
92         float f_flow;
93
94         /** Noise size for noise effector, restlength for harmonic effector. */
95         float f_size;
96
97         /* fall-off */
98         /** The power law - real gravitation is 2 (square).     */
99         float f_power;
100         /** If indicated, use this maximum. */
101         float maxdist;
102         /** If indicated, use this minimum. */
103         float mindist;
104         /** Radial fall-off power. */
105         float f_power_r;
106         /** Radial versions of above. */
107         float maxrad;
108         float minrad;
109
110         /* particle collisions */
111         /** Damping factor for particle deflection. */
112         float pdef_damp;
113         /** Random element of damping for deflection. */
114         float pdef_rdamp;
115         /** Chance of particle passing through mesh. */
116         float pdef_perm;
117         /** Friction factor for particle deflection. */
118         float pdef_frict;
119         /** Random element of friction for deflection. */
120         float pdef_rfrict;
121         /** Surface particle stickiness. */
122         float pdef_stickness;
123
124         /** Used for forces. */
125         float absorption;
126
127         /* softbody collisions */
128         /** Damping factor for softbody deflection. */
129         float pdef_sbdamp;
130         /** Inner face thickness for softbody deflection. */
131         float pdef_sbift;
132         /** Outer face thickness for softbody deflection. */
133         float pdef_sboft;
134
135         /* guide curve, same as for particle child effects */
136         float clump_fac, clump_pow;
137         float kink_freq, kink_shape, kink_amp, free_end;
138
139         /* texture effector */
140         /** Used for calculating partial derivatives. */
141         float tex_nabla;
142         /** Texture of the texture effector. */
143         struct Tex *tex;
144
145         /* effector noise */
146         /** Random noise generator for e.g. wind. */
147         struct RNG *rng;
148         /** Noise of force. */
149         float f_noise;
150         /** Noise random seed. */
151         int seed;
152
153         /* Display Size */
154         /** Runtime only : start of the curve or draw scale. */
155         float drawvec1[4];
156         /** Runtime only : end of the curve. */
157         float drawvec2[4];
158         /** Runtime only. */
159         float drawvec_falloff_min[3], pad1;
160         /** Runtime only. */
161         float drawvec_falloff_max[3], pad2;
162
163         /** Force source object. */
164         struct Object *f_source;
165
166         /** Friction of cloth collisions. */
167         float pdef_cfrict;
168         float pad;
169 } PartDeflect;
170
171 typedef struct EffectorWeights {
172         /** Only use effectors from this group of objects. */
173         struct Collection *group;
174
175         /** Effector type specific weights. */
176         float weight[14];
177         float global_gravity;
178         short flag, rt[3];
179         int pad;
180 } EffectorWeights;
181
182 /* EffectorWeights->flag */
183 #define EFF_WEIGHT_DO_HAIR              1
184
185 /* Point cache file data types:
186  * - used as (1<<flag) so poke jahka if you reach the limit of 15
187  * - to add new data types update:
188  *   - BKE_ptcache_data_size()
189  *   - ptcache_file_init_pointers()
190  */
191 #define BPHYS_DATA_INDEX                0
192 #define BPHYS_DATA_LOCATION             1
193 #define BPHYS_DATA_SMOKE_LOW    1
194 #define BPHYS_DATA_VELOCITY             2
195 #define BPHYS_DATA_SMOKE_HIGH   2
196 #define BPHYS_DATA_ROTATION             3
197 #define BPHYS_DATA_DYNAMICPAINT 3
198 #define BPHYS_DATA_AVELOCITY    4       /* used for particles */
199 #define BPHYS_DATA_XCONST               4       /* used for cloth */
200 #define BPHYS_DATA_SIZE                 5
201 #define BPHYS_DATA_TIMES                6
202 #define BPHYS_DATA_BOIDS                7
203
204 #define BPHYS_TOT_DATA                  8
205
206 #define BPHYS_EXTRA_FLUID_SPRINGS       1
207
208 typedef struct PTCacheExtra {
209         struct PTCacheExtra *next, *prev;
210         unsigned int type, totdata;
211         void *data;
212 } PTCacheExtra;
213
214 typedef struct PTCacheMem {
215         struct PTCacheMem *next, *prev;
216         unsigned int frame, totpoint;
217         unsigned int data_types, flag;
218
219         /** BPHYS_TOT_DATA. */
220         void *data[8];
221         /** BPHYS_TOT_DATA. */
222         void *cur[8];
223
224         struct ListBase extradata;
225 } PTCacheMem;
226
227 typedef struct PointCache {
228         struct PointCache *next, *prev;
229         /** Generic flag. */
230         int flag;
231
232         /**
233          * The number of frames between cached frames.
234          * This should probably be an upper bound for a per point adaptive step in the future,
235          * buf for now it's the same for all points. Without adaptivity this can effect the perceived
236          * simulation quite a bit though. If for example particles are colliding with a horizontal
237          * plane (with high damping) they quickly come to a stop on the plane, however there are still
238          * forces acting on the particle (gravity and collisions), so the particle velocity isn't necessarily
239          * zero for the whole duration of the frame even if the particle seems stationary. If all simulation
240          * frames aren't cached (step > 1) these velocities are interpolated into movement for the non-cached
241          * frames. The result will look like the point is oscillating around the collision location. So for
242          * now cache step should be set to 1 for accurate reproduction of collisions.
243          */
244         int step;
245
246         /** Current frame of simulation (only if SIMULATION_VALID). */
247         int simframe;
248         /** Simulation start frame. */
249         int startframe;
250         /** Simulation end frame. */
251         int endframe;
252         /** Frame being edited (runtime only). */
253         int editframe;
254         /** Last exact frame that's cached. */
255         int last_exact;
256         /** Used for editing cache - what is the last baked frame. */
257         int last_valid;
258         int pad;
259
260         /* for external cache files */
261         /** Number of cached points. */
262         int totpoint;
263         /** Modifier stack index. */
264         int index;
265         short compression, rt;
266
267         char name[64];
268         char prev_name[64];
269         char info[64];
270         /** File path, 1024 = FILE_MAX. */
271         char path[1024];
272         /**
273          * Array of length endframe-startframe+1 with flags to indicate cached frames.
274          * Can be later used for other per frame flags too if needed.
275          */
276         char *cached_frames;
277         struct ListBase mem_cache;
278
279         struct PTCacheEdit *edit;
280         /** Free callback. */
281         void (*free_edit)(struct PTCacheEdit *edit);
282 } PointCache;
283
284 typedef struct SBVertex {
285         float vec[4];
286 } SBVertex;
287
288 /* Container for data that is shared among CoW copies.
289  *
290  * This is placed in a separate struct so that values can be changed
291  * without having to update all CoW copies. */
292 typedef struct SoftBody_Shared {
293         struct PointCache *pointcache;
294         struct ListBase ptcaches;
295 } SoftBody_Shared;
296
297 typedef struct SoftBody {
298         /* dynamic data */
299         int totpoint, totspring;
300         /** Not saved in file. */
301         struct BodyPoint *bpoint;
302         /** Not saved in file. */
303         struct BodySpring *bspring;
304         char   pad;
305         char   msg_lock;
306         short  msg_value;
307
308         /* part of UI: */
309
310         /* general options */
311         /** Softbody mass of *vertex*. */
312         float nodemass;
313         /**
314          * Along with it introduce mass painting
315          * starting to fix old bug .. nastiness that VG are indexes
316          * rather find them by name tag to find it -> jow20090613.
317          * MAX_VGROUP_NAME */
318         char  namedVG_Mass[64];
319         /** Softbody amount of gravitaion to apply. */
320         float grav;
321         /** Friction to env. */
322         float mediafrict;
323         /** Error limit for ODE solver. */
324         float rklimit;
325         /** User control over simulation speed. */
326         float physics_speed;
327
328         /* goal */
329         /** Softbody goal springs. */
330         float goalspring;
331         /** Softbody goal springs friction. */
332         float goalfrict;
333         /** Quick limits for goal. */
334         float mingoal;
335         float maxgoal;
336         /** Default goal for vertices without vgroup. */
337         float defgoal;
338         /** Index starting at 1. */
339         short vertgroup;
340         /**
341          * Starting to fix old bug .. nastiness that VG are indexes
342          * rather find them by name tag to find it -> jow20090613.
343          * MAX_VGROUP_NAME */
344         char  namedVG_Softgoal[64];
345
346         short fuzzyness;
347
348         /* springs */
349         /** Softbody inner springs. */
350         float inspring;
351         /** Softbody inner springs friction. */
352         float infrict;
353         /**
354          * Along with it introduce Spring_K painting
355          * starting to fix old bug .. nastiness that VG are indexes
356          * rather find them by name tag to find it -> jow20090613.
357          * MAX_VGROUP_NAME
358          */
359         char  namedVG_Spring_K[64];
360
361         /* baking */
362         int sfra, efra;
363         int interval;
364         /** Local==1: use local coords for baking. */
365         short local, solverflags;
366
367         /* -- these must be kept for backwards compatibility -- */
368         /** Array of size totpointkey. */
369         SBVertex **keys;
370         /** If totpointkey != totpoint or totkey!- (efra-sfra)/interval -> free keys. */
371         int totpointkey, totkey;
372         /* ---------------------------------------------------- */
373         float secondspring;
374
375         /* self collision*/
376         /** Fixed collision ball size if > 0. */
377         float colball;
378         /** Cooling down collision response . */
379         float balldamp;
380         /** Pressure the ball is loaded with . */
381         float ballstiff;
382         short sbc_mode;
383         short aeroedge,
384                 minloops,
385                 maxloops,
386                 choke,
387                 solver_ID,
388                 plastic, springpreload
389                 ;
390
391         /** Scratch pad/cache on live time not saved in file. */
392         struct SBScratch *scratch;
393         float shearstiff;
394         float inpush;
395
396         struct SoftBody_Shared *shared;
397         /** Moved to SoftBody_Shared. */
398         struct PointCache *pointcache DNA_DEPRECATED;
399         /** Moved to SoftBody_Shared. */
400         struct ListBase ptcaches DNA_DEPRECATED;
401
402         struct Collection *collision_group;
403
404         struct EffectorWeights *effector_weights;
405         /* reverse esimated obmatrix .. no need to store in blend file .. how ever who cares */
406         float lcom[3];
407         float lrot[3][3];
408         float lscale[3][3];
409
410         int last_frame;
411 } SoftBody;
412
413
414 /* pd->flag: various settings */
415 #define PFIELD_USEMAX           (1 << 0)
416 /*#define PDEFLE_DEFORM         (1 << 1)*/      /*UNUSED*/
417 /** TODO: do_versions for below */
418 #define PFIELD_GUIDE_PATH_ADD   (1 << 2)
419 /** used for do_versions */
420 #define PFIELD_PLANAR           (1 << 3)
421 #define PDEFLE_KILL_PART        (1 << 4)
422 /** used for do_versions */
423 #define PFIELD_POSZ             (1 << 5)
424 #define PFIELD_TEX_OBJECT       (1 << 6)
425 /** used for turbulence */
426 #define PFIELD_GLOBAL_CO        (1 << 6)
427 #define PFIELD_TEX_2D           (1 << 7)
428 /** used for harmonic force */
429 #define PFIELD_MULTIPLE_SPRINGS (1 << 7)
430 #define PFIELD_USEMIN           (1 << 8)
431 #define PFIELD_USEMAXR          (1 << 9)
432 #define PFIELD_USEMINR          (1 << 10)
433 #define PFIELD_TEX_ROOTCO       (1 << 11)
434 /** used for do_versions */
435 #define PFIELD_SURFACE          (1 << 12)
436 #define PFIELD_VISIBILITY       (1 << 13)
437 #define PFIELD_DO_LOCATION      (1 << 14)
438 #define PFIELD_DO_ROTATION      (1 << 15)
439 /** apply curve weights */
440 #define PFIELD_GUIDE_PATH_WEIGHT (1 << 16)
441 /** multiply smoke force by density */
442 #define PFIELD_SMOKE_DENSITY    (1 << 17)
443 /** used for (simple) force */
444 #define PFIELD_GRAVITATION      (1 << 18)
445 /** Enable cloth collision side detection based on normal. */
446 #define PFIELD_CLOTH_USE_CULLING (1<< 19)
447 /** Replace collision direction with collider normal. */
448 #define PFIELD_CLOTH_USE_NORMAL (1 << 20)
449
450 /* pd->falloff */
451 #define PFIELD_FALL_SPHERE              0
452 #define PFIELD_FALL_TUBE                1
453 #define PFIELD_FALL_CONE                2
454
455 /* pd->shape */
456 #define PFIELD_SHAPE_POINT              0
457 #define PFIELD_SHAPE_PLANE              1
458 #define PFIELD_SHAPE_SURFACE    2
459 #define PFIELD_SHAPE_POINTS             3
460 #define PFIELD_SHAPE_LINE               4
461
462 /* pd->tex_mode */
463 #define PFIELD_TEX_RGB  0
464 #define PFIELD_TEX_GRAD 1
465 #define PFIELD_TEX_CURL 2
466
467 /* pd->zdir */
468 #define PFIELD_Z_BOTH   0
469 #define PFIELD_Z_POS    1
470 #define PFIELD_Z_NEG    2
471
472 /* pointcache->flag */
473 #define PTCACHE_BAKED               (1 << 0)
474 #define PTCACHE_OUTDATED            (1 << 1)
475 #define PTCACHE_SIMULATION_VALID    (1 << 2)
476 #define PTCACHE_BAKING              (1 << 3)
477 //#define PTCACHE_BAKE_EDIT         (1 << 4)
478 //#define PTCACHE_BAKE_EDIT_ACTIVE  (1 << 5)
479 #define PTCACHE_DISK_CACHE          (1 << 6)
480 ///* removed since 2.64 - [#30974], could be added back in a more useful way */
481 //#define PTCACHE_QUICK_CACHE       (1 << 7)
482 #define PTCACHE_FRAMES_SKIPPED      (1 << 8)
483 #define PTCACHE_EXTERNAL            (1 << 9)
484 #define PTCACHE_READ_INFO           (1 << 10)
485 /** don't use the filename of the blendfile the data is linked from (write a local cache) */
486 #define PTCACHE_IGNORE_LIBPATH      (1 << 11)
487 /** high resolution cache is saved for smoke for backwards compatibility,
488  * so set this flag to know it's a "fake" cache */
489 #define PTCACHE_FAKE_SMOKE          (1 << 12)
490 #define PTCACHE_IGNORE_CLEAR        (1 << 13)
491
492 /* PTCACHE_OUTDATED + PTCACHE_FRAMES_SKIPPED */
493 #define PTCACHE_REDO_NEEDED                     258
494
495 #define PTCACHE_COMPRESS_NO                     0
496 #define PTCACHE_COMPRESS_LZO            1
497 #define PTCACHE_COMPRESS_LZMA           2
498
499 /* ob->softflag */
500 #define OB_SB_ENABLE    1               /* deprecated, use modifier */
501 #define OB_SB_GOAL              2
502 #define OB_SB_EDGES             4
503 #define OB_SB_QUADS             8
504 #define OB_SB_POSTDEF   16
505 // #define OB_SB_REDO           32
506 // #define OB_SB_BAKESET        64
507 // #define OB_SB_BAKEDO 128
508 // #define OB_SB_RESET          256
509 #define OB_SB_SELF              512
510 #define OB_SB_FACECOLL  1024
511 #define OB_SB_EDGECOLL  2048
512 /* #define OB_SB_COLLFINAL 4096 */ /* deprecated */
513 /* #define OB_SB_BIG_UI 8192 */    /* deprecated */
514 #define OB_SB_AERO_ANGLE        16384
515
516 /* sb->solverflags */
517 #define SBSO_MONITOR            1
518 #define SBSO_OLDERR                     2
519 #define SBSO_ESTIMATEIPO    4
520
521 /* sb->sbc_mode */
522 #define SBC_MODE_MANUAL         0
523 #define SBC_MODE_AVG            1
524 #define SBC_MODE_MIN            2
525 #define SBC_MODE_MAX            3
526 #define SBC_MODE_AVGMINMAX      4
527
528 #ifdef __cplusplus
529 }
530 #endif
531
532 #endif  /* __DNA_OBJECT_FORCE_TYPES_H__ */