[Bf-blender-cvs] [1c6da92b1a5] fluid-mantaflow: Mantaflow: Updated rna smoke code
Sebastián Barschkis
noreply at git.blender.org
Sat Apr 6 22:13:08 CEST 2019
Commit: 1c6da92b1a5eb604df4da52651151ef988dbaa8b
Author: Sebastián Barschkis
Date: Sun Oct 28 16:32:19 2018 +0100
Branches: fluid-mantaflow
https://developer.blender.org/rB1c6da92b1a5eb604df4da52651151ef988dbaa8b
Mantaflow: Updated rna smoke code
Necessary updates for new fluid parameters
===================================================================
M source/blender/makesrna/intern/rna_smoke.c
===================================================================
diff --git a/source/blender/makesrna/intern/rna_smoke.c b/source/blender/makesrna/intern/rna_smoke.c
index 5eb25985fa4..5c7aabc6009 100644
--- a/source/blender/makesrna/intern/rna_smoke.c
+++ b/source/blender/makesrna/intern/rna_smoke.c
@@ -17,6 +17,7 @@
*
* Contributor(s): Daniel Genrich
* Blender Foundation
+ * Sebastian Barschkis (sebbas)
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -29,6 +30,8 @@
#include <stdlib.h>
#include <limits.h>
+#include "BLI_utildefines.h"
+#include "BLI_path_util.h"
#include "BLI_sys_types.h"
#include "BLI_threads.h"
@@ -46,9 +49,10 @@
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "DNA_smoke_types.h"
+#include "DNA_particle_types.h"
#include "WM_types.h"
-
+#include "WM_api.h"
#ifdef RNA_RUNTIME
@@ -59,12 +63,18 @@
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_build.h"
-#include "smoke_API.h"
-
+#ifdef WITH_MANTA
+# include "manta_fluid_API.h"
+#endif
static void rna_Smoke_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
{
DEG_id_tag_update(ptr->id.data, OB_RECALC_DATA);
+
+ // Needed for liquid domain objects
+ Object *ob = ptr->id.data;
+ DEG_id_tag_update(ptr->id.data, OB_RECALC_DATA);
+ WM_main_add_notifier(NC_OBJECT | ND_DRAW, ob);
}
static void rna_Smoke_dependency_update(Main *bmain, Scene *scene, PointerRNA *ptr)
@@ -80,22 +90,6 @@ static void rna_Smoke_resetCache(Main *UNUSED(bmain), Scene *UNUSED(scene), Poin
settings->point_cache[0]->flag |= PTCACHE_OUTDATED;
DEG_id_tag_update(ptr->id.data, OB_RECALC_DATA);
}
-
-static void rna_Smoke_cachetype_set(struct PointerRNA *ptr, int value)
-{
- SmokeDomainSettings *settings = (SmokeDomainSettings *)ptr->data;
- Object *ob = (Object *)ptr->id.data;
-
- if (value != settings->cache_file_format) {
- /* Clear old caches. */
- PTCacheID id;
- BKE_ptcache_id_from_smoke(&id, ob, settings->smd);
- BKE_ptcache_id_clear(&id, PTCACHE_CLEAR_ALL, 0);
-
- settings->cache_file_format = value;
- }
-}
-
static void rna_Smoke_reset(Main *bmain, Scene *scene, PointerRNA *ptr)
{
SmokeDomainSettings *settings = (SmokeDomainSettings *)ptr->data;
@@ -118,6 +112,485 @@ static void rna_Smoke_reset_dependency(Main *bmain, Scene *scene, PointerRNA *pt
rna_Smoke_dependency_update(bmain, scene, ptr);
}
+static void rna_Smoke_parts_create(Main *bmain, PointerRNA *ptr, char *pset_name, char* parts_name, char* psys_name, int psys_type)
+{
+ Object *ob = (Object *)ptr->id.data;
+ ParticleSystemModifierData *psmd;
+ ParticleSystem *psys;
+ ParticleSettings *part;
+
+ /* add particle system */
+ part = BKE_particlesettings_add(bmain, pset_name);
+ psys = MEM_callocN(sizeof(ParticleSystem), "particle_system");
+
+ part->type = psys_type;
+ part->totpart = 0;
+ part->draw_size = 0.05f; // make fluid particles more subtle in viewport
+ part->draw_col = PART_DRAW_COL_VEL;
+ psys->part = part;
+ psys->pointcache = BKE_ptcache_add(&psys->ptcaches);
+ BLI_strncpy(psys->name, parts_name, sizeof(psys->name));
+ BLI_addtail(&ob->particlesystem, psys);
+
+ /* add modifier */
+ psmd = (ParticleSystemModifierData *)modifier_new(eModifierType_ParticleSystem);
+ BLI_strncpy(psmd->modifier.name, psys_name, sizeof(psmd->modifier.name));
+ psmd->psys = psys;
+ BLI_addtail(&ob->modifiers, psmd);
+ modifier_unique_name(&ob->modifiers, (ModifierData *)psmd);
+}
+
+static void rna_Smoke_parts_delete(PointerRNA *ptr, int ptype)
+{
+ Object *ob = (Object *)ptr->id.data;
+ ParticleSystemModifierData *psmd;
+ ParticleSystem *psys, *next_psys;
+
+ for (psys = ob->particlesystem.first; psys; psys = next_psys) {
+ next_psys = psys->next;
+ if (psys->part->type == ptype) {
+ /* clear modifier */
+ psmd = psys_get_modifier(ob, psys);
+ BLI_remlink(&ob->modifiers, psmd);
+ modifier_free((ModifierData *)psmd);
+
+ /* clear particle system */
+ BLI_remlink(&ob->particlesystem, psys);
+ psys_free(ob, psys);
+ }
+ }
+}
+
+static bool rna_Smoke_parts_exists(PointerRNA *ptr, int ptype)
+{
+ Object *ob = (Object *)ptr->id.data;
+ ParticleSystem *psys;
+
+ for (psys = ob->particlesystem.first; psys; psys = psys->next) {
+ if (psys->part->type == ptype) return true;
+ }
+ return false;
+}
+
+static void rna_Smoke_draw_type_update(Main *UNUSED(bmain), Scene *UNUSED(scene), struct PointerRNA *ptr)
+{
+ Object *ob = (Object *)ptr->id.data;
+ SmokeDomainSettings *settings = (SmokeDomainSettings *)ptr->data;
+
+ /* Wireframe mode more convenient when particles present */
+ if (settings->particle_type == 0) {
+ ob->dt = OB_SOLID;
+ } else {
+ ob->dt = OB_WIRE;
+ }
+}
+
+static void rna_Smoke_flip_parts_update(Main *bmain, Scene *UNUSED(scene), PointerRNA *ptr)
+{
+ Object *ob = (Object *)ptr->id.data;
+ SmokeModifierData *smd;
+ smd = (SmokeModifierData *)modifiers_findByType(ob, eModifierType_Smoke);
+ bool exists = rna_Smoke_parts_exists(ptr, PART_MANTA_FLIP);
+
+ if (ob->type == OB_MESH && !exists) {
+ rna_Smoke_parts_create(bmain, ptr, "FlipParticleSettings", "FLIP Particles", "FLIP Particle System", PART_MANTA_FLIP);
+ smd->domain->particle_type |= FLUID_DOMAIN_PARTICLE_FLIP;
+ }
+ else {
+ rna_Smoke_parts_delete(ptr, PART_MANTA_FLIP);
+ rna_Smoke_resetCache(NULL, NULL, ptr);
+
+ smd->domain->particle_type &= ~FLUID_DOMAIN_PARTICLE_FLIP;
+ }
+ rna_Smoke_draw_type_update(NULL, NULL, ptr);
+ rna_Smoke_reset(NULL, NULL, ptr);
+}
+
+static void rna_Smoke_spray_parts_update(Main *bmain, Scene *UNUSED(scene), PointerRNA *ptr)
+{
+ Object *ob = (Object *)ptr->id.data;
+ SmokeModifierData *smd;
+ smd = (SmokeModifierData *)modifiers_findByType(ob, eModifierType_Smoke);
+ bool exists = rna_Smoke_parts_exists(ptr, PART_MANTA_SPRAY);
+
+ if (ob->type == OB_MESH && !exists) {
+ rna_Smoke_parts_create(bmain, ptr, "SprayParticleSettings", "Spray Particles", "Spray Particle System", PART_MANTA_SPRAY);
+ smd->domain->particle_type |= FLUID_DOMAIN_PARTICLE_SPRAY;
+ }
+ else {
+ rna_Smoke_parts_delete(ptr, PART_MANTA_SPRAY);
+ rna_Smoke_resetCache(NULL, NULL, ptr);
+
+ smd->domain->particle_type &= ~FLUID_DOMAIN_PARTICLE_SPRAY;
+ }
+ rna_Smoke_draw_type_update(NULL, NULL, ptr);
+ rna_Smoke_reset(NULL, NULL, ptr);
+}
+
+static void rna_Smoke_bubble_parts_update(Main *bmain, Scene *UNUSED(scene), PointerRNA *ptr)
+{
+ Object *ob = (Object *)ptr->id.data;
+ SmokeModifierData *smd;
+ smd = (SmokeModifierData *)modifiers_findByType(ob, eModifierType_Smoke);
+ bool exists = rna_Smoke_parts_exists(ptr, PART_MANTA_BUBBLE);
+
+ if (ob->type == OB_MESH && !exists) {
+ rna_Smoke_parts_create(bmain, ptr, "BubbleParticleSettings", "Bubble Particles", "Bubble Particle System", PART_MANTA_BUBBLE);
+ smd->domain->particle_type |= FLUID_DOMAIN_PARTICLE_BUBBLE;
+ }
+ else {
+ rna_Smoke_parts_delete(ptr, PART_MANTA_BUBBLE);
+ rna_Smoke_resetCache(NULL, NULL, ptr);
+
+ smd->domain->particle_type &= ~FLUID_DOMAIN_PARTICLE_BUBBLE;
+ }
+ rna_Smoke_draw_type_update(NULL, NULL, ptr);
+ rna_Smoke_reset(NULL, NULL, ptr);
+}
+
+static void rna_Smoke_foam_parts_update(Main *bmain, Scene *UNUSED(scene), PointerRNA *ptr)
+{
+ Object *ob = (Object *)ptr->id.data;
+ SmokeModifierData *smd;
+ smd = (SmokeModifierData *)modifiers_findByType(ob, eModifierType_Smoke);
+ bool exists = rna_Smoke_parts_exists(ptr, PART_MANTA_FOAM);
+
+ if (ob->type == OB_MESH && !exists) {
+ rna_Smoke_parts_create(bmain, ptr, "FoamParticleSettings", "Foam Particles", "Foam Particle System", PART_MANTA_FOAM);
+ smd->domain->particle_type |= FLUID_DOMAIN_PARTICLE_FOAM;
+ }
+ else {
+ rna_Smoke_parts_delete(ptr, PART_MANTA_FOAM);
+ rna_Smoke_resetCache(NULL, NULL, ptr);
+
+ smd->domain->particle_type &= ~FLUID_DOMAIN_PARTICLE_FOAM;
+ }
+ rna_Smoke_draw_type_update(NULL, NULL, ptr);
+ rna_Smoke_reset(NULL, NULL, ptr);
+}
+
+static void rna_Smoke_tracer_parts_update(Main *bmain, Scene *UNUSED(scene), PointerRNA *ptr)
+{
+ Object *ob = (Object *)ptr->id.data;
+ SmokeModifierData *smd;
+ smd = (SmokeModifierData *)modifiers_findByType(ob, eModifierType_Smoke);
+ bool exists = rna_Smoke_parts_exists(ptr, PART_MANTA_TRACER);
+
+ if (ob->type == OB_MESH && !exists) {
+ rna_Smoke_parts_create(bmain, ptr, "TracerParticleSettings", "Tracer Particles", "Tracer Particle System", PART_MANTA_TRACER);
+ smd->domain->particle_type |= FLUID_DOMAIN_PARTICLE_TRACER;
+ }
+ else {
+ rna_Smoke_parts_delete(ptr, PART_MANTA_TRACER);
+ rna_Smoke_resetCache(NULL, NULL, ptr);
+
+ smd->domain->particle_type &= ~FLUID_DOMAIN_PARTICLE_TRACER;
+ }
+ rna_Smoke_draw_type_update(NULL, NULL, ptr);
+ rna_Smoke_reset(NULL, NULL, ptr);
+}
+
+static void rna_Smoke_combined_export_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ Object *ob = (Object *)ptr->id.data;
+ SmokeModifierData *smd;
+ smd = (SmokeModifierData *)modifiers_findByType(ob, eModifierType_Smoke);
+
+ if (smd->domain->sndparticle_combined_export == SNDPARTICLE_COMBINED_EXPORT_OFF) {
+ rna_Smoke_parts_delete(ptr, (PART_MANTA_SPRAY | PART_MANTA_FOAM));
+ rna_Smoke_parts_delete(ptr, (PART_MANTA_SPRAY | PART_MANTA_BUBBLE));
+ rna_Smoke_parts_delete(ptr, (PART_MANTA_FOAM | PART_MANTA_BUBBLE));
+ rna_Smoke_parts_delete(ptr, (PART_MANTA_SPRAY | PART_MANTA_FOAM | PART_MANTA_BUBBLE));
+
+ // re-add each particle type if enabled
+ if ((smd->domain->particle_type & FLUID_DOMAIN_PARTICLE_SPRAY) != 0) {
+ rna_Smoke_spray_parts_update(bmain, scene, ptr);
+ }
+ if ((smd->domain->particle_type & FLUID_DOMAIN_PARTICLE_FOAM) != 0) {
+ rna_Smoke_foam_parts_update(bmain, scene, ptr);
+
+ }
+ if ((smd->domain->particle_type & FLUID_DOMAIN_PARTICLE_BUBBLE) != 0) {
+ rna_Smoke_bubble_parts_update(bmain, scene, ptr);
+ }
+ }
+ else if (smd->domain->sndparticle_combined_export == SNDPARTICLE_COMBINED_EXPORT_SPRAY_FOAM) {
+ if (ob->type == OB_MESH && !rna_Smoke_parts_exists(ptr, (PART_MANTA_SPRAY | PART_MANTA_FOAM) ))
+ rna_Smoke_parts_create(bmain, ptr, "SprayFoamParticleSettings", "Spray + Foam Particles", "Spray + Foam Particle System", (PART_MANTA_SPRAY | PART_MANTA_FOAM));
+ rna_Smoke_parts_delete(ptr, PART_MANTA_SPRAY);
+ rna_Smoke_parts_delete(ptr, PART_MANTA_FOAM);
+ rna_Smoke_parts_delete(ptr, (PART_MANTA_SPRAY | PART_MANTA_BUBBLE));
+ rna_Smoke_parts_delete(ptr, (PART_MANTA_FOAM | PART_M
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list