Merge branch 'blender2.7'
[blender.git] / source / blender / blenkernel / BKE_pointcache.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) 2006 Blender Foundation.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): Campbell Barton <ideasman42@gmail.com>
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 #ifndef __BKE_POINTCACHE_H__
29 #define __BKE_POINTCACHE_H__
30
31 /** \file BKE_pointcache.h
32  *  \ingroup bke
33  */
34
35 #include "DNA_ID.h"
36 #include "DNA_dynamicpaint_types.h"
37 #include "DNA_object_force_types.h"
38 #include "DNA_boid_types.h"
39 #include <stdio.h> /* for FILE */
40
41 /* Point cache clearing option, for BKE_ptcache_id_clear, before
42  * and after are non inclusive (they wont remove the cfra) */
43 #define PTCACHE_CLEAR_ALL       0
44 #define PTCACHE_CLEAR_FRAME     1
45 #define PTCACHE_CLEAR_BEFORE    2
46 #define PTCACHE_CLEAR_AFTER     3
47
48 /* Point cache reset options */
49 #define PTCACHE_RESET_DEPSGRAPH     0
50 #define PTCACHE_RESET_BAKED         1
51 #define PTCACHE_RESET_OUTDATED      2
52 /* #define PTCACHE_RESET_FREE                   3 */ /*UNUSED*/
53
54 /* Add the blendfile name after blendcache_ */
55 #define PTCACHE_EXT ".bphys"
56 #define PTCACHE_PATH "blendcache_"
57
58 /* File open options, for BKE_ptcache_file_open */
59 #define PTCACHE_FILE_READ   0
60 #define PTCACHE_FILE_WRITE  1
61 #define PTCACHE_FILE_UPDATE 2
62
63 /* PTCacheID types */
64 #define PTCACHE_TYPE_SOFTBODY           0
65 #define PTCACHE_TYPE_PARTICLES          1
66 #define PTCACHE_TYPE_CLOTH              2
67 #define PTCACHE_TYPE_SMOKE_DOMAIN       3
68 #define PTCACHE_TYPE_SMOKE_HIGHRES      4
69 #define PTCACHE_TYPE_DYNAMICPAINT       5
70 #define PTCACHE_TYPE_RIGIDBODY          6
71
72 /* high bits reserved for flags that need to be stored in file */
73 #define PTCACHE_TYPEFLAG_COMPRESS       (1 << 16)
74 #define PTCACHE_TYPEFLAG_EXTRADATA      (1 << 17)
75
76 #define PTCACHE_TYPEFLAG_TYPEMASK           0x0000FFFF
77 #define PTCACHE_TYPEFLAG_FLAGMASK           0xFFFF0000
78
79 /* PTCache read return code */
80 #define PTCACHE_READ_EXACT              1
81 #define PTCACHE_READ_INTERPOLATED       2
82 #define PTCACHE_READ_OLD                3
83
84 /* Structs */
85 struct ClothModifierData;
86 struct ListBase;
87 struct Main;
88 struct Object;
89 struct ParticleKey;
90 struct ParticleSystem;
91 struct PointCache;
92 struct Scene;
93 struct ViewLayer;
94 struct SmokeModifierData;
95 struct SoftBody;
96 struct RigidBodyWorld;
97
98 struct OpenVDBReader;
99 struct OpenVDBWriter;
100
101 /* temp structure for read/write */
102 typedef struct PTCacheData {
103         unsigned int index;
104         float loc[3];
105         float vel[3];
106         float rot[4];
107         float ave[3];
108         float size;
109         float times[3];
110         struct BoidData boids;
111 } PTCacheData;
112
113 typedef struct PTCacheFile {
114         FILE *fp;
115
116         int frame, old_format;
117         unsigned int totpoint, type;
118         unsigned int data_types, flag;
119
120         struct PTCacheData data;
121         void *cur[BPHYS_TOT_DATA];
122 } PTCacheFile;
123
124 #define PTCACHE_VEL_PER_SEC     1
125
126 enum {
127         PTCACHE_FILE_PTCACHE = 0,
128         PTCACHE_FILE_OPENVDB = 1,
129 };
130
131 typedef struct PTCacheID {
132         struct PTCacheID *next, *prev;
133
134         struct Scene *scene;
135         struct Object *ob;
136         void *calldata;
137         unsigned int type, file_type;
138         unsigned int stack_index;
139         unsigned int flag;
140
141         unsigned int default_step;
142         unsigned int max_step;
143
144         /* flags defined in DNA_object_force_types.h */
145         unsigned int data_types, info_types;
146
147         /* copies point data to cache data */
148         int (*write_point)(int index, void *calldata, void **data, int cfra);
149         /* copies cache cata to point data */
150         void (*read_point)(int index, void *calldata, void **data, float cfra, float *old_data);
151         /* interpolated between previously read point data and cache data */
152         void (*interpolate_point)(int index, void *calldata, void **data, float cfra, float cfra1, float cfra2, float *old_data);
153
154         /* copies point data to cache data */
155         int (*write_stream)(PTCacheFile *pf, void *calldata);
156         /* copies cache cata to point data */
157         int (*read_stream)(PTCacheFile *pf, void *calldata);
158
159         /* copies point data to cache data */
160         int (*write_openvdb_stream)(struct OpenVDBWriter *writer, void *calldata);
161         /* copies cache cata to point data */
162         int (*read_openvdb_stream)(struct OpenVDBReader *reader, void *calldata);
163
164         /* copies custom extradata to cache data */
165         void (*write_extra_data)(void *calldata, struct PTCacheMem *pm, int cfra);
166         /* copies custom extradata to cache data */
167         void (*read_extra_data)(void *calldata, struct PTCacheMem *pm, float cfra);
168         /* copies custom extradata to cache data */
169         void (*interpolate_extra_data)(void *calldata, struct PTCacheMem *pm, float cfra, float cfra1, float cfra2);
170
171         /* total number of simulated points (the cfra parameter is just for using same function pointer with totwrite) */
172         int (*totpoint)(void *calldata, int cfra);
173         /* report error if number of points does not match */
174         void (*error)(void *calldata, const char *message);
175         /* number of points written for current cache frame */
176         int (*totwrite)(void *calldata, int cfra);
177
178         int (*write_header)(PTCacheFile *pf);
179         int (*read_header)(PTCacheFile *pf);
180
181         struct PointCache *cache;
182         /* used for setting the current cache from ptcaches list */
183         struct PointCache **cache_ptr;
184         struct ListBase *ptcaches;
185 } PTCacheID;
186
187 typedef struct PTCacheBaker {
188         struct Main *bmain;
189         struct Scene *scene;
190         struct ViewLayer *view_layer;
191         struct Depsgraph *depsgraph;
192         int bake;
193         int render;
194         int anim_init;
195         int quick_step;
196         struct PTCacheID pid;
197
198         void (*update_progress)(void *data, float progress, int *cancel);
199         void *bake_job;
200 } PTCacheBaker;
201
202 /* PTCacheEditKey->flag */
203 #define PEK_SELECT      1
204 #define PEK_TAG         2
205 #define PEK_HIDE        4
206 #define PEK_USE_WCO     8
207
208 typedef struct PTCacheEditKey {
209         float *co;
210         float *vel;
211         float *rot;
212         float *time;
213
214         float world_co[3];
215         float ftime;
216         float length;
217         short flag;
218 } PTCacheEditKey;
219
220 /* PTCacheEditPoint->flag */
221 #define PEP_TAG             1
222 #define PEP_EDIT_RECALC     2
223 #define PEP_TRANSFORM       4
224 #define PEP_HIDE            8
225
226 typedef struct PTCacheEditPoint {
227         struct PTCacheEditKey *keys;
228         int totkey;
229         short flag;
230 } PTCacheEditPoint;
231
232 typedef struct PTCacheUndo {
233         struct PTCacheEditPoint *points;
234
235         /* particles stuff */
236         struct ParticleData *particles;
237         struct KDTree *emitter_field;
238         float *emitter_cosnos;
239         int psys_flag;
240
241         /* cache stuff */
242         struct ListBase mem_cache;
243
244         int totpoint;
245
246         size_t undo_size;
247 } PTCacheUndo;
248
249 enum {
250         /* Modifier stack got evaluated during particle edit mode, need to copy
251          * new evaluated particles to the edit struct.
252          */
253         PT_CACHE_EDIT_UPDATE_PARTICLE_FROM_EVAL = (1 << 0),
254 };
255
256 typedef struct PTCacheEdit {
257         int flags;
258
259         PTCacheEditPoint *points;
260
261         struct PTCacheID pid;
262
263         /* particles stuff */
264         struct ParticleSystem *psys;
265         struct ParticleSystem *psys_eval;
266         struct ParticleSystemModifierData *psmd;
267         struct ParticleSystemModifierData *psmd_eval;
268         struct KDTree *emitter_field;
269         float *emitter_cosnos; /* localspace face centers and normals (average of its verts), from the derived mesh */
270         int *mirror_cache;
271
272         struct ParticleCacheKey **pathcache;    /* path cache (runtime) */
273         ListBase pathcachebufs;
274
275         int totpoint, totframes, totcached, edited;
276
277         unsigned char sel_col[3];
278         unsigned char nosel_col[3];
279 } PTCacheEdit;
280
281 /* Particle functions */
282 void BKE_ptcache_make_particle_key(struct ParticleKey *key, int index, void **data, float time);
283
284 /**************** Creating ID's ****************************/
285 void BKE_ptcache_id_from_softbody(PTCacheID *pid, struct Object *ob, struct SoftBody *sb);
286 void BKE_ptcache_id_from_particles(PTCacheID *pid, struct Object *ob, struct ParticleSystem *psys);
287 void BKE_ptcache_id_from_cloth(PTCacheID *pid, struct Object *ob, struct ClothModifierData *clmd);
288 void BKE_ptcache_id_from_smoke(PTCacheID *pid, struct Object *ob, struct SmokeModifierData *smd);
289 void BKE_ptcache_id_from_dynamicpaint(PTCacheID *pid, struct Object *ob, struct DynamicPaintSurface *surface);
290 void BKE_ptcache_id_from_rigidbody(PTCacheID *pid, struct Object *ob, struct RigidBodyWorld *rbw);
291
292 PTCacheID BKE_ptcache_id_find(struct Object *ob, struct Scene *scene, struct PointCache *cache);
293 void BKE_ptcache_ids_from_object(
294         struct ListBase *lb, struct Object *ob, struct Scene *scene, int duplis);
295
296 /****************** Query funcs ****************************/
297
298 /* Check whether object has a point cache. */
299 bool BKE_ptcache_object_has(struct Scene *scene, struct Object *ob, int duplis);
300
301 /***************** Global funcs ****************************/
302 void BKE_ptcache_remove(void);
303
304 /************ ID specific functions ************************/
305 void    BKE_ptcache_id_clear(PTCacheID *id, int mode, unsigned int cfra);
306 int     BKE_ptcache_id_exist(PTCacheID *id, int cfra);
307 int     BKE_ptcache_id_reset(struct Scene *scene, PTCacheID *id, int mode);
308 void    BKE_ptcache_id_time(PTCacheID *pid, struct Scene *scene, float cfra, int *startframe, int *endframe, float *timescale);
309 int     BKE_ptcache_object_reset(struct Scene *scene, struct Object *ob, int mode);
310
311 void BKE_ptcache_update_info(PTCacheID *pid);
312
313 /*********** General cache reading/writing ******************/
314
315 /* Size of cache data type. */
316 int     BKE_ptcache_data_size(int data_type);
317
318 /* Is point with index in memory cache */
319 int BKE_ptcache_mem_index_find(struct PTCacheMem *pm, unsigned int index);
320
321 /* Memory cache read/write helpers. */
322 void BKE_ptcache_mem_pointers_init(struct PTCacheMem *pm);
323 void BKE_ptcache_mem_pointers_incr(struct PTCacheMem *pm);
324 int  BKE_ptcache_mem_pointers_seek(int point_index, struct PTCacheMem *pm);
325
326 /* Main cache reading call. */
327 int     BKE_ptcache_read(PTCacheID *pid, float cfra, bool no_extrapolate_old);
328
329 /* Main cache writing call. */
330 int     BKE_ptcache_write(PTCacheID *pid, unsigned int cfra);
331
332 /******************* Allocate & free ***************/
333 struct PointCache *BKE_ptcache_add(struct ListBase *ptcaches);
334 void BKE_ptcache_free_mem(struct ListBase *mem_cache);
335 void BKE_ptcache_free(struct PointCache *cache);
336 void BKE_ptcache_free_list(struct ListBase *ptcaches);
337 struct PointCache *BKE_ptcache_copy_list(struct ListBase *ptcaches_new, const struct ListBase *ptcaches_old, const int flag);
338
339 /********************** Baking *********************/
340
341 /* Bakes cache with cache_step sized jumps in time, not accurate but very fast. */
342 void BKE_ptcache_quick_cache_all(struct Main *bmain, struct Scene *scene, struct ViewLayer *view_layer);
343
344 /* Bake cache or simulate to current frame with settings defined in the baker. */
345 void BKE_ptcache_bake(struct PTCacheBaker *baker);
346
347 /* Convert disk cache to memory cache. */
348 void BKE_ptcache_disk_to_mem(struct PTCacheID *pid);
349
350 /* Convert memory cache to disk cache. */
351 void BKE_ptcache_mem_to_disk(struct PTCacheID *pid);
352
353 /* Convert disk cache to memory cache and vice versa. Clears the cache that was converted. */
354 void BKE_ptcache_toggle_disk_cache(struct PTCacheID *pid);
355
356 /* Rename all disk cache files with a new name. Doesn't touch the actual content of the files. */
357 void BKE_ptcache_disk_cache_rename(struct PTCacheID *pid, const char *name_src, const char *name_dst);
358
359 /* Loads simulation from external (disk) cache files. */
360 void BKE_ptcache_load_external(struct PTCacheID *pid);
361
362 /* Set correct flags after successful simulation step */
363 void BKE_ptcache_validate(struct PointCache *cache, int framenr);
364
365 /* Set correct flags after unsuccessful simulation step */
366 void BKE_ptcache_invalidate(struct PointCache *cache);
367
368 #endif