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