[Bf-blender-cvs] [0a4750a6587] fluid-mantaflow: replaced border collisions menu in UI with boolean flags

Sebastián Barschkis noreply at git.blender.org
Mon Jun 5 16:37:17 CEST 2017


Commit: 0a4750a6587619959004ffb8f8fee24c7f89c812
Author: Sebastián Barschkis
Date:   Mon Jun 5 16:33:47 2017 +0200
Branches: fluid-mantaflow
https://developer.blender.org/rB0a4750a6587619959004ffb8f8fee24c7f89c812

replaced border collisions menu in UI with boolean flags

Setting domain borders should not be determined by a few textual descriptions. Rather, users should be able to set any combination of borders.

===================================================================

M	intern/mantaflow/intern/FLUID.cpp
M	intern/mantaflow/intern/strings/liquid_script.h
M	release/scripts/startup/bl_operators/object_quick_effects.py
M	release/scripts/startup/bl_ui/properties_physics_smoke.py
M	source/blender/blenkernel/intern/smoke.c
M	source/blender/makesdna/DNA_smoke_types.h
M	source/blender/makesrna/intern/rna_smoke.c

===================================================================

diff --git a/intern/mantaflow/intern/FLUID.cpp b/intern/mantaflow/intern/FLUID.cpp
index 434f256051a..4923c289b70 100644
--- a/intern/mantaflow/intern/FLUID.cpp
+++ b/intern/mantaflow/intern/FLUID.cpp
@@ -531,6 +531,7 @@ std::string FLUID::getRealValue(const std::string& varName,  SmokeModifierData *
 	std::ostringstream ss;
 	bool is2D = false;
 	ModifierData *md;
+	int closedDomain;
 	
 	if (smd) {
 		is2D = (smd->domain->manta_solver_res == 2);
@@ -547,20 +548,25 @@ std::string FLUID::getRealValue(const std::string& varName,  SmokeModifierData *
 		ss << (smd->domain->flags & MOD_SMOKE_HIGHRES ? "True" : "False");
 	else if (varName == "SOLVER_DIM")
 		ss << smd->domain->manta_solver_res;
-	else if (varName == "DO_OPEN")
-		ss << (smd->domain->border_collisions == SM_BORDER_CLOSED ? "False" : "True");
-	else if (varName == "BOUNDCONDITIONS") {
+	else if (varName == "DO_OPEN") {
+		closedDomain = (MOD_SMOKE_BORDER_BACK | MOD_SMOKE_BORDER_FRONT |
+						 MOD_SMOKE_BORDER_LEFT | MOD_SMOKE_BORDER_RIGHT |
+						 MOD_SMOKE_BORDER_BOTTOM | MOD_SMOKE_BORDER_TOP);
+		ss << (((smd->domain->border_collisions & closedDomain) == closedDomain) ? "False" : "True");
+	} else if (varName == "BOUNDCONDITIONS") {
 		if (smd->domain->manta_solver_res == 2) {
-			if (smd->domain->border_collisions == SM_BORDER_OPEN) ss << "xXyY";
-			else if (smd->domain->border_collisions == SM_BORDER_VERTICAL) ss << "yY";
-			else if (smd->domain->border_collisions == SM_BORDER_HORIZONTAL) ss << "xX";
-			else if (smd->domain->border_collisions == SM_BORDER_CLOSED) ss << "";
+			if ((smd->domain->border_collisions & MOD_SMOKE_BORDER_BACK) == 0) ss << "x";
+			if ((smd->domain->border_collisions & MOD_SMOKE_BORDER_FRONT) == 0) ss << "X";
+			if ((smd->domain->border_collisions & MOD_SMOKE_BORDER_LEFT) == 0) ss << "y";
+			if ((smd->domain->border_collisions & MOD_SMOKE_BORDER_RIGHT) == 0) ss << "Y";
 		}
 		if (smd->domain->manta_solver_res == 3) {
-			if (smd->domain->border_collisions == SM_BORDER_OPEN) ss << "xXyYzZ";
-			else if (smd->domain->border_collisions == SM_BORDER_VERTICAL) ss << "zZ";
-			else if (smd->domain->border_collisions == SM_BORDER_HORIZONTAL) ss << "xXyY";
-			else if (smd->domain->border_collisions == SM_BORDER_CLOSED) ss << "";
+			if ((smd->domain->border_collisions & MOD_SMOKE_BORDER_BACK) == 0) ss << "x";
+			if ((smd->domain->border_collisions & MOD_SMOKE_BORDER_FRONT) == 0) ss << "X";
+			if ((smd->domain->border_collisions & MOD_SMOKE_BORDER_LEFT) == 0) ss << "y";
+			if ((smd->domain->border_collisions & MOD_SMOKE_BORDER_RIGHT) == 0) ss << "Y";
+			if ((smd->domain->border_collisions & MOD_SMOKE_BORDER_BOTTOM) == 0) ss << "z";
+			if ((smd->domain->border_collisions & MOD_SMOKE_BORDER_TOP) == 0) ss << "Z";
 		}
 	} else if (varName == "RES")
 		ss << smd->domain->maxres;
diff --git a/intern/mantaflow/intern/strings/liquid_script.h b/intern/mantaflow/intern/strings/liquid_script.h
index e6f296934b9..6dc6600177b 100644
--- a/intern/mantaflow/intern/strings/liquid_script.h
+++ b/intern/mantaflow/intern/strings/liquid_script.h
@@ -163,8 +163,6 @@ def manta_step_$ID$(framenr):\n\
     while s$ID$.frame == last_frame_s$ID$:\n\
         \n\
         flags_s$ID$.initDomain(boundaryWidth=boundaryWidth_s$ID$, phiWalls=phiObs_s$ID$)\n\
-        if doOpen_s$ID$:\n\
-            setOpenBound(flags=flags_s$ID$, bWidth=boundaryWidth_s$ID$, openBound=boundConditions_s$ID$, type=FlagOutflow|FlagEmpty)\n\
         \n\
         phiObs_s$ID$.join(phiObsIn_s$ID$)\n\
         phi_s$ID$.join(phiIn_s$ID$)\n\
@@ -172,6 +170,8 @@ def manta_step_$ID$(framenr):\n\
         \n\
         #updateFractions(flags=flags_s$ID$, phiObs=phiObs_s$ID$, fractions=fractions_s$ID$, boundaryWidth=boundaryWidth_s$ID$) # TODO: uncomment for fractions\n\
         setObstacleFlags(flags=flags_s$ID$, phiObs=phiObs_s$ID$, phiOut=phiOut_s$ID$)#, fractions=fractions_s$ID$) # TODO: uncomment for fractions\n\
+        if doOpen_s$ID$:\n\
+            setOpenBound(flags=flags_s$ID$, bWidth=boundaryWidth_s$ID$, openBound=boundConditions_s$ID$, type=FlagOutflow|FlagEmpty)\n\
         \n\
         sampleLevelsetWithParticles(phi=phiIn_s$ID$, flags=flags_s$ID$, parts=pp_s$ID$, discretization=particleNumber_s$ID$, randomness=randomness_s$ID$, refillEmpty=True)\n\
         flags_s$ID$.updateFromLevelset(phi_s$ID$)\n\
diff --git a/release/scripts/startup/bl_operators/object_quick_effects.py b/release/scripts/startup/bl_operators/object_quick_effects.py
index f4ca500091c..d16a9563e32 100644
--- a/release/scripts/startup/bl_operators/object_quick_effects.py
+++ b/release/scripts/startup/bl_operators/object_quick_effects.py
@@ -700,7 +700,13 @@ class QuickLiquid(Operator):
         bpy.ops.object.modifier_add(type='SMOKE')
         obj.modifiers[-1].smoke_type = 'DOMAIN'
         obj.modifiers[-1].domain_settings.smoke_domain_type = 'LIQUID'
-        obj.modifiers[-1].domain_settings.collision_extents = 'BORDERCLOSED'
+        # set all domain borders to obstacle 
+        obj.modifiers[-1].domain_settings.use_collision_border_front = True
+        obj.modifiers[-1].domain_settings.use_collision_border_back = True
+        obj.modifiers[-1].domain_settings.use_collision_border_right = True
+        obj.modifiers[-1].domain_settings.use_collision_border_left = True
+        obj.modifiers[-1].domain_settings.use_collision_border_top = True
+        obj.modifiers[-1].domain_settings.use_collision_border_bottom = True
 
         # set correct cache file format for liquid
         obj.modifiers[-1].domain_settings.cache_file_format = 'OBJECT'
diff --git a/release/scripts/startup/bl_ui/properties_physics_smoke.py b/release/scripts/startup/bl_ui/properties_physics_smoke.py
index b8c66302381..05ed6a66e71 100644
--- a/release/scripts/startup/bl_ui/properties_physics_smoke.py
+++ b/release/scripts/startup/bl_ui/properties_physics_smoke.py
@@ -62,13 +62,27 @@ class PHYSICS_PT_smoke(PhysicButtonsPanel, Panel):
             flow = md.flow_settings
 
             layout.prop(domain, "smoke_domain_type", expand=False)
-            layout.prop(domain, "collision_extents", expand=False)
+            layout.label(text="Border collisions:")
 
             split = layout.split()
 
             split.enabled = not domain.point_cache.is_baked
 
             col = split.column()
+            col.prop(domain, "use_collision_border_front", text="Front")
+            col.prop(domain, "use_collision_border_back", text="Back")
+
+            col = split.column()
+            col.prop(domain, "use_collision_border_right", text="Right")
+            col.prop(domain, "use_collision_border_left", text="Left")
+
+            col = split.column()
+            col.prop(domain, "use_collision_border_top", text="Top")
+            col.prop(domain, "use_collision_border_bottom", text="Bottom")
+
+            split = layout.split()
+
+            col = split.column()
             col.label(text="Time:")
             col.prop(domain, "time_scale", text="Scale")
             col.prop(domain, "use_adaptive_stepping", text="Adaptive stepping")
diff --git a/source/blender/blenkernel/intern/smoke.c b/source/blender/blenkernel/intern/smoke.c
index e0dd4b57fed..44bb8ddda16 100644
--- a/source/blender/blenkernel/intern/smoke.c
+++ b/source/blender/blenkernel/intern/smoke.c
@@ -559,7 +559,7 @@ void smokeModifier_createType(struct SmokeModifierData *smd)
 			smd->domain->beta = 0.3;
 			smd->domain->time_scale = 1.0;
 			smd->domain->vorticity = 0.2;
-			smd->domain->border_collisions = SM_BORDER_OPEN; // open domain
+			smd->domain->border_collisions = 0; // open domain
 			smd->domain->flags = MOD_SMOKE_DISSOLVE_LOG;
 			smd->domain->highres_sampling = SM_HRES_FULLSAMPLE;
 			smd->domain->strength = 1.0;
diff --git a/source/blender/makesdna/DNA_smoke_types.h b/source/blender/makesdna/DNA_smoke_types.h
index e7a9cb3e56d..e93425d2f00 100644
--- a/source/blender/makesdna/DNA_smoke_types.h
+++ b/source/blender/makesdna/DNA_smoke_types.h
@@ -51,6 +51,16 @@ enum {
 	MOD_SMOKE_ADAPTIVE_DOMAIN = (1 << 7),
 };
 
+/* border collisions */
+enum {
+	MOD_SMOKE_BORDER_FRONT = (1 << 1),
+	MOD_SMOKE_BORDER_BACK = (1 << 2),
+	MOD_SMOKE_BORDER_RIGHT = (1 << 3),
+	MOD_SMOKE_BORDER_LEFT = (1 << 4),
+	MOD_SMOKE_BORDER_TOP = (1 << 5),
+	MOD_SMOKE_BORDER_BOTTOM = (1 << 6),
+};
+
 /* noise */
 #define MOD_SMOKE_NOISEWAVE (1<<0)
 #define MOD_SMOKE_NOISEFFT (1<<1)
@@ -103,6 +113,7 @@ enum {
 #define SM_CACHE_HEAVY		1
 
 /* domain border collision */
+/* TODO (sebbas): deprecated values. kept for possible versioning */
 #define SM_BORDER_OPEN		 0
 #define SM_BORDER_VERTICAL	 1
 #define SM_BORDER_CLOSED	 2
diff --git a/source/blender/makesrna/intern/rna_smoke.c b/source/blender/makesrna/intern/rna_smoke.c
index 7436d83b928..aea7cb545b3 100644
--- a/source/blender/makesrna/intern/rna_smoke.c
+++ b/source/blender/makesrna/intern/rna_smoke.c
@@ -143,10 +143,15 @@ static EnumPropertyItem *rna_Smoke_cachetype_itemf(
 	return item;
 }
 
-static void rna_Smoke_collisionextents_set(struct PointerRNA *ptr, int value)
+static void rna_Smoke_collisionextents_set(struct PointerRNA *ptr, int value, bool clear)
 {
 	SmokeDomainSettings *settings = (SmokeDomainSettings *)ptr->data;
-	settings->border_collisions = value;
+	if (clear) {
+		settings->border_collisions &= value;
+	}
+	else {
+		settings->border_collisions |= value;
+	}
 }
 
 static void rna_Smoke_domaintype_set(struct PointerRNA *ptr, int value)
@@ -159,13 +164,23 @@ static void rna_Smoke_domaintype_set(struct PointerRNA *ptr, int value)
 		if (value == MOD_SMOKE_DOMAIN_TYPE_GAS)
 		{
 			rna_Smoke_cachetype_set(ptr, PTCACHE_FILE_PTCACHE);
-			rna_Smoke_collisionextents_set(ptr, SM_BORDER_OPEN);
+			rna_Smoke_collisionextents_set(ptr, MOD_SMOKE_BORDER_FRONT, 1);
+			rna_Smoke_collisionextents_set(ptr, MOD_SMOKE_BORDER_BACK, 1);
+			rna_Smoke_collisionextents_set(ptr, MOD_SMOKE_BORDER_RIGHT, 1);
+			rna_Smoke_collisionextents_set(ptr, MOD_SMOKE_BORDER_LEFT, 1);
+			rna_Smoke_collisionextents_set(ptr, MOD_SMOKE_BORDER_TOP, 1);
+			rna_Smoke_collisionextents_set(ptr, MOD_SMOKE_BORDER_BOTTOM, 1);
 			BKE_object_draw_type_set(ob, OB_WIRE);
 		}
 		else if (value == MOD_SMOKE_DOMAIN_TYPE_LIQUID)
 		{
 			rna_Smoke_cachetype_set(ptr, PTCACH

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list