Blender V4.3
rna_fluid.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9#include <climits>
10#include <cstdlib>
11
12#include "BLI_math_vector.h"
13#include "BLI_path_utils.hh"
14#include "BLI_sys_types.h"
15#include "BLI_utildefines.h"
16
17#include "RNA_define.hh"
18#include "RNA_enum_types.hh"
19
20#include "rna_internal.hh"
21
22#include "BKE_fluid.h"
23#include "BKE_modifier.hh"
24#include "BKE_pointcache.h"
25
26#include "BLT_translation.hh"
27
28#include "DNA_fluid_types.h"
29#include "DNA_modifier_types.h"
31#include "DNA_object_types.h"
32#include "DNA_particle_types.h"
33#include "DNA_scene_types.h"
34
35#include "WM_api.hh"
36#include "WM_types.hh"
37
38#ifdef RNA_RUNTIME
39
40# include <fmt/format.h>
41
42# include "BLI_threads.h"
43
44# include "BKE_colorband.hh"
45# include "BKE_context.hh"
46# include "BKE_particle.h"
47
48# include "DEG_depsgraph.hh"
49# include "DEG_depsgraph_build.hh"
50
51# include "manta_fluid_API.h"
52
53static void rna_Fluid_update(Main * /*bmain*/, Scene * /*scene*/, PointerRNA *ptr)
54{
56
57 /* Needed for liquid domain objects */
58 Object *ob = (Object *)ptr->owner_id;
60}
61
62static void rna_Fluid_dependency_update(Main *bmain, Scene *scene, PointerRNA *ptr)
63{
64 rna_Fluid_update(bmain, scene, ptr);
66}
67
68static void rna_Fluid_datacache_reset(Main * /*bmain*/, Scene * /*scene*/, PointerRNA *ptr)
69{
70# ifdef WITH_FLUID
72 if (settings->fmd && settings->fmd->domain) {
73 Object *ob = (Object *)ptr->owner_id;
76
77 /* In replay mode, always invalidate guiding cache too. */
78 if (settings->cache_type == FLUID_DOMAIN_CACHE_REPLAY) {
79 cache_map |= FLUID_DOMAIN_OUTDATED_GUIDE;
80 }
81 BKE_fluid_cache_free(settings, ob, cache_map);
82 }
83# endif
85}
86static void rna_Fluid_noisecache_reset(Main * /*bmain*/, Scene * /*scene*/, PointerRNA *ptr)
87{
88# ifdef WITH_FLUID
90 if (settings->fmd && settings->fmd->domain) {
91 Object *ob = (Object *)ptr->owner_id;
92 int cache_map = FLUID_DOMAIN_OUTDATED_NOISE;
93 BKE_fluid_cache_free(settings, ob, cache_map);
94 }
95# endif
97}
98static void rna_Fluid_meshcache_reset(Main * /*bmain*/, Scene * /*scene*/, PointerRNA *ptr)
99{
100# ifdef WITH_FLUID
102 if (settings->fmd && settings->fmd->domain) {
103 Object *ob = (Object *)ptr->owner_id;
104 int cache_map = FLUID_DOMAIN_OUTDATED_MESH;
105 BKE_fluid_cache_free(settings, ob, cache_map);
106 }
107# endif
109}
110static void rna_Fluid_particlescache_reset(Main * /*bmain*/, Scene * /*scene*/, PointerRNA *ptr)
111{
112# ifdef WITH_FLUID
114 if (settings->fmd && settings->fmd->domain) {
115 Object *ob = (Object *)ptr->owner_id;
116 int cache_map = FLUID_DOMAIN_OUTDATED_PARTICLES;
117 BKE_fluid_cache_free(settings, ob, cache_map);
118 }
119# endif
121}
122static void rna_Fluid_guidingcache_reset(Main * /*bmain*/, Scene * /*scene*/, PointerRNA *ptr)
123{
124# ifdef WITH_FLUID
126 if (settings->fmd && settings->fmd->domain) {
127 Object *ob = (Object *)ptr->owner_id;
131 BKE_fluid_cache_free(settings, ob, cache_map);
132 }
133# endif
135}
136
137static void rna_Fluid_effector_reset(Main *bmain, Scene *scene, PointerRNA *ptr)
138{
139# ifdef WITH_FLUID
141 settings->flags |= FLUID_EFFECTOR_NEEDS_UPDATE;
142# endif
143
144 rna_Fluid_update(bmain, scene, ptr);
145}
146
147static void rna_Fluid_flow_reset(Main *bmain, Scene *scene, PointerRNA *ptr)
148{
149# ifdef WITH_FLUID
151 settings->flags |= FLUID_FLOW_NEEDS_UPDATE;
152# endif
153
154 rna_Fluid_update(bmain, scene, ptr);
155}
156
157static void rna_Fluid_domain_data_reset(Main *bmain, Scene *scene, PointerRNA *ptr)
158{
159# ifdef WITH_FLUID
161 BKE_fluid_modifier_reset(settings->fmd);
162# endif
163
164 rna_Fluid_datacache_reset(bmain, scene, ptr);
165 rna_Fluid_update(bmain, scene, ptr);
166}
167
168static void rna_Fluid_domain_noise_reset(Main *bmain, Scene *scene, PointerRNA *ptr)
169{
170# ifdef WITH_FLUID
172 BKE_fluid_modifier_reset(settings->fmd);
173# endif
174
175 rna_Fluid_noisecache_reset(bmain, scene, ptr);
176 rna_Fluid_update(bmain, scene, ptr);
177}
178
179static void rna_Fluid_domain_mesh_reset(Main *bmain, Scene *scene, PointerRNA *ptr)
180{
181# ifdef WITH_FLUID
183 BKE_fluid_modifier_reset(settings->fmd);
184# endif
185
186 rna_Fluid_meshcache_reset(bmain, scene, ptr);
187 rna_Fluid_update(bmain, scene, ptr);
188}
189
190static void rna_Fluid_domain_particles_reset(Main *bmain, Scene *scene, PointerRNA *ptr)
191{
192# ifdef WITH_FLUID
194 BKE_fluid_modifier_reset(settings->fmd);
195# endif
196
197 rna_Fluid_particlescache_reset(bmain, scene, ptr);
198 rna_Fluid_update(bmain, scene, ptr);
199}
200
201static void rna_Fluid_reset_dependency(Main *bmain, Scene *scene, PointerRNA *ptr)
202{
203# ifdef WITH_FLUID
205 BKE_fluid_modifier_reset(settings->fmd);
206# endif
207
208 rna_Fluid_dependency_update(bmain, scene, ptr);
209}
210
211static void rna_Fluid_parts_create(Main *bmain,
213 const char *pset_name,
214 const char *parts_name,
215 const char *psys_name,
216 int psys_type)
217{
218# ifndef WITH_FLUID
219 UNUSED_VARS(bmain, ptr, pset_name, parts_name, psys_name, psys_type);
220# else
221 Object *ob = (Object *)ptr->owner_id;
222 BKE_fluid_particle_system_create(bmain, ob, pset_name, parts_name, psys_name, psys_type);
223
226# endif
227}
228
229static void rna_Fluid_parts_delete(Main *bmain, PointerRNA *ptr, int ptype)
230{
231# ifndef WITH_FLUID
232 UNUSED_VARS(bmain, ptr, ptype);
233# else
234 Object *ob = (Object *)ptr->owner_id;
236
239# endif
240}
241
242static bool rna_Fluid_parts_exists(PointerRNA *ptr, int ptype)
243{
244 Object *ob = (Object *)ptr->owner_id;
245 ParticleSystem *psys;
246
247 for (psys = static_cast<ParticleSystem *>(ob->particlesystem.first); psys; psys = psys->next) {
248 if (psys->part->type == ptype) {
249 return true;
250 }
251 }
252 return false;
253}
254
255static void rna_Fluid_flip_parts_update(Main *bmain, Scene *scene, PointerRNA *ptr)
256{
257 Object *ob = (Object *)ptr->owner_id;
260 bool exists = rna_Fluid_parts_exists(ptr, PART_FLUID_FLIP);
261
262 /* Only create a particle system in liquid domain mode.
263 * Remove any remaining data from a liquid sim when switching to gas. */
264 if (fmd->domain->type != FLUID_DOMAIN_TYPE_LIQUID) {
265 rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_FLIP);
266 fmd->domain->particle_type &= ~FLUID_DOMAIN_PARTICLE_FLIP;
267 rna_Fluid_domain_data_reset(bmain, scene, ptr);
268 return;
269 }
270
271 if (ob->type == OB_MESH && !exists) {
272 rna_Fluid_parts_create(
273 bmain, ptr, "LiquidParticleSettings", "Liquid", "Liquid Particle System", PART_FLUID_FLIP);
275 }
276 else {
277 rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_FLIP);
278 fmd->domain->particle_type &= ~FLUID_DOMAIN_PARTICLE_FLIP;
279 }
280 rna_Fluid_update(bmain, scene, ptr);
281}
282
283static void rna_Fluid_spray_parts_update(Main *bmain, Scene * /*scene*/, PointerRNA *ptr)
284{
285 Object *ob = (Object *)ptr->owner_id;
288 bool exists = rna_Fluid_parts_exists(ptr, PART_FLUID_SPRAY);
289
290 if (ob->type == OB_MESH && !exists) {
291 rna_Fluid_parts_create(
292 bmain, ptr, "SprayParticleSettings", "Spray", "Spray Particle System", PART_FLUID_SPRAY);
294 }
295 else {
296 rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_SPRAY);
297 fmd->domain->particle_type &= ~FLUID_DOMAIN_PARTICLE_SPRAY;
298 }
299}
300
301static void rna_Fluid_bubble_parts_update(Main *bmain, Scene * /*scene*/, PointerRNA *ptr)
302{
303 Object *ob = (Object *)ptr->owner_id;
306 bool exists = rna_Fluid_parts_exists(ptr, PART_FLUID_BUBBLE);
307
308 if (ob->type == OB_MESH && !exists) {
309 rna_Fluid_parts_create(bmain,
310 ptr,
311 "BubbleParticleSettings",
312 "Bubbles",
313 "Bubble Particle System",
316 }
317 else {
318 rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_BUBBLE);
319 fmd->domain->particle_type &= ~FLUID_DOMAIN_PARTICLE_BUBBLE;
320 }
321}
322
323static void rna_Fluid_foam_parts_update(Main *bmain, Scene * /*scene*/, PointerRNA *ptr)
324{
325 Object *ob = (Object *)ptr->owner_id;
328 bool exists = rna_Fluid_parts_exists(ptr, PART_FLUID_FOAM);
329
330 if (ob->type == OB_MESH && !exists) {
331 rna_Fluid_parts_create(
332 bmain, ptr, "FoamParticleSettings", "Foam", "Foam Particle System", PART_FLUID_FOAM);
334 }
335 else {
336 rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_FOAM);
337 fmd->domain->particle_type &= ~FLUID_DOMAIN_PARTICLE_FOAM;
338 }
339}
340
341static void rna_Fluid_tracer_parts_update(Main *bmain, Scene * /*scene*/, PointerRNA *ptr)
342{
343 Object *ob = (Object *)ptr->owner_id;
346 bool exists = rna_Fluid_parts_exists(ptr, PART_FLUID_TRACER);
347
348 if (ob->type == OB_MESH && !exists) {
349 rna_Fluid_parts_create(bmain,
350 ptr,
351 "TracerParticleSettings",
352 "Tracers",
353 "Tracer Particle System",
356 }
357 else {
358 rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_TRACER);
359 fmd->domain->particle_type &= ~FLUID_DOMAIN_PARTICLE_TRACER;
360 }
361}
362
363static void rna_Fluid_combined_export_update(Main *bmain, Scene *scene, PointerRNA *ptr)
364{
365 Object *ob = (Object *)ptr->owner_id;
368
370 rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_SPRAYFOAM);
371 rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_SPRAYBUBBLE);
372 rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_FOAMBUBBLE);
373 rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_SPRAYFOAMBUBBLE);
374
375 bool exists_spray = rna_Fluid_parts_exists(ptr, PART_FLUID_SPRAY);
376 bool exists_foam = rna_Fluid_parts_exists(ptr, PART_FLUID_FOAM);
377 bool exists_bubble = rna_Fluid_parts_exists(ptr, PART_FLUID_BUBBLE);
378
379 /* Re-add each particle type if enabled and no particle system exists for them anymore. */
380 if ((fmd->domain->particle_type & FLUID_DOMAIN_PARTICLE_SPRAY) && !exists_spray) {
381 rna_Fluid_spray_parts_update(bmain, scene, ptr);
382 }
383 if ((fmd->domain->particle_type & FLUID_DOMAIN_PARTICLE_FOAM) && !exists_foam) {
384 rna_Fluid_foam_parts_update(bmain, scene, ptr);
385 }
386 if ((fmd->domain->particle_type & FLUID_DOMAIN_PARTICLE_BUBBLE) && !exists_bubble) {
387 rna_Fluid_bubble_parts_update(bmain, scene, ptr);
388 }
389 }
391 if (ob->type == OB_MESH && !rna_Fluid_parts_exists(ptr, PART_FLUID_SPRAYFOAM)) {
392
393 rna_Fluid_parts_create(bmain,
394 ptr,
395 "SprayFoamParticleSettings",
396 "Spray + Foam",
397 "Spray + Foam Particle System",
399
402
403 rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_SPRAY);
404 rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_FOAM);
405 rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_SPRAYBUBBLE);
406 rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_FOAMBUBBLE);
407 rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_SPRAYFOAMBUBBLE);
408
409 /* Re-add spray if enabled and no particle system exists for it anymore. */
410 bool exists_bubble = rna_Fluid_parts_exists(ptr, PART_FLUID_BUBBLE);
411 if ((fmd->domain->particle_type & FLUID_DOMAIN_PARTICLE_BUBBLE) && !exists_bubble) {
412 rna_Fluid_bubble_parts_update(bmain, scene, ptr);
413 }
414 }
415 }
417 if (ob->type == OB_MESH && !rna_Fluid_parts_exists(ptr, PART_FLUID_SPRAYBUBBLE)) {
418
419 rna_Fluid_parts_create(bmain,
420 ptr,
421 "SprayBubbleParticleSettings",
422 "Spray + Bubbles",
423 "Spray + Bubble Particle System",
425
428
429 rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_SPRAY);
430 rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_BUBBLE);
431 rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_SPRAYFOAM);
432 rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_FOAMBUBBLE);
433 rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_SPRAYFOAMBUBBLE);
434
435 /* Re-add foam if enabled and no particle system exists for it anymore. */
436 bool exists_foam = rna_Fluid_parts_exists(ptr, PART_FLUID_FOAM);
437 if ((fmd->domain->particle_type & FLUID_DOMAIN_PARTICLE_FOAM) && !exists_foam) {
438 rna_Fluid_foam_parts_update(bmain, scene, ptr);
439 }
440 }
441 }
443 if (ob->type == OB_MESH && !rna_Fluid_parts_exists(ptr, PART_FLUID_FOAMBUBBLE)) {
444
445 rna_Fluid_parts_create(bmain,
446 ptr,
447 "FoamBubbleParticleSettings",
448 "Foam + Bubble Particles",
449 "Foam + Bubble Particle System",
451
454
455 rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_FOAM);
456 rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_BUBBLE);
457 rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_SPRAYFOAM);
458 rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_SPRAYBUBBLE);
459 rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_SPRAYFOAMBUBBLE);
460
461 /* Re-add foam if enabled and no particle system exists for it anymore. */
462 bool exists_spray = rna_Fluid_parts_exists(ptr, PART_FLUID_SPRAY);
463 if ((fmd->domain->particle_type & FLUID_DOMAIN_PARTICLE_SPRAY) && !exists_spray) {
464 rna_Fluid_spray_parts_update(bmain, scene, ptr);
465 }
466 }
467 }
468 else if (fmd->domain->sndparticle_combined_export ==
470 {
471 if (ob->type == OB_MESH && !rna_Fluid_parts_exists(ptr, PART_FLUID_SPRAYFOAMBUBBLE)) {
472
473 rna_Fluid_parts_create(bmain,
474 ptr,
475 "SprayFoamBubbleParticleSettings",
476 "Spray + Foam + Bubbles",
477 "Spray + Foam + Bubble Particle System",
479
483
484 rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_SPRAY);
485 rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_FOAM);
486 rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_BUBBLE);
487 rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_SPRAYFOAM);
488 rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_SPRAYBUBBLE);
489 rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_FOAMBUBBLE);
490 }
491 }
492 else {
493 /* sanity check, should not occur */
494 printf("ERROR: Unexpected combined export setting encountered!");
495 }
496}
497
498static void rna_Fluid_cache_startframe_set(PointerRNA *ptr, int value)
499{
501 BKE_fluid_cache_startframe_set(settings, value);
502}
503
504static void rna_Fluid_cache_endframe_set(PointerRNA *ptr, int value)
505{
507 BKE_fluid_cache_endframe_set(settings, value);
508}
509
510static void rna_Fluid_cachetype_mesh_set(PointerRNA *ptr, int value)
511{
513 BKE_fluid_cachetype_mesh_set(settings, value);
514}
515
516static void rna_Fluid_cachetype_data_set(PointerRNA *ptr, int value)
517{
519 BKE_fluid_cachetype_data_set(settings, value);
520}
521
522static void rna_Fluid_cachetype_particle_set(PointerRNA *ptr, int value)
523{
525 BKE_fluid_cachetype_particle_set(settings, value);
526}
527
528static void rna_Fluid_cachetype_noise_set(PointerRNA *ptr, int value)
529{
531 BKE_fluid_cachetype_noise_set(settings, value);
532}
533
534static void rna_Fluid_cachetype_set(PointerRNA *ptr, int value)
535{
537
538 if (value != settings->cache_type) {
539 settings->cache_type = value;
540 settings->cache_flag = 0;
541 }
542}
543
544static void rna_Fluid_guide_parent_set(PointerRNA *ptr, PointerRNA value, ReportList * /*reports*/)
545{
547 Object *par = (Object *)value.data;
548
549 FluidModifierData *fmd_par = nullptr;
550
551 if (par != nullptr) {
553 if (fmd_par && fmd_par->domain) {
554 fds->guide_parent = static_cast<Object *>(value.data);
555 copy_v3_v3_int(fds->guide_res, fmd_par->domain->res);
556 }
557 }
558 else {
559 fds->guide_parent = nullptr;
560 }
561}
562
563static const EnumPropertyItem *rna_Fluid_cachetype_mesh_itemf(bContext * /*C*/,
564 PointerRNA * /*ptr*/,
565 PropertyRNA * /*prop*/,
566 bool *r_free)
567{
568 EnumPropertyItem *item = nullptr;
569 EnumPropertyItem tmp = {0, "", 0, "", ""};
570 int totitem = 0;
571
573 tmp.identifier = "BOBJECT";
574 tmp.name = N_("Binary Object");
575 tmp.description = N_("Binary object file format (.bobj.gz)");
576 RNA_enum_item_add(&item, &totitem, &tmp);
577
579 tmp.identifier = "OBJECT";
580 tmp.name = N_("Object");
581 tmp.description = N_("Object file format (.obj)");
582 RNA_enum_item_add(&item, &totitem, &tmp);
583
584 RNA_enum_item_end(&item, &totitem);
585 *r_free = true;
586
587 return item;
588}
589
590static const EnumPropertyItem *rna_Fluid_cachetype_volume_itemf(bContext * /*C*/,
592 PropertyRNA * /*prop*/,
593 bool *r_free)
594{
595 EnumPropertyItem *item = nullptr;
596 EnumPropertyItem tmp = {0, "", 0, "", ""};
597 int totitem = 0;
598
600 tmp.identifier = "UNI";
601 tmp.name = N_("Uni Cache");
602 tmp.description = N_("Uni file format (.uni)");
603 RNA_enum_item_add(&item, &totitem, &tmp);
604
605# ifdef WITH_OPENVDB
607 tmp.identifier = "OPENVDB";
608 tmp.name = N_("OpenVDB");
609 tmp.description = N_("OpenVDB file format (.vdb)");
610 RNA_enum_item_add(&item, &totitem, &tmp);
611# endif
612
613 /* Support for deprecated `.raw` format. */
615 if (fds->cache_data_format == FLUID_DOMAIN_FILE_RAW ||
616 fds->cache_noise_format == FLUID_DOMAIN_FILE_RAW)
617 {
618 tmp.value = FLUID_DOMAIN_FILE_RAW;
619 tmp.identifier = "RAW";
620 tmp.name = N_("Raw Cache");
621 tmp.description = N_("Raw file format (.raw)");
622 RNA_enum_item_add(&item, &totitem, &tmp);
623 }
624
625 RNA_enum_item_end(&item, &totitem);
626 *r_free = true;
627
628 return item;
629}
630
631static const EnumPropertyItem *rna_Fluid_cachetype_particle_itemf(bContext * /*C*/,
632 PointerRNA * /*ptr*/,
633 PropertyRNA * /*prop*/,
634 bool *r_free)
635{
636 EnumPropertyItem *item = nullptr;
637 EnumPropertyItem tmp = {0, "", 0, "", ""};
638 int totitem = 0;
639
641 tmp.identifier = "UNI";
642 tmp.name = N_("Uni Cache");
643 tmp.description = N_("Uni file format");
644 RNA_enum_item_add(&item, &totitem, &tmp);
645
646 RNA_enum_item_end(&item, &totitem);
647 *r_free = true;
648
649 return item;
650}
651
652static void rna_Fluid_cache_directory_set(PointerRNA *ptr, const char *value)
653{
655
656 if (STREQ(settings->cache_directory, value)) {
657 return;
658 }
659
660 STRNCPY(settings->cache_directory, value);
661
662 /* TODO(sebbas): Read cache state in order to set cache bake flags and cache pause frames
663 * correctly. */
664 // settings->cache_flag = 0;
665}
666
667static const EnumPropertyItem *rna_Fluid_cobafield_itemf(bContext * /*C*/,
669 PropertyRNA * /*prop*/,
670 bool *r_free)
671{
673
674 EnumPropertyItem *item = nullptr;
675 EnumPropertyItem tmp = {0, "", 0, "", ""};
676 int totitem = 0;
677
679 tmp.identifier = "FLAGS";
680 tmp.icon = 0;
681 tmp.name = N_("Flags");
682 tmp.description = N_("Flag grid of the fluid domain");
683 RNA_enum_item_add(&item, &totitem, &tmp);
684
686 tmp.identifier = "PRESSURE";
687 tmp.icon = 0;
688 tmp.name = N_("Pressure");
689 tmp.description = N_("Pressure field of the fluid domain");
690 RNA_enum_item_add(&item, &totitem, &tmp);
691
693 tmp.identifier = "VELOCITY_X";
694 tmp.icon = 0;
695 tmp.name = N_("X Velocity");
696 tmp.description = N_("X component of the velocity field");
697 RNA_enum_item_add(&item, &totitem, &tmp);
698
700 tmp.identifier = "VELOCITY_Y";
701 tmp.icon = 0;
702 tmp.name = N_("Y Velocity");
703 tmp.description = N_("Y component of the velocity field");
704 RNA_enum_item_add(&item, &totitem, &tmp);
705
707 tmp.identifier = "VELOCITY_Z";
708 tmp.icon = 0;
709 tmp.name = N_("Z Velocity");
710 tmp.description = N_("Z component of the velocity field");
711 RNA_enum_item_add(&item, &totitem, &tmp);
712
714 tmp.identifier = "FORCE_X";
715 tmp.icon = 0;
716 tmp.name = N_("X Force");
717 tmp.description = N_("X component of the force field");
718 RNA_enum_item_add(&item, &totitem, &tmp);
719
721 tmp.identifier = "FORCE_Y";
722 tmp.icon = 0;
723 tmp.name = N_("Y Force");
724 tmp.description = N_("Y component of the force field");
725 RNA_enum_item_add(&item, &totitem, &tmp);
726
728 tmp.identifier = "FORCE_Z";
729 tmp.icon = 0;
730 tmp.name = N_("Z Force");
731 tmp.description = N_("Z component of the force field");
732 RNA_enum_item_add(&item, &totitem, &tmp);
733
734 if (settings->type == FLUID_DOMAIN_TYPE_GAS) {
736 tmp.identifier = "COLOR_R";
737 tmp.icon = 0;
738 tmp.name = N_("Red");
739 tmp.description = N_("Red component of the color field");
740 RNA_enum_item_add(&item, &totitem, &tmp);
741
743 tmp.identifier = "COLOR_G";
744 tmp.icon = 0;
745 tmp.name = N_("Green");
746 tmp.description = N_("Green component of the color field");
747 RNA_enum_item_add(&item, &totitem, &tmp);
748
750 tmp.identifier = "COLOR_B";
751 tmp.icon = 0;
752 tmp.name = N_("Blue");
753 tmp.description = N_("Blue component of the color field");
754 RNA_enum_item_add(&item, &totitem, &tmp);
755
757 tmp.identifier = "DENSITY";
758 tmp.icon = 0;
759 tmp.name = N_("Density");
760 tmp.description = N_("Quantity of soot in the fluid");
761 RNA_enum_item_add(&item, &totitem, &tmp);
762
764 tmp.identifier = "FLAME";
765 tmp.icon = 0;
766 tmp.name = N_("Flame");
767 tmp.description = N_("Flame field");
768 RNA_enum_item_add(&item, &totitem, &tmp);
769
771 tmp.identifier = "FUEL";
772 tmp.icon = 0;
773 tmp.name = N_("Fuel");
774 tmp.description = N_("Fuel field");
775 RNA_enum_item_add(&item, &totitem, &tmp);
776
778 tmp.identifier = "HEAT";
779 tmp.icon = 0;
780 tmp.name = N_("Heat");
781 tmp.description = N_("Temperature of the fluid");
782 RNA_enum_item_add(&item, &totitem, &tmp);
783 }
784 else if (settings->type == FLUID_DOMAIN_TYPE_LIQUID) {
786 tmp.identifier = "PHI";
787 tmp.icon = 0;
788 tmp.name = N_("Fluid Level Set");
789 tmp.description = N_("Level set representation of the fluid");
790 RNA_enum_item_add(&item, &totitem, &tmp);
791
793 tmp.identifier = "PHI_IN";
794 tmp.icon = 0;
795 tmp.name = N_("Inflow Level Set");
796 tmp.description = N_("Level set representation of the inflow");
797 RNA_enum_item_add(&item, &totitem, &tmp);
798
800 tmp.identifier = "PHI_OUT";
801 tmp.icon = 0;
802 tmp.name = N_("Outflow Level Set");
803 tmp.description = N_("Level set representation of the outflow");
804 RNA_enum_item_add(&item, &totitem, &tmp);
805
807 tmp.identifier = "PHI_OBSTACLE";
808 tmp.icon = 0;
809 tmp.name = N_("Obstacle Level Set");
810 tmp.description = N_("Level set representation of the obstacles");
811 RNA_enum_item_add(&item, &totitem, &tmp);
812 }
813
814 RNA_enum_item_end(&item, &totitem);
815 *r_free = true;
816
817 return item;
818}
819
820static const EnumPropertyItem *rna_Fluid_data_depth_itemf(bContext * /*C*/,
822 PropertyRNA * /*prop*/,
823 bool *r_free)
824{
826
827 EnumPropertyItem *item = nullptr;
828 EnumPropertyItem tmp = {0, "", 0, "", ""};
829 int totitem = 0;
830
832 tmp.identifier = "32";
833 tmp.icon = 0;
834 tmp.name = N_("Full");
835 tmp.description = N_("Full float (Use 32 bit for all data)");
836 RNA_enum_item_add(&item, &totitem, &tmp);
837
839 tmp.identifier = "16";
840 tmp.icon = 0;
841 tmp.name = N_("Half");
842 tmp.description = N_("Half float (Use 16 bit for all data)");
843 RNA_enum_item_add(&item, &totitem, &tmp);
844
845 if (settings->type == FLUID_DOMAIN_TYPE_LIQUID) {
847 tmp.identifier = "8";
848 tmp.icon = 0;
849 tmp.name = N_("Mini");
850 tmp.description = N_("Mini float (Use 8 bit where possible, otherwise use 16 bit)");
851 RNA_enum_item_add(&item, &totitem, &tmp);
852 }
853
854 RNA_enum_item_end(&item, &totitem);
855 *r_free = true;
856
857 return item;
858}
859
860static void rna_Fluid_domaintype_set(PointerRNA *ptr, int value)
861{
863 Object *ob = (Object *)ptr->owner_id;
864 BKE_fluid_domain_type_set(ob, settings, value);
866}
867
868static std::optional<std::string> rna_FluidDomainSettings_path(const PointerRNA *ptr)
869{
870 const FluidDomainSettings *settings = (FluidDomainSettings *)ptr->data;
871 const ModifierData *md = (ModifierData *)settings->fmd;
872 char name_esc[sizeof(md->name) * 2];
873
874 BLI_str_escape(name_esc, md->name, sizeof(name_esc));
875 return fmt::format("modifiers[\"{}\"].domain_settings", name_esc);
876}
877
878static std::optional<std::string> rna_FluidFlowSettings_path(const PointerRNA *ptr)
879{
880 const FluidFlowSettings *settings = (FluidFlowSettings *)ptr->data;
881 const ModifierData *md = (ModifierData *)settings->fmd;
882 char name_esc[sizeof(md->name) * 2];
883
884 BLI_str_escape(name_esc, md->name, sizeof(name_esc));
885 return fmt::format("modifiers[\"{}\"].flow_settings", name_esc);
886}
887
888static std::optional<std::string> rna_FluidEffectorSettings_path(const PointerRNA *ptr)
889{
891 const ModifierData *md = (ModifierData *)settings->fmd;
892 char name_esc[sizeof(md->name) * 2];
893
894 BLI_str_escape(name_esc, md->name, sizeof(name_esc));
895 return fmt::format("modifiers[\"{}\"].effector_settings", name_esc);
896}
897
898/* -------------------------------------------------------------------- */
902# ifdef WITH_FLUID
903
904static int rna_FluidModifier_grid_get_length(const PointerRNA *ptr,
905 int length[RNA_MAX_ARRAY_DIMENSION])
906{
908 float *density = nullptr;
909 int size = 0;
910
911 if (fds->flags & FLUID_DOMAIN_USE_NOISE && fds->fluid) {
912 /* high resolution smoke */
913 int res[3];
914
915 manta_noise_get_res(fds->fluid, res);
916 size = res[0] * res[1] * res[2];
917
918 density = manta_noise_get_density(fds->fluid);
919 }
920 else if (fds->fluid) {
921 /* regular resolution */
922 size = fds->res[0] * fds->res[1] * fds->res[2];
923 density = manta_smoke_get_density(fds->fluid);
924 }
925
926 length[0] = (density) ? size : 0;
927 return length[0];
928}
929
930static int rna_FluidModifier_color_grid_get_length(const PointerRNA *ptr,
931 int length[RNA_MAX_ARRAY_DIMENSION])
932{
933 rna_FluidModifier_grid_get_length(ptr, length);
934
935 length[0] *= 4;
936 return length[0];
937}
938
939static int rna_FluidModifier_velocity_grid_get_length(const PointerRNA *ptr,
940 int length[RNA_MAX_ARRAY_DIMENSION])
941{
943 float *vx = nullptr;
944 float *vy = nullptr;
945 float *vz = nullptr;
946 int size = 0;
947
948 /* Velocity data is always low-resolution. */
949 if (fds->fluid) {
950 size = 3 * fds->res[0] * fds->res[1] * fds->res[2];
951 vx = manta_get_velocity_x(fds->fluid);
952 vy = manta_get_velocity_y(fds->fluid);
953 vz = manta_get_velocity_z(fds->fluid);
954 }
955
956 length[0] = (vx && vy && vz) ? size : 0;
957 return length[0];
958}
959
960static int rna_FluidModifier_heat_grid_get_length(const PointerRNA *ptr,
961 int length[RNA_MAX_ARRAY_DIMENSION])
962{
964 float *heat = nullptr;
965 int size = 0;
966
967 /* Heat data is always low-resolution. */
968 if (fds->fluid) {
969 size = fds->res[0] * fds->res[1] * fds->res[2];
970 heat = manta_smoke_get_heat(fds->fluid);
971 }
972
973 length[0] = (heat) ? size : 0;
974 return length[0];
975}
976
977static void rna_FluidModifier_density_grid_get(PointerRNA *ptr, float *values)
978{
980 int length[RNA_MAX_ARRAY_DIMENSION];
981 int size = rna_FluidModifier_grid_get_length(ptr, length);
982 float *density;
983
984 BLI_rw_mutex_lock(static_cast<ThreadRWMutex *>(fds->fluid_mutex), THREAD_LOCK_READ);
985
986 if (fds->flags & FLUID_DOMAIN_USE_NOISE && fds->fluid) {
987 density = manta_noise_get_density(fds->fluid);
988 }
989 else {
990 density = manta_smoke_get_density(fds->fluid);
991 }
992
993 memcpy(values, density, size * sizeof(float));
994
995 BLI_rw_mutex_unlock(static_cast<ThreadRWMutex *>(fds->fluid_mutex));
996}
997
998static void rna_FluidModifier_velocity_grid_get(PointerRNA *ptr, float *values)
999{
1001 int length[RNA_MAX_ARRAY_DIMENSION];
1002 int size = rna_FluidModifier_velocity_grid_get_length(ptr, length);
1003 float *vx, *vy, *vz;
1004 int i;
1005
1006 BLI_rw_mutex_lock(static_cast<ThreadRWMutex *>(fds->fluid_mutex), THREAD_LOCK_READ);
1007
1008 vx = manta_get_velocity_x(fds->fluid);
1009 vy = manta_get_velocity_y(fds->fluid);
1010 vz = manta_get_velocity_z(fds->fluid);
1011
1012 for (i = 0; i < size; i += 3) {
1013 *(values++) = *(vx++);
1014 *(values++) = *(vy++);
1015 *(values++) = *(vz++);
1016 }
1017
1018 BLI_rw_mutex_unlock(static_cast<ThreadRWMutex *>(fds->fluid_mutex));
1019}
1020
1021static void rna_FluidModifier_color_grid_get(PointerRNA *ptr, float *values)
1022{
1024 int length[RNA_MAX_ARRAY_DIMENSION];
1025 int size = rna_FluidModifier_grid_get_length(ptr, length);
1026
1027 BLI_rw_mutex_lock(static_cast<ThreadRWMutex *>(fds->fluid_mutex), THREAD_LOCK_READ);
1028
1029 if (!fds->fluid) {
1030 memset(values, 0, size * sizeof(float));
1031 }
1032 else {
1033 if (fds->flags & FLUID_DOMAIN_USE_NOISE) {
1034 if (manta_noise_has_colors(fds->fluid)) {
1035 manta_noise_get_rgba(fds->fluid, values, 0);
1036 }
1037 else {
1038 manta_noise_get_rgba_fixed_color(fds->fluid, fds->active_color, values, 0);
1039 }
1040 }
1041 else {
1042 if (manta_smoke_has_colors(fds->fluid)) {
1043 manta_smoke_get_rgba(fds->fluid, values, 0);
1044 }
1045 else {
1046 manta_smoke_get_rgba_fixed_color(fds->fluid, fds->active_color, values, 0);
1047 }
1048 }
1049 }
1050
1051 BLI_rw_mutex_unlock(static_cast<ThreadRWMutex *>(fds->fluid_mutex));
1052}
1053
1054static void rna_FluidModifier_flame_grid_get(PointerRNA *ptr, float *values)
1055{
1057 int length[RNA_MAX_ARRAY_DIMENSION];
1058 int size = rna_FluidModifier_grid_get_length(ptr, length);
1059 float *flame;
1060
1061 BLI_rw_mutex_lock(static_cast<ThreadRWMutex *>(fds->fluid_mutex), THREAD_LOCK_READ);
1062
1063 if (fds->flags & FLUID_DOMAIN_USE_NOISE && fds->fluid) {
1064 flame = manta_noise_get_flame(fds->fluid);
1065 }
1066 else {
1067 flame = manta_smoke_get_flame(fds->fluid);
1068 }
1069
1070 if (flame) {
1071 memcpy(values, flame, size * sizeof(float));
1072 }
1073 else {
1074 memset(values, 0, size * sizeof(float));
1075 }
1076
1077 BLI_rw_mutex_unlock(static_cast<ThreadRWMutex *>(fds->fluid_mutex));
1078}
1079
1080static void rna_FluidModifier_heat_grid_get(PointerRNA *ptr, float *values)
1081{
1083 int length[RNA_MAX_ARRAY_DIMENSION];
1084 int size = rna_FluidModifier_heat_grid_get_length(ptr, length);
1085 float *heat;
1086
1087 BLI_rw_mutex_lock(static_cast<ThreadRWMutex *>(fds->fluid_mutex), THREAD_LOCK_READ);
1088
1089 heat = manta_smoke_get_heat(fds->fluid);
1090
1091 if (heat != nullptr) {
1092 /* scale heat values from -2.0-2.0 to -1.0-1.0. */
1093 for (int i = 0; i < size; i++) {
1094 values[i] = heat[i] * 0.5f;
1095 }
1096 }
1097 else {
1098 memset(values, 0, size * sizeof(float));
1099 }
1100
1101 BLI_rw_mutex_unlock(static_cast<ThreadRWMutex *>(fds->fluid_mutex));
1102}
1103
1104static void rna_FluidModifier_temperature_grid_get(PointerRNA *ptr, float *values)
1105{
1107 int length[RNA_MAX_ARRAY_DIMENSION];
1108 int size = rna_FluidModifier_grid_get_length(ptr, length);
1109 float *flame;
1110
1111 BLI_rw_mutex_lock(static_cast<ThreadRWMutex *>(fds->fluid_mutex), THREAD_LOCK_READ);
1112
1113 if (fds->flags & FLUID_DOMAIN_USE_NOISE && fds->fluid) {
1114 flame = manta_noise_get_flame(fds->fluid);
1115 }
1116 else {
1117 flame = manta_smoke_get_flame(fds->fluid);
1118 }
1119
1120 if (flame) {
1121 /* Output is such that 0..1 maps to 0..1000K */
1122 float offset = fds->flame_ignition;
1123 float scale = fds->flame_max_temp - fds->flame_ignition;
1124
1125 for (int i = 0; i < size; i++) {
1126 values[i] = (flame[i] > 0.01f) ? offset + flame[i] * scale : 0.0f;
1127 }
1128 }
1129 else {
1130 memset(values, 0, size * sizeof(float));
1131 }
1132
1133 BLI_rw_mutex_unlock(static_cast<ThreadRWMutex *>(fds->fluid_mutex));
1134}
1135# endif /* WITH_FLUID */
1136
1139static void rna_FluidFlow_density_vgroup_get(PointerRNA *ptr, char *value)
1140{
1142 rna_object_vgroup_name_index_get(ptr, value, flow->vgroup_density);
1143}
1144
1145static int rna_FluidFlow_density_vgroup_length(PointerRNA *ptr)
1146{
1148 return rna_object_vgroup_name_index_length(ptr, flow->vgroup_density);
1149}
1150
1151static void rna_FluidFlow_density_vgroup_set(PointerRNA *ptr, const char *value)
1152{
1154 rna_object_vgroup_name_index_set(ptr, value, &flow->vgroup_density);
1155}
1156
1157static void rna_FluidFlow_uvlayer_set(PointerRNA *ptr, const char *value)
1158{
1160 rna_object_uvlayer_name_set(ptr, value, flow->uvlayer_name, sizeof(flow->uvlayer_name));
1161}
1162
1163static void rna_Fluid_use_color_ramp_set(PointerRNA *ptr, bool value)
1164{
1166
1167 fds->use_coba = value;
1168
1169 if (value && fds->coba == nullptr) {
1170 fds->coba = BKE_colorband_add(false);
1171 }
1172}
1173
1174static void rna_Fluid_flowsource_set(PointerRNA *ptr, int value)
1175{
1177
1178 if (value != settings->source) {
1179 settings->source = value;
1180 }
1181}
1182
1183static const EnumPropertyItem *rna_Fluid_flowsource_itemf(bContext * /*C*/,
1184 PointerRNA *ptr,
1185 PropertyRNA * /*prop*/,
1186 bool *r_free)
1187{
1189
1190 EnumPropertyItem *item = nullptr;
1191 EnumPropertyItem tmp = {0, "", 0, "", ""};
1192 int totitem = 0;
1193
1195 tmp.identifier = "MESH";
1196 tmp.icon = ICON_META_CUBE;
1197 tmp.name = N_("Mesh");
1198 tmp.description = N_("Emit fluid from mesh surface or volume");
1199 RNA_enum_item_add(&item, &totitem, &tmp);
1200
1201 if (settings->type != FLUID_FLOW_TYPE_LIQUID) {
1203 tmp.identifier = "PARTICLES";
1204 tmp.icon = ICON_PARTICLES;
1205 tmp.name = N_("Particle System");
1206 tmp.description = N_("Emit smoke from particles");
1207 RNA_enum_item_add(&item, &totitem, &tmp);
1208 }
1209
1210 RNA_enum_item_end(&item, &totitem);
1211 *r_free = true;
1212
1213 return item;
1214}
1215
1216static void rna_Fluid_flowtype_set(PointerRNA *ptr, int value)
1217{
1219
1220 if (value != settings->type) {
1221 short prev_value = settings->type;
1222 settings->type = value;
1223
1224 /* Force flow source to mesh for liquids.
1225 * Also use different surface emission. Liquids should by default not emit around surface. */
1226 if (value == FLUID_FLOW_TYPE_LIQUID) {
1227 rna_Fluid_flowsource_set(ptr, FLUID_FLOW_SOURCE_MESH);
1228 settings->surface_distance = 0.0f;
1229 }
1230 /* Use some surface emission when switching to a gas emitter. Gases should by default emit a
1231 * bit around surface. */
1232 if (prev_value == FLUID_FLOW_TYPE_LIQUID) {
1233 settings->surface_distance = 1.5f;
1234 }
1235 }
1236}
1237
1238#else
1239
1241{
1242 StructRNA *srna;
1243 PropertyRNA *prop;
1244
1245 static const EnumPropertyItem domain_types[] = {
1246 {FLUID_DOMAIN_TYPE_GAS, "GAS", 0, "Gas", "Create domain for gases"},
1247 {FLUID_DOMAIN_TYPE_LIQUID, "LIQUID", 0, "Liquid", "Create domain for liquids"},
1248 {0, nullptr, 0, nullptr, nullptr}};
1249
1250 static const EnumPropertyItem prop_compression_items[] = {
1251 {VDB_COMPRESSION_ZIP, "ZIP", 0, "Zip", "Effective but slow compression"},
1252# ifdef WITH_OPENVDB_BLOSC
1254 "BLOSC",
1255 0,
1256 "Blosc",
1257 "Multithreaded compression, similar in size and quality as 'Zip'"},
1258# endif
1259 {VDB_COMPRESSION_NONE, "NONE", 0, "None", "Do not use any compression"},
1260 {0, nullptr, 0, nullptr, nullptr}};
1261
1262 static const EnumPropertyItem smoke_highres_sampling_items[] = {
1263 {SM_HRES_FULLSAMPLE, "FULLSAMPLE", 0, "Full Sample", ""},
1264 {SM_HRES_LINEAR, "LINEAR", 0, "Linear", ""},
1265 {SM_HRES_NEAREST, "NEAREST", 0, "Nearest", ""},
1266 {0, nullptr, 0, nullptr, nullptr},
1267 };
1268
1269 static const EnumPropertyItem cache_types[] = {
1270 {FLUID_DOMAIN_CACHE_REPLAY, "REPLAY", 0, "Replay", "Use the timeline to bake the scene"},
1272 "MODULAR",
1273 0,
1274 "Modular",
1275 "Bake every stage of the simulation separately"},
1276 {FLUID_DOMAIN_CACHE_ALL, "ALL", 0, "All", "Bake all simulation settings at once"},
1277 {0, nullptr, 0, nullptr, nullptr}};
1278
1279 /* OpenVDB data depth - generated dynamically based on domain type */
1280 static const EnumPropertyItem fluid_data_depth_items[] = {
1281 {0, "NONE", 0, "", ""},
1282 {0, nullptr, 0, nullptr, nullptr},
1283 };
1284
1285 static const EnumPropertyItem fluid_mesh_quality_items[] = {
1287 "IMPROVED",
1288 0,
1289 "Final",
1290 "Use improved particle level set (slower but more precise and with mesh smoothening "
1291 "options)"},
1293 "UNION",
1294 0,
1295 "Preview",
1296 "Use union particle level set (faster but lower quality)"},
1297 {0, nullptr, 0, nullptr, nullptr},
1298 };
1299
1300 static const EnumPropertyItem fluid_guide_source_items[] = {
1302 "DOMAIN",
1303 0,
1304 "Domain",
1305 "Use a fluid domain for guiding (domain needs to be baked already so that velocities can "
1306 "be extracted). Guiding domain can be of any type (i.e. gas or liquid)."},
1308 "EFFECTOR",
1309 0,
1310 "Effector",
1311 "Use guiding (effector) objects to create fluid guiding (guiding objects should be "
1312 "animated and baked once set up completely)"},
1313 {0, nullptr, 0, nullptr, nullptr},
1314 };
1315
1316 /* Cache type - generated dynamically based on domain type */
1317 static const EnumPropertyItem cache_file_type_items[] = {
1318 {0, "NONE", 0, "", ""},
1319 {0, nullptr, 0, nullptr, nullptr},
1320 };
1321
1322 static const EnumPropertyItem interp_method_item[] = {
1323 {FLUID_DISPLAY_INTERP_LINEAR, "LINEAR", 0, "Linear", "Good smoothness and speed"},
1325 "CUBIC",
1326 0,
1327 "Cubic",
1328 "Smoothed high quality interpolation, but slower"},
1329 {FLUID_DISPLAY_INTERP_CLOSEST, "CLOSEST", 0, "Closest", "No interpolation"},
1330 {0, nullptr, 0, nullptr, nullptr},
1331 };
1332
1333 static const EnumPropertyItem axis_slice_position_items[] = {
1335 "AUTO",
1336 0,
1337 "Auto",
1338 "Adjust slice direction according to the view direction"},
1339 {SLICE_AXIS_X, "X", 0, "X", "Slice along the X axis"},
1340 {SLICE_AXIS_Y, "Y", 0, "Y", "Slice along the Y axis"},
1341 {SLICE_AXIS_Z, "Z", 0, "Z", "Slice along the Z axis"},
1342 {0, nullptr, 0, nullptr, nullptr},
1343 };
1344
1345 static const EnumPropertyItem vector_draw_items[] = {
1346 {VECTOR_DRAW_NEEDLE, "NEEDLE", 0, "Needle", "Display vectors as needles"},
1347 {VECTOR_DRAW_STREAMLINE, "STREAMLINE", 0, "Streamlines", "Display vectors as streamlines"},
1348 {VECTOR_DRAW_MAC, "MAC", 0, "MAC Grid", "Display vector field as MAC grid"},
1349 {0, nullptr, 0, nullptr, nullptr},
1350 };
1351
1352 static const EnumPropertyItem vector_field_items[] = {
1354 "FLUID_VELOCITY",
1355 0,
1356 "Fluid Velocity",
1357 "Velocity field of the fluid domain"},
1359 "GUIDE_VELOCITY",
1360 0,
1361 "Guide Velocity",
1362 "Guide velocity field of the fluid domain"},
1363 {FLUID_DOMAIN_VECTOR_FIELD_FORCE, "FORCE", 0, "Force", "Force field of the fluid domain"},
1364 {0, nullptr, 0, nullptr, nullptr},
1365 };
1366
1367 static const EnumPropertyItem gridlines_color_field_items[] = {
1368 {FLUID_GRIDLINE_COLOR_TYPE_NONE, "NONE", 0, "None", "None"},
1369 {FLUID_GRIDLINE_COLOR_TYPE_FLAGS, "FLAGS", 0, "Flags", "Flag grid of the fluid domain"},
1371 "RANGE",
1372 0,
1373 "Highlight Range",
1374 "Highlight the voxels with values of the color mapped field within the range"},
1375 {0, nullptr, 0, nullptr, nullptr},
1376 };
1377
1378 static const EnumPropertyItem gridlines_cell_filter_items[] = {
1379 {FLUID_CELL_TYPE_NONE, "NONE", 0, "None", "Highlight the cells regardless of their type"},
1380 {FLUID_CELL_TYPE_FLUID, "FLUID", 0, "Fluid", "Highlight only the cells of type Fluid"},
1382 "OBSTACLE",
1383 0,
1384 "Obstacle",
1385 "Highlight only the cells of type Obstacle"},
1386 {FLUID_CELL_TYPE_EMPTY, "EMPTY", 0, "Empty", "Highlight only the cells of type Empty"},
1387 {FLUID_CELL_TYPE_INFLOW, "INFLOW", 0, "Inflow", "Highlight only the cells of type Inflow"},
1389 "OUTFLOW",
1390 0,
1391 "Outflow",
1392 "Highlight only the cells of type Outflow"},
1393 {0, nullptr, 0, nullptr, nullptr},
1394 };
1395
1396 static const EnumPropertyItem sndparticle_boundary_items[] = {
1398 "DELETE",
1399 0,
1400 "Delete",
1401 "Delete secondary particles that are inside obstacles or left the domain"},
1403 "PUSHOUT",
1404 0,
1405 "Push Out",
1406 "Push secondary particles that left the domain back into the domain"},
1407 {0, nullptr, 0, nullptr, nullptr}};
1408
1409 static const EnumPropertyItem sndparticle_combined_export_items[] = {
1411 "OFF",
1412 0,
1413 "Off",
1414 "Create a separate particle system for every secondary particle type"},
1416 "SPRAY_FOAM",
1417 0,
1418 "Spray + Foam",
1419 "Spray and foam particles are saved in the same particle system"},
1421 "SPRAY_BUBBLES",
1422 0,
1423 "Spray + Bubbles",
1424 "Spray and bubble particles are saved in the same particle system"},
1426 "FOAM_BUBBLES",
1427 0,
1428 "Foam + Bubbles",
1429 "Foam and bubbles particles are saved in the same particle system"},
1431 "SPRAY_FOAM_BUBBLES",
1432 0,
1433 "Spray + Foam + Bubbles",
1434 "Create one particle system that contains all three secondary particle types"},
1435 {0, nullptr, 0, nullptr, nullptr}};
1436
1437 static const EnumPropertyItem simulation_methods[] = {
1439 "FLIP",
1440 0,
1441 "FLIP",
1442 "Use FLIP as the simulation method (more splashy behavior)"},
1444 "APIC",
1445 0,
1446 "APIC",
1447 "Use APIC as the simulation method (more energetic and stable behavior)"},
1448 {0, nullptr, 0, nullptr, nullptr},
1449 };
1450
1451 srna = RNA_def_struct(brna, "FluidDomainSettings", nullptr);
1452 RNA_def_struct_ui_text(srna, "Domain Settings", "Fluid domain settings");
1453 RNA_def_struct_sdna(srna, "FluidDomainSettings");
1454 RNA_def_struct_path_func(srna, "rna_FluidDomainSettings_path");
1455
1456 prop = RNA_def_property(srna, "effector_weights", PROP_POINTER, PROP_NONE);
1457 RNA_def_property_struct_type(prop, "EffectorWeights");
1460 RNA_def_property_ui_text(prop, "Effector Weights", "");
1461
1462 /* object collections */
1463
1464 prop = RNA_def_property(srna, "effector_group", PROP_POINTER, PROP_NONE);
1465 RNA_def_property_pointer_sdna(prop, nullptr, "effector_group");
1466 RNA_def_property_struct_type(prop, "Collection");
1468 RNA_def_property_ui_text(prop, "Effector Collection", "Limit effectors to this collection");
1469 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_reset_dependency");
1470
1471 prop = RNA_def_property(srna, "fluid_group", PROP_POINTER, PROP_NONE);
1472 RNA_def_property_pointer_sdna(prop, nullptr, "fluid_group");
1473 RNA_def_property_struct_type(prop, "Collection");
1475 RNA_def_property_ui_text(prop, "Fluid Collection", "Limit fluid objects to this collection");
1476 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_reset_dependency");
1477
1478 prop = RNA_def_property(srna, "force_collection", PROP_POINTER, PROP_NONE);
1479 RNA_def_property_pointer_sdna(prop, nullptr, "force_group");
1480 RNA_def_property_struct_type(prop, "Collection");
1482 RNA_def_property_ui_text(prop, "Force Collection", "Limit forces to this collection");
1483 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_reset_dependency");
1484
1485 /* grid access */
1486
1487# ifdef WITH_FLUID
1488 prop = RNA_def_property(srna, "density_grid", PROP_FLOAT, PROP_NONE);
1489 RNA_def_property_array(prop, 32);
1492 RNA_def_property_dynamic_array_funcs(prop, "rna_FluidModifier_grid_get_length");
1493 RNA_def_property_float_funcs(prop, "rna_FluidModifier_density_grid_get", nullptr, nullptr);
1494 RNA_def_property_ui_text(prop, "Density Grid", "Smoke density grid");
1495
1496 prop = RNA_def_property(srna, "velocity_grid", PROP_FLOAT, PROP_NONE);
1497 RNA_def_property_array(prop, 32);
1500 RNA_def_property_dynamic_array_funcs(prop, "rna_FluidModifier_velocity_grid_get_length");
1501 RNA_def_property_float_funcs(prop, "rna_FluidModifier_velocity_grid_get", nullptr, nullptr);
1502 RNA_def_property_ui_text(prop, "Velocity Grid", "Smoke velocity grid");
1503
1504 prop = RNA_def_property(srna, "flame_grid", PROP_FLOAT, PROP_NONE);
1505 RNA_def_property_array(prop, 32);
1508 RNA_def_property_dynamic_array_funcs(prop, "rna_FluidModifier_grid_get_length");
1509 RNA_def_property_float_funcs(prop, "rna_FluidModifier_flame_grid_get", nullptr, nullptr);
1510 RNA_def_property_ui_text(prop, "Flame Grid", "Smoke flame grid");
1511
1512 prop = RNA_def_property(srna, "color_grid", PROP_FLOAT, PROP_NONE);
1513 RNA_def_property_array(prop, 32);
1516 RNA_def_property_dynamic_array_funcs(prop, "rna_FluidModifier_color_grid_get_length");
1517 RNA_def_property_float_funcs(prop, "rna_FluidModifier_color_grid_get", nullptr, nullptr);
1518 RNA_def_property_ui_text(prop, "Color Grid", "Smoke color grid");
1519
1520 prop = RNA_def_property(srna, "heat_grid", PROP_FLOAT, PROP_NONE);
1521 RNA_def_property_array(prop, 32);
1524 RNA_def_property_dynamic_array_funcs(prop, "rna_FluidModifier_heat_grid_get_length");
1525 RNA_def_property_float_funcs(prop, "rna_FluidModifier_heat_grid_get", nullptr, nullptr);
1526 RNA_def_property_ui_text(prop, "Heat Grid", "Smoke heat grid");
1527
1528 prop = RNA_def_property(srna, "temperature_grid", PROP_FLOAT, PROP_NONE);
1529 RNA_def_property_array(prop, 32);
1532 RNA_def_property_dynamic_array_funcs(prop, "rna_FluidModifier_grid_get_length");
1533 RNA_def_property_float_funcs(prop, "rna_FluidModifier_temperature_grid_get", nullptr, nullptr);
1535 prop, "Temperature Grid", "Smoke temperature grid, range 0 to 1 represents 0 to 1000K");
1536# endif /* WITH_FLUID */
1537
1538 /* domain object data */
1539
1540 prop = RNA_def_property(srna,
1541 "start_point",
1542 PROP_FLOAT,
1543 PROP_XYZ); /* can change each frame when using adaptive domain */
1544 RNA_def_property_float_sdna(prop, nullptr, "p0");
1546 RNA_def_property_ui_text(prop, "p0", "Start point");
1547
1548 prop = RNA_def_property(srna,
1549 "cell_size",
1550 PROP_FLOAT,
1551 PROP_XYZ); /* can change each frame when using adaptive domain */
1553 RNA_def_property_ui_text(prop, "cell_size", "Cell Size");
1554
1555 prop = RNA_def_property(srna,
1556 "domain_resolution",
1557 PROP_INT,
1558 PROP_XYZ); /* can change each frame when using adaptive domain */
1559 RNA_def_property_int_sdna(prop, nullptr, "res");
1561 RNA_def_property_ui_text(prop, "res", "Smoke Grid Resolution");
1562
1563 /* adaptive domain options */
1564
1565 prop = RNA_def_property(srna, "additional_res", PROP_INT, PROP_NONE);
1566 RNA_def_property_int_sdna(prop, nullptr, "adapt_res");
1567 RNA_def_property_range(prop, 0, 512);
1568 RNA_def_property_ui_text(prop, "Additional", "Maximum number of additional cells");
1569 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
1570
1571 prop = RNA_def_property(srna, "adapt_margin", PROP_INT, PROP_NONE);
1572 RNA_def_property_int_sdna(prop, nullptr, "adapt_margin");
1573 RNA_def_property_range(prop, 2, 24);
1575 prop, "Margin", "Margin added around fluid to minimize boundary interference");
1576 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
1577
1578 prop = RNA_def_property(srna, "adapt_threshold", PROP_FLOAT, PROP_NONE);
1579 RNA_def_property_range(prop, 0.0, 1.0);
1580 RNA_def_property_ui_range(prop, 0.0, 1.0, 0.02, 6);
1582 prop,
1583 "Threshold",
1584 "Minimum amount of fluid a cell can contain before it is considered empty");
1585 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
1586
1587 prop = RNA_def_property(srna, "use_adaptive_domain", PROP_BOOLEAN, PROP_NONE);
1590 prop, "Adaptive Domain", "Adapt simulation resolution and size to fluid");
1592 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_domain_data_reset");
1593
1594 /* fluid domain options */
1595
1596 prop = RNA_def_property(srna, "resolution_max", PROP_INT, PROP_NONE);
1597 RNA_def_property_int_sdna(prop, nullptr, "maxres");
1598 RNA_def_property_range(prop, 6, 10000);
1599 RNA_def_property_ui_range(prop, 24, 10000, 2, -1);
1601 prop,
1602 "Maximum Resolution",
1603 "Resolution used for the fluid domain. Value corresponds to the longest domain side "
1604 "(resolution for other domain sides is calculated automatically).");
1606 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_domain_data_reset");
1607
1608 prop = RNA_def_property(srna, "use_collision_border_front", PROP_BOOLEAN, PROP_NONE);
1609 RNA_def_property_boolean_sdna(prop, nullptr, "border_collisions", FLUID_DOMAIN_BORDER_FRONT);
1610 RNA_def_property_ui_text(prop, "Front", "Enable collisions with front domain border");
1611 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
1612
1613 prop = RNA_def_property(srna, "use_collision_border_back", PROP_BOOLEAN, PROP_NONE);
1614 RNA_def_property_boolean_sdna(prop, nullptr, "border_collisions", FLUID_DOMAIN_BORDER_BACK);
1615 RNA_def_property_ui_text(prop, "Back", "Enable collisions with back domain border");
1616 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
1617
1618 prop = RNA_def_property(srna, "use_collision_border_right", PROP_BOOLEAN, PROP_NONE);
1619 RNA_def_property_boolean_sdna(prop, nullptr, "border_collisions", FLUID_DOMAIN_BORDER_RIGHT);
1620 RNA_def_property_ui_text(prop, "Right", "Enable collisions with right domain border");
1621 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
1622
1623 prop = RNA_def_property(srna, "use_collision_border_left", PROP_BOOLEAN, PROP_NONE);
1624 RNA_def_property_boolean_sdna(prop, nullptr, "border_collisions", FLUID_DOMAIN_BORDER_LEFT);
1625 RNA_def_property_ui_text(prop, "Left", "Enable collisions with left domain border");
1626 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
1627
1628 prop = RNA_def_property(srna, "use_collision_border_top", PROP_BOOLEAN, PROP_NONE);
1629 RNA_def_property_boolean_sdna(prop, nullptr, "border_collisions", FLUID_DOMAIN_BORDER_TOP);
1630 RNA_def_property_ui_text(prop, "Top", "Enable collisions with top domain border");
1631 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
1632
1633 prop = RNA_def_property(srna, "use_collision_border_bottom", PROP_BOOLEAN, PROP_NONE);
1634 RNA_def_property_boolean_sdna(prop, nullptr, "border_collisions", FLUID_DOMAIN_BORDER_BOTTOM);
1635 RNA_def_property_ui_text(prop, "Bottom", "Enable collisions with bottom domain border");
1636 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
1637
1638 prop = RNA_def_property(srna, "gravity", PROP_FLOAT, PROP_ACCELERATION);
1639 RNA_def_property_float_sdna(prop, nullptr, "gravity");
1640 RNA_def_property_array(prop, 3);
1641 RNA_def_property_range(prop, -1000.1, 1000.1);
1642 RNA_def_property_ui_text(prop, "Gravity", "Gravity in X, Y and Z direction");
1643 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
1644
1645 prop = RNA_def_property(srna, "domain_type", PROP_ENUM, PROP_NONE);
1646 RNA_def_property_enum_sdna(prop, nullptr, "type");
1647 RNA_def_property_enum_items(prop, domain_types);
1648 RNA_def_property_enum_funcs(prop, nullptr, "rna_Fluid_domaintype_set", nullptr);
1649 RNA_def_property_ui_text(prop, "Domain Type", "Change domain type of the simulation");
1651 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Fluid_flip_parts_update");
1652
1653 prop = RNA_def_property(srna, "delete_in_obstacle", PROP_BOOLEAN, PROP_NONE);
1655 RNA_def_property_ui_text(prop, "Clear In Obstacle", "Delete fluid inside obstacles");
1656 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
1657
1658 /* smoke domain options */
1659
1660 prop = RNA_def_property(srna, "alpha", PROP_FLOAT, PROP_NONE);
1661 RNA_def_property_float_sdna(prop, nullptr, "alpha");
1662 RNA_def_property_range(prop, -5.0, 5.0);
1663 RNA_def_property_ui_range(prop, -5.0, 5.0, 0.02, 5);
1665 prop,
1666 "Buoyancy Density",
1667 "Buoyant force based on smoke density (higher value results in faster rising smoke)");
1668 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
1669
1670 prop = RNA_def_property(srna, "beta", PROP_FLOAT, PROP_NONE);
1671 RNA_def_property_float_sdna(prop, nullptr, "beta");
1672 RNA_def_property_range(prop, -5.0, 5.0);
1673 RNA_def_property_ui_range(prop, -5.0, 5.0, 0.02, 5);
1675 prop,
1676 "Buoyancy Heat",
1677 "Buoyant force based on smoke heat (higher value results in faster rising smoke)");
1678 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
1679
1680 prop = RNA_def_property(srna, "dissolve_speed", PROP_INT, PROP_NONE);
1681 RNA_def_property_int_sdna(prop, nullptr, "diss_speed");
1682 RNA_def_property_range(prop, 1.0, 10000.0);
1683 RNA_def_property_ui_range(prop, 1.0, 10000.0, 1, -1);
1685 prop,
1686 "Dissolve Speed",
1687 "Determine how quickly the smoke dissolves (lower value makes smoke disappear faster)");
1688 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
1689
1690 prop = RNA_def_property(srna, "vorticity", PROP_FLOAT, PROP_NONE);
1691 RNA_def_property_float_sdna(prop, nullptr, "vorticity");
1692 RNA_def_property_range(prop, 0.0, 4.0);
1693 RNA_def_property_ui_text(prop, "Vorticity", "Amount of turbulence and rotation in smoke");
1694 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
1695
1696 prop = RNA_def_property(srna, "highres_sampling", PROP_ENUM, PROP_NONE);
1697 RNA_def_property_enum_items(prop, smoke_highres_sampling_items);
1698 RNA_def_property_ui_text(prop, "Emitter", "Method for sampling the high resolution flow");
1699 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
1700
1701 prop = RNA_def_property(srna, "use_dissolve_smoke", PROP_BOOLEAN, PROP_NONE);
1703 RNA_def_property_ui_text(prop, "Dissolve Smoke", "Let smoke disappear over time");
1704 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
1705
1706 prop = RNA_def_property(srna, "use_dissolve_smoke_log", PROP_BOOLEAN, PROP_NONE);
1709 prop,
1710 "Logarithmic Dissolve",
1711 "Dissolve smoke in a logarithmic fashion. Dissolves quickly at first, but lingers longer.");
1712 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
1713
1714 /* flame options */
1715
1716 prop = RNA_def_property(srna, "burning_rate", PROP_FLOAT, PROP_NONE);
1717 RNA_def_property_range(prop, 0.01, 4.0);
1718 RNA_def_property_ui_range(prop, 0.01, 2.0, 1.0, 5);
1720 prop, "Speed", "Speed of the burning reaction (higher value results in smaller flames)");
1721 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
1722
1723 prop = RNA_def_property(srna, "flame_smoke", PROP_FLOAT, PROP_NONE);
1724 RNA_def_property_range(prop, 0.0, 8.0);
1725 RNA_def_property_ui_range(prop, 0.0, 4.0, 1.0, 5);
1726 RNA_def_property_ui_text(prop, "Smoke", "Amount of smoke created by burning fuel");
1727 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
1728
1729 prop = RNA_def_property(srna, "flame_vorticity", PROP_FLOAT, PROP_NONE);
1730 RNA_def_property_range(prop, 0.0, 2.0);
1731 RNA_def_property_ui_range(prop, 0.0, 1.0, 1.0, 5);
1732 RNA_def_property_ui_text(prop, "Vorticity", "Additional vorticity for the flames");
1733 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
1734
1735 prop = RNA_def_property(srna, "flame_ignition", PROP_FLOAT, PROP_NONE);
1736 RNA_def_property_range(prop, 0.5, 5.0);
1737 RNA_def_property_ui_range(prop, 0.5, 2.5, 1.0, 5);
1739 prop,
1740 "Minimum",
1741 "Minimum temperature of the flames (higher value results in faster rising flames)");
1742 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
1743
1744 prop = RNA_def_property(srna, "flame_max_temp", PROP_FLOAT, PROP_NONE);
1745 RNA_def_property_range(prop, 1.0, 10.0);
1746 RNA_def_property_ui_range(prop, 1.0, 5.0, 1.0, 5);
1748 prop,
1749 "Maximum",
1750 "Maximum temperature of the flames (higher value results in faster rising flames)");
1751 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
1752
1753 prop = RNA_def_property(srna, "flame_smoke_color", PROP_FLOAT, PROP_COLOR_GAMMA);
1754 RNA_def_property_array(prop, 3);
1755 RNA_def_property_ui_text(prop, "Smoke Color", "Color of smoke emitted from burning fuel");
1756 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
1757
1758 /* noise options */
1759
1760 prop = RNA_def_property(srna, "noise_strength", PROP_FLOAT, PROP_NONE);
1761 RNA_def_property_float_sdna(prop, nullptr, "noise_strength");
1762 RNA_def_property_range(prop, 0.0, 10.0);
1763 RNA_def_property_ui_range(prop, 0.0, 10.0, 1, 2);
1764 RNA_def_property_ui_text(prop, "Strength", "Strength of noise");
1765 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_noisecache_reset");
1766
1767 prop = RNA_def_property(srna, "noise_pos_scale", PROP_FLOAT, PROP_NONE);
1768 RNA_def_property_float_sdna(prop, nullptr, "noise_pos_scale");
1769 RNA_def_property_range(prop, 0.0001, 10.0);
1771 prop, "Scale", "Scale of noise (higher value results in larger vortices)");
1772 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_noisecache_reset");
1773
1774 prop = RNA_def_property(srna, "noise_time_anim", PROP_FLOAT, PROP_NONE);
1775 RNA_def_property_float_sdna(prop, nullptr, "noise_time_anim");
1776 RNA_def_property_range(prop, 0.0001, 10.0);
1777 RNA_def_property_ui_text(prop, "Time", "Animation time of noise");
1778 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_noisecache_reset");
1779
1780 prop = RNA_def_property(srna, "noise_scale", PROP_INT, PROP_NONE);
1781 RNA_def_property_int_sdna(prop, nullptr, "noise_scale");
1782 RNA_def_property_range(prop, 1, 100);
1783 RNA_def_property_ui_range(prop, 1, 10, 1, -1);
1785 "Noise Scale",
1786 "The noise simulation is scaled up by this factor (compared to the "
1787 "base resolution of the domain)");
1789 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_domain_noise_reset");
1790
1791 prop = RNA_def_property(srna, "use_noise", PROP_BOOLEAN, PROP_NONE);
1793 RNA_def_property_ui_text(prop, "Use Noise", "Enable fluid noise (using amplification)");
1795 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_update");
1796
1797 /* liquid domain options */
1798
1799 prop = RNA_def_property(srna, "simulation_method", PROP_ENUM, PROP_NONE);
1800 RNA_def_property_enum_sdna(prop, nullptr, "simulation_method");
1801 RNA_def_property_enum_items(prop, simulation_methods);
1802 RNA_def_property_ui_text(prop, "Simulation Method", "Change the underlying simulation method");
1804 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_domain_data_reset");
1805
1806 prop = RNA_def_property(srna, "flip_ratio", PROP_FLOAT, PROP_NONE);
1807 RNA_def_property_range(prop, 0.0, 1.0);
1809 prop,
1810 "FLIP Ratio",
1811 "PIC/FLIP Ratio. A value of 1.0 will result in a completely FLIP based simulation. Use a "
1812 "lower value for simulations which should produce smaller splashes.");
1813 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
1814
1815 prop = RNA_def_property(srna, "particle_randomness", PROP_FLOAT, PROP_NONE);
1816 RNA_def_property_range(prop, 0.0, 10.0);
1817 RNA_def_property_ui_text(prop, "Randomness", "Randomness factor for particle sampling");
1818 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
1819
1820 prop = RNA_def_property(srna, "particle_number", PROP_INT, PROP_NONE);
1821 RNA_def_property_range(prop, 1, 5);
1823 prop, "Number", "Particle number factor (higher value results in more particles)");
1825 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
1826
1827 prop = RNA_def_property(srna, "particle_min", PROP_INT, PROP_NONE);
1828 RNA_def_property_int_sdna(prop, nullptr, "particle_minimum");
1829 RNA_def_property_range(prop, 0, 1000);
1831 "Minimum",
1832 "Minimum number of particles per cell (ensures that each cell has at "
1833 "least this amount of particles)");
1834 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
1835
1836 prop = RNA_def_property(srna, "particle_max", PROP_INT, PROP_NONE);
1837 RNA_def_property_int_sdna(prop, nullptr, "particle_maximum");
1838 RNA_def_property_range(prop, 0, 1000);
1840 "Maximum",
1841 "Maximum number of particles per cell (ensures that each cell has at "
1842 "most this amount of particles)");
1843 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
1844
1845 prop = RNA_def_property(srna, "particle_radius", PROP_FLOAT, PROP_NONE);
1846 RNA_def_property_range(prop, 0.0, 10.0);
1848 "Radius",
1849 "Particle radius factor. Increase this value if the simulation appears "
1850 "to leak volume, decrease it if the simulation seems to gain volume.");
1851 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
1852
1853 prop = RNA_def_property(srna, "particle_band_width", PROP_FLOAT, PROP_NONE);
1854 RNA_def_property_range(prop, 0.0, 1000.0);
1856 prop,
1857 "Width",
1858 "Particle (narrow) band width (higher value results in thicker band and more particles)");
1859 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
1860
1861 prop = RNA_def_property(srna, "use_flip_particles", PROP_BOOLEAN, PROP_NONE);
1862 RNA_def_property_boolean_sdna(prop, nullptr, "particle_type", FLUID_DOMAIN_PARTICLE_FLIP);
1863 RNA_def_property_ui_text(prop, "FLIP", "Create liquid particle system");
1865 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Fluid_flip_parts_update");
1866
1867 prop = RNA_def_property(srna, "use_fractions", PROP_BOOLEAN, PROP_NONE);
1870 prop,
1871 "Fractional Obstacles",
1872 "Fractional obstacles improve and smoothen the fluid-obstacle boundary");
1874 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
1875
1876 prop = RNA_def_property(srna, "fractions_threshold", PROP_FLOAT, PROP_NONE);
1877 RNA_def_property_range(prop, 0.001, 1.0);
1878 RNA_def_property_ui_range(prop, 0.01, 1.0, 0.05, -1);
1880 "Obstacle Threshold",
1881 "Determines how much fluid is allowed in an obstacle cell "
1882 "(higher values will tag a boundary cell as an obstacle easier "
1883 "and reduce the boundary smoothening effect)");
1884 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
1885
1886 prop = RNA_def_property(srna, "fractions_distance", PROP_FLOAT, PROP_NONE);
1887 RNA_def_property_range(prop, -5.0, 5.0);
1888 RNA_def_property_ui_range(prop, 0.01, 5.0, 0.1, -1);
1890 "Obstacle Distance",
1891 "Determines how far apart fluid and obstacle are (higher values will "
1892 "result in fluid being further away from obstacles, smaller values "
1893 "will let fluid move towards the inside of obstacles)");
1894 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
1895
1896 prop = RNA_def_property(srna, "sys_particle_maximum", PROP_INT, PROP_NONE);
1897 RNA_def_property_int_sdna(prop, nullptr, "sys_particle_maximum");
1898 RNA_def_property_range(prop, 0, INT_MAX);
1900 prop,
1901 "System Maximum",
1902 "Maximum number of fluid particles that are allowed in this simulation");
1903 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
1904
1905 /* viscosity options */
1906
1907 prop = RNA_def_property(srna, "use_viscosity", PROP_BOOLEAN, PROP_NONE);
1910 prop, "Use Viscosity", "Simulate fluids with high viscosity using a special solver");
1911 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
1912
1913 prop = RNA_def_property(srna, "viscosity_value", PROP_FLOAT, PROP_NONE);
1914 RNA_def_property_range(prop, 0.0, 10.0);
1915 RNA_def_property_ui_range(prop, 0.0, 5.0, 1.0, 3);
1917 "Strength",
1918 "Viscosity of liquid (higher values result in more viscous fluids, a "
1919 "value of 0 will still apply some viscosity)");
1920 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
1921
1922 /* diffusion options */
1923
1924 prop = RNA_def_property(srna, "use_diffusion", PROP_BOOLEAN, PROP_NONE);
1927 prop, "Use Diffusion", "Enable fluid diffusion settings (e.g. viscosity, surface tension)");
1929 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
1930
1931 prop = RNA_def_property(srna, "surface_tension", PROP_FLOAT, PROP_NONE);
1932 RNA_def_property_range(prop, 0.0, 100.0);
1934 prop,
1935 "Tension",
1936 "Surface tension of liquid (higher value results in greater hydrophobic behavior)");
1937 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
1938
1939 prop = RNA_def_property(srna, "viscosity_base", PROP_FLOAT, PROP_NONE);
1940 RNA_def_property_float_sdna(prop, nullptr, "viscosity_base");
1941 RNA_def_property_range(prop, 0, 10);
1943 prop,
1944 "Viscosity Base",
1945 "Viscosity setting: value that is multiplied by 10 to the power of (exponent*-1)");
1946 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
1947
1948 prop = RNA_def_property(srna, "viscosity_exponent", PROP_INT, PROP_NONE);
1949 RNA_def_property_int_sdna(prop, nullptr, "viscosity_exponent");
1950 RNA_def_property_range(prop, 0, 10);
1952 prop,
1953 "Viscosity Exponent",
1954 "Negative exponent for the viscosity value (to simplify entering small values "
1955 "e.g. 5*10^-6)");
1956 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
1957
1958 /* Mesh options. */
1959
1960 prop = RNA_def_property(srna, "mesh_concave_upper", PROP_FLOAT, PROP_NONE);
1961 RNA_def_property_range(prop, 0.0, 10.0);
1963 prop,
1964 "Upper Concavity",
1965 "Upper mesh concavity bound (high values tend to smoothen and fill out concave regions)");
1966 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_meshcache_reset");
1967
1968 prop = RNA_def_property(srna, "mesh_concave_lower", PROP_FLOAT, PROP_NONE);
1969 RNA_def_property_range(prop, 0.0, 10.0);
1971 prop,
1972 "Lower Concavity",
1973 "Lower mesh concavity bound (high values tend to smoothen and fill out concave regions)");
1974 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_meshcache_reset");
1975
1976 prop = RNA_def_property(srna, "mesh_smoothen_pos", PROP_INT, PROP_NONE);
1977 RNA_def_property_range(prop, 0, 100);
1978 RNA_def_property_ui_text(prop, "Smoothen Pos", "Positive mesh smoothening");
1979 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_meshcache_reset");
1980
1981 prop = RNA_def_property(srna, "mesh_smoothen_neg", PROP_INT, PROP_NONE);
1982 RNA_def_property_range(prop, 0, 100);
1983 RNA_def_property_ui_text(prop, "Smoothen Neg", "Negative mesh smoothening");
1984 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_meshcache_reset");
1985
1986 prop = RNA_def_property(srna, "mesh_scale", PROP_INT, PROP_NONE);
1987 RNA_def_property_int_sdna(prop, nullptr, "mesh_scale");
1988 RNA_def_property_range(prop, 1, 100);
1989 RNA_def_property_ui_range(prop, 1, 10, 1, -1);
1991 "Mesh scale",
1992 "The mesh simulation is scaled up by this factor (compared to the base "
1993 "resolution of the domain). For best meshing, it is recommended to "
1994 "adjust the mesh particle radius alongside this value.");
1996 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_domain_mesh_reset");
1997
1998 prop = RNA_def_property(srna, "mesh_generator", PROP_ENUM, PROP_NONE);
1999 RNA_def_property_enum_sdna(prop, nullptr, "mesh_generator");
2000 RNA_def_property_enum_items(prop, fluid_mesh_quality_items);
2001 RNA_def_property_ui_text(prop, "Mesh generator", "Which particle level set generator to use");
2002 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Fluid_update");
2003
2004 prop = RNA_def_property(srna, "use_mesh", PROP_BOOLEAN, PROP_NONE);
2006 RNA_def_property_ui_text(prop, "Use Mesh", "Enable fluid mesh (using amplification)");
2008 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_update");
2009
2010 prop = RNA_def_property(srna, "use_speed_vectors", PROP_BOOLEAN, PROP_NONE);
2013 "Speed Vectors",
2014 "Caches velocities of mesh vertices. These will be used "
2015 "(automatically) when rendering with motion blur enabled.");
2017 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_meshcache_reset");
2018
2019 prop = RNA_def_property(srna, "mesh_particle_radius", PROP_FLOAT, PROP_NONE);
2020 RNA_def_property_range(prop, 0.0, 10.0);
2022 "Radius",
2023 "Particle radius factor (higher value results in larger (meshed) "
2024 "particles). Needs to be adjusted after changing the mesh scale.");
2025 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_meshcache_reset");
2026
2027 /* secondary particles options */
2028
2029 prop = RNA_def_property(srna, "sndparticle_potential_min_wavecrest", PROP_FLOAT, PROP_NONE);
2030 RNA_def_property_float_sdna(prop, nullptr, "sndparticle_tau_min_wc");
2031 RNA_def_property_range(prop, 0.0, 1000.0);
2032 RNA_def_property_ui_range(prop, 0.0, 1000.0, 100.0, 3);
2034 "Minimum Wave Crest Potential",
2035 "Lower clamping threshold for marking fluid cells as wave crests "
2036 "(lower value results in more marked cells)");
2037 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_particlescache_reset");
2038
2039 prop = RNA_def_property(srna, "sndparticle_potential_max_wavecrest", PROP_FLOAT, PROP_NONE);
2040 RNA_def_property_float_sdna(prop, nullptr, "sndparticle_tau_max_wc");
2041 RNA_def_property_range(prop, 0.0, 1000.0);
2042 RNA_def_property_ui_range(prop, 0.0, 1000.0, 100.0, 3);
2044 "Maximum Wave Crest Potential",
2045 "Upper clamping threshold for marking fluid cells as wave crests "
2046 "(higher value results in less marked cells)");
2047 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_particlescache_reset");
2048
2049 prop = RNA_def_property(srna, "sndparticle_potential_min_trappedair", PROP_FLOAT, PROP_NONE);
2050 RNA_def_property_float_sdna(prop, nullptr, "sndparticle_tau_min_ta");
2051 RNA_def_property_range(prop, 0.0, 1000.0);
2052 RNA_def_property_ui_range(prop, 0.0, 10000.0, 100.0, 3);
2054 "Minimum Trapped Air Potential",
2055 "Lower clamping threshold for marking fluid cells where air is trapped "
2056 "(lower value results in more marked cells)");
2057 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_particlescache_reset");
2058
2059 prop = RNA_def_property(srna, "sndparticle_potential_max_trappedair", PROP_FLOAT, PROP_NONE);
2060 RNA_def_property_float_sdna(prop, nullptr, "sndparticle_tau_max_ta");
2061 RNA_def_property_range(prop, 0.0, 1000.0);
2062 RNA_def_property_ui_range(prop, 0.0, 1000.0, 100.0, 3);
2064 "Maximum Trapped Air Potential",
2065 "Upper clamping threshold for marking fluid cells where air is trapped "
2066 "(higher value results in less marked cells)");
2067 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_particlescache_reset");
2068
2069 prop = RNA_def_property(srna, "sndparticle_potential_min_energy", PROP_FLOAT, PROP_NONE);
2070 RNA_def_property_float_sdna(prop, nullptr, "sndparticle_tau_min_k");
2071 RNA_def_property_range(prop, 0.0, 1000.0);
2072 RNA_def_property_ui_range(prop, 0.0, 1000.0, 100.0, 3);
2074 prop,
2075 "Minimum Kinetic Energy Potential",
2076 "Lower clamping threshold that indicates the fluid speed where cells start to emit "
2077 "particles (lower values result in generally more particles)");
2078 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_particlescache_reset");
2079
2080 prop = RNA_def_property(srna, "sndparticle_potential_max_energy", PROP_FLOAT, PROP_NONE);
2081 RNA_def_property_float_sdna(prop, nullptr, "sndparticle_tau_max_k");
2082 RNA_def_property_range(prop, 0.0, 1000.0);
2083 RNA_def_property_ui_range(prop, 0.0, 1000.0, 100.0, 3);
2085 prop,
2086 "Maximum Kinetic Energy Potential",
2087 "Upper clamping threshold that indicates the fluid speed where cells no longer emit more "
2088 "particles (higher value results in generally less particles)");
2089 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_particlescache_reset");
2090
2091 prop = RNA_def_property(srna, "sndparticle_sampling_wavecrest", PROP_INT, PROP_NONE);
2092 RNA_def_property_int_sdna(prop, nullptr, "sndparticle_k_wc");
2093 RNA_def_property_range(prop, 0, 10000);
2094 RNA_def_property_ui_range(prop, 0, 10000, 1.0, -1);
2096 "Wave Crest Sampling",
2097 "Maximum number of particles generated per wave crest cell per frame");
2098 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_particlescache_reset");
2099
2100 prop = RNA_def_property(srna, "sndparticle_sampling_trappedair", PROP_INT, PROP_NONE);
2101 RNA_def_property_int_sdna(prop, nullptr, "sndparticle_k_ta");
2102 RNA_def_property_range(prop, 0, 10000);
2103 RNA_def_property_ui_range(prop, 0, 10000, 1.0, -1);
2105 "Trapped Air Sampling",
2106 "Maximum number of particles generated per trapped air cell per frame");
2107 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_particlescache_reset");
2108
2109 prop = RNA_def_property(srna, "sndparticle_bubble_buoyancy", PROP_FLOAT, PROP_NONE);
2110 RNA_def_property_float_sdna(prop, nullptr, "sndparticle_k_b");
2111 RNA_def_property_range(prop, 0.0, 100.0);
2112 RNA_def_property_ui_range(prop, 0.0, 100.0, 10.0, 2);
2114 "Bubble Buoyancy",
2115 "Amount of buoyancy force that rises bubbles (high value results in "
2116 "bubble movement mainly upwards)");
2117 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_particlescache_reset");
2118
2119 prop = RNA_def_property(srna, "sndparticle_bubble_drag", PROP_FLOAT, PROP_NONE);
2120 RNA_def_property_float_sdna(prop, nullptr, "sndparticle_k_d");
2121 RNA_def_property_range(prop, 0.0, 100.0);
2122 RNA_def_property_ui_range(prop, 0.0, 100.0, 10.0, 2);
2124 "Bubble Drag",
2125 "Amount of drag force that moves bubbles along with the fluid (high "
2126 "value results in bubble movement mainly along with the fluid)");
2127 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_particlescache_reset");
2128
2129 prop = RNA_def_property(srna, "sndparticle_life_min", PROP_FLOAT, PROP_NONE);
2130 RNA_def_property_float_sdna(prop, nullptr, "sndparticle_l_min");
2131 RNA_def_property_range(prop, 0.0, 10000.0);
2132 RNA_def_property_ui_range(prop, 0.0, 10000.0, 100.0, 1);
2133 RNA_def_property_ui_text(prop, "Minimum Lifetime", "Lowest possible particle lifetime");
2134 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_particlescache_reset");
2135
2136 prop = RNA_def_property(srna, "sndparticle_life_max", PROP_FLOAT, PROP_NONE);
2137 RNA_def_property_float_sdna(prop, nullptr, "sndparticle_l_max");
2138 RNA_def_property_range(prop, 0.0, 10000.0);
2139 RNA_def_property_ui_range(prop, 0.0, 10000.0, 100.0, 1);
2140 RNA_def_property_ui_text(prop, "Maximum Lifetime", "Highest possible particle lifetime");
2141 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_particlescache_reset");
2142
2143 prop = RNA_def_property(srna, "sndparticle_boundary", PROP_ENUM, PROP_NONE);
2144 RNA_def_property_enum_sdna(prop, nullptr, "sndparticle_boundary");
2145 RNA_def_property_enum_items(prop, sndparticle_boundary_items);
2147 prop, "Particles in Boundary", "How particles that left the domain are treated");
2148 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_particlescache_reset");
2149
2150 prop = RNA_def_property(srna, "sndparticle_combined_export", PROP_ENUM, PROP_NONE);
2151 RNA_def_property_enum_sdna(prop, nullptr, "sndparticle_combined_export");
2152 RNA_def_property_enum_items(prop, sndparticle_combined_export_items);
2154 prop,
2155 "Combined Export",
2156 "Determines which particle systems are created from secondary particles");
2157 RNA_def_property_update(prop, 0, "rna_Fluid_combined_export_update");
2158
2159 prop = RNA_def_property(srna, "sndparticle_potential_radius", PROP_INT, PROP_NONE);
2160 RNA_def_property_int_sdna(prop, nullptr, "sndparticle_potential_radius");
2161 RNA_def_property_range(prop, 1, 4);
2162 RNA_def_property_ui_range(prop, 1, 4, 1, -1);
2164 "Potential Radius",
2165 "Radius to compute potential for each cell (higher values are slower "
2166 "but create smoother potential grids)");
2167 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_particlescache_reset");
2168
2169 prop = RNA_def_property(srna, "sndparticle_update_radius", PROP_INT, PROP_NONE);
2170 RNA_def_property_int_sdna(prop, nullptr, "sndparticle_update_radius");
2171 RNA_def_property_range(prop, 1, 4);
2172 RNA_def_property_ui_range(prop, 1, 4, 1, -1);
2174 "Update Radius",
2175 "Radius to compute position update for each particle (higher values "
2176 "are slower but particles move less chaotic)");
2177 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_particlescache_reset");
2178
2179 prop = RNA_def_property(srna, "particle_scale", PROP_INT, PROP_NONE);
2180 RNA_def_property_int_sdna(prop, nullptr, "particle_scale");
2181 RNA_def_property_range(prop, 1, 100);
2182 RNA_def_property_ui_range(prop, 1, 10, 1, -1);
2184 "Particle scale",
2185 "The particle simulation is scaled up by this factor (compared to the "
2186 "base resolution of the domain)");
2188 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_domain_particles_reset");
2189
2190 prop = RNA_def_property(srna, "use_spray_particles", PROP_BOOLEAN, PROP_NONE);
2191 RNA_def_property_boolean_sdna(prop, nullptr, "particle_type", FLUID_DOMAIN_PARTICLE_SPRAY);
2192 RNA_def_property_ui_text(prop, "Spray", "Create spray particle system");
2194 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Fluid_spray_parts_update");
2195
2196 prop = RNA_def_property(srna, "use_bubble_particles", PROP_BOOLEAN, PROP_NONE);
2197 RNA_def_property_boolean_sdna(prop, nullptr, "particle_type", FLUID_DOMAIN_PARTICLE_BUBBLE);
2198 RNA_def_property_ui_text(prop, "Bubble", "Create bubble particle system");
2200 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Fluid_bubble_parts_update");
2201
2202 prop = RNA_def_property(srna, "use_foam_particles", PROP_BOOLEAN, PROP_NONE);
2203 RNA_def_property_boolean_sdna(prop, nullptr, "particle_type", FLUID_DOMAIN_PARTICLE_FOAM);
2204 RNA_def_property_ui_text(prop, "Foam", "Create foam particle system");
2206 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Fluid_foam_parts_update");
2207
2208 prop = RNA_def_property(srna, "use_tracer_particles", PROP_BOOLEAN, PROP_NONE);
2209 RNA_def_property_boolean_sdna(prop, nullptr, "particle_type", FLUID_DOMAIN_PARTICLE_TRACER);
2210 RNA_def_property_ui_text(prop, "Tracer", "Create tracer particle system");
2212 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Fluid_tracer_parts_update");
2213
2214 /* fluid guiding options */
2215
2216 prop = RNA_def_property(srna, "guide_alpha", PROP_FLOAT, PROP_NONE);
2217 RNA_def_property_float_sdna(prop, nullptr, "guide_alpha");
2218 RNA_def_property_range(prop, 1.0, 100.0);
2219 RNA_def_property_ui_text(prop, "Weight", "Guiding weight (higher value results in greater lag)");
2220 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
2221
2222 prop = RNA_def_property(srna, "guide_beta", PROP_INT, PROP_NONE);
2223 RNA_def_property_int_sdna(prop, nullptr, "guide_beta");
2224 RNA_def_property_range(prop, 1, 50);
2225 RNA_def_property_ui_text(prop, "Size", "Guiding size (higher value results in larger vortices)");
2226 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
2227
2228 prop = RNA_def_property(srna, "guide_vel_factor", PROP_FLOAT, PROP_NONE);
2229 RNA_def_property_float_sdna(prop, nullptr, "guide_vel_factor");
2230 RNA_def_property_range(prop, 0.0, 100.0);
2232 prop,
2233 "Velocity Factor",
2234 "Guiding velocity factor (higher value results in greater guiding velocities)");
2235 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
2236
2237 prop = RNA_def_property(srna, "guide_source", PROP_ENUM, PROP_NONE);
2238 RNA_def_property_enum_sdna(prop, nullptr, "guide_source");
2239 RNA_def_property_enum_items(prop, fluid_guide_source_items);
2240 RNA_def_property_ui_text(prop, "Guiding source", "Choose where to get guiding velocities from");
2241 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Fluid_update");
2242
2243 prop = RNA_def_property(srna, "guide_parent", PROP_POINTER, PROP_NONE);
2244 RNA_def_property_pointer_sdna(prop, nullptr, "guide_parent");
2245 RNA_def_property_struct_type(prop, "Object");
2246 RNA_def_property_pointer_funcs(prop, nullptr, "rna_Fluid_guide_parent_set", nullptr, nullptr);
2249 "",
2250 "Use velocities from this object for the guiding effect (object needs "
2251 "to have fluid modifier and be of type domain))");
2252 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Fluid_guidingcache_reset");
2253
2254 prop = RNA_def_property(srna, "use_guide", PROP_BOOLEAN, PROP_NONE);
2256 RNA_def_property_ui_text(prop, "Use Guiding", "Enable fluid guiding");
2258 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_update");
2259
2260 /* cache options */
2261
2262 prop = RNA_def_property(srna, "cache_frame_start", PROP_INT, PROP_TIME);
2263 RNA_def_property_int_sdna(prop, nullptr, "cache_frame_start");
2265 RNA_def_property_int_funcs(prop, nullptr, "rna_Fluid_cache_startframe_set", nullptr);
2267 prop, "Start", "Frame on which the simulation starts (first frame baked)");
2269
2270 prop = RNA_def_property(srna, "cache_frame_end", PROP_INT, PROP_TIME);
2271 RNA_def_property_int_sdna(prop, nullptr, "cache_frame_end");
2273 RNA_def_property_int_funcs(prop, nullptr, "rna_Fluid_cache_endframe_set", nullptr);
2274 RNA_def_property_ui_text(prop, "End", "Frame on which the simulation stops (last frame baked)");
2276
2277 prop = RNA_def_property(srna, "cache_frame_offset", PROP_INT, PROP_TIME);
2278 RNA_def_property_int_sdna(prop, nullptr, "cache_frame_offset");
2281 prop,
2282 "Offset",
2283 "Frame offset that is used when loading the simulation from the cache. It is not considered "
2284 "when baking the simulation, only when loading it.");
2286
2287 prop = RNA_def_property(srna, "cache_frame_pause_data", PROP_INT, PROP_TIME);
2288 RNA_def_property_int_sdna(prop, nullptr, "cache_frame_pause_data");
2289
2290 prop = RNA_def_property(srna, "cache_frame_pause_noise", PROP_INT, PROP_TIME);
2291 RNA_def_property_int_sdna(prop, nullptr, "cache_frame_pause_noise");
2292
2293 prop = RNA_def_property(srna, "cache_frame_pause_mesh", PROP_INT, PROP_TIME);
2294 RNA_def_property_int_sdna(prop, nullptr, "cache_frame_pause_mesh");
2295
2296 prop = RNA_def_property(srna, "cache_frame_pause_particles", PROP_INT, PROP_TIME);
2297 RNA_def_property_int_sdna(prop, nullptr, "cache_frame_pause_particles");
2298
2299 prop = RNA_def_property(srna, "cache_frame_pause_guide", PROP_INT, PROP_TIME);
2300 RNA_def_property_int_sdna(prop, nullptr, "cache_frame_pause_guide");
2301
2302 prop = RNA_def_property(srna, "cache_mesh_format", PROP_ENUM, PROP_NONE);
2303 RNA_def_property_enum_sdna(prop, nullptr, "cache_mesh_format");
2304 RNA_def_property_enum_items(prop, cache_file_type_items);
2306 prop, nullptr, "rna_Fluid_cachetype_mesh_set", "rna_Fluid_cachetype_mesh_itemf");
2308 prop, "File Format", "Select the file format to be used for caching surface data");
2310 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_meshcache_reset");
2311
2312 prop = RNA_def_property(srna, "cache_data_format", PROP_ENUM, PROP_NONE);
2313 RNA_def_property_enum_sdna(prop, nullptr, "cache_data_format");
2314 RNA_def_property_enum_items(prop, cache_file_type_items);
2316 prop, nullptr, "rna_Fluid_cachetype_data_set", "rna_Fluid_cachetype_volume_itemf");
2318 prop, "File Format", "Select the file format to be used for caching volumetric data");
2320 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
2321
2322 prop = RNA_def_property(srna, "cache_particle_format", PROP_ENUM, PROP_NONE);
2323 RNA_def_property_enum_sdna(prop, nullptr, "cache_particle_format");
2324 RNA_def_property_enum_items(prop, cache_file_type_items);
2326 prop, nullptr, "rna_Fluid_cachetype_particle_set", "rna_Fluid_cachetype_particle_itemf");
2328 prop, "File Format", "Select the file format to be used for caching particle data");
2330 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_particlescache_reset");
2331
2332 prop = RNA_def_property(srna, "cache_noise_format", PROP_ENUM, PROP_NONE);
2333 RNA_def_property_enum_sdna(prop, nullptr, "cache_noise_format");
2334 RNA_def_property_enum_items(prop, cache_file_type_items);
2336 prop, nullptr, "rna_Fluid_cachetype_noise_set", "rna_Fluid_cachetype_volume_itemf");
2338 prop, "File Format", "Select the file format to be used for caching noise data");
2340 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_noisecache_reset");
2341
2342 prop = RNA_def_property(srna, "cache_type", PROP_ENUM, PROP_NONE);
2343 RNA_def_property_enum_sdna(prop, nullptr, "cache_type");
2344 RNA_def_property_enum_items(prop, cache_types);
2345 RNA_def_property_enum_funcs(prop, nullptr, "rna_Fluid_cachetype_set", nullptr);
2346 RNA_def_property_ui_text(prop, "Type", "Change the cache type of the simulation");
2348 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Fluid_domain_data_reset");
2349
2350 prop = RNA_def_property(srna, "cache_resumable", PROP_BOOLEAN, PROP_NONE);
2353 prop,
2354 "Resumable",
2355 "Additional data will be saved so that the bake jobs can be resumed after pausing. Because "
2356 "more data will be written to disk it is recommended to avoid enabling this option when "
2357 "baking at high resolutions.");
2359 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
2360
2361 prop = RNA_def_property(srna, "cache_directory", PROP_STRING, PROP_DIRPATH);
2363 RNA_def_property_string_funcs(prop, nullptr, nullptr, "rna_Fluid_cache_directory_set");
2364 RNA_def_property_string_sdna(prop, nullptr, "cache_directory");
2365 RNA_def_property_ui_text(prop, "Cache directory", "Directory that contains fluid cache files");
2366 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_update");
2367
2368 prop = RNA_def_property(srna, "is_cache_baking_data", PROP_BOOLEAN, PROP_NONE);
2369 RNA_def_property_boolean_sdna(prop, nullptr, "cache_flag", FLUID_DOMAIN_BAKING_DATA);
2371
2372 prop = RNA_def_property(srna, "has_cache_baked_data", PROP_BOOLEAN, PROP_NONE);
2373 RNA_def_property_boolean_sdna(prop, nullptr, "cache_flag", FLUID_DOMAIN_BAKED_DATA);
2375
2376 prop = RNA_def_property(srna, "is_cache_baking_noise", PROP_BOOLEAN, PROP_NONE);
2377 RNA_def_property_boolean_sdna(prop, nullptr, "cache_flag", FLUID_DOMAIN_BAKING_NOISE);
2379
2380 prop = RNA_def_property(srna, "has_cache_baked_noise", PROP_BOOLEAN, PROP_NONE);
2381 RNA_def_property_boolean_sdna(prop, nullptr, "cache_flag", FLUID_DOMAIN_BAKED_NOISE);
2383
2384 prop = RNA_def_property(srna, "is_cache_baking_mesh", PROP_BOOLEAN, PROP_NONE);
2385 RNA_def_property_boolean_sdna(prop, nullptr, "cache_flag", FLUID_DOMAIN_BAKING_MESH);
2387
2388 prop = RNA_def_property(srna, "has_cache_baked_mesh", PROP_BOOLEAN, PROP_NONE);
2389 RNA_def_property_boolean_sdna(prop, nullptr, "cache_flag", FLUID_DOMAIN_BAKED_MESH);
2391
2392 prop = RNA_def_property(srna, "is_cache_baking_particles", PROP_BOOLEAN, PROP_NONE);
2395
2396 prop = RNA_def_property(srna, "has_cache_baked_particles", PROP_BOOLEAN, PROP_NONE);
2397 RNA_def_property_boolean_sdna(prop, nullptr, "cache_flag", FLUID_DOMAIN_BAKED_PARTICLES);
2399
2400 prop = RNA_def_property(srna, "is_cache_baking_guide", PROP_BOOLEAN, PROP_NONE);
2401 RNA_def_property_boolean_sdna(prop, nullptr, "cache_flag", FLUID_DOMAIN_BAKING_GUIDE);
2403
2404 prop = RNA_def_property(srna, "has_cache_baked_guide", PROP_BOOLEAN, PROP_NONE);
2405 RNA_def_property_boolean_sdna(prop, nullptr, "cache_flag", FLUID_DOMAIN_BAKED_GUIDE);
2407
2408 /* Read only checks, avoids individually accessing flags above. */
2409 prop = RNA_def_property(srna, "is_cache_baking_any", PROP_BOOLEAN, PROP_NONE);
2410 RNA_def_property_boolean_sdna(prop, nullptr, "cache_flag", FLUID_DOMAIN_BAKING_ALL);
2412
2413 prop = RNA_def_property(srna, "has_cache_baked_any", PROP_BOOLEAN, PROP_NONE);
2414 RNA_def_property_boolean_sdna(prop, nullptr, "cache_flag", FLUID_DOMAIN_BAKED_ALL);
2416
2417 prop = RNA_def_property(srna, "export_manta_script", PROP_BOOLEAN, PROP_NONE);
2420 prop,
2421 "Export Mantaflow Script",
2422 "Generate and export Mantaflow script from current domain settings during bake. This is "
2423 "only needed if you plan to analyze the cache (e.g. view grids, velocity vectors, "
2424 "particles) in Mantaflow directly (outside of Blender) after baking the simulation.");
2426 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_domain_data_reset");
2427
2428 prop = RNA_def_property(srna, "openvdb_cache_compress_type", PROP_ENUM, PROP_NONE);
2429 RNA_def_property_enum_sdna(prop, nullptr, "openvdb_compression");
2430 RNA_def_property_enum_items(prop, prop_compression_items);
2431 RNA_def_property_ui_text(prop, "Compression", "Compression method to be used");
2432 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_domain_data_reset");
2433
2434 prop = RNA_def_property(srna, "openvdb_data_depth", PROP_ENUM, PROP_NONE);
2435 RNA_def_property_enum_sdna(prop, nullptr, "openvdb_data_depth");
2436 RNA_def_property_enum_items(prop, fluid_data_depth_items);
2437 RNA_def_property_enum_funcs(prop, nullptr, nullptr, "rna_Fluid_data_depth_itemf");
2439 prop,
2440 "Data Depth",
2441 "Bit depth for fluid particles and grids (lower bit values reduce file size)");
2442 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_domain_data_reset");
2443
2444 /* time options */
2445
2446 prop = RNA_def_property(srna, "time_scale", PROP_FLOAT, PROP_NONE);
2447 RNA_def_property_float_sdna(prop, nullptr, "time_scale");
2448 RNA_def_property_range(prop, 0.0001, 10.0);
2449 RNA_def_property_ui_text(prop, "Time Scale", "Adjust simulation speed");
2450 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
2451
2452 prop = RNA_def_property(srna, "use_adaptive_timesteps", PROP_BOOLEAN, PROP_NONE);
2455 prop,
2456 "Use Adaptive Time Steps",
2457 "Lets the solver automatically decide when to perform multiple simulation steps per frame");
2458 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
2459
2460 prop = RNA_def_property(srna, "cfl_condition", PROP_FLOAT, PROP_NONE);
2461 RNA_def_property_float_sdna(prop, nullptr, "cfl_condition");
2462 RNA_def_property_range(prop, 0.0, 10.0);
2464 "CFL",
2465 "Maximal velocity per cell (greater CFL numbers will minimize the "
2466 "number of simulation steps and the computation time.)");
2467 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
2468
2469 prop = RNA_def_property(srna, "timesteps_min", PROP_INT, PROP_NONE);
2470 RNA_def_property_int_sdna(prop, nullptr, "timesteps_minimum");
2471 RNA_def_property_range(prop, 1, 100);
2472 RNA_def_property_ui_range(prop, 0, 100, 1, -1);
2474 prop, "Minimum", "Minimum number of simulation steps to perform for one frame");
2475 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
2476
2477 prop = RNA_def_property(srna, "timesteps_max", PROP_INT, PROP_NONE);
2478 RNA_def_property_int_sdna(prop, nullptr, "timesteps_maximum");
2479 RNA_def_property_range(prop, 1, 100);
2480 RNA_def_property_ui_range(prop, 0, 100, 1, -1);
2482 prop, "Maximum", "Maximum number of simulation steps to perform for one frame");
2483 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
2484
2485 /* display settings */
2486
2487 prop = RNA_def_property(srna, "use_slice", PROP_BOOLEAN, PROP_NONE);
2488 RNA_def_property_boolean_sdna(prop, nullptr, "axis_slice_method", AXIS_SLICE_SINGLE);
2489 RNA_def_property_ui_text(prop, "Slice", "Perform a single slice of the domain object");
2490 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, nullptr);
2491
2492 prop = RNA_def_property(srna, "slice_axis", PROP_ENUM, PROP_NONE);
2493 RNA_def_property_enum_sdna(prop, nullptr, "slice_axis");
2494 RNA_def_property_enum_items(prop, axis_slice_position_items);
2495 RNA_def_property_ui_text(prop, "Axis", "");
2496 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, nullptr);
2497
2498 prop = RNA_def_property(srna, "slice_per_voxel", PROP_FLOAT, PROP_NONE);
2499 RNA_def_property_float_sdna(prop, nullptr, "slice_per_voxel");
2500 RNA_def_property_range(prop, 0.0, 100.0);
2501 RNA_def_property_ui_range(prop, 0.0, 5.0, 0.1, 1);
2503 prop, "Slice Per Voxel", "How many slices per voxel should be generated");
2504 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, nullptr);
2505
2506 prop = RNA_def_property(srna, "slice_depth", PROP_FLOAT, PROP_FACTOR);
2507 RNA_def_property_float_sdna(prop, nullptr, "slice_depth");
2508 RNA_def_property_range(prop, 0.0, 1.0);
2509 RNA_def_property_ui_range(prop, 0.0, 1.0, 0.1, 3);
2510 RNA_def_property_ui_text(prop, "Position", "Position of the slice");
2511 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, nullptr);
2512
2513 prop = RNA_def_property(srna, "display_thickness", PROP_FLOAT, PROP_NONE);
2514 RNA_def_property_float_sdna(prop, nullptr, "display_thickness");
2515 RNA_def_property_range(prop, 0.001, 1000.0);
2516 RNA_def_property_ui_range(prop, 0.1, 100.0, 0.1, 3);
2517 RNA_def_property_ui_text(prop, "Thickness", "Thickness of smoke display in the viewport");
2519
2520 prop = RNA_def_property(srna, "display_interpolation", PROP_ENUM, PROP_NONE);
2521 RNA_def_property_enum_sdna(prop, nullptr, "interp_method");
2522 RNA_def_property_enum_items(prop, interp_method_item);
2524 prop, "Interpolation", "Interpolation method to use for smoke/fire volumes in solid mode");
2525 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, nullptr);
2526
2527 prop = RNA_def_property(srna, "show_gridlines", PROP_BOOLEAN, PROP_NONE);
2528 RNA_def_property_boolean_sdna(prop, nullptr, "show_gridlines", 0);
2529 RNA_def_property_ui_text(prop, "Gridlines", "Show gridlines");
2530 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, nullptr);
2531
2532 prop = RNA_def_property(srna, "show_velocity", PROP_BOOLEAN, PROP_NONE);
2533 RNA_def_property_boolean_sdna(prop, nullptr, "draw_velocity", 0);
2534 RNA_def_property_ui_text(prop, "Vector Display", "Visualize vector fields");
2535 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, nullptr);
2536
2537 prop = RNA_def_property(srna, "vector_display_type", PROP_ENUM, PROP_NONE);
2538 RNA_def_property_enum_sdna(prop, nullptr, "vector_draw_type");
2539 RNA_def_property_enum_items(prop, vector_draw_items);
2540 RNA_def_property_ui_text(prop, "Display Type", "");
2541 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, nullptr);
2542
2543 prop = RNA_def_property(srna, "vector_field", PROP_ENUM, PROP_NONE);
2544 RNA_def_property_enum_sdna(prop, nullptr, "vector_field");
2545 RNA_def_property_enum_items(prop, vector_field_items);
2546 RNA_def_property_ui_text(prop, "Field", "Vector field to be represented by the display vectors");
2547 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, nullptr);
2548
2549 prop = RNA_def_property(srna, "vector_scale_with_magnitude", PROP_BOOLEAN, PROP_NONE);
2550 RNA_def_property_boolean_sdna(prop, nullptr, "vector_scale_with_magnitude", 0);
2551 RNA_def_property_ui_text(prop, "Magnitude", "Scale vectors with their magnitudes");
2552 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, nullptr);
2553
2554 prop = RNA_def_property(srna, "vector_show_mac_x", PROP_BOOLEAN, PROP_NONE);
2555 RNA_def_property_boolean_sdna(prop, nullptr, "vector_draw_mac_components", VECTOR_DRAW_MAC_X);
2556 RNA_def_property_ui_text(prop, "X", "Show X-component of MAC Grid");
2557 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, nullptr);
2558
2559 prop = RNA_def_property(srna, "vector_show_mac_y", PROP_BOOLEAN, PROP_NONE);
2560 RNA_def_property_boolean_sdna(prop, nullptr, "vector_draw_mac_components", VECTOR_DRAW_MAC_Y);
2561 RNA_def_property_ui_text(prop, "Y", "Show Y-component of MAC Grid");
2562 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, nullptr);
2563
2564 prop = RNA_def_property(srna, "vector_show_mac_z", PROP_BOOLEAN, PROP_NONE);
2565 RNA_def_property_boolean_sdna(prop, nullptr, "vector_draw_mac_components", VECTOR_DRAW_MAC_Z);
2566 RNA_def_property_ui_text(prop, "Z", "Show Z-component of MAC Grid");
2567 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, nullptr);
2568
2569 prop = RNA_def_property(srna, "vector_scale", PROP_FLOAT, PROP_NONE);
2570 RNA_def_property_float_sdna(prop, nullptr, "vector_scale");
2571 RNA_def_property_range(prop, 0.0, 1000.0);
2572 RNA_def_property_ui_range(prop, 0.0, 100.0, 0.1, 3);
2573 RNA_def_property_ui_text(prop, "Scale", "Multiplier for scaling the vectors");
2574 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, nullptr);
2575
2576 /* --------- Color mapping. --------- */
2577
2578 prop = RNA_def_property(srna, "use_color_ramp", PROP_BOOLEAN, PROP_NONE);
2579 RNA_def_property_boolean_sdna(prop, nullptr, "use_coba", 0);
2580 RNA_def_property_boolean_funcs(prop, nullptr, "rna_Fluid_use_color_ramp_set");
2582 "Grid Display",
2583 "Render a simulation field while mapping its voxels values to the "
2584 "colors of a ramp or using a predefined color code");
2585 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, nullptr);
2586
2587 /* Color ramp field items are generated dynamically based on domain type. */
2588 static const EnumPropertyItem coba_field_items[] = {
2589 {0, "NONE", 0, "", ""},
2590 {0, nullptr, 0, nullptr, nullptr},
2591 };
2592
2593 prop = RNA_def_property(srna, "color_ramp_field", PROP_ENUM, PROP_NONE);
2594 RNA_def_property_enum_sdna(prop, nullptr, "coba_field");
2595 RNA_def_property_enum_items(prop, coba_field_items);
2596 RNA_def_property_enum_funcs(prop, nullptr, nullptr, "rna_Fluid_cobafield_itemf");
2597 RNA_def_property_ui_text(prop, "Field", "Simulation field to color map");
2598 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, nullptr);
2599
2600 prop = RNA_def_property(srna, "color_ramp_field_scale", PROP_FLOAT, PROP_NONE);
2601 RNA_def_property_float_sdna(prop, nullptr, "grid_scale");
2602 RNA_def_property_range(prop, 0.001, 100000.0);
2603 RNA_def_property_ui_range(prop, 0.001, 1000.0, 0.1, 3);
2605 prop, "Scale", "Multiplier for scaling the selected field to color map");
2607
2608 prop = RNA_def_property(srna, "color_ramp", PROP_POINTER, PROP_NEVER_NULL);
2609 RNA_def_property_pointer_sdna(prop, nullptr, "coba");
2610 RNA_def_property_struct_type(prop, "ColorRamp");
2611 RNA_def_property_ui_text(prop, "Color Ramp", "");
2612 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, nullptr);
2613
2614 prop = RNA_def_property(srna, "clipping", PROP_FLOAT, PROP_NONE);
2615 RNA_def_property_float_sdna(prop, nullptr, "clipping");
2616 RNA_def_property_range(prop, 0.0, 1.0);
2617 RNA_def_property_ui_range(prop, 0.0, 1.0, 0.1, 6);
2619 prop,
2620 "Clipping",
2621 "Value under which voxels are considered empty space to optimize rendering");
2623
2624 prop = RNA_def_property(srna, "gridlines_color_field", PROP_ENUM, PROP_NONE);
2625 RNA_def_property_enum_sdna(prop, nullptr, "gridlines_color_field");
2626 RNA_def_property_enum_items(prop, gridlines_color_field_items);
2628 prop, "Color Gridlines", "Simulation field to color map onto gridlines");
2629 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, nullptr);
2630
2631 prop = RNA_def_property(srna, "gridlines_lower_bound", PROP_FLOAT, PROP_NONE);
2632 RNA_def_property_float_sdna(prop, nullptr, "gridlines_lower_bound");
2634 RNA_def_property_ui_range(prop, -FLT_MAX, FLT_MAX, 0.1, 6);
2635 RNA_def_property_ui_text(prop, "Lower Bound", "Lower bound of the highlighting range");
2637
2638 prop = RNA_def_property(srna, "gridlines_upper_bound", PROP_FLOAT, PROP_NONE);
2639 RNA_def_property_float_sdna(prop, nullptr, "gridlines_upper_bound");
2641 RNA_def_property_ui_range(prop, -FLT_MAX, FLT_MAX, 0.1, 6);
2642 RNA_def_property_ui_text(prop, "Upper Bound", "Upper bound of the highlighting range");
2644
2645 prop = RNA_def_property(srna, "gridlines_range_color", PROP_FLOAT, PROP_COLOR);
2646 RNA_def_property_float_sdna(prop, nullptr, "gridlines_range_color");
2647 RNA_def_property_array(prop, 4);
2648 RNA_def_property_ui_text(prop, "Color", "Color used to highlight the range");
2650
2651 prop = RNA_def_property(srna, "gridlines_cell_filter", PROP_ENUM, PROP_NONE);
2652 RNA_def_property_enum_sdna(prop, nullptr, "gridlines_cell_filter");
2653 RNA_def_property_enum_items(prop, gridlines_cell_filter_items);
2654 RNA_def_property_ui_text(prop, "Cell Type", "Cell type to be highlighted");
2655 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, nullptr);
2656
2657 prop = RNA_def_property(srna, "velocity_scale", PROP_FLOAT, PROP_NONE);
2658 RNA_def_property_float_sdna(prop, nullptr, "velocity_scale");
2659 RNA_def_property_range(prop, 0.0f, FLT_MAX);
2660 RNA_def_property_ui_text(prop, "Velocity Scale", "Factor to control the amount of motion blur");
2661 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_update");
2662}
2663
2665{
2666 StructRNA *srna;
2667 PropertyRNA *prop;
2668
2669 static const EnumPropertyItem flow_type_items[] = {
2670 {FLUID_FLOW_TYPE_SMOKE, "SMOKE", 0, "Smoke", "Add smoke"},
2671 {FLUID_FLOW_TYPE_SMOKEFIRE, "BOTH", 0, "Fire + Smoke", "Add fire and smoke"},
2672 {FLUID_FLOW_TYPE_FIRE, "FIRE", 0, "Fire", "Add fire"},
2673 {FLUID_FLOW_TYPE_LIQUID, "LIQUID", 0, "Liquid", "Add liquid"},
2674 {0, nullptr, 0, nullptr, nullptr},
2675 };
2676
2677 static const EnumPropertyItem flow_behavior_items[] = {
2678 {FLUID_FLOW_BEHAVIOR_INFLOW, "INFLOW", 0, "Inflow", "Add fluid to simulation"},
2679 {FLUID_FLOW_BEHAVIOR_OUTFLOW, "OUTFLOW", 0, "Outflow", "Delete fluid from simulation"},
2681 "GEOMETRY",
2682 0,
2683 "Geometry",
2684 "Only use given geometry for fluid"},
2685 {0, nullptr, 0, nullptr, nullptr},
2686 };
2687
2688 /* Flow source - generated dynamically based on flow type */
2689 static const EnumPropertyItem flow_sources[] = {
2690 {0, "NONE", 0, "", ""},
2691 {0, nullptr, 0, nullptr, nullptr},
2692 };
2693
2694 static const EnumPropertyItem flow_texture_types[] = {
2696 "AUTO",
2697 0,
2698 "Generated",
2699 "Generated coordinates centered to flow object"},
2700 {FLUID_FLOW_TEXTURE_MAP_UV, "UV", 0, "UV", "Use UV layer for texture coordinates"},
2701 {0, nullptr, 0, nullptr, nullptr},
2702 };
2703
2704 srna = RNA_def_struct(brna, "FluidFlowSettings", nullptr);
2705 RNA_def_struct_ui_text(srna, "Flow Settings", "Fluid flow settings");
2706 RNA_def_struct_sdna(srna, "FluidFlowSettings");
2707 RNA_def_struct_path_func(srna, "rna_FluidFlowSettings_path");
2708
2709 prop = RNA_def_property(srna, "density", PROP_FLOAT, PROP_FACTOR);
2710 RNA_def_property_float_sdna(prop, nullptr, "density");
2711 RNA_def_property_range(prop, 0.0, 10);
2712 RNA_def_property_ui_range(prop, 0.0, 1.0, 1.0, 4);
2713 RNA_def_property_ui_text(prop, "Density", "");
2714 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_flow_reset");
2715
2716 prop = RNA_def_property(srna, "smoke_color", PROP_FLOAT, PROP_COLOR_GAMMA);
2717 RNA_def_property_float_sdna(prop, nullptr, "color");
2718 RNA_def_property_array(prop, 3);
2719 RNA_def_property_ui_text(prop, "Smoke Color", "Color of smoke");
2720 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_flow_reset");
2721
2722 prop = RNA_def_property(srna, "fuel_amount", PROP_FLOAT, PROP_NONE);
2723 RNA_def_property_range(prop, 0.0, 10);
2724 RNA_def_property_ui_range(prop, 0.0, 5.0, 1.0, 4);
2725 RNA_def_property_ui_text(prop, "Flame Rate", "");
2726 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_flow_reset");
2727
2728 prop = RNA_def_property(srna, "temperature", PROP_FLOAT, PROP_NONE);
2729 RNA_def_property_float_sdna(prop, nullptr, "temperature");
2730 RNA_def_property_range(prop, -10, 10);
2731 RNA_def_property_ui_range(prop, -10, 10, 1, 1);
2733 prop, "Temperature Difference", "Temperature difference to ambient temperature");
2734 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_flow_reset");
2735
2736 prop = RNA_def_property(srna, "particle_system", PROP_POINTER, PROP_NONE);
2737 RNA_def_property_pointer_sdna(prop, nullptr, "psys");
2738 RNA_def_property_struct_type(prop, "ParticleSystem");
2740 RNA_def_property_ui_text(prop, "Particle Systems", "Particle systems emitted from the object");
2741 RNA_def_property_update(prop, 0, "rna_Fluid_reset_dependency");
2742
2743 prop = RNA_def_property(srna, "flow_type", PROP_ENUM, PROP_NONE);
2744 RNA_def_property_enum_sdna(prop, nullptr, "type");
2745 RNA_def_property_enum_items(prop, flow_type_items);
2746 RNA_def_property_enum_funcs(prop, nullptr, "rna_Fluid_flowtype_set", nullptr);
2747 RNA_def_property_ui_text(prop, "Flow Type", "Change type of fluid in the simulation");
2748 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_flow_reset");
2749
2750 prop = RNA_def_property(srna, "flow_behavior", PROP_ENUM, PROP_NONE);
2751 RNA_def_property_enum_sdna(prop, nullptr, "behavior");
2752 RNA_def_property_enum_items(prop, flow_behavior_items);
2753 RNA_def_property_ui_text(prop, "Flow Behavior", "Change flow behavior in the simulation");
2754 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_flow_reset");
2755
2756 prop = RNA_def_property(srna, "flow_source", PROP_ENUM, PROP_NONE);
2757 RNA_def_property_enum_sdna(prop, nullptr, "source");
2758 RNA_def_property_enum_items(prop, flow_sources);
2760 prop, nullptr, "rna_Fluid_flowsource_set", "rna_Fluid_flowsource_itemf");
2761 RNA_def_property_ui_text(prop, "Source", "Change how fluid is emitted");
2762 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_flow_reset");
2763
2764 prop = RNA_def_property(srna, "use_absolute", PROP_BOOLEAN, PROP_NONE);
2765 RNA_def_property_boolean_sdna(prop, nullptr, "flags", FLUID_FLOW_ABSOLUTE);
2767 "Absolute Density",
2768 "Only allow given density value in emitter area and will not add up");
2769 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_flow_reset");
2770
2771 prop = RNA_def_property(srna, "use_initial_velocity", PROP_BOOLEAN, PROP_NONE);
2774 prop, "Initial Velocity", "Fluid has some initial velocity when it is emitted");
2775 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_flow_reset");
2776
2777 prop = RNA_def_property(srna, "velocity_factor", PROP_FLOAT, PROP_NONE);
2778 RNA_def_property_float_sdna(prop, nullptr, "vel_multi");
2779 RNA_def_property_range(prop, -100.0, 100.0);
2780 RNA_def_property_ui_range(prop, -2.0, 2.0, 0.05, 5);
2782 "Source",
2783 "Multiplier of source velocity passed to fluid (source velocity is "
2784 "non-zero only if object is moving)");
2785 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_flow_reset");
2786
2787 prop = RNA_def_property(srna, "velocity_normal", PROP_FLOAT, PROP_NONE);
2788 RNA_def_property_float_sdna(prop, nullptr, "vel_normal");
2789 RNA_def_property_range(prop, -100.0, 100.0);
2790 RNA_def_property_ui_range(prop, -2.0, 2.0, 0.05, 5);
2791 RNA_def_property_ui_text(prop, "Normal", "Amount of normal directional velocity");
2792 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_flow_reset");
2793
2794 prop = RNA_def_property(srna, "velocity_random", PROP_FLOAT, PROP_NONE);
2795 RNA_def_property_float_sdna(prop, nullptr, "vel_random");
2796 RNA_def_property_range(prop, 0.0, 10.0);
2797 RNA_def_property_ui_range(prop, 0.0, 2.0, 0.05, 5);
2798 RNA_def_property_ui_text(prop, "Random", "Amount of random velocity");
2799 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_flow_reset");
2800
2801 prop = RNA_def_property(srna, "velocity_coord", PROP_FLOAT, PROP_VELOCITY);
2802 RNA_def_property_float_sdna(prop, nullptr, "vel_coord");
2803 RNA_def_property_array(prop, 3);
2804 RNA_def_property_range(prop, -1000.1, 1000.1);
2806 prop,
2807 "Initial",
2808 "Additional initial velocity in X, Y and Z direction (added to source velocity)");
2809 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_flow_reset");
2810
2811 prop = RNA_def_property(srna, "volume_density", PROP_FLOAT, PROP_NONE);
2812 RNA_def_property_range(prop, 0.0, 1.0);
2813 RNA_def_property_ui_range(prop, 0.0, 1.0, 0.05, 5);
2815 "Volume Emission",
2816 "Controls fluid emission from within the mesh (higher value results in "
2817 "greater emissions from inside the mesh)");
2818 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_flow_reset");
2819
2820 prop = RNA_def_property(srna, "surface_distance", PROP_FLOAT, PROP_NONE);
2821 RNA_def_property_range(prop, 0.0, 10.0);
2822 RNA_def_property_ui_range(prop, 0.0, 10.0, 0.05, 5);
2824 "Surface Emission",
2825 "Controls fluid emission from the mesh surface (higher value results "
2826 "in emission further away from the mesh surface");
2827 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_flow_reset");
2828
2829 prop = RNA_def_property(srna, "use_plane_init", PROP_BOOLEAN, PROP_NONE);
2832 prop,
2833 "Is Planar",
2834 "Treat this object as a planar and unclosed mesh. Fluid will only be emitted from the mesh "
2835 "surface and based on the surface emission value.");
2836 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_flow_reset");
2837
2838 prop = RNA_def_property(srna, "particle_size", PROP_FLOAT, PROP_NONE);
2839 RNA_def_property_range(prop, 0.1, FLT_MAX);
2840 RNA_def_property_ui_range(prop, 0.5, 5.0, 0.05, 5);
2841 RNA_def_property_ui_text(prop, "Size", "Particle size in simulation cells");
2842 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_flow_reset");
2843
2844 prop = RNA_def_property(srna, "use_particle_size", PROP_BOOLEAN, PROP_NONE);
2847 prop, "Set Size", "Set particle size in simulation cells or use nearest cell");
2848 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_flow_reset");
2849
2850 prop = RNA_def_property(srna, "use_inflow", PROP_BOOLEAN, PROP_NONE);
2852 RNA_def_property_ui_text(prop, "Use Flow", "Control when to apply fluid flow");
2853 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_flow_reset");
2854
2855 prop = RNA_def_property(srna, "subframes", PROP_INT, PROP_NONE);
2856 RNA_def_property_range(prop, 0, 200);
2857 RNA_def_property_ui_range(prop, 0, 10, 1, -1);
2859 "Subframes",
2860 "Number of additional samples to take between frames to improve "
2861 "quality of fast moving flows");
2862 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_flow_reset");
2863
2864 prop = RNA_def_property(srna, "density_vertex_group", PROP_STRING, PROP_NONE);
2866 "rna_FluidFlow_density_vgroup_get",
2867 "rna_FluidFlow_density_vgroup_length",
2868 "rna_FluidFlow_density_vgroup_set");
2870 prop, "Vertex Group", "Name of vertex group which determines surface emission rate");
2871 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_flow_reset");
2872
2873 prop = RNA_def_property(srna, "use_texture", PROP_BOOLEAN, PROP_NONE);
2875 RNA_def_property_ui_text(prop, "Use Texture", "Use a texture to control emission strength");
2876 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_flow_reset");
2877
2878 prop = RNA_def_property(srna, "texture_map_type", PROP_ENUM, PROP_NONE);
2879 RNA_def_property_enum_sdna(prop, nullptr, "texture_type");
2880 RNA_def_property_enum_items(prop, flow_texture_types);
2882 RNA_def_property_ui_text(prop, "Mapping", "Texture mapping type");
2883 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_flow_reset");
2884
2885 prop = RNA_def_property(srna, "uv_layer", PROP_STRING, PROP_NONE);
2886 RNA_def_property_string_sdna(prop, nullptr, "uvlayer_name");
2887 RNA_def_property_ui_text(prop, "UV Map", "UV map name");
2888 RNA_def_property_string_funcs(prop, nullptr, nullptr, "rna_FluidFlow_uvlayer_set");
2889 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_flow_reset");
2890
2891 prop = RNA_def_property(srna, "noise_texture", PROP_POINTER, PROP_NONE);
2893 RNA_def_property_ui_text(prop, "Texture", "Texture that controls emission strength");
2894 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_flow_reset");
2895
2896 prop = RNA_def_property(srna, "texture_size", PROP_FLOAT, PROP_NONE);
2897 RNA_def_property_range(prop, 0.01, 10.0);
2898 RNA_def_property_ui_range(prop, 0.1, 5.0, 0.05, 5);
2899 RNA_def_property_ui_text(prop, "Size", "Size of texture mapping");
2900 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_flow_reset");
2901
2902 prop = RNA_def_property(srna, "texture_offset", PROP_FLOAT, PROP_NONE);
2903 RNA_def_property_range(prop, 0.0, 200.0);
2904 RNA_def_property_ui_range(prop, 0.0, 100.0, 0.05, 5);
2905 RNA_def_property_ui_text(prop, "Offset", "Z-offset of texture mapping");
2906 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_flow_reset");
2907}
2908
2910{
2911 static const EnumPropertyItem effector_type_items[] = {
2912 {FLUID_EFFECTOR_TYPE_COLLISION, "COLLISION", 0, "Collision", "Create collision object"},
2913 {FLUID_EFFECTOR_TYPE_GUIDE, "GUIDE", 0, "Guide", "Create guide object"},
2914 {0, nullptr, 0, nullptr, nullptr},
2915 };
2916
2917 static const EnumPropertyItem fluid_guide_mode_items[] = {
2919 "MAXIMUM",
2920 0,
2921 "Maximize",
2922 "Compare velocities from previous frame with new velocities from current frame and keep "
2923 "the maximum"},
2925 "MINIMUM",
2926 0,
2927 "Minimize",
2928 "Compare velocities from previous frame with new velocities from current frame and keep "
2929 "the minimum"},
2931 "OVERRIDE",
2932 0,
2933 "Override",
2934 "Always write new guide velocities for every frame (each frame only contains current "
2935 "velocities from guiding objects)"},
2937 "AVERAGED",
2938 0,
2939 "Averaged",
2940 "Take average of velocities from previous frame and new velocities from current frame"},
2941 {0, nullptr, 0, nullptr, nullptr},
2942 };
2943
2944 StructRNA *srna;
2945 PropertyRNA *prop;
2946
2947 srna = RNA_def_struct(brna, "FluidEffectorSettings", nullptr);
2948 RNA_def_struct_ui_text(srna, "Effector Settings", "Smoke collision settings");
2949 RNA_def_struct_sdna(srna, "FluidEffectorSettings");
2950 RNA_def_struct_path_func(srna, "rna_FluidEffectorSettings_path");
2951
2952 prop = RNA_def_property(srna, "effector_type", PROP_ENUM, PROP_NONE);
2953 RNA_def_property_enum_sdna(prop, nullptr, "type");
2954 RNA_def_property_enum_items(prop, effector_type_items);
2955 RNA_def_property_ui_text(prop, "Effector Type", "Change type of effector in the simulation");
2956 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_effector_reset");
2957
2958 prop = RNA_def_property(srna, "surface_distance", PROP_FLOAT, PROP_NONE);
2959 RNA_def_property_range(prop, 0.0, 10.0);
2960 RNA_def_property_ui_range(prop, 0.0, 10.0, 0.05, 5);
2962 prop, "Surface", "Additional distance around mesh surface to consider as effector");
2963 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_effector_reset");
2964
2965 prop = RNA_def_property(srna, "use_plane_init", PROP_BOOLEAN, PROP_NONE);
2967 RNA_def_property_ui_text(prop, "Is Planar", "Treat this object as a planar, unclosed mesh");
2968 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_domain_data_reset");
2969
2970 prop = RNA_def_property(srna, "velocity_factor", PROP_FLOAT, PROP_NONE);
2971 RNA_def_property_float_sdna(prop, nullptr, "vel_multi");
2972 RNA_def_property_range(prop, -100.0, 100.0);
2973 RNA_def_property_ui_text(prop, "Source", "Multiplier of obstacle velocity");
2974 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_effector_reset");
2975
2976 prop = RNA_def_property(srna, "guide_mode", PROP_ENUM, PROP_NONE);
2977 RNA_def_property_enum_sdna(prop, nullptr, "guide_mode");
2978 RNA_def_property_enum_items(prop, fluid_guide_mode_items);
2979 RNA_def_property_ui_text(prop, "Guiding mode", "How to create guiding velocities");
2980 RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Fluid_effector_reset");
2981
2982 prop = RNA_def_property(srna, "use_effector", PROP_BOOLEAN, PROP_NONE);
2984 RNA_def_property_ui_text(prop, "Enabled", "Control when to apply the effector");
2985 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_effector_reset");
2986
2987 prop = RNA_def_property(srna, "subframes", PROP_INT, PROP_NONE);
2988 RNA_def_property_range(prop, 0, 200);
2989 RNA_def_property_ui_range(prop, 0, 10, 1, -1);
2991 "Subframes",
2992 "Number of additional samples to take between frames to improve "
2993 "quality of fast moving effector objects");
2994 RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_effector_reset");
2995}
2996
3003
3004#endif
ColorBand * BKE_colorband_add(bool rangetype)
Definition colorband.cc:298
void BKE_fluid_modifier_reset(struct FluidModifierData *fmd)
Definition fluid.cc:4790
void BKE_fluid_particle_system_destroy(struct Object *ob, int particle_type)
void BKE_fluid_cache_endframe_set(struct FluidDomainSettings *settings, int value)
Definition fluid.cc:4527
void BKE_fluid_domain_type_set(struct Object *object, struct FluidDomainSettings *settings, int type)
Definition fluid.cc:4589
void BKE_fluid_cache_startframe_set(struct FluidDomainSettings *settings, int value)
Definition fluid.cc:4521
void BKE_fluid_cachetype_noise_set(struct FluidDomainSettings *settings, int cache_noise_format)
Definition fluid.cc:4560
void BKE_fluid_particle_system_create(struct Main *bmain, struct Object *ob, const char *pset_name, const char *parts_name, const char *psys_name, int psys_type)
void BKE_fluid_cachetype_particle_set(struct FluidDomainSettings *settings, int cache_particle_format)
Definition fluid.cc:4551
void BKE_fluid_fields_sanitize(struct FluidDomainSettings *settings)
Definition fluid.cc:4641
void BKE_fluid_cachetype_mesh_set(struct FluidDomainSettings *settings, int cache_mesh_format)
Definition fluid.cc:4533
void BKE_fluid_cachetype_data_set(struct FluidDomainSettings *settings, int cache_data_format)
Definition fluid.cc:4542
void BKE_fluid_cache_free(struct FluidDomainSettings *fds, struct Object *ob, int cache_map)
ModifierData * BKE_modifiers_findby_type(const Object *ob, ModifierType type)
MINLINE void copy_v3_v3_int(int r[3], const int a[3])
#define FILE_MAX
#define STRNCPY(dst, src)
Definition BLI_string.h:593
size_t BLI_str_escape(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_NONNULL(1
pthread_rwlock_t ThreadRWMutex
#define THREAD_LOCK_READ
void BLI_rw_mutex_lock(ThreadRWMutex *mutex, int mode)
Definition threads.cc:467
void BLI_rw_mutex_unlock(ThreadRWMutex *mutex)
Definition threads.cc:477
#define UNUSED_VARS(...)
#define STREQ(a, b)
#define BLT_I18NCONTEXT_AMOUNT
#define BLT_I18NCONTEXT_ID_TEXTURE
void DEG_id_tag_update(ID *id, unsigned int flags)
void DEG_relations_tag_update(Main *bmain)
@ ID_RECALC_GEOMETRY
Definition DNA_ID.h:1041
@ FLUID_DOMAIN_PARTICLE_SPRAY
@ FLUID_DOMAIN_PARTICLE_FOAM
@ FLUID_DOMAIN_PARTICLE_TRACER
@ FLUID_DOMAIN_PARTICLE_FLIP
@ FLUID_DOMAIN_PARTICLE_BUBBLE
@ FLUID_CELL_TYPE_OUTFLOW
@ FLUID_CELL_TYPE_FLUID
@ FLUID_CELL_TYPE_EMPTY
@ FLUID_CELL_TYPE_NONE
@ FLUID_CELL_TYPE_OBSTACLE
@ FLUID_CELL_TYPE_INFLOW
@ AXIS_SLICE_SINGLE
@ VDB_COMPRESSION_NONE
@ VDB_COMPRESSION_ZIP
@ VDB_COMPRESSION_BLOSC
@ FLUID_DOMAIN_FIELD_COLOR_B
@ FLUID_DOMAIN_FIELD_FLAME
@ FLUID_DOMAIN_FIELD_PHI_OUT
@ FLUID_DOMAIN_FIELD_FORCE_Z
@ FLUID_DOMAIN_FIELD_PHI_OBSTACLE
@ FLUID_DOMAIN_FIELD_FLAGS
@ FLUID_DOMAIN_FIELD_VELOCITY_Z
@ FLUID_DOMAIN_FIELD_FORCE_Y
@ FLUID_DOMAIN_FIELD_PHI
@ FLUID_DOMAIN_FIELD_PRESSURE
@ FLUID_DOMAIN_FIELD_VELOCITY_X
@ FLUID_DOMAIN_FIELD_DENSITY
@ FLUID_DOMAIN_FIELD_VELOCITY_Y
@ FLUID_DOMAIN_FIELD_PHI_IN
@ FLUID_DOMAIN_FIELD_HEAT
@ FLUID_DOMAIN_FIELD_COLOR_G
@ FLUID_DOMAIN_FIELD_FORCE_X
@ FLUID_DOMAIN_FIELD_FUEL
@ FLUID_DOMAIN_FIELD_COLOR_R
@ FLUID_DOMAIN_TYPE_GAS
@ FLUID_DOMAIN_TYPE_LIQUID
@ FLUID_DOMAIN_METHOD_FLIP
@ FLUID_DOMAIN_METHOD_APIC
@ VECTOR_DRAW_MAC_X
@ VECTOR_DRAW_MAC_Y
@ VECTOR_DRAW_MAC_Z
@ FLUID_EFFECTOR_NEEDS_UPDATE
@ FLUID_EFFECTOR_USE_EFFEC
@ FLUID_EFFECTOR_USE_PLANE_INIT
@ FLUID_DOMAIN_GUIDE_SRC_EFFECTOR
@ FLUID_DOMAIN_GUIDE_SRC_DOMAIN
@ SNDPARTICLE_COMBINED_EXPORT_OFF
@ SNDPARTICLE_COMBINED_EXPORT_SPRAY_FOAM
@ SNDPARTICLE_COMBINED_EXPORT_SPRAY_BUBBLE
@ SNDPARTICLE_COMBINED_EXPORT_SPRAY_FOAM_BUBBLE
@ SNDPARTICLE_COMBINED_EXPORT_FOAM_BUBBLE
@ FLUID_DOMAIN_BAKED_DATA
@ FLUID_DOMAIN_OUTDATED_GUIDE
@ FLUID_DOMAIN_OUTDATED_PARTICLES
@ FLUID_DOMAIN_BAKING_MESH
@ FLUID_DOMAIN_BAKING_NOISE
@ FLUID_DOMAIN_BAKING_GUIDE
@ FLUID_DOMAIN_OUTDATED_NOISE
@ FLUID_DOMAIN_BAKED_NOISE
@ FLUID_DOMAIN_BAKED_MESH
@ FLUID_DOMAIN_OUTDATED_MESH
@ FLUID_DOMAIN_BAKING_DATA
@ FLUID_DOMAIN_BAKED_GUIDE
@ FLUID_DOMAIN_BAKED_PARTICLES
@ FLUID_DOMAIN_OUTDATED_DATA
@ FLUID_DOMAIN_BAKING_PARTICLES
@ FLUID_DISPLAY_INTERP_CLOSEST
@ FLUID_DISPLAY_INTERP_CUBIC
@ FLUID_DISPLAY_INTERP_LINEAR
@ FLUID_DOMAIN_FILE_BIN_OBJECT
@ FLUID_DOMAIN_FILE_RAW
@ FLUID_DOMAIN_FILE_OBJECT
@ FLUID_DOMAIN_FILE_UNI
@ FLUID_DOMAIN_FILE_OPENVDB
@ VDB_PRECISION_MINI_FLOAT
@ VDB_PRECISION_FULL_FLOAT
@ VDB_PRECISION_HALF_FLOAT
@ FLUID_EFFECTOR_GUIDE_MAX
@ FLUID_EFFECTOR_GUIDE_OVERRIDE
@ FLUID_EFFECTOR_GUIDE_AVERAGED
@ FLUID_EFFECTOR_GUIDE_MIN
@ FLUID_DOMAIN_CACHE_ALL
@ FLUID_DOMAIN_CACHE_REPLAY
@ FLUID_DOMAIN_CACHE_MODULAR
@ FLUID_FLOW_ABSOLUTE
@ FLUID_FLOW_TEXTUREEMIT
@ FLUID_FLOW_USE_PART_SIZE
@ FLUID_FLOW_NEEDS_UPDATE
@ FLUID_FLOW_USE_PLANE_INIT
@ FLUID_FLOW_INITVELOCITY
@ FLUID_FLOW_USE_INFLOW
@ FLUID_FLOW_SOURCE_PARTICLES
@ FLUID_FLOW_SOURCE_MESH
@ SLICE_AXIS_X
@ SLICE_AXIS_AUTO
@ SLICE_AXIS_Z
@ SLICE_AXIS_Y
@ FLUID_DOMAIN_USE_ADAPTIVE_DOMAIN
@ FLUID_DOMAIN_USE_MESH
@ FLUID_DOMAIN_DELETE_IN_OBSTACLE
@ FLUID_DOMAIN_USE_RESUMABLE_CACHE
@ FLUID_DOMAIN_USE_DISSOLVE_LOG
@ FLUID_DOMAIN_USE_DIFFUSION
@ FLUID_DOMAIN_USE_ADAPTIVE_TIME
@ FLUID_DOMAIN_USE_GUIDE
@ FLUID_DOMAIN_EXPORT_MANTA_SCRIPT
@ FLUID_DOMAIN_USE_VISCOSITY
@ FLUID_DOMAIN_USE_SPEED_VECTORS
@ FLUID_DOMAIN_USE_NOISE
@ FLUID_DOMAIN_USE_FRACTIONS
@ FLUID_DOMAIN_USE_DISSOLVE
@ FLUID_FLOW_TEXTURE_MAP_UV
@ FLUID_FLOW_TEXTURE_MAP_AUTO
@ SNDPARTICLE_BOUNDARY_DELETE
@ SNDPARTICLE_BOUNDARY_PUSHOUT
@ SM_HRES_NEAREST
@ SM_HRES_LINEAR
@ SM_HRES_FULLSAMPLE
@ VECTOR_DRAW_NEEDLE
@ VECTOR_DRAW_STREAMLINE
@ VECTOR_DRAW_MAC
@ FLUID_FLOW_TYPE_FIRE
@ FLUID_FLOW_TYPE_SMOKEFIRE
@ FLUID_FLOW_TYPE_LIQUID
@ FLUID_FLOW_TYPE_SMOKE
@ FLUID_GRIDLINE_COLOR_TYPE_FLAGS
@ FLUID_GRIDLINE_COLOR_TYPE_RANGE
@ FLUID_GRIDLINE_COLOR_TYPE_NONE
@ FLUID_EFFECTOR_TYPE_GUIDE
@ FLUID_EFFECTOR_TYPE_COLLISION
@ FLUID_DOMAIN_MESH_UNION
@ FLUID_DOMAIN_MESH_IMPROVED
@ FLUID_DOMAIN_BORDER_BOTTOM
@ FLUID_DOMAIN_BORDER_LEFT
@ FLUID_DOMAIN_BORDER_RIGHT
@ FLUID_DOMAIN_BORDER_FRONT
@ FLUID_DOMAIN_BORDER_TOP
@ FLUID_DOMAIN_BORDER_BACK
@ FLUID_DOMAIN_VECTOR_FIELD_FORCE
@ FLUID_DOMAIN_VECTOR_FIELD_VELOCITY
@ FLUID_DOMAIN_VECTOR_FIELD_GUIDE_VELOCITY
#define FLUID_DOMAIN_BAKED_ALL
@ FLUID_FLOW_BEHAVIOR_GEOMETRY
@ FLUID_FLOW_BEHAVIOR_OUTFLOW
@ FLUID_FLOW_BEHAVIOR_INFLOW
#define FLUID_DOMAIN_BAKING_ALL
@ eModifierType_Fluid
Object is a sort of wrapper for general info.
@ OB_MESH
@ PART_FLUID_FLIP
@ PART_FLUID_BUBBLE
@ PART_FLUID_SPRAYBUBBLE
@ PART_FLUID_TRACER
@ PART_FLUID_FOAM
@ PART_FLUID_SPRAYFOAMBUBBLE
@ PART_FLUID_SPRAYFOAM
@ PART_FLUID_SPRAY
@ PART_FLUID_FOAMBUBBLE
#define MAXFRAME
#define RNA_MAX_ARRAY_DIMENSION
Definition RNA_define.hh:26
@ PROP_FLOAT
Definition RNA_types.hh:67
@ PROP_BOOLEAN
Definition RNA_types.hh:65
@ PROP_ENUM
Definition RNA_types.hh:69
@ PROP_INT
Definition RNA_types.hh:66
@ PROP_STRING
Definition RNA_types.hh:68
@ PROP_POINTER
Definition RNA_types.hh:70
@ PROPOVERRIDE_OVERRIDABLE_LIBRARY
Definition RNA_types.hh:355
@ PROP_DYNAMIC
Definition RNA_types.hh:317
@ PROP_ANIMATABLE
Definition RNA_types.hh:220
@ PROP_EDITABLE
Definition RNA_types.hh:207
@ PROP_NEVER_NULL
Definition RNA_types.hh:266
@ PROP_TIME
Definition RNA_types.hh:156
@ PROP_XYZ
Definition RNA_types.hh:172
@ PROP_ACCELERATION
Definition RNA_types.hh:167
@ PROP_COLOR
Definition RNA_types.hh:163
@ PROP_NONE
Definition RNA_types.hh:136
@ PROP_DIRPATH
Definition RNA_types.hh:140
@ PROP_FACTOR
Definition RNA_types.hh:154
@ PROP_COLOR_GAMMA
Definition RNA_types.hh:175
@ PROP_VELOCITY
Definition RNA_types.hh:166
#define ND_DRAW
Definition WM_types.hh:428
#define ND_MODIFIER
Definition WM_types.hh:429
#define NC_OBJECT
Definition WM_types.hh:346
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Definition btDbvt.cpp:52
#define printf
float * manta_noise_get_density(struct MANTA *smoke)
bool manta_noise_has_colors(struct MANTA *smoke)
void manta_noise_get_rgba(struct MANTA *smoke, float *data, int sequential)
void manta_noise_get_res(struct MANTA *smoke, int *res)
float * manta_get_velocity_y(struct MANTA *fluid)
float * manta_smoke_get_density(struct MANTA *smoke)
float * manta_get_velocity_z(struct MANTA *fluid)
bool manta_smoke_has_colors(struct MANTA *smoke)
float * manta_get_velocity_x(struct MANTA *fluid)
void manta_noise_get_rgba_fixed_color(struct MANTA *smoke, float color[3], float *data, int sequential)
float * manta_smoke_get_heat(struct MANTA *smoke)
void manta_smoke_get_rgba(struct MANTA *smoke, float *data, int sequential)
float * manta_smoke_get_flame(struct MANTA *smoke)
float * manta_noise_get_flame(struct MANTA *smoke)
void manta_smoke_get_rgba_fixed_color(struct MANTA *smoke, float color[3], float *data, int sequential)
void RNA_def_property_pointer_sdna(PropertyRNA *prop, const char *structname, const char *propname)
void RNA_def_struct_path_func(StructRNA *srna, const char *path)
void RNA_def_property_boolean_sdna(PropertyRNA *prop, const char *structname, const char *propname, int64_t bit)
void RNA_def_property_string_funcs(PropertyRNA *prop, const char *get, const char *length, const char *set)
void RNA_def_property_float_funcs(PropertyRNA *prop, const char *get, const char *set, const char *range)
void RNA_def_property_ui_text(PropertyRNA *prop, const char *name, const char *description)
void RNA_def_property_string_sdna(PropertyRNA *prop, const char *structname, const char *propname)
void RNA_def_struct_ui_text(StructRNA *srna, const char *name, const char *description)
void RNA_def_property_boolean_funcs(PropertyRNA *prop, const char *get, const char *set)
void RNA_def_property_dynamic_array_funcs(PropertyRNA *prop, const char *getlength)
void RNA_def_property_enum_items(PropertyRNA *prop, const EnumPropertyItem *item)
void RNA_def_struct_sdna(StructRNA *srna, const char *structname)
void RNA_def_property_array(PropertyRNA *prop, int length)
void RNA_def_property_range(PropertyRNA *prop, double min, double max)
void RNA_def_property_string_maxlength(PropertyRNA *prop, int maxlength)
void RNA_def_property_struct_type(PropertyRNA *prop, const char *type)
void RNA_def_property_update(PropertyRNA *prop, int noteflag, const char *func)
PropertyRNA * RNA_def_property(StructOrFunctionRNA *cont_, const char *identifier, int type, int subtype)
void RNA_def_property_enum_funcs(PropertyRNA *prop, const char *get, const char *set, const char *item)
StructRNA * RNA_def_struct(BlenderRNA *brna, const char *identifier, const char *from)
void RNA_enum_item_end(EnumPropertyItem **items, int *totitem)
void RNA_def_property_clear_flag(PropertyRNA *prop, PropertyFlag flag)
void RNA_def_property_pointer_funcs(PropertyRNA *prop, const char *get, const char *set, const char *type_fn, const char *poll)
void RNA_def_property_enum_sdna(PropertyRNA *prop, const char *structname, const char *propname)
void RNA_enum_item_add(EnumPropertyItem **items, int *totitem, const EnumPropertyItem *item)
void RNA_def_property_int_funcs(PropertyRNA *prop, const char *get, const char *set, const char *range)
void RNA_def_property_translation_context(PropertyRNA *prop, const char *context)
void RNA_def_property_flag(PropertyRNA *prop, PropertyFlag flag)
void RNA_def_property_float_sdna(PropertyRNA *prop, const char *structname, const char *propname)
void RNA_def_property_ui_range(PropertyRNA *prop, double min, double max, double step, int precision)
void RNA_def_property_int_sdna(PropertyRNA *prop, const char *structname, const char *propname)
void RNA_def_property_override_flag(PropertyRNA *prop, PropertyOverrideFlag flag)
static void rna_def_fluid_domain_settings(BlenderRNA *brna)
void RNA_def_fluid(BlenderRNA *brna)
static void rna_def_fluid_flow_settings(BlenderRNA *brna)
static void rna_def_fluid_effector_settings(BlenderRNA *brna)
int rna_object_vgroup_name_index_length(PointerRNA *ptr, int index)
void rna_object_uvlayer_name_set(PointerRNA *ptr, const char *value, char *result, int result_maxncpy)
void rna_object_vgroup_name_index_set(PointerRNA *ptr, const char *value, short *index)
void rna_object_vgroup_name_index_get(PointerRNA *ptr, char *value, int index)
#define FLT_MAX
Definition stdcycles.h:14
const char * identifier
Definition RNA_types.hh:506
const char * name
Definition RNA_types.hh:510
const char * description
Definition RNA_types.hh:512
struct FluidDomainSettings * domain
ParticleSettings * part
struct ParticleSystem * next
ID * owner_id
Definition RNA_types.hh:40
void * data
Definition RNA_types.hh:42
#define N_(msgid)
void WM_main_add_notifier(uint type, void *reference)
PointerRNA * ptr
Definition wm_files.cc:4126