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