Merge branch 'master' into blender2.8
[blender.git] / source / blender / makesrna / intern / rna_smoke.c
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  * Contributor(s): Daniel Genrich
19  *                 Blender Foundation
20  *
21  * ***** END GPL LICENSE BLOCK *****
22  */
23
24 /** \file blender/makesrna/intern/rna_smoke.c
25  *  \ingroup RNA
26  */
27
28
29 #include <stdlib.h>
30 #include <limits.h>
31
32 #include "BLI_sys_types.h"
33 #include "BLI_threads.h"
34
35 #include "RNA_define.h"
36 #include "RNA_enum_types.h"
37
38 #include "rna_internal.h"
39
40 #include "BKE_modifier.h"
41 #include "BKE_smoke.h"
42 #include "BKE_pointcache.h"
43
44 #include "DNA_modifier_types.h"
45 #include "DNA_object_force_types.h"
46 #include "DNA_object_types.h"
47 #include "DNA_scene_types.h"
48 #include "DNA_smoke_types.h"
49
50 #include "WM_types.h"
51
52
53 #ifdef RNA_RUNTIME
54
55 #include "BKE_colorband.h"
56 #include "BKE_context.h"
57 #include "BKE_particle.h"
58
59 #include "DEG_depsgraph.h"
60 #include "DEG_depsgraph_build.h"
61
62 #include "smoke_API.h"
63
64
65 static void rna_Smoke_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
66 {
67         DEG_id_tag_update(ptr->id.data, OB_RECALC_DATA);
68 }
69
70 static void rna_Smoke_dependency_update(Main *bmain, Scene *scene, PointerRNA *ptr)
71 {
72         rna_Smoke_update(bmain, scene, ptr);
73         DEG_relations_tag_update(bmain);
74 }
75
76 static void rna_Smoke_resetCache(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
77 {
78         SmokeDomainSettings *settings = (SmokeDomainSettings *)ptr->data;
79         if (settings->smd && settings->smd->domain)
80                 settings->point_cache[0]->flag |= PTCACHE_OUTDATED;
81         DEG_id_tag_update(ptr->id.data, OB_RECALC_DATA);
82 }
83
84 static void rna_Smoke_cachetype_set(struct PointerRNA *ptr, int value)
85 {
86         SmokeDomainSettings *settings = (SmokeDomainSettings *)ptr->data;
87         Object *ob = (Object *)ptr->id.data;
88
89         if (value != settings->cache_file_format) {
90                 /* Clear old caches. */
91                 PTCacheID id;
92                 BKE_ptcache_id_from_smoke(&id, ob, settings->smd);
93                 BKE_ptcache_id_clear(&id, PTCACHE_CLEAR_ALL, 0);
94
95                 settings->cache_file_format = value;
96         }
97 }
98
99 static void rna_Smoke_reset(Main *bmain, Scene *scene, PointerRNA *ptr)
100 {
101         SmokeDomainSettings *settings = (SmokeDomainSettings *)ptr->data;
102
103         smokeModifier_reset(settings->smd);
104         rna_Smoke_resetCache(bmain, scene, ptr);
105
106         rna_Smoke_update(bmain, scene, ptr);
107 }
108
109 static void rna_Smoke_reset_dependency(Main *bmain, Scene *scene, PointerRNA *ptr)
110 {
111         SmokeDomainSettings *settings = (SmokeDomainSettings *)ptr->data;
112
113         smokeModifier_reset(settings->smd);
114
115         if (settings->smd && settings->smd->domain)
116                 settings->smd->domain->point_cache[0]->flag |= PTCACHE_OUTDATED;
117
118         rna_Smoke_dependency_update(bmain, scene, ptr);
119 }
120
121 static char *rna_SmokeDomainSettings_path(PointerRNA *ptr)
122 {
123         SmokeDomainSettings *settings = (SmokeDomainSettings *)ptr->data;
124         ModifierData *md = (ModifierData *)settings->smd;
125         char name_esc[sizeof(md->name) * 2];
126
127         BLI_strescape(name_esc, md->name, sizeof(name_esc));
128         return BLI_sprintfN("modifiers[\"%s\"].domain_settings", name_esc);
129 }
130
131 static char *rna_SmokeFlowSettings_path(PointerRNA *ptr)
132 {
133         SmokeFlowSettings *settings = (SmokeFlowSettings *)ptr->data;
134         ModifierData *md = (ModifierData *)settings->smd;
135         char name_esc[sizeof(md->name) * 2];
136
137         BLI_strescape(name_esc, md->name, sizeof(name_esc));
138         return BLI_sprintfN("modifiers[\"%s\"].flow_settings", name_esc);
139 }
140
141 static char *rna_SmokeCollSettings_path(PointerRNA *ptr)
142 {
143         SmokeCollSettings *settings = (SmokeCollSettings *)ptr->data;
144         ModifierData *md = (ModifierData *)settings->smd;
145         char name_esc[sizeof(md->name) * 2];
146
147         BLI_strescape(name_esc, md->name, sizeof(name_esc));
148         return BLI_sprintfN("modifiers[\"%s\"].coll_settings", name_esc);
149 }
150
151 static int rna_SmokeModifier_grid_get_length(PointerRNA *ptr, int length[RNA_MAX_ARRAY_DIMENSION])
152 {
153 #ifdef WITH_SMOKE
154         SmokeDomainSettings *sds = (SmokeDomainSettings *)ptr->data;
155         float *density = NULL;
156         int size = 0;
157
158         if (sds->flags & MOD_SMOKE_HIGHRES && sds->wt) {
159                 /* high resolution smoke */
160                 int res[3];
161
162                 smoke_turbulence_get_res(sds->wt, res);
163                 size = res[0] * res[1] * res[2];
164
165                 density = smoke_turbulence_get_density(sds->wt);
166         }
167         else if (sds->fluid) {
168                 /* regular resolution */
169                 size = sds->res[0] * sds->res[1] * sds->res[2];
170                 density = smoke_get_density(sds->fluid);
171         }
172
173         length[0] = (density) ? size : 0;
174 #else
175         (void)ptr;
176         length[0] = 0;
177 #endif
178         return length[0];
179 }
180
181 static int rna_SmokeModifier_color_grid_get_length(PointerRNA *ptr, int length[RNA_MAX_ARRAY_DIMENSION])
182 {
183         rna_SmokeModifier_grid_get_length(ptr, length);
184
185         length[0] *= 4;
186         return length[0];
187 }
188
189 static int rna_SmokeModifier_velocity_grid_get_length(PointerRNA *ptr, int length[RNA_MAX_ARRAY_DIMENSION])
190 {
191 #ifdef WITH_SMOKE
192         SmokeDomainSettings *sds = (SmokeDomainSettings *)ptr->data;
193         float *vx = NULL;
194         float *vy = NULL;
195         float *vz = NULL;
196         int size = 0;
197
198         /* Velocity data is always low-resolution. */
199         if (sds->fluid) {
200                 size = 3 * sds->res[0] * sds->res[1] * sds->res[2];
201                 vx = smoke_get_velocity_x(sds->fluid);
202                 vy = smoke_get_velocity_y(sds->fluid);
203                 vz = smoke_get_velocity_z(sds->fluid);
204         }
205
206         length[0] = (vx && vy && vz) ? size : 0;
207 #else
208         (void)ptr;
209         length[0] = 0;
210 #endif
211         return length[0];
212 }
213
214 static int rna_SmokeModifier_heat_grid_get_length(
215         PointerRNA *ptr,
216         int length[RNA_MAX_ARRAY_DIMENSION])
217 {
218 #ifdef WITH_SMOKE
219         SmokeDomainSettings *sds = (SmokeDomainSettings *)ptr->data;
220         float *heat = NULL;
221         int size = 0;
222
223         /* Heat data is always low-resolution. */
224         if (sds->fluid) {
225                 size = sds->res[0] * sds->res[1] * sds->res[2];
226                 heat = smoke_get_heat(sds->fluid);
227         }
228
229         length[0] = (heat) ? size : 0;
230 #else
231         (void)ptr;
232         length[0] = 0;
233 #endif
234         return length[0];
235 }
236
237 static void rna_SmokeModifier_density_grid_get(PointerRNA *ptr, float *values)
238 {
239 #ifdef WITH_SMOKE
240         SmokeDomainSettings *sds = (SmokeDomainSettings *)ptr->data;
241         int length[RNA_MAX_ARRAY_DIMENSION];
242         int size = rna_SmokeModifier_grid_get_length(ptr, length);
243         float *density;
244
245         BLI_rw_mutex_lock(sds->fluid_mutex, THREAD_LOCK_READ);
246         
247         if (sds->flags & MOD_SMOKE_HIGHRES && sds->wt)
248                 density = smoke_turbulence_get_density(sds->wt);
249         else
250                 density = smoke_get_density(sds->fluid);
251
252         memcpy(values, density, size * sizeof(float));
253
254         BLI_rw_mutex_unlock(sds->fluid_mutex);
255 #else
256         UNUSED_VARS(ptr, values);
257 #endif
258 }
259
260 static void rna_SmokeModifier_velocity_grid_get(PointerRNA *ptr, float *values)
261 {
262 #ifdef WITH_SMOKE
263         SmokeDomainSettings *sds = (SmokeDomainSettings *)ptr->data;
264         int length[RNA_MAX_ARRAY_DIMENSION];
265         int size = rna_SmokeModifier_velocity_grid_get_length(ptr, length);
266         float *vx, *vy, *vz;
267         int i;
268
269         BLI_rw_mutex_lock(sds->fluid_mutex, THREAD_LOCK_READ);
270
271         vx = smoke_get_velocity_x(sds->fluid);
272         vy = smoke_get_velocity_y(sds->fluid);
273         vz = smoke_get_velocity_z(sds->fluid);
274
275         for (i = 0; i < size; i += 3) {
276                 *(values++) = *(vx++);
277                 *(values++) = *(vy++);
278                 *(values++) = *(vz++);
279         }
280
281         BLI_rw_mutex_unlock(sds->fluid_mutex);
282 #else
283         UNUSED_VARS(ptr, values);
284 #endif
285 }
286
287 static void rna_SmokeModifier_color_grid_get(PointerRNA *ptr, float *values)
288 {
289 #ifdef WITH_SMOKE
290         SmokeDomainSettings *sds = (SmokeDomainSettings *)ptr->data;
291         int length[RNA_MAX_ARRAY_DIMENSION];
292         int size = rna_SmokeModifier_grid_get_length(ptr, length);
293
294         BLI_rw_mutex_lock(sds->fluid_mutex, THREAD_LOCK_READ);
295
296         if (!sds->fluid) {
297                 memset(values, 0, size * sizeof(float));
298         }
299         else {
300                 if (sds->flags & MOD_SMOKE_HIGHRES) {
301                         if (smoke_turbulence_has_colors(sds->wt))
302                                 smoke_turbulence_get_rgba(sds->wt, values, 0);
303                         else
304                                 smoke_turbulence_get_rgba_from_density(sds->wt, sds->active_color, values, 0);
305                 }
306                 else {
307                         if (smoke_has_colors(sds->fluid))
308                                 smoke_get_rgba(sds->fluid, values, 0);
309                         else
310                                 smoke_get_rgba_from_density(sds->fluid, sds->active_color, values, 0);
311                 }
312         }
313
314         BLI_rw_mutex_unlock(sds->fluid_mutex);
315 #else
316         UNUSED_VARS(ptr, values);
317 #endif
318 }
319
320 static void rna_SmokeModifier_flame_grid_get(PointerRNA *ptr, float *values)
321 {
322 #ifdef WITH_SMOKE
323         SmokeDomainSettings *sds = (SmokeDomainSettings *)ptr->data;
324         int length[RNA_MAX_ARRAY_DIMENSION];
325         int size = rna_SmokeModifier_grid_get_length(ptr, length);
326         float *flame;
327
328         BLI_rw_mutex_lock(sds->fluid_mutex, THREAD_LOCK_READ);
329         
330         if (sds->flags & MOD_SMOKE_HIGHRES && sds->wt)
331                 flame = smoke_turbulence_get_flame(sds->wt);
332         else
333                 flame = smoke_get_flame(sds->fluid);
334         
335         if (flame)
336                 memcpy(values, flame, size * sizeof(float));
337         else
338                 memset(values, 0, size * sizeof(float));
339
340         BLI_rw_mutex_unlock(sds->fluid_mutex);
341 #else
342         UNUSED_VARS(ptr, values);
343 #endif
344 }
345
346 static void rna_SmokeModifier_heat_grid_get(PointerRNA *ptr, float *values)
347 {
348 #ifdef WITH_SMOKE
349         SmokeDomainSettings *sds = (SmokeDomainSettings *)ptr->data;
350         int length[RNA_MAX_ARRAY_DIMENSION];
351         int size = rna_SmokeModifier_heat_grid_get_length(ptr, length);
352         float *heat;
353
354         BLI_rw_mutex_lock(sds->fluid_mutex, THREAD_LOCK_READ);
355
356         heat = smoke_get_heat(sds->fluid);
357
358         if (heat != NULL) {
359                 /* scale heat values from -2.0-2.0 to -1.0-1.0. */
360                 for (int i = 0; i < size; i++) {
361                         values[i] = heat[i] * 0.5f;
362                 }
363         }
364         else {
365                 memset(values, 0, size * sizeof(float));
366         }
367
368         BLI_rw_mutex_unlock(sds->fluid_mutex);
369 #else
370         UNUSED_VARS(ptr, values);
371 #endif
372 }
373
374 static void rna_SmokeModifier_temperature_grid_get(PointerRNA *ptr, float *values)
375 {
376 #ifdef WITH_SMOKE
377         SmokeDomainSettings *sds = (SmokeDomainSettings *)ptr->data;
378         int length[RNA_MAX_ARRAY_DIMENSION];
379         int size = rna_SmokeModifier_grid_get_length(ptr, length);
380         float *flame;
381
382         BLI_rw_mutex_lock(sds->fluid_mutex, THREAD_LOCK_READ);
383
384         if (sds->flags & MOD_SMOKE_HIGHRES && sds->wt) {
385                 flame = smoke_turbulence_get_flame(sds->wt);
386         }
387         else {
388                 flame = smoke_get_flame(sds->fluid);
389         }
390
391         if (flame) {
392                 /* Output is such that 0..1 maps to 0..1000K */
393                 float offset = sds->flame_ignition;
394                 float scale = sds->flame_max_temp - sds->flame_ignition;
395
396                 for (int i = 0; i < size; i++) {
397                         values[i] = (flame[i] > 0.01f) ? offset + flame[i] * scale : 0.0f;
398                 }
399         }
400         else {
401                 memset(values, 0, size * sizeof(float));
402         }
403
404         BLI_rw_mutex_unlock(sds->fluid_mutex);
405 #else
406         UNUSED_VARS(ptr, values);
407 #endif
408 }
409
410 static void rna_SmokeFlow_density_vgroup_get(PointerRNA *ptr, char *value)
411 {
412         SmokeFlowSettings *flow = (SmokeFlowSettings *)ptr->data;
413         rna_object_vgroup_name_index_get(ptr, value, flow->vgroup_density);
414 }
415
416 static int rna_SmokeFlow_density_vgroup_length(PointerRNA *ptr)
417 {
418         SmokeFlowSettings *flow = (SmokeFlowSettings *)ptr->data;
419         return rna_object_vgroup_name_index_length(ptr, flow->vgroup_density);
420 }
421
422 static void rna_SmokeFlow_density_vgroup_set(PointerRNA *ptr, const char *value)
423 {
424         SmokeFlowSettings *flow = (SmokeFlowSettings *)ptr->data;
425         rna_object_vgroup_name_index_set(ptr, value, &flow->vgroup_density);
426 }
427
428 static void rna_SmokeFlow_uvlayer_set(PointerRNA *ptr, const char *value)
429 {
430         SmokeFlowSettings *flow = (SmokeFlowSettings *)ptr->data;
431         rna_object_uvlayer_name_set(ptr, value, flow->uvlayer_name, sizeof(flow->uvlayer_name));
432 }
433
434 static void rna_Smoke_use_color_ramp_set(PointerRNA *ptr, int value)
435 {
436         SmokeDomainSettings *sds = (SmokeDomainSettings *)ptr->data;
437
438         sds->use_coba = value;
439
440         if (value && sds->coba == NULL) {
441                 sds->coba = BKE_colorband_add(false);
442         }
443 }
444
445 #else
446
447 static void rna_def_smoke_domain_settings(BlenderRNA *brna)
448 {
449         StructRNA *srna;
450         PropertyRNA *prop;
451
452         static const EnumPropertyItem prop_noise_type_items[] = {
453                 {MOD_SMOKE_NOISEWAVE, "NOISEWAVE", 0, "Wavelet", ""},
454 #ifdef WITH_FFTW3
455                 {MOD_SMOKE_NOISEFFT, "NOISEFFT", 0, "FFT", ""},
456 #endif
457                 /*  {MOD_SMOKE_NOISECURL, "NOISECURL", 0, "Curl", ""}, */
458                 {0, NULL, 0, NULL, NULL}
459         };
460
461         static const EnumPropertyItem prop_compression_items[] = {
462                 { VDB_COMPRESSION_ZIP, "ZIP", 0, "Zip", "Effective but slow compression" },
463 #ifdef WITH_OPENVDB_BLOSC
464                 { VDB_COMPRESSION_BLOSC, "BLOSC", 0, "Blosc", "Multithreaded compression, similar in size and quality as 'Zip'" },
465 #endif
466                 { VDB_COMPRESSION_NONE, "NONE", 0, "None", "Do not use any compression" },
467                 { 0, NULL, 0, NULL, NULL }
468         };
469
470         static const EnumPropertyItem smoke_cache_comp_items[] = {
471                 {SM_CACHE_LIGHT, "CACHELIGHT", 0, "Light", "Fast but not so effective compression"},
472                 {SM_CACHE_HEAVY, "CACHEHEAVY", 0, "Heavy", "Effective but slow compression"},
473                 {0, NULL, 0, NULL, NULL}
474         };
475
476         static const EnumPropertyItem smoke_highres_sampling_items[] = {
477                 {SM_HRES_FULLSAMPLE, "FULLSAMPLE", 0, "Full Sample", ""},
478                 {SM_HRES_LINEAR, "LINEAR", 0, "Linear", ""},
479                 {SM_HRES_NEAREST, "NEAREST", 0, "Nearest", ""},
480                 {0, NULL, 0, NULL, NULL}
481         };
482
483         static const EnumPropertyItem smoke_data_depth_items[] = {
484                 {16, "16", 0, "Float (Half)", "Half float (16 bit data)"},
485                 {0,  "32", 0, "Float (Full)", "Full float (32 bit data)"},  /* default */
486                 {0, NULL, 0, NULL, NULL},
487         };
488
489         static const EnumPropertyItem smoke_domain_colli_items[] = {
490                 {SM_BORDER_OPEN, "BORDEROPEN", 0, "Open", "Smoke doesn't collide with any border"},
491                 {SM_BORDER_VERTICAL, "BORDERVERTICAL", 0, "Vertically Open",
492                  "Smoke doesn't collide with top and bottom sides"},
493                 {SM_BORDER_CLOSED, "BORDERCLOSED", 0, "Collide All", "Smoke collides with every side"},
494                 {0, NULL, 0, NULL, NULL}
495         };
496
497         static const EnumPropertyItem cache_file_type_items[] = {
498                 {PTCACHE_FILE_PTCACHE, "POINTCACHE", 0, "Point Cache", "Blender specific point cache file format"},
499 #ifdef WITH_OPENVDB
500                 {PTCACHE_FILE_OPENVDB, "OPENVDB", 0, "OpenVDB", "OpenVDB file format"},
501 #endif
502                 {0, NULL, 0, NULL, NULL}
503         };
504
505         static const EnumPropertyItem smoke_view_items[] = {
506             {MOD_SMOKE_SLICE_VIEW_ALIGNED, "VIEW_ALIGNED", 0, "View", "Slice volume parallel to the view plane"},
507             {MOD_SMOKE_SLICE_AXIS_ALIGNED, "AXIS_ALIGNED", 0, "Axis", "Slice volume parallel to the major axis"},
508             {0, NULL, 0, NULL, NULL}
509         };
510
511         static const EnumPropertyItem axis_slice_method_items[] = {
512             {AXIS_SLICE_FULL, "FULL", 0, "Full", "Slice the whole domain object"},
513             {AXIS_SLICE_SINGLE, "SINGLE", 0, "Single", "Perform a single slice of the domain object"},
514             {0, NULL, 0, NULL, NULL}
515         };
516
517         static const EnumPropertyItem axis_slice_position_items[] = {
518             {SLICE_AXIS_AUTO, "AUTO", 0, "Auto", "Adjust slice direction according to the view direction"},
519             {SLICE_AXIS_X, "X", 0, "X", "Slice along the X axis"},
520             {SLICE_AXIS_Y, "Y", 0, "Y", "Slice along the Y axis"},
521             {SLICE_AXIS_Z, "Z", 0, "Z", "Slice along the Z axis"},
522             {0, NULL, 0, NULL, NULL}
523         };
524
525         static const EnumPropertyItem vector_draw_items[] = {
526             {VECTOR_DRAW_NEEDLE, "NEEDLE", 0, "Needle", "Draw vectors as needles"},
527             {VECTOR_DRAW_STREAMLINE, "STREAMLINE", 0, "Streamlines", "Draw vectors as streamlines"},
528             {0, NULL, 0, NULL, NULL}
529         };
530
531         srna = RNA_def_struct(brna, "SmokeDomainSettings", NULL);
532         RNA_def_struct_ui_text(srna, "Domain Settings", "Smoke domain settings");
533         RNA_def_struct_sdna(srna, "SmokeDomainSettings");
534         RNA_def_struct_path_func(srna, "rna_SmokeDomainSettings_path");
535
536         prop = RNA_def_property(srna, "resolution_max", PROP_INT, PROP_NONE);
537         RNA_def_property_int_sdna(prop, NULL, "maxres");
538         RNA_def_property_range(prop, 6, 512);
539         RNA_def_property_ui_range(prop, 24, 512, 2, -1);
540         RNA_def_property_ui_text(prop, "Max Res", "Maximal resolution used in the fluid domain");
541         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
542         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
543
544         prop = RNA_def_property(srna, "amplify", PROP_INT, PROP_NONE);
545         RNA_def_property_int_sdna(prop, NULL, "amplify");
546         RNA_def_property_range(prop, 1, 10);
547         RNA_def_property_ui_range(prop, 1, 10, 1, -1);
548         RNA_def_property_ui_text(prop, "Amplification", "Enhance the resolution of smoke by this factor using noise");
549         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
550         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
551
552         prop = RNA_def_property(srna, "use_high_resolution", PROP_BOOLEAN, PROP_NONE);
553         RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_SMOKE_HIGHRES);
554         RNA_def_property_ui_text(prop, "High res", "Enable high resolution (using amplification)");
555         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
556         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
557
558         prop = RNA_def_property(srna, "show_high_resolution", PROP_BOOLEAN, PROP_NONE);
559         RNA_def_property_boolean_sdna(prop, NULL, "viewsettings", MOD_SMOKE_VIEW_SHOWBIG);
560         RNA_def_property_ui_text(prop, "Show High Resolution", "Show high resolution (using amplification)");
561         RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
562
563         prop = RNA_def_property(srna, "noise_type", PROP_ENUM, PROP_NONE);
564         RNA_def_property_enum_sdna(prop, NULL, "noise");
565         RNA_def_property_enum_items(prop, prop_noise_type_items);
566         RNA_def_property_ui_text(prop, "Noise Method", "Noise method which is used for creating the high resolution");
567         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
568         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
569
570         prop = RNA_def_property(srna, "alpha", PROP_FLOAT, PROP_NONE);
571         RNA_def_property_float_sdna(prop, NULL, "alpha");
572         RNA_def_property_range(prop, -5.0, 5.0);
573         RNA_def_property_ui_range(prop, -5.0, 5.0, 0.02, 5);
574         RNA_def_property_ui_text(prop, "Density",
575                                  "How much density affects smoke motion (higher value results in faster rising smoke)");
576         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_resetCache");
577
578         prop = RNA_def_property(srna, "beta", PROP_FLOAT, PROP_NONE);
579         RNA_def_property_float_sdna(prop, NULL, "beta");
580         RNA_def_property_range(prop, -5.0, 5.0);
581         RNA_def_property_ui_range(prop, -5.0, 5.0, 0.02, 5);
582         RNA_def_property_ui_text(prop, "Heat",
583                                  "How much heat affects smoke motion (higher value results in faster rising smoke)");
584         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_resetCache");
585
586         prop = RNA_def_property(srna, "collision_group", PROP_POINTER, PROP_NONE);
587         RNA_def_property_pointer_sdna(prop, NULL, "coll_group");
588         RNA_def_property_struct_type(prop, "Collection");
589         RNA_def_property_flag(prop, PROP_EDITABLE);
590         RNA_def_property_ui_text(prop, "Collision Collection", "Limit collisions to this collection");
591         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset_dependency");
592
593         prop = RNA_def_property(srna, "fluid_group", PROP_POINTER, PROP_NONE);
594         RNA_def_property_pointer_sdna(prop, NULL, "fluid_group");
595         RNA_def_property_struct_type(prop, "Collection");
596         RNA_def_property_flag(prop, PROP_EDITABLE);
597         RNA_def_property_ui_text(prop, "Fluid Collection", "Limit fluid objects to this collection");
598         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset_dependency");
599
600         prop = RNA_def_property(srna, "effector_group", PROP_POINTER, PROP_NONE);
601         RNA_def_property_pointer_sdna(prop, NULL, "eff_group");
602         RNA_def_property_struct_type(prop, "Collection");
603         RNA_def_property_flag(prop, PROP_EDITABLE);
604         RNA_def_property_ui_text(prop, "Effector Collection", "Limit effectors to this collection");
605         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset_dependency");
606
607         prop = RNA_def_property(srna, "strength", PROP_FLOAT, PROP_NONE);
608         RNA_def_property_float_sdna(prop, NULL, "strength");
609         RNA_def_property_range(prop, 0.0, 10.0);
610         RNA_def_property_ui_range(prop, 0.0, 10.0, 1, 2);
611         RNA_def_property_ui_text(prop, "Strength", "Strength of noise");
612         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_resetCache");
613
614         prop = RNA_def_property(srna, "dissolve_speed", PROP_INT, PROP_NONE);
615         RNA_def_property_int_sdna(prop, NULL, "diss_speed");
616         RNA_def_property_range(prop, 1.0, 10000.0);
617         RNA_def_property_ui_range(prop, 1.0, 10000.0, 1, -1);
618         RNA_def_property_ui_text(prop, "Dissolve Speed", "Dissolve Speed");
619         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_resetCache");
620
621         prop = RNA_def_property(srna, "use_dissolve_smoke", PROP_BOOLEAN, PROP_NONE);
622         RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_SMOKE_DISSOLVE);
623         RNA_def_property_ui_text(prop, "Dissolve Smoke", "Enable smoke to disappear over time");
624         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_resetCache");
625
626         prop = RNA_def_property(srna, "use_dissolve_smoke_log", PROP_BOOLEAN, PROP_NONE);
627         RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_SMOKE_DISSOLVE_LOG);
628         RNA_def_property_ui_text(prop, "Logarithmic dissolve", "Using 1/x ");
629         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_resetCache");
630
631         prop = RNA_def_property(srna, "point_cache", PROP_POINTER, PROP_NONE);
632         RNA_def_property_flag(prop, PROP_NEVER_NULL);
633         RNA_def_property_pointer_sdna(prop, NULL, "point_cache[0]");
634         RNA_def_property_struct_type(prop, "PointCache");
635         RNA_def_property_ui_text(prop, "Point Cache", "");
636
637         prop = RNA_def_property(srna, "point_cache_compress_type", PROP_ENUM, PROP_NONE);
638         RNA_def_property_enum_sdna(prop, NULL, "cache_comp");
639         RNA_def_property_enum_items(prop, smoke_cache_comp_items);
640         RNA_def_property_ui_text(prop, "Cache Compression", "Compression method to be used");
641
642         prop = RNA_def_property(srna, "openvdb_cache_compress_type", PROP_ENUM, PROP_NONE);
643         RNA_def_property_enum_sdna(prop, NULL, "openvdb_comp");
644         RNA_def_property_enum_items(prop, prop_compression_items);
645         RNA_def_property_ui_text(prop, "Compression", "Compression method to be used");
646
647         prop = RNA_def_property(srna, "data_depth", PROP_ENUM, PROP_NONE);
648         RNA_def_property_enum_bitflag_sdna(prop, NULL, "data_depth");
649         RNA_def_property_enum_items(prop, smoke_data_depth_items);
650         RNA_def_property_ui_text(prop, "Data Depth",
651                                  "Bit depth for writing all scalar (including vector) "
652                                  "lower values reduce file size");
653         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, NULL);
654
655         prop = RNA_def_property(srna, "collision_extents", PROP_ENUM, PROP_NONE);
656         RNA_def_property_enum_sdna(prop, NULL, "border_collisions");
657         RNA_def_property_enum_items(prop, smoke_domain_colli_items);
658         RNA_def_property_ui_text(prop, "Border Collisions",
659                                  "Select which domain border will be treated as collision object");
660         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
661
662         prop = RNA_def_property(srna, "effector_weights", PROP_POINTER, PROP_NONE);
663         RNA_def_property_struct_type(prop, "EffectorWeights");
664         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
665         RNA_def_property_ui_text(prop, "Effector Weights", "");
666
667         prop = RNA_def_property(srna, "highres_sampling", PROP_ENUM, PROP_NONE);
668         RNA_def_property_enum_items(prop, smoke_highres_sampling_items);
669         RNA_def_property_ui_text(prop, "Emitter", "Method for sampling the high resolution flow");
670         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_resetCache");
671
672         prop = RNA_def_property(srna, "time_scale", PROP_FLOAT, PROP_NONE);
673         RNA_def_property_float_sdna(prop, NULL, "time_scale");
674         RNA_def_property_range(prop, 0.2, 1.5);
675         RNA_def_property_ui_range(prop, 0.2, 1.5, 0.02, 5);
676         RNA_def_property_ui_text(prop, "Time Scale", "Adjust simulation speed");
677         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_resetCache");
678
679         prop = RNA_def_property(srna, "vorticity", PROP_FLOAT, PROP_NONE);
680         RNA_def_property_float_sdna(prop, NULL, "vorticity");
681         RNA_def_property_range(prop, 0.01, 4.0);
682         RNA_def_property_ui_range(prop, 0.01, 4.0, 0.02, 5);
683         RNA_def_property_ui_text(prop, "Vorticity", "Amount of turbulence/rotation in fluid");
684         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_resetCache");
685
686         prop = RNA_def_property(srna, "density_grid", PROP_FLOAT, PROP_NONE);
687         RNA_def_property_array(prop, 32);
688         RNA_def_property_flag(prop, PROP_DYNAMIC);
689         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
690         RNA_def_property_dynamic_array_funcs(prop, "rna_SmokeModifier_grid_get_length");
691         RNA_def_property_float_funcs(prop, "rna_SmokeModifier_density_grid_get", NULL, NULL);
692         RNA_def_property_ui_text(prop, "Density Grid", "Smoke density grid");
693
694         prop = RNA_def_property(srna, "velocity_grid", PROP_FLOAT, PROP_NONE);
695         RNA_def_property_array(prop, 32);
696         RNA_def_property_flag(prop, PROP_DYNAMIC);
697         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
698         RNA_def_property_dynamic_array_funcs(prop, "rna_SmokeModifier_velocity_grid_get_length");
699         RNA_def_property_float_funcs(prop, "rna_SmokeModifier_velocity_grid_get", NULL, NULL);
700         RNA_def_property_ui_text(prop, "Velocity Grid", "Smoke velocity grid");
701
702         prop = RNA_def_property(srna, "flame_grid", PROP_FLOAT, PROP_NONE);
703         RNA_def_property_array(prop, 32);
704         RNA_def_property_flag(prop, PROP_DYNAMIC);
705         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
706         RNA_def_property_dynamic_array_funcs(prop, "rna_SmokeModifier_grid_get_length");
707         RNA_def_property_float_funcs(prop, "rna_SmokeModifier_flame_grid_get", NULL, NULL);
708         RNA_def_property_ui_text(prop, "Flame Grid", "Smoke flame grid");
709
710         prop = RNA_def_property(srna, "color_grid", PROP_FLOAT, PROP_NONE);
711         RNA_def_property_array(prop, 32);
712         RNA_def_property_flag(prop, PROP_DYNAMIC);
713         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
714         RNA_def_property_dynamic_array_funcs(prop, "rna_SmokeModifier_color_grid_get_length");
715         RNA_def_property_float_funcs(prop, "rna_SmokeModifier_color_grid_get", NULL, NULL);
716         RNA_def_property_ui_text(prop, "Color Grid", "Smoke color grid");
717
718         prop = RNA_def_property(srna, "heat_grid", PROP_FLOAT, PROP_NONE);
719         RNA_def_property_array(prop, 32);
720         RNA_def_property_flag(prop, PROP_DYNAMIC);
721         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
722         RNA_def_property_dynamic_array_funcs(prop, "rna_SmokeModifier_heat_grid_get_length");
723         RNA_def_property_float_funcs(prop, "rna_SmokeModifier_heat_grid_get", NULL, NULL);
724         RNA_def_property_ui_text(prop, "Heat Grid", "Smoke heat grid");
725
726         prop = RNA_def_property(srna, "temperature_grid", PROP_FLOAT, PROP_NONE);
727         RNA_def_property_array(prop, 32);
728         RNA_def_property_flag(prop, PROP_DYNAMIC);
729         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
730         RNA_def_property_dynamic_array_funcs(prop, "rna_SmokeModifier_grid_get_length");
731         RNA_def_property_float_funcs(prop, "rna_SmokeModifier_temperature_grid_get", NULL, NULL);
732         RNA_def_property_ui_text(prop, "Temperature Grid", "Smoke temperature grid, range 0..1 represents 0..1000K");
733
734         prop = RNA_def_property(srna, "cell_size", PROP_FLOAT, PROP_XYZ); /* can change each frame when using adaptive domain */
735         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
736         RNA_def_property_ui_text(prop, "cell_size", "Cell Size");
737
738         prop = RNA_def_property(srna, "start_point", PROP_FLOAT, PROP_XYZ); /* can change each frame when using adaptive domain */
739         RNA_def_property_float_sdna(prop, NULL, "p0");
740         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
741         RNA_def_property_ui_text(prop, "p0", "Start point");
742
743         prop = RNA_def_property(srna, "domain_resolution", PROP_INT, PROP_XYZ); /* can change each frame when using adaptive domain */
744         RNA_def_property_int_sdna(prop, NULL, "res");
745         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
746         RNA_def_property_ui_text(prop, "res", "Smoke Grid Resolution");
747
748         prop = RNA_def_property(srna, "burning_rate", PROP_FLOAT, PROP_NONE);
749         RNA_def_property_range(prop, 0.01, 4.0);
750         RNA_def_property_ui_range(prop, 0.01, 2.0, 1.0, 5);
751         RNA_def_property_ui_text(prop, "Speed", "Speed of the burning reaction (use larger values for smaller flame)");
752         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_resetCache");
753
754         prop = RNA_def_property(srna, "flame_smoke", PROP_FLOAT, PROP_NONE);
755         RNA_def_property_range(prop, 0.0, 8.0);
756         RNA_def_property_ui_range(prop, 0.0, 4.0, 1.0, 5);
757         RNA_def_property_ui_text(prop, "Smoke", "Amount of smoke created by burning fuel");
758         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_resetCache");
759
760         prop = RNA_def_property(srna, "flame_vorticity", PROP_FLOAT, PROP_NONE);
761         RNA_def_property_range(prop, 0.0, 2.0);
762         RNA_def_property_ui_range(prop, 0.0, 1.0, 1.0, 5);
763         RNA_def_property_ui_text(prop, "Vorticity", "Additional vorticity for the flames");
764         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_resetCache");
765
766         prop = RNA_def_property(srna, "flame_ignition", PROP_FLOAT, PROP_NONE);
767         RNA_def_property_range(prop, 0.5, 5.0);
768         RNA_def_property_ui_range(prop, 0.5, 2.5, 1.0, 5);
769         RNA_def_property_ui_text(prop, "Ignition", "Minimum temperature of flames");
770         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_resetCache");
771
772         prop = RNA_def_property(srna, "flame_max_temp", PROP_FLOAT, PROP_NONE);
773         RNA_def_property_range(prop, 1.0, 10.0);
774         RNA_def_property_ui_range(prop, 1.0, 5.0, 1.0, 5);
775         RNA_def_property_ui_text(prop, "Maximum", "Maximum temperature of flames");
776         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_resetCache");
777
778         prop = RNA_def_property(srna, "flame_smoke_color", PROP_FLOAT, PROP_COLOR_GAMMA);
779         RNA_def_property_array(prop, 3);
780         RNA_def_property_ui_text(prop, "Smoke Color", "Color of smoke emitted from burning fuel");
781         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_resetCache");
782
783         prop = RNA_def_property(srna, "use_adaptive_domain", PROP_BOOLEAN, PROP_NONE);
784         RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_SMOKE_ADAPTIVE_DOMAIN);
785         RNA_def_property_ui_text(prop, "Adaptive Domain", "Adapt simulation resolution and size to fluid");
786         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
787         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
788
789         prop = RNA_def_property(srna, "additional_res", PROP_INT, PROP_NONE);
790         RNA_def_property_int_sdna(prop, NULL, "adapt_res");
791         RNA_def_property_range(prop, 0, 512);
792         RNA_def_property_ui_range(prop, 0, 512, 2, -1);
793         RNA_def_property_ui_text(prop, "Additional", "Maximum number of additional cells");
794         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_resetCache");
795
796         prop = RNA_def_property(srna, "adapt_margin", PROP_INT, PROP_NONE);
797         RNA_def_property_int_sdna(prop, NULL, "adapt_margin");
798         RNA_def_property_range(prop, 2, 24);
799         RNA_def_property_ui_range(prop, 2, 24, 2, -1);
800         RNA_def_property_ui_text(prop, "Margin", "Margin added around fluid to minimize boundary interference");
801         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_resetCache");
802
803         prop = RNA_def_property(srna, "adapt_threshold", PROP_FLOAT, PROP_NONE);
804         RNA_def_property_range(prop, 0.01, 0.5);
805         RNA_def_property_ui_range(prop, 0.01, 0.5, 1.0, 5);
806         RNA_def_property_ui_text(prop, "Threshold",
807                                  "Maximum amount of fluid cell can contain before it is considered empty");
808         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_resetCache");
809
810         prop = RNA_def_property(srna, "cache_file_format", PROP_ENUM, PROP_NONE);
811         RNA_def_property_enum_sdna(prop, NULL, "cache_file_format");
812         RNA_def_property_enum_items(prop, cache_file_type_items);
813         RNA_def_property_enum_funcs(prop, NULL, "rna_Smoke_cachetype_set", NULL);
814         RNA_def_property_ui_text(prop, "File Format", "Select the file format to be used for caching");
815         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_resetCache");
816
817         /* display settings */
818
819         prop = RNA_def_property(srna, "slice_method", PROP_ENUM, PROP_NONE);
820         RNA_def_property_enum_sdna(prop, NULL, "slice_method");
821         RNA_def_property_enum_items(prop, smoke_view_items);
822         RNA_def_property_ui_text(prop, "View Method", "How to slice the volume for viewport rendering");
823         RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
824
825         prop = RNA_def_property(srna, "axis_slice_method", PROP_ENUM, PROP_NONE);
826         RNA_def_property_enum_sdna(prop, NULL, "axis_slice_method");
827         RNA_def_property_enum_items(prop, axis_slice_method_items);
828         RNA_def_property_ui_text(prop, "Method", "");
829         RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
830
831         prop = RNA_def_property(srna, "slice_axis", PROP_ENUM, PROP_NONE);
832         RNA_def_property_enum_sdna(prop, NULL, "slice_axis");
833         RNA_def_property_enum_items(prop, axis_slice_position_items);
834         RNA_def_property_ui_text(prop, "Axis", "");
835         RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
836
837         prop = RNA_def_property(srna, "slice_per_voxel", PROP_FLOAT, PROP_NONE);
838         RNA_def_property_float_sdna(prop, NULL, "slice_per_voxel");
839         RNA_def_property_range(prop, 0.0, 100.0);
840         RNA_def_property_ui_range(prop, 0.0, 5.0, 0.1, 1);
841         RNA_def_property_ui_text(prop, "Slice Per Voxel",
842                                  "How many slices per voxel should be generated");
843         RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
844
845         prop = RNA_def_property(srna, "slice_depth", PROP_FLOAT, PROP_NONE);
846         RNA_def_property_float_sdna(prop, NULL, "slice_depth");
847         RNA_def_property_range(prop, 0.0, 1.0);
848         RNA_def_property_ui_range(prop, 0.0, 1.0, 0.1, 3);
849         RNA_def_property_ui_text(prop, "Position", "Position of the slice");
850         RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
851
852         prop = RNA_def_property(srna, "display_thickness", PROP_FLOAT, PROP_NONE);
853         RNA_def_property_float_sdna(prop, NULL, "display_thickness");
854         RNA_def_property_range(prop, 0.001, 1000.0);
855         RNA_def_property_ui_range(prop, 0.1, 100.0, 0.1, 3);
856         RNA_def_property_ui_text(prop, "Thickness", "Thickness of smoke drawing in the viewport");
857         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, NULL);
858
859         prop = RNA_def_property(srna, "draw_velocity", PROP_BOOLEAN, PROP_NONE);
860         RNA_def_property_boolean_sdna(prop, NULL, "draw_velocity", 0);
861         RNA_def_property_ui_text(prop, "Draw Velocity", "Toggle visualization of the velocity field as needles");
862         RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
863
864         prop = RNA_def_property(srna, "vector_draw_type", PROP_ENUM, PROP_NONE);
865         RNA_def_property_enum_sdna(prop, NULL, "vector_draw_type");
866         RNA_def_property_enum_items(prop, vector_draw_items);
867         RNA_def_property_ui_text(prop, "Draw Type", "");
868         RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
869
870         prop = RNA_def_property(srna, "vector_scale", PROP_FLOAT, PROP_NONE);
871         RNA_def_property_float_sdna(prop, NULL, "vector_scale");
872         RNA_def_property_range(prop, 0.0, 1000.0);
873         RNA_def_property_ui_range(prop, 0.0, 100.0, 0.1, 3);
874         RNA_def_property_ui_text(prop, "Scale", "Multiplier for scaling the vectors");
875         RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
876
877         /* --------- Color mapping. --------- */
878
879         prop = RNA_def_property(srna, "use_color_ramp", PROP_BOOLEAN, PROP_NONE);
880         RNA_def_property_boolean_sdna(prop, NULL, "use_coba", 0);
881         RNA_def_property_boolean_funcs(prop, NULL, "rna_Smoke_use_color_ramp_set");
882         RNA_def_property_ui_text(prop, "Use Color Ramp",
883                                  "Render a simulation field while mapping its voxels values to the colors of a ramp");
884         RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
885
886         static const EnumPropertyItem coba_field_items[] = {
887             {FLUID_FIELD_COLOR_R, "COLOR_R", 0, "Red", "Red component of the color field"},
888             {FLUID_FIELD_COLOR_G, "COLOR_G", 0, "Green", "Green component of the color field"},
889             {FLUID_FIELD_COLOR_B, "COLOR_B", 0, "Blue", "Blue component of the color field"},
890             {FLUID_FIELD_DENSITY, "DENSITY", 0, "Density", "Quantity of soot in the fluid"},
891             {FLUID_FIELD_FLAME, "FLAME", 0, "Flame", "Flame field"},
892             {FLUID_FIELD_FUEL, "FUEL", 0, "Fuel", "Fuel field"},
893             {FLUID_FIELD_HEAT, "HEAT", 0, "Heat", "Temperature of the fluid"},
894             {FLUID_FIELD_VELOCITY_X, "VELOCITY_X", 0, "X Velocity", "X component of the velocity field"},
895             {FLUID_FIELD_VELOCITY_Y, "VELOCITY_Y", 0, "Y Velocity", "Y component of the velocity field"},
896             {FLUID_FIELD_VELOCITY_Z, "VELOCITY_Z", 0, "Z Velocity", "Z component of the velocity field"},
897             {0, NULL, 0, NULL, NULL}
898         };
899
900         prop = RNA_def_property(srna, "coba_field", PROP_ENUM, PROP_NONE);
901         RNA_def_property_enum_sdna(prop, NULL, "coba_field");
902         RNA_def_property_enum_items(prop, coba_field_items);
903         RNA_def_property_ui_text(prop, "Field", "Simulation field to color map");
904         RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
905
906         prop = RNA_def_property(srna, "color_ramp", PROP_POINTER, PROP_NEVER_NULL);
907         RNA_def_property_pointer_sdna(prop, NULL, "coba");
908         RNA_def_property_struct_type(prop, "ColorRamp");
909         RNA_def_property_ui_text(prop, "Color Ramp", "");
910         RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
911
912         prop = RNA_def_property(srna, "clipping", PROP_FLOAT, PROP_NONE);
913         RNA_def_property_float_sdna(prop, NULL, "clipping");
914         RNA_def_property_range(prop, 0.0, 1.0);
915         RNA_def_property_ui_range(prop, 0.0, 1.0, 0.1, 3);
916         RNA_def_property_ui_text(prop, "Clipping",
917                                  "Value under which voxels are considered empty space to optimize caching or rendering");
918         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, NULL);
919 }
920
921 static void rna_def_smoke_flow_settings(BlenderRNA *brna)
922 {
923         StructRNA *srna;
924         PropertyRNA *prop;
925
926         static const EnumPropertyItem smoke_flow_types[] = {
927                 {MOD_SMOKE_FLOW_TYPE_OUTFLOW, "OUTFLOW", 0, "Outflow", "Delete smoke from simulation"},
928                 {MOD_SMOKE_FLOW_TYPE_SMOKE, "SMOKE", 0, "Smoke", "Add smoke"},
929                 {MOD_SMOKE_FLOW_TYPE_SMOKEFIRE, "BOTH", 0, "Fire + Smoke", "Add fire and smoke"},
930                 {MOD_SMOKE_FLOW_TYPE_FIRE, "FIRE", 0, "Fire", "Add fire"},
931                 {0, NULL, 0, NULL, NULL}
932         };
933
934         static const EnumPropertyItem smoke_flow_sources[] = {
935                 {MOD_SMOKE_FLOW_SOURCE_PARTICLES, "PARTICLES", ICON_PARTICLES, "Particle System", "Emit smoke from particles"},
936                 {MOD_SMOKE_FLOW_SOURCE_MESH, "MESH", ICON_META_CUBE, "Mesh", "Emit smoke from mesh surface or volume"},
937                 {0, NULL, 0, NULL, NULL}
938         };
939
940         static const EnumPropertyItem smoke_flow_texture_types[] = {
941                 {MOD_SMOKE_FLOW_TEXTURE_MAP_AUTO, "AUTO", 0, "Generated", "Generated coordinates centered to flow object"},
942                 {MOD_SMOKE_FLOW_TEXTURE_MAP_UV, "UV", 0, "UV", "Use UV layer for texture coordinates"},
943                 {0, NULL, 0, NULL, NULL}
944         };
945
946         srna = RNA_def_struct(brna, "SmokeFlowSettings", NULL);
947         RNA_def_struct_ui_text(srna, "Flow Settings", "Smoke flow settings");
948         RNA_def_struct_sdna(srna, "SmokeFlowSettings");
949         RNA_def_struct_path_func(srna, "rna_SmokeFlowSettings_path");
950
951         prop = RNA_def_property(srna, "density", PROP_FLOAT, PROP_NONE);
952         RNA_def_property_float_sdna(prop, NULL, "density");
953         RNA_def_property_range(prop, 0.0, 1);
954         RNA_def_property_ui_range(prop, 0.0, 1.0, 1.0, 4);
955         RNA_def_property_ui_text(prop, "Density", "");
956         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
957
958         prop = RNA_def_property(srna, "smoke_color", PROP_FLOAT, PROP_COLOR_GAMMA);
959         RNA_def_property_float_sdna(prop, NULL, "color");
960         RNA_def_property_array(prop, 3);
961         RNA_def_property_ui_text(prop, "Smoke Color", "Color of smoke");
962         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
963
964         prop = RNA_def_property(srna, "fuel_amount", PROP_FLOAT, PROP_NONE);
965         RNA_def_property_range(prop, 0.0, 10);
966         RNA_def_property_ui_range(prop, 0.0, 5.0, 1.0, 4);
967         RNA_def_property_ui_text(prop, "Flame Rate", "");
968         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
969
970         prop = RNA_def_property(srna, "temperature", PROP_FLOAT, PROP_NONE);
971         RNA_def_property_float_sdna(prop, NULL, "temp");
972         RNA_def_property_range(prop, -10, 10);
973         RNA_def_property_ui_range(prop, -10, 10, 1, 1);
974         RNA_def_property_ui_text(prop, "Temp. Diff.", "Temperature difference to ambient temperature");
975         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
976         
977         prop = RNA_def_property(srna, "particle_system", PROP_POINTER, PROP_NONE);
978         RNA_def_property_pointer_sdna(prop, NULL, "psys");
979         RNA_def_property_struct_type(prop, "ParticleSystem");
980         RNA_def_property_flag(prop, PROP_EDITABLE);
981         RNA_def_property_ui_text(prop, "Particle Systems", "Particle systems emitted from the object");
982         RNA_def_property_update(prop, 0, "rna_Smoke_reset_dependency");
983
984         prop = RNA_def_property(srna, "smoke_flow_type", PROP_ENUM, PROP_NONE);
985         RNA_def_property_enum_sdna(prop, NULL, "type");
986         RNA_def_property_enum_items(prop, smoke_flow_types);
987         RNA_def_property_ui_text(prop, "Flow Type", "Change how flow affects the simulation");
988         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
989
990         prop = RNA_def_property(srna, "smoke_flow_source", PROP_ENUM, PROP_NONE);
991         RNA_def_property_enum_sdna(prop, NULL, "source");
992         RNA_def_property_enum_items(prop, smoke_flow_sources);
993         RNA_def_property_ui_text(prop, "Source", "Change how smoke is emitted");
994         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
995
996         prop = RNA_def_property(srna, "use_absolute", PROP_BOOLEAN, PROP_NONE);
997         RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_SMOKE_FLOW_ABSOLUTE);
998         RNA_def_property_ui_text(prop, "Absolute Density", "Only allow given density value in emitter area");
999         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
1000
1001         prop = RNA_def_property(srna, "use_initial_velocity", PROP_BOOLEAN, PROP_NONE);
1002         RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_SMOKE_FLOW_INITVELOCITY);
1003         RNA_def_property_ui_text(prop, "Initial Velocity", "Smoke has some initial velocity when it is emitted");
1004         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
1005
1006         prop = RNA_def_property(srna, "velocity_factor", PROP_FLOAT, PROP_NONE);
1007         RNA_def_property_float_sdna(prop, NULL, "vel_multi");
1008         RNA_def_property_range(prop, -100.0, 100.0);
1009         RNA_def_property_ui_range(prop, -2.0, 2.0, 0.05, 5);
1010         RNA_def_property_ui_text(prop, "Source", "Multiplier of source velocity passed to smoke");
1011         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
1012
1013         prop = RNA_def_property(srna, "velocity_normal", PROP_FLOAT, PROP_NONE);
1014         RNA_def_property_float_sdna(prop, NULL, "vel_normal");
1015         RNA_def_property_range(prop, -100.0, 100.0);
1016         RNA_def_property_ui_range(prop, -2.0, 2.0, 0.05, 5);
1017         RNA_def_property_ui_text(prop, "Normal", "Amount of normal directional velocity");
1018         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
1019
1020         prop = RNA_def_property(srna, "velocity_random", PROP_FLOAT, PROP_NONE);
1021         RNA_def_property_float_sdna(prop, NULL, "vel_random");
1022         RNA_def_property_range(prop, 0.0, 10.0);
1023         RNA_def_property_ui_range(prop, 0.0, 2.0, 0.05, 5);
1024         RNA_def_property_ui_text(prop, "Random", "Amount of random velocity");
1025         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
1026
1027         prop = RNA_def_property(srna, "volume_density", PROP_FLOAT, PROP_NONE);
1028         RNA_def_property_range(prop, 0.0, 1.0);
1029         RNA_def_property_ui_range(prop, 0.0, 1.0, 0.05, 5);
1030         RNA_def_property_ui_text(prop, "Volume", "Factor for smoke emitted from inside the mesh volume");
1031         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
1032
1033         prop = RNA_def_property(srna, "surface_distance", PROP_FLOAT, PROP_NONE);
1034         RNA_def_property_range(prop, 0.0, 10.0);
1035         RNA_def_property_ui_range(prop, 0.5, 5.0, 0.05, 5);
1036         RNA_def_property_ui_text(prop, "Surface", "Maximum distance from mesh surface to emit smoke");
1037         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
1038
1039         prop = RNA_def_property(srna, "particle_size", PROP_FLOAT, PROP_NONE);
1040         RNA_def_property_range(prop, 0.1, 20.0);
1041         RNA_def_property_ui_range(prop, 0.5, 5.0, 0.05, 5);
1042         RNA_def_property_ui_text(prop, "Size", "Particle size in simulation cells");
1043         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
1044
1045         prop = RNA_def_property(srna, "use_particle_size", PROP_BOOLEAN, PROP_NONE);
1046         RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_SMOKE_FLOW_USE_PART_SIZE);
1047         RNA_def_property_ui_text(prop, "Set Size", "Set particle size in simulation cells or use nearest cell");
1048         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
1049
1050         prop = RNA_def_property(srna, "subframes", PROP_INT, PROP_NONE);
1051         RNA_def_property_range(prop, 0, 50);
1052         RNA_def_property_ui_range(prop, 0, 10, 1, -1);
1053         RNA_def_property_ui_text(prop, "Subframes", "Number of additional samples to take between frames to improve quality of fast moving flows");
1054         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
1055
1056         prop = RNA_def_property(srna, "density_vertex_group", PROP_STRING, PROP_NONE);
1057         RNA_def_property_string_funcs(prop, "rna_SmokeFlow_density_vgroup_get",
1058                                       "rna_SmokeFlow_density_vgroup_length",
1059                                       "rna_SmokeFlow_density_vgroup_set");
1060         RNA_def_property_ui_text(prop, "Vertex Group",
1061                                  "Name of vertex group which determines surface emission rate");
1062         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
1063
1064         prop = RNA_def_property(srna, "use_texture", PROP_BOOLEAN, PROP_NONE);
1065         RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_SMOKE_FLOW_TEXTUREEMIT);
1066         RNA_def_property_ui_text(prop, "Use Texture", "Use a texture to control emission strength");
1067         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
1068
1069         prop = RNA_def_property(srna, "texture_map_type", PROP_ENUM, PROP_NONE);
1070         RNA_def_property_enum_sdna(prop, NULL, "texture_type");
1071         RNA_def_property_enum_items(prop, smoke_flow_texture_types);
1072         RNA_def_property_ui_text(prop, "Mapping", "Texture mapping type");
1073         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
1074
1075         prop = RNA_def_property(srna, "uv_layer", PROP_STRING, PROP_NONE);
1076         RNA_def_property_string_sdna(prop, NULL, "uvlayer_name");
1077         RNA_def_property_ui_text(prop, "UV Map", "UV map name");
1078         RNA_def_property_string_funcs(prop, NULL, NULL, "rna_SmokeFlow_uvlayer_set");
1079         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
1080
1081         prop = RNA_def_property(srna, "noise_texture", PROP_POINTER, PROP_NONE);
1082         RNA_def_property_flag(prop, PROP_EDITABLE);
1083         RNA_def_property_ui_text(prop, "Texture", "Texture that controls emission strength");
1084         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
1085
1086         prop = RNA_def_property(srna, "texture_size", PROP_FLOAT, PROP_NONE);
1087         RNA_def_property_range(prop, 0.01, 10.0);
1088         RNA_def_property_ui_range(prop, 0.1, 5.0, 0.05, 5);
1089         RNA_def_property_ui_text(prop, "Size", "Size of texture mapping");
1090         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
1091
1092         prop = RNA_def_property(srna, "texture_offset", PROP_FLOAT, PROP_NONE);
1093         RNA_def_property_range(prop, 0.0, 200.0);
1094         RNA_def_property_ui_range(prop, 0.0, 100.0, 0.05, 5);
1095         RNA_def_property_ui_text(prop, "Offset", "Z-offset of texture mapping");
1096         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
1097 }
1098
1099 static void rna_def_smoke_coll_settings(BlenderRNA *brna)
1100 {
1101         static const EnumPropertyItem smoke_coll_type_items[] = {
1102                 {SM_COLL_STATIC, "COLLSTATIC", 0, "Static", "Non moving obstacle"},
1103                 {SM_COLL_RIGID, "COLLRIGID", 0, "Rigid", "Rigid obstacle"},
1104                 {SM_COLL_ANIMATED, "COLLANIMATED", 0, "Animated", "Animated obstacle"},
1105                 {0, NULL, 0, NULL, NULL}
1106         };
1107
1108         StructRNA *srna;
1109         PropertyRNA *prop;
1110
1111         srna = RNA_def_struct(brna, "SmokeCollSettings", NULL);
1112         RNA_def_struct_ui_text(srna, "Collision Settings", "Smoke collision settings");
1113         RNA_def_struct_sdna(srna, "SmokeCollSettings");
1114         RNA_def_struct_path_func(srna, "rna_SmokeCollSettings_path");
1115
1116         prop = RNA_def_property(srna, "collision_type", PROP_ENUM, PROP_NONE);
1117         RNA_def_property_enum_sdna(prop, NULL, "type");
1118         RNA_def_property_enum_items(prop, smoke_coll_type_items);
1119         RNA_def_property_ui_text(prop, "Collision type", "Collision type");
1120         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
1121 }
1122
1123 void RNA_def_smoke(BlenderRNA *brna)
1124 {
1125         rna_def_smoke_domain_settings(brna);
1126         rna_def_smoke_flow_settings(brna);
1127         rna_def_smoke_coll_settings(brna);
1128 }
1129
1130 #endif