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