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