merge with 2.5 (not trunk, last merge message said that on accident) at r22252
[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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, 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
34 #include "MEM_guardedalloc.h"
35
36 /* Point cache clearing option, for BKE_ptcache_id_clear, before
37  * and after are non inclusive (they wont remove the cfra) */
38 #define PTCACHE_CLEAR_ALL               0
39 #define PTCACHE_CLEAR_FRAME             1
40 #define PTCACHE_CLEAR_BEFORE    2
41 #define PTCACHE_CLEAR_AFTER             3
42
43 /* Point cache reset options */
44 #define PTCACHE_RESET_DEPSGRAPH         0
45 #define PTCACHE_RESET_BAKED                     1
46 #define PTCACHE_RESET_OUTDATED          2
47 #define PTCACHE_RESET_FREE                      3
48
49 /* Add the blendfile name after blendcache_ */
50 #define PTCACHE_EXT ".bphys"
51 #define PTCACHE_PATH "blendcache_"
52
53 /* File open options, for BKE_ptcache_file_open */
54 #define PTCACHE_FILE_READ       0
55 #define PTCACHE_FILE_WRITE      1
56
57 /* PTCacheID types */
58 #define PTCACHE_TYPE_SOFTBODY   0
59 #define PTCACHE_TYPE_PARTICLES  1
60 #define PTCACHE_TYPE_CLOTH              2
61
62 /* PTCache read return code */
63 #define PTCACHE_READ_EXACT                              1
64 #define PTCACHE_READ_INTERPOLATED               2
65 #define PTCACHE_READ_OLD                                3
66
67 /* Structs */
68 struct Object;
69 struct Scene;
70 struct SoftBody;
71 struct ParticleSystem;
72 struct ClothModifierData;
73 struct PointCache;
74 struct ListBase;
75
76 typedef struct PTCacheFile {
77         FILE *fp;
78 } PTCacheFile;
79
80 typedef struct PTCacheID {
81         struct PTCacheID *next, *prev;
82
83         struct Object *ob;
84         void *data;
85         int type;
86         int stack_index;
87
88         struct PointCache *cache;
89 } PTCacheID;
90
91 typedef struct PTCacheWriter {
92         struct PTCacheID *pid;
93         int cfra;
94         int totelem;
95
96         void (*set_elem)(int index, void *calldata, float *data);
97         void *calldata;
98 } PTCacheWriter;
99
100 typedef struct PTCacheReader {
101         struct Scene *scene;
102         struct PTCacheID *pid;
103         float cfra;
104         int totelem;
105
106         void (*set_elem)(int elem_index, void *calldata, float *data);
107         void (*interpolate_elem)(int index, void *calldata, float frs_sec, float cfra, float cfra1, float cfra2, float *data1, float *data2);
108         void *calldata;
109
110         int *old_frame;
111 } PTCacheReader;
112
113 typedef struct PTCacheBaker {
114         struct Scene *scene;
115         int bake;
116         int render;
117         int anim_init;
118         int quick_step;
119         struct PTCacheID *pid;
120         int (*break_test)(void *data);
121         void *break_data;
122         void (*progressbar)(void *data, int num);
123         void *progresscontext;
124 } PTCacheBaker;
125
126 /* Creating ID's */
127 void BKE_ptcache_id_from_softbody(PTCacheID *pid, struct Object *ob, struct SoftBody *sb);
128 void BKE_ptcache_id_from_particles(PTCacheID *pid, struct Object *ob, struct ParticleSystem *psys);
129 void BKE_ptcache_id_from_cloth(PTCacheID *pid, struct Object *ob, struct ClothModifierData *clmd);
130
131 void BKE_ptcache_ids_from_object(struct ListBase *lb, struct Object *ob);
132
133 /* Global funcs */
134 void BKE_ptcache_remove(void);
135
136 /* ID specific functions */
137 void    BKE_ptcache_id_clear(PTCacheID *id, int mode, int cfra);
138 int             BKE_ptcache_id_exist(PTCacheID *id, int cfra);
139 int             BKE_ptcache_id_reset(struct Scene *scene, PTCacheID *id, int mode);
140 void    BKE_ptcache_id_time(PTCacheID *pid, struct Scene *scene, float cfra, int *startframe, int *endframe, float *timescale);
141 int             BKE_ptcache_object_reset(struct Scene *scene, struct Object *ob, int mode);
142
143 /* File reading/writing */
144 PTCacheFile     *BKE_ptcache_file_open(PTCacheID *id, int mode, int cfra);
145 void         BKE_ptcache_file_close(PTCacheFile *pf);
146 int          BKE_ptcache_file_read_floats(PTCacheFile *pf, float *f, int tot);
147 int          BKE_ptcache_file_write_floats(PTCacheFile *pf, float *f, int tot);
148
149 void BKE_ptcache_update_info(PTCacheID *pid);
150
151 /* General cache reading/writing */
152 int                      BKE_ptcache_read_cache(PTCacheReader *reader);
153 int                      BKE_ptcache_write_cache(PTCacheWriter *writer);
154
155 /* Continue physics */
156 void BKE_ptcache_set_continue_physics(struct Scene *scene, int enable);
157 int BKE_ptcache_get_continue_physics(void);
158
159 /* Point Cache */
160 struct PointCache *BKE_ptcache_add(void);
161 void BKE_ptcache_free(struct PointCache *cache);
162 struct PointCache *BKE_ptcache_copy(struct PointCache *cache);
163
164 /* Baking */
165 void BKE_ptcache_quick_cache_all(struct Scene *scene);
166 void BKE_ptcache_make_cache(struct PTCacheBaker* baker);
167 void BKE_ptcache_toggle_disk_cache(struct PTCacheID *pid);
168
169 void BKE_ptcache_load_external(struct PTCacheID *pid);
170
171 #endif