Viscoelastic springs for sph particle fluids, original patch by Stephen Whitehorn...
[blender.git] / source / blender / blenkernel / BKE_pointcache.h
1 /*
2 *
3 * ***** BEGIN GPL LICENSE BLOCK *****
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version 2
8 * of the License, or (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software  Foundation,
17 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 *
19 * The Original Code is Copyright (C) 2006 Blender Foundation.
20 * All rights reserved.
21 *
22 * The Original Code is: all of this file.
23 *
24 * Contributor(s): Campbell Barton <ideasman42@gmail.com>
25 *
26 * ***** END GPL LICENSE BLOCK *****
27 */
28
29 #ifndef BKE_POINTCACHE_H
30 #define BKE_POINTCACHE_H
31
32 #include "DNA_ID.h"
33 #include "DNA_object_force.h"
34 #include "DNA_boid_types.h"
35 #include "DNA_particle_types.h"
36 #include <stdio.h> /* for FILE */
37
38 /* Point cache clearing option, for BKE_ptcache_id_clear, before
39  * and after are non inclusive (they wont remove the cfra) */
40 #define PTCACHE_CLEAR_ALL               0
41 #define PTCACHE_CLEAR_FRAME             1
42 #define PTCACHE_CLEAR_BEFORE    2
43 #define PTCACHE_CLEAR_AFTER             3
44
45 /* Point cache reset options */
46 #define PTCACHE_RESET_DEPSGRAPH         0
47 #define PTCACHE_RESET_BAKED                     1
48 #define PTCACHE_RESET_OUTDATED          2
49 #define PTCACHE_RESET_FREE                      3
50
51 /* Add the blendfile name after blendcache_ */
52 #define PTCACHE_EXT ".bphys"
53 #define PTCACHE_PATH "blendcache_"
54
55 /* File open options, for BKE_ptcache_file_open */
56 #define PTCACHE_FILE_READ       0
57 #define PTCACHE_FILE_WRITE      1
58 #define PTCACHE_FILE_UPDATE     2
59
60 /* PTCacheID types */
61 #define PTCACHE_TYPE_SOFTBODY                   0
62 #define PTCACHE_TYPE_PARTICLES                  1
63 #define PTCACHE_TYPE_CLOTH                              2
64 #define PTCACHE_TYPE_SMOKE_DOMAIN               3
65 #define PTCACHE_TYPE_SMOKE_HIGHRES              4
66
67 /* high bits reserved for flags that need to be stored in file */
68 #define PTCACHE_TYPEFLAG_COMPRESS               (1<<16)
69 #define PTCACHE_TYPEFLAG_EXTRADATA              (1<<17)
70
71 #define PTCACHE_TYPEFLAG_TYPEMASK                       0x0000FFFF
72 #define PTCACHE_TYPEFLAG_FLAGMASK                       0xFFFF0000
73
74 /* PTCache read return code */
75 #define PTCACHE_READ_EXACT                              1
76 #define PTCACHE_READ_INTERPOLATED               2
77 #define PTCACHE_READ_OLD                                3
78
79 /* Structs */
80 struct ClothModifierData;
81 struct ListBase;
82 struct Main;
83 struct Object;
84 struct ParticleKey;
85 struct ParticleSystem;
86 struct PointCache;
87 struct Scene;
88 struct SmokeModifierData;
89 struct SoftBody;
90
91 /* temp structure for read/write */
92 typedef struct PTCacheData {
93         unsigned int index;
94         float loc[3];
95         float vel[3];
96         float rot[4];
97         float ave[3];
98         float size;
99         float times[3];
100         struct BoidData boids;
101 } PTCacheData;
102
103 static char *ptcache_datastruct[] = {
104         "", // BPHYS_DATA_INDEX
105         "", // BPHYS_DATA_LOCATION
106         "", // BPHYS_DATA_VELOCITY
107         "", // BPHYS_DATA_ROTATION
108         "", // BPHYS_DATA_AVELOCITY / BPHYS_DATA_XCONST */
109         "", // BPHYS_DATA_SIZE:
110         "", // BPHYS_DATA_TIMES:        
111         "BoidData" // case BPHYS_DATA_BOIDS:
112 };
113
114 static char *ptcache_extra_datastruct[] = {
115         "",
116         "ParticleSpring"
117 };
118
119 static int ptcache_extra_datasize[] = {
120         0,
121         sizeof(ParticleSpring)
122 };
123
124 typedef struct PTCacheFile {
125         FILE *fp;
126
127         int frame, old_format;
128         unsigned int totpoint, type;
129         unsigned int data_types, flag;
130
131         struct PTCacheData data;
132         void *cur[BPHYS_TOT_DATA];
133 } PTCacheFile;
134
135 #define PTCACHE_VEL_PER_SEC             1
136
137 typedef struct PTCacheID {
138         struct PTCacheID *next, *prev;
139
140         struct Scene *scene;
141         struct Object *ob;
142         void *calldata;
143         unsigned int type;
144         unsigned int stack_index;
145         unsigned int flag;
146
147         /* flags defined in DNA_object_force.h */
148         unsigned int data_types, info_types;
149
150         /* copies point data to cache data */
151         int (*write_point)(int index, void *calldata, void **data, int cfra);
152         /* copies cache cata to point data */
153         void (*read_point)(int index, void *calldata, void **data, float cfra, float *old_data);
154         /* interpolated between previously read point data and cache data */
155         void (*interpolate_point)(int index, void *calldata, void **data, float cfra, float cfra1, float cfra2, float *old_data);
156
157         /* copies point data to cache data */
158         int (*write_stream)(PTCacheFile *pf, void *calldata);
159         /* copies cache cata to point data */
160         void (*read_stream)(PTCacheFile *pf, void *calldata);
161
162         /* copies custom extradata to cache data */
163         void (*write_extra_data)(void *calldata, struct PTCacheMem *pm, int cfra);
164         /* copies custom extradata to cache data */
165         void (*read_extra_data)(void *calldata, struct PTCacheMem *pm, float cfra);
166         /* copies custom extradata to cache data */
167         void (*interpolate_extra_data)(void *calldata, struct PTCacheMem *pm, float cfra, float cfra1, float cfra2);
168
169         /* total number of simulated points (the cfra parameter is just for using same function pointer with totwrite) */
170         int (*totpoint)(void *calldata, int cfra);
171         /* number of points written for current cache frame */
172         int (*totwrite)(void *calldata, int cfra);
173
174         int (*write_header)(PTCacheFile *pf);
175         int (*read_header)(PTCacheFile *pf);
176
177         struct PointCache *cache;
178         /* used for setting the current cache from ptcaches list */
179         struct PointCache **cache_ptr;
180         struct ListBase *ptcaches;
181 } PTCacheID;
182
183 typedef struct PTCacheBaker {
184         struct Main *main;
185         struct Scene *scene;
186         int bake;
187         int render;
188         int anim_init;
189         int quick_step;
190         struct PTCacheID *pid;
191         int (*break_test)(void *data);
192         void *break_data;
193         void (*progressbar)(void *data, int num);
194         void (*progressend)(void *data);
195         void *progresscontext;
196 } PTCacheBaker;
197
198 /* PTCacheEditKey->flag */
199 #define PEK_SELECT              1
200 #define PEK_TAG                 2
201 #define PEK_HIDE                4
202 #define PEK_USE_WCO             8
203
204 typedef struct PTCacheEditKey{
205         float *co;
206         float *vel;
207         float *rot;
208         float *time;
209
210         float world_co[3];
211         float ftime;
212         float length;
213         short flag;
214 } PTCacheEditKey;
215
216 /* PTCacheEditPoint->flag */
217 #define PEP_TAG                         1
218 #define PEP_EDIT_RECALC         2
219 #define PEP_TRANSFORM           4
220 #define PEP_HIDE                        8
221
222 typedef struct PTCacheEditPoint {
223         struct PTCacheEditKey *keys;
224         int totkey;
225         short flag;
226 } PTCacheEditPoint;
227
228 typedef struct PTCacheUndo {
229         struct PTCacheUndo *next, *prev;
230         struct PTCacheEditPoint *points;
231
232         /* particles stuff */
233         struct ParticleData *particles;
234         struct KDTree *emitter_field;
235         float *emitter_cosnos;
236         int psys_flag;
237
238         /* cache stuff */
239         struct ListBase mem_cache;
240
241         int totpoint;
242         char name[64];
243 } PTCacheUndo;
244
245 typedef struct PTCacheEdit {
246         ListBase undo;
247         struct PTCacheUndo *curundo;
248         PTCacheEditPoint *points;
249
250         struct PTCacheID pid;
251
252         /* particles stuff */
253         struct ParticleSystem *psys;
254         struct ParticleData *particles;
255         struct KDTree *emitter_field;
256         float *emitter_cosnos; /* localspace face centers and normals (average of its verts), from the derived mesh */
257         int *mirror_cache;
258
259         struct ParticleCacheKey **pathcache;    /* path cache (runtime) */
260         ListBase pathcachebufs;
261
262         int totpoint, totframes, totcached, edited;
263
264         unsigned char sel_col[3];
265         unsigned char nosel_col[3];
266 } PTCacheEdit;
267
268 /* Particle functions */
269 void BKE_ptcache_make_particle_key(struct ParticleKey *key, int index, void **data, float time);
270
271 /**************** Creating ID's ****************************/
272 void BKE_ptcache_id_from_softbody(PTCacheID *pid, struct Object *ob, struct SoftBody *sb);
273 void BKE_ptcache_id_from_particles(PTCacheID *pid, struct Object *ob, struct ParticleSystem *psys);
274 void BKE_ptcache_id_from_cloth(PTCacheID *pid, struct Object *ob, struct ClothModifierData *clmd);
275 void BKE_ptcache_id_from_smoke(PTCacheID *pid, struct Object *ob, struct SmokeModifierData *smd);
276
277 void BKE_ptcache_ids_from_object(struct ListBase *lb, struct Object *ob, struct Scene *scene, int duplis);
278
279 /***************** Global funcs ****************************/
280 void BKE_ptcache_remove(void);
281
282 /************ ID specific functions ************************/
283 void    BKE_ptcache_id_clear(PTCacheID *id, int mode, unsigned int cfra);
284 int             BKE_ptcache_id_exist(PTCacheID *id, int cfra);
285 int             BKE_ptcache_id_reset(struct Scene *scene, PTCacheID *id, int mode);
286 void    BKE_ptcache_id_time(PTCacheID *pid, struct Scene *scene, float cfra, int *startframe, int *endframe, float *timescale);
287 int             BKE_ptcache_object_reset(struct Scene *scene, struct Object *ob, int mode);
288
289 void BKE_ptcache_update_info(PTCacheID *pid);
290
291 /*********** General cache reading/writing ******************/
292
293 /* Size of cache data type. */
294 int             BKE_ptcache_data_size(int data_type);
295
296 /* Is point with indes in memory cache */
297 int BKE_ptcache_mem_index_find(struct PTCacheMem *pm, unsigned int index);
298
299 /* Memory cache read/write helpers. */
300 void BKE_ptcache_mem_pointers_init(struct PTCacheMem *pm);
301 void BKE_ptcache_mem_pointers_incr(struct PTCacheMem *pm);
302 int  BKE_ptcache_mem_pointers_seek(int point_index, struct PTCacheMem *pm);
303
304 /* Copy a specific data type from cache data to point data. */
305 void    BKE_ptcache_data_get(void **data, int type, int index, void *to);
306
307 /* Copy a specific data type from point data to cache data. */
308 void    BKE_ptcache_data_set(void **data, int type, void *from);
309
310 /* Main cache reading call. */
311 int             BKE_ptcache_read(PTCacheID *pid, float cfra);
312
313 /* Main cache writing call. */
314 int             BKE_ptcache_write(PTCacheID *pid, unsigned int cfra);
315
316 /****************** Continue physics ***************/
317 void BKE_ptcache_set_continue_physics(struct Main *bmain, struct Scene *scene, int enable);
318 int BKE_ptcache_get_continue_physics(void);
319
320 /******************* Allocate & free ***************/
321 struct PointCache *BKE_ptcache_add(struct ListBase *ptcaches);
322 void BKE_ptcache_free_mem(struct ListBase *mem_cache);
323 void BKE_ptcache_free(struct PointCache *cache);
324 void BKE_ptcache_free_list(struct ListBase *ptcaches);
325 struct PointCache *BKE_ptcache_copy_list(struct ListBase *ptcaches_new, struct ListBase *ptcaches_old);
326
327 /********************** Baking *********************/
328
329 /* Bakes cache with cache_step sized jumps in time, not accurate but very fast. */
330 void BKE_ptcache_quick_cache_all(struct Main *bmain, struct Scene *scene);
331
332 /* Bake cache or simulate to current frame with settings defined in the baker. */
333 void BKE_ptcache_bake(struct PTCacheBaker* baker);
334
335 /* Convert disk cache to memory cache. */
336 void BKE_ptcache_disk_to_mem(struct PTCacheID *pid);
337
338 /* Convert memory cache to disk cache. */
339 void BKE_ptcache_mem_to_disk(struct PTCacheID *pid);
340
341 /* Convert disk cache to memory cache and vice versa. Clears the cache that was converted. */
342 void BKE_ptcache_toggle_disk_cache(struct PTCacheID *pid);
343
344 /* Rename all disk cache files with a new name. Doesn't touch the actual content of the files. */
345 void BKE_ptcache_disk_cache_rename(struct PTCacheID *pid, char *from, char *to);
346
347 /* Loads simulation from external (disk) cache files. */
348 void BKE_ptcache_load_external(struct PTCacheID *pid);
349
350 /* Set correct flags after successful simulation step */
351 void BKE_ptcache_validate(struct PointCache *cache, int framenr);
352
353 /* Set correct flags after unsuccessful simulation step */
354 void BKE_ptcache_invalidate(struct PointCache *cache);
355
356 #endif