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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to