[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