Merge remote-tracking branch 'origin/master' into blender2.8
[blender.git] / source / blender / makesdna / DNA_smoke_types.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 by NaN Holding BV.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): Daniel Genrich (Genscher)
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 /** \file DNA_smoke_types.h
29  *  \ingroup DNA
30  */
31
32 #ifndef __DNA_SMOKE_TYPES_H__
33 #define __DNA_SMOKE_TYPES_H__
34
35 /* flags */
36 enum {
37         MOD_SMOKE_HIGHRES = (1 << 1),  /* enable high resolution */
38         MOD_SMOKE_DISSOLVE = (1 << 2),  /* let smoke dissolve */
39         MOD_SMOKE_DISSOLVE_LOG = (1 << 3),  /* using 1/x for dissolve */
40
41 #ifdef DNA_DEPRECATED
42         MOD_SMOKE_HIGH_SMOOTH = (1 << 5),  /* -- Deprecated -- */
43 #endif
44         MOD_SMOKE_FILE_LOAD = (1 << 6),  /* flag for file load */
45         MOD_SMOKE_ADAPTIVE_DOMAIN = (1 << 7),
46 };
47
48 /* noise */
49 #define MOD_SMOKE_NOISEWAVE (1<<0)
50 #define MOD_SMOKE_NOISEFFT (1<<1)
51 #define MOD_SMOKE_NOISECURL (1<<2)
52 /* viewsettings */
53 #define MOD_SMOKE_VIEW_SHOWBIG (1<<0)
54
55 /* slice method */
56 enum {
57         MOD_SMOKE_SLICE_VIEW_ALIGNED = 0,
58         MOD_SMOKE_SLICE_AXIS_ALIGNED = 1,
59 };
60
61 /* axis aligned method */
62 enum {
63         AXIS_SLICE_FULL   = 0,
64         AXIS_SLICE_SINGLE = 1,
65 };
66
67 /* single slice direction */
68 enum {
69         SLICE_AXIS_AUTO = 0,
70         SLICE_AXIS_X    = 1,
71         SLICE_AXIS_Y    = 2,
72         SLICE_AXIS_Z    = 3,
73 };
74
75 /* axis aligned method */
76 enum {
77         VOLUME_INTERP_LINEAR   = 0,
78         VOLUME_INTERP_CUBIC    = 1,
79 };
80
81 enum {
82         VECTOR_DRAW_NEEDLE     = 0,
83         VECTOR_DRAW_STREAMLINE = 1,
84 };
85
86 enum {
87         FLUID_FIELD_DENSITY    = 0,
88         FLUID_FIELD_HEAT       = 1,
89         FLUID_FIELD_FUEL       = 2,
90         FLUID_FIELD_REACT      = 3,
91         FLUID_FIELD_FLAME      = 4,
92         FLUID_FIELD_VELOCITY_X = 5,
93         FLUID_FIELD_VELOCITY_Y = 6,
94         FLUID_FIELD_VELOCITY_Z = 7,
95         FLUID_FIELD_COLOR_R    = 8,
96         FLUID_FIELD_COLOR_G    = 9,
97         FLUID_FIELD_COLOR_B    = 10,
98         FLUID_FIELD_FORCE_X    = 11,
99         FLUID_FIELD_FORCE_Y    = 12,
100         FLUID_FIELD_FORCE_Z    = 13,
101 };
102
103 /* cache compression */
104 #define SM_CACHE_LIGHT          0
105 #define SM_CACHE_HEAVY          1
106
107 /* domain border collision */
108 #define SM_BORDER_OPEN          0
109 #define SM_BORDER_VERTICAL      1
110 #define SM_BORDER_CLOSED        2
111
112 /* collision types */
113 #define SM_COLL_STATIC          0
114 #define SM_COLL_RIGID           1
115 #define SM_COLL_ANIMATED        2
116
117 /* high resolution sampling types */
118 #define SM_HRES_NEAREST         0
119 #define SM_HRES_LINEAR          1
120 #define SM_HRES_FULLSAMPLE      2
121
122 /* smoke data fields (active_fields) */
123 #define SM_ACTIVE_HEAT          (1<<0)
124 #define SM_ACTIVE_FIRE          (1<<1)
125 #define SM_ACTIVE_COLORS        (1<<2)
126 #define SM_ACTIVE_COLOR_SET     (1<<3)
127
128 enum {
129         VDB_COMPRESSION_BLOSC = 0,
130         VDB_COMPRESSION_ZIP   = 1,
131         VDB_COMPRESSION_NONE  = 2,
132 };
133
134 typedef struct SmokeDomainSettings {
135         struct SmokeModifierData *smd; /* for fast RNA access */
136         struct FLUID_3D *fluid;
137         void *fluid_mutex;
138         struct Collection *fluid_group;
139         struct Collection *eff_group; // UNUSED
140         struct Collection *coll_group; // collision objects group
141         struct WTURBULENCE *wt; // WTURBULENCE object, if active
142         struct GPUTexture *tex;
143         struct GPUTexture *tex_wt;
144         struct GPUTexture *tex_shadow;
145         struct GPUTexture *tex_flame;
146         struct GPUTexture *tex_flame_coba;
147         struct GPUTexture *tex_coba;
148         struct GPUTexture *tex_field;
149         struct GPUTexture *tex_velocity_x;
150         struct GPUTexture *tex_velocity_y;
151         struct GPUTexture *tex_velocity_z;
152         float *shadow;
153
154         /* simulation data */
155         float p0[3]; /* start point of BB in local space (includes sub-cell shift for adaptive domain)*/
156         float p1[3]; /* end point of BB in local space */
157         float dp0[3]; /* difference from object center to grid start point */
158         float cell_size[3]; /* size of simulation cell in local space */
159         float global_size[3]; /* global size of domain axises */
160         float prev_loc[3];
161         int shift[3]; /* current domain shift in simulation cells */
162         float shift_f[3]; /* exact domain shift */
163         float obj_shift_f[3]; /* how much object has shifted since previous smoke frame (used to "lock" domain while drawing) */
164         float imat[4][4]; /* domain object imat */
165         float obmat[4][4]; /* domain obmat */
166         float fluidmat[4][4]; /* low res fluid matrix */
167         float fluidmat_wt[4][4]; /* high res fluid matrix */
168
169         int base_res[3]; /* initial "non-adapted" resolution */
170         int res_min[3]; /* cell min */
171         int res_max[3]; /* cell max */
172         int res[3]; /* data resolution (res_max-res_min) */
173         int total_cells;
174         float dx; /* 1.0f / res */
175         float scale; /* largest domain size */
176
177         /* user settings */
178         int adapt_margin;
179         int adapt_res;
180         float adapt_threshold;
181
182         float alpha;
183         float beta;
184         int amplify; /* wavelet amplification */
185         int maxres; /* longest axis on the BB gets this resolution assigned */
186         int flags; /* show up-res or low res, etc */
187         int viewsettings;
188         short noise; /* noise type: wave, curl, anisotropic */
189         short diss_percent;
190         int diss_speed;/* in frames */
191         float strength;
192         int res_wt[3];
193         float dx_wt;
194         /* point cache options */
195         int cache_comp;
196         int cache_high_comp;
197         /* OpenVDB cache options */
198         int openvdb_comp;
199         char cache_file_format;
200         char data_depth;
201         char pad[2];
202
203         /* Smoke uses only one cache from now on (index [0]), but keeping the array for now for reading old files. */
204         struct PointCache *point_cache[2];      /* definition is in DNA_object_force_types.h */
205         struct ListBase ptcaches[2];
206         struct EffectorWeights *effector_weights;
207         int border_collisions;  /* How domain border collisions are handled */
208         float time_scale;
209         float vorticity;
210         int active_fields;
211         float active_color[3]; /* monitor color situation of simulation */
212         int highres_sampling;
213
214         /* flame parameters */
215         float burning_rate, flame_smoke, flame_vorticity;
216         float flame_ignition, flame_max_temp;
217         float flame_smoke_color[3];
218
219         /* Display settings */
220         char slice_method, axis_slice_method;
221         char slice_axis, draw_velocity;
222         float slice_per_voxel;
223         float slice_depth;
224         float display_thickness;
225
226         struct ColorBand *coba;
227         float vector_scale;
228         char vector_draw_type;
229         char use_coba;
230         char coba_field;  /* simulation field used for the color mapping */
231         char interp_method;
232
233         float clipping;
234         float pad3;
235 } SmokeDomainSettings;
236
237
238 /* inflow / outflow */
239
240 /* type */
241 #define MOD_SMOKE_FLOW_TYPE_SMOKE 0
242 #define MOD_SMOKE_FLOW_TYPE_FIRE 1
243 #define MOD_SMOKE_FLOW_TYPE_OUTFLOW 2
244 #define MOD_SMOKE_FLOW_TYPE_SMOKEFIRE 3
245
246 /* flow source */
247 #define MOD_SMOKE_FLOW_SOURCE_PARTICLES 0
248 #define MOD_SMOKE_FLOW_SOURCE_MESH 1
249
250 /* flow texture type */
251 #define MOD_SMOKE_FLOW_TEXTURE_MAP_AUTO 0
252 #define MOD_SMOKE_FLOW_TEXTURE_MAP_UV 1
253
254 /* flags */
255 #define MOD_SMOKE_FLOW_ABSOLUTE (1<<1) /*old style emission*/
256 #define MOD_SMOKE_FLOW_INITVELOCITY (1<<2) /* passes particles speed to the smoke */
257 #define MOD_SMOKE_FLOW_TEXTUREEMIT (1<<3) /* use texture to control emission speed */
258 #define MOD_SMOKE_FLOW_USE_PART_SIZE (1<<4) /* use specific size for particles instead of closest cell */
259
260 typedef struct SmokeFlowSettings {
261         struct SmokeModifierData *smd; /* for fast RNA access */
262         struct Mesh *mesh;
263         struct ParticleSystem *psys;
264         struct Tex *noise_texture;
265
266         /* initial velocity */
267         float *verts_old; /* previous vertex positions in domain space */
268         int numverts;
269         float vel_multi; // Multiplier for inherited velocity
270         float vel_normal;
271         float vel_random;
272         /* emission */
273         float density;
274         float color[3];
275         float fuel_amount;
276         float temp; /* delta temperature (temp - ambient temp) */
277         float volume_density; /* density emitted within mesh volume */
278         float surface_distance; /* maximum emission distance from mesh surface */
279         float particle_size;
280         int subframes;
281         /* texture control */
282         float texture_size;
283         float texture_offset;
284         int pad;
285         char uvlayer_name[64];  /* MAX_CUSTOMDATA_LAYER_NAME */
286         short vgroup_density;
287
288         short type; /* smoke, flames, both, outflow */
289         short source;
290         short texture_type;
291         int flags; /* absolute emission etc*/
292 } SmokeFlowSettings;
293
294
295 // struct BVHTreeFromMesh *bvh;
296 // float mat[4][4];
297 // float mat_old[4][4];
298
299 /* collision objects (filled with smoke) */
300 typedef struct SmokeCollSettings {
301         struct SmokeModifierData *smd; /* for fast RNA access */
302         struct Mesh *mesh;
303         float *verts_old;
304         int numverts;
305         short type; // static = 0, rigid = 1, dynamic = 2
306         short pad;
307 } SmokeCollSettings;
308
309 #endif