Pointcache code cleanup and disk cache compression options:
[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 <stdio.h> /* for FILE */
36
37 /* Point cache clearing option, for BKE_ptcache_id_clear, before
38  * and after are non inclusive (they wont remove the cfra) */
39 #define PTCACHE_CLEAR_ALL               0
40 #define PTCACHE_CLEAR_FRAME             1
41 #define PTCACHE_CLEAR_BEFORE    2
42 #define PTCACHE_CLEAR_AFTER             3
43
44 /* Point cache reset options */
45 #define PTCACHE_RESET_DEPSGRAPH         0
46 #define PTCACHE_RESET_BAKED                     1
47 #define PTCACHE_RESET_OUTDATED          2
48 #define PTCACHE_RESET_FREE                      3
49
50 /* Add the blendfile name after blendcache_ */
51 #define PTCACHE_EXT ".bphys"
52 #define PTCACHE_PATH "blendcache_"
53
54 /* File open options, for BKE_ptcache_file_open */
55 #define PTCACHE_FILE_READ       0
56 #define PTCACHE_FILE_WRITE      1
57 #define PTCACHE_FILE_UPDATE     2
58
59 /* PTCacheID types */
60 #define PTCACHE_TYPE_SOFTBODY                   0
61 #define PTCACHE_TYPE_PARTICLES                  1
62 #define PTCACHE_TYPE_CLOTH                              2
63 #define PTCACHE_TYPE_SMOKE_DOMAIN               3
64 #define PTCACHE_TYPE_SMOKE_HIGHRES              4
65
66 /* high bits reserved for flags that need to be stored in file */
67 #define PTCACHE_TYPEFLAG_COMPRESS               (1<<16)
68 #define PTCACHE_TYPEFLAG_EXTRADATA              (1<<17)
69
70 #define PTCACHE_TYPEFLAG_TYPEMASK                       0x0000FFFF
71 #define PTCACHE_TYPEFLAG_FLAGMASK                       0xFFFF0000
72
73 /* PTCache read return code */
74 #define PTCACHE_READ_EXACT                              1
75 #define PTCACHE_READ_INTERPOLATED               2
76 #define PTCACHE_READ_OLD                                3
77
78 /* Structs */
79 struct ClothModifierData;
80 struct ListBase;
81 struct Main;
82 struct Object;
83 struct ParticleKey;
84 struct ParticleSystem;
85 struct PointCache;
86 struct Scene;
87 struct SmokeModifierData;
88 struct SoftBody;
89
90 /* temp structure for read/write */
91 typedef struct PTCacheData {
92         int index;
93         float loc[3];
94         float vel[3];
95         float rot[4];
96         float ave[3];
97         float size;
98         float times[3];
99         struct BoidData boids;
100 } PTCacheData;
101
102 typedef struct PTCacheFile {
103         FILE *fp;
104
105         int totpoint, type, frame, old_format;
106         unsigned int data_types, flag;
107
108         struct PTCacheData data;
109         void *cur[BPHYS_TOT_DATA];
110 } PTCacheFile;
111
112 #define PTCACHE_VEL_PER_SEC             1
113
114 typedef struct PTCacheID {
115         struct PTCacheID *next, *prev;
116
117         struct Scene *scene;
118         struct Object *ob;
119         void *calldata;
120         int type;
121         int stack_index;
122         int flag;
123
124         /* flags defined in DNA_object_force.h */
125         unsigned int data_types, info_types;
126
127         /* copies point data to cache data */
128         int (*write_point)(int index, void *calldata, void **data, int cfra);
129         /* copies cache cata to point data */
130         void (*read_point)(int index, void *calldata, void **data, float cfra, float *old_data);
131         /* interpolated between previously read point data and cache data */
132         void (*interpolate_point)(int index, void *calldata, void **data, float cfra, float cfra1, float cfra2, float *old_data);
133
134         /* copies point data to cache data */
135         int (*write_stream)(PTCacheFile *pf, void *calldata);
136         /* copies cache cata to point data */
137         void (*read_stream)(PTCacheFile *pf, void *calldata);
138
139         /* copies custom extradata to cache data */
140         int (*write_extra_data)(void *calldata, struct PTCacheMem *pm, int cfra);
141         /* copies custom extradata to cache data */
142         int (*read_extra_data)(void *calldata, struct PTCacheMem *pm, float cfra);
143         /* copies custom extradata to cache data */
144         int (*interpolate_extra_data)(void *calldata, struct PTCacheMem *pm, float cfra, float cfra1, float cfra2);
145
146         /* total number of simulated points (the cfra parameter is just for using same function pointer with totwrite) */
147         int (*totpoint)(void *calldata, int cfra);
148         /* number of points written for current cache frame */
149         int (*totwrite)(void *calldata, int cfra);
150
151         int (*write_header)(PTCacheFile *pf);
152         int (*read_header)(PTCacheFile *pf);
153
154         struct PointCache *cache;
155         /* used for setting the current cache from ptcaches list */
156         struct PointCache **cache_ptr;
157         struct ListBase *ptcaches;
158 } PTCacheID;
159
160 typedef struct PTCacheBaker {
161         struct Main *main;
162         struct Scene *scene;
163         int bake;
164         int render;
165         int anim_init;
166         int quick_step;
167         struct PTCacheID *pid;
168         int (*break_test)(void *data);
169         void *break_data;
170         void (*progressbar)(void *data, int num);
171         void (*progressend)(void *data);
172         void *progresscontext;
173 } PTCacheBaker;
174
175 /* PTCacheEditKey->flag */
176 #define PEK_SELECT              1
177 #define PEK_TAG                 2
178 #define PEK_HIDE                4
179 #define PEK_USE_WCO             8
180
181 typedef struct PTCacheEditKey{
182         float *co;
183         float *vel;
184         float *rot;
185         float *time;
186
187         float world_co[3];
188         float ftime;
189         float length;
190         short flag;
191 } PTCacheEditKey;
192
193 /* PTCacheEditPoint->flag */
194 #define PEP_TAG                         1
195 #define PEP_EDIT_RECALC         2
196 #define PEP_TRANSFORM           4
197 #define PEP_HIDE                        8
198
199 typedef struct PTCacheEditPoint {
200         struct PTCacheEditKey *keys;
201         int totkey;
202         short flag;
203 } PTCacheEditPoint;
204
205 typedef struct PTCacheUndo {
206         struct PTCacheUndo *next, *prev;
207         struct PTCacheEditPoint *points;
208
209         /* particles stuff */
210         struct ParticleData *particles;
211         struct KDTree *emitter_field;
212         float *emitter_cosnos;
213         int psys_flag;
214
215         /* cache stuff */
216         struct ListBase mem_cache;
217
218         int totpoint;
219         char name[64];
220 } PTCacheUndo;
221
222 typedef struct PTCacheEdit {
223         ListBase undo;
224         struct PTCacheUndo *curundo;
225         PTCacheEditPoint *points;
226
227         struct PTCacheID pid;
228
229         /* particles stuff */
230         struct ParticleSystem *psys;
231         struct ParticleData *particles;
232         struct KDTree *emitter_field;
233         float *emitter_cosnos; /* localspace face centers and normals (average of its verts), from the derived mesh */
234         int *mirror_cache;
235
236         struct ParticleCacheKey **pathcache;    /* path cache (runtime) */
237         ListBase pathcachebufs;
238
239         int totpoint, totframes, totcached, edited;
240
241         unsigned char sel_col[3];
242         unsigned char nosel_col[3];
243 } PTCacheEdit;
244
245 /* Particle functions */
246 void BKE_ptcache_make_particle_key(struct ParticleKey *key, int index, void **data, float time);
247
248 /**************** Creating ID's ****************************/
249 void BKE_ptcache_id_from_softbody(PTCacheID *pid, struct Object *ob, struct SoftBody *sb);
250 void BKE_ptcache_id_from_particles(PTCacheID *pid, struct Object *ob, struct ParticleSystem *psys);
251 void BKE_ptcache_id_from_cloth(PTCacheID *pid, struct Object *ob, struct ClothModifierData *clmd);
252 void BKE_ptcache_id_from_smoke(PTCacheID *pid, struct Object *ob, struct SmokeModifierData *smd);
253
254 void BKE_ptcache_ids_from_object(struct ListBase *lb, struct Object *ob, struct Scene *scene, int duplis);
255
256 /***************** Global funcs ****************************/
257 void BKE_ptcache_remove(void);
258
259 /************ ID specific functions ************************/
260 void    BKE_ptcache_id_clear(PTCacheID *id, int mode, int cfra);
261 int             BKE_ptcache_id_exist(PTCacheID *id, int cfra);
262 int             BKE_ptcache_id_reset(struct Scene *scene, PTCacheID *id, int mode);
263 void    BKE_ptcache_id_time(PTCacheID *pid, struct Scene *scene, float cfra, int *startframe, int *endframe, float *timescale);
264 int             BKE_ptcache_object_reset(struct Scene *scene, struct Object *ob, int mode);
265
266 void BKE_ptcache_update_info(PTCacheID *pid);
267
268 /*********** General cache reading/writing ******************/
269
270 /* Size of cache data type. */
271 int             BKE_ptcache_data_size(int data_type);
272
273 /* Memory cache read/write helpers. */
274 void BKE_ptcache_mem_pointers_init(struct PTCacheMem *pm);
275 void BKE_ptcache_mem_pointers_incr(struct PTCacheMem *pm);
276 int  BKE_ptcache_mem_pointers_seek(int point_index, struct PTCacheMem *pm);
277
278 /* Copy a specific data type from cache data to point data. */
279 void    BKE_ptcache_data_get(void **data, int type, int index, void *to);
280
281 /* Copy a specific data type from point data to cache data. */
282 void    BKE_ptcache_data_set(void **data, int type, void *from);
283
284 /* Main cache reading call. */
285 int             BKE_ptcache_read(PTCacheID *pid, float cfra);
286
287 /* Main cache writing call. */
288 int             BKE_ptcache_write(PTCacheID *pid, int cfra);
289
290 /****************** Continue physics ***************/
291 void BKE_ptcache_set_continue_physics(struct Main *bmain, struct Scene *scene, int enable);
292 int BKE_ptcache_get_continue_physics(void);
293
294 /******************* Allocate & free ***************/
295 struct PointCache *BKE_ptcache_add(struct ListBase *ptcaches);
296 void BKE_ptcache_free_mem(struct ListBase *mem_cache);
297 void BKE_ptcache_free(struct PointCache *cache);
298 void BKE_ptcache_free_list(struct ListBase *ptcaches);
299 struct PointCache *BKE_ptcache_copy_list(struct ListBase *ptcaches_new, struct ListBase *ptcaches_old);
300
301 /********************** Baking *********************/
302
303 /* Bakes cache with cache_step sized jumps in time, not accurate but very fast. */
304 void BKE_ptcache_quick_cache_all(struct Main *bmain, struct Scene *scene);
305
306 /* Bake cache or simulate to current frame with settings defined in the baker. */
307 void BKE_ptcache_bake(struct PTCacheBaker* baker);
308
309 /* Convert disk cache to memory cache. */
310 void BKE_ptcache_disk_to_mem(struct PTCacheID *pid);
311
312 /* Convert memory cache to disk cache. */
313 void BKE_ptcache_mem_to_disk(struct PTCacheID *pid);
314
315 /* Convert disk cache to memory cache and vice versa. Clears the cache that was converted. */
316 void BKE_ptcache_toggle_disk_cache(struct PTCacheID *pid);
317
318 /* Rename all disk cache files with a new name. Doesn't touch the actual content of the files. */
319 void BKE_ptcache_disk_cache_rename(struct PTCacheID *pid, char *from, char *to);
320
321 /* Loads simulation from external (disk) cache files. */
322 void BKE_ptcache_load_external(struct PTCacheID *pid);
323
324 /* Set correct flags after successful simulation step */
325 void BKE_ptcache_validate(struct PointCache *cache, int framenr);
326
327 /* Set correct flags after unsuccessful simulation step */
328 void BKE_ptcache_invalidate(struct PointCache *cache);
329
330 #endif