[Bf-blender-cvs] [1ff4fd4bb04] soc-2020-fluid-tools: Fluid: Added an option for color mapping pressure grid

Sriharsha Kotcharlakot noreply at git.blender.org
Fri Jul 24 20:02:19 CEST 2020


Commit: 1ff4fd4bb043c3b3bc6183a0c89e23eb377b2855
Author: Sriharsha Kotcharlakot
Date:   Fri Jul 24 23:31:26 2020 +0530
Branches: soc-2020-fluid-tools
https://developer.blender.org/rB1ff4fd4bb043c3b3bc6183a0c89e23eb377b2855

Fluid: Added an option for color mapping pressure grid

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

M	intern/mantaflow/extern/manta_fluid_API.h
M	intern/mantaflow/intern/MANTA_main.cpp
M	intern/mantaflow/intern/MANTA_main.h
M	intern/mantaflow/intern/manta_fluid_API.cpp
M	release/scripts/startup/bl_ui/properties_physics_fluid.py
M	source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl
M	source/blender/draw/engines/workbench/workbench_volume.c
M	source/blender/gpu/intern/gpu_draw_smoke.c
M	source/blender/makesdna/DNA_fluid_types.h
M	source/blender/makesrna/intern/rna_fluid.c

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

diff --git a/intern/mantaflow/extern/manta_fluid_API.h b/intern/mantaflow/extern/manta_fluid_API.h
index a7018f638ec..9e3c23e0444 100644
--- a/intern/mantaflow/extern/manta_fluid_API.h
+++ b/intern/mantaflow/extern/manta_fluid_API.h
@@ -109,6 +109,7 @@ float *manta_get_phiobsstatic_in(struct MANTA *fluid);
 float *manta_get_phiout_in(struct MANTA *fluid);
 float *manta_get_phioutstatic_in(struct MANTA *fluid);
 float *manta_get_phi(struct MANTA *fluid);
+float *manta_get_pressure(struct MANTA *fluid);
 
 /* Smoke functions */
 void manta_smoke_export_script(struct MANTA *smoke, struct FluidModifierData *fmd);
diff --git a/intern/mantaflow/intern/MANTA_main.cpp b/intern/mantaflow/intern/MANTA_main.cpp
index 676a2fd785e..55fb174bc5c 100644
--- a/intern/mantaflow/intern/MANTA_main.cpp
+++ b/intern/mantaflow/intern/MANTA_main.cpp
@@ -130,6 +130,7 @@ MANTA::MANTA(int *res, FluidModifierData *fmd) : mCurrentID(++solverID)
   mFuelIn = nullptr;
   mReactIn = nullptr;
   mEmissionIn = nullptr;
+  mPressure = nullptr;
 
   // Smoke high res grids
   mDensityHigh = nullptr;
@@ -1986,6 +1987,7 @@ void MANTA::updatePointers()
   mForceX = (float *)pyObjectToPointer(callPythonFunction("x_force" + solver_ext, func));
   mForceY = (float *)pyObjectToPointer(callPythonFunction("y_force" + solver_ext, func));
   mForceZ = (float *)pyObjectToPointer(callPythonFunction("z_force" + solver_ext, func));
+  mPressure = (float *)pyObjectToPointer(callPythonFunction("pressure" + solver_ext, func));
 
   if (mUsingOutflow) {
     mPhiOutIn = (float *)pyObjectToPointer(callPythonFunction("phiOutIn" + solver_ext, func));
diff --git a/intern/mantaflow/intern/MANTA_main.h b/intern/mantaflow/intern/MANTA_main.h
index dae2aea4e08..1644620fa75 100644
--- a/intern/mantaflow/intern/MANTA_main.h
+++ b/intern/mantaflow/intern/MANTA_main.h
@@ -420,6 +420,10 @@ struct MANTA {
   {
     return mPhi;
   }
+  inline float *getPressure()
+  {
+    return mPressure;
+  }
 
   static atomic<int> solverID;
   static int with_debug;  // on or off (1 or 0), also sets manta debug level
@@ -818,6 +822,7 @@ struct MANTA {
   int *mFlags;
   float *mNumObstacle;
   float *mNumGuide;
+  float *mPressure;
 
   // Smoke grids
   float *mDensity;
diff --git a/intern/mantaflow/intern/manta_fluid_API.cpp b/intern/mantaflow/intern/manta_fluid_API.cpp
index 423c3c249c9..195a260d20d 100644
--- a/intern/mantaflow/intern/manta_fluid_API.cpp
+++ b/intern/mantaflow/intern/manta_fluid_API.cpp
@@ -363,6 +363,10 @@ float *manta_get_phi(MANTA *fluid)
 {
   return fluid->getPhi();
 }
+float *manta_get_pressure(MANTA *fluid)
+{
+  return fluid->getPressure();
+}
 
 /* Smoke functions */
 void manta_smoke_export_script(MANTA *smoke, FluidModifierData *fmd)
diff --git a/release/scripts/startup/bl_ui/properties_physics_fluid.py b/release/scripts/startup/bl_ui/properties_physics_fluid.py
index 3fe40cac956..ff1716d39aa 100644
--- a/release/scripts/startup/bl_ui/properties_physics_fluid.py
+++ b/release/scripts/startup/bl_ui/properties_physics_fluid.py
@@ -1308,7 +1308,7 @@ class PHYSICS_PT_viewport_display_color(PhysicButtonsPanel, Panel):
 
         col.use_property_split = False
 
-        if (not (domain.coba_field[:3] == "PHI" or domain.coba_field == "FLAGS")):
+        if (not (domain.coba_field[:3] == "PHI" or domain.coba_field == "FLAGS" or domain.coba_field == "PRESSURE")):
             col = col.column()
             col.template_color_ramp(domain, "color_ramp", expand=True)
 
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl
index 9c57ac760f1..e6a4e1d885b 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl
@@ -26,6 +26,7 @@ uniform int sliceAxis; /* -1 is no slice, 0 is X, 1 is Y, 2 is Z. */
 
 uniform bool showPhi = false;
 uniform bool showFlags = false;
+uniform bool showPressure = false;
 
 #ifdef VOLUME_SLICE
 in vec3 localPos;
@@ -157,6 +158,17 @@ void volume_properties(vec3 ls_pos, out vec3 scattering, out float extinction)
       tval.rgb += vec3(0.5, 0.0, 0.0); /* medium red */
     }
   }
+  else if (showPressure) {
+    /* Color mapping for pressure */
+    float val = sample_volume_texture(densityTexture, co).r * gridScale;
+
+    if (val > 0) {
+      tval = vec4(val, val, val, 0.06);
+    }
+    else {
+      tval = vec4(-val, 0.0, 0.0, 0.06);
+    }
+  }
   else {
     float val = sample_volume_texture(densityTexture, co).r * gridScale;
     tval = texture(transferTexture, val);
diff --git a/source/blender/draw/engines/workbench/workbench_volume.c b/source/blender/draw/engines/workbench/workbench_volume.c
index 10c49e8c8cf..75ba0490829 100644
--- a/source/blender/draw/engines/workbench/workbench_volume.c
+++ b/source/blender/draw/engines/workbench/workbench_volume.c
@@ -100,6 +100,7 @@ static void workbench_volume_modifier_cache_populate(WORKBENCH_Data *vedata,
                          fds->coba_field == FLUID_DOMAIN_FIELD_PHI_OUT ||
                          fds->coba_field == FLUID_DOMAIN_FIELD_PHI_OBSTACLE);
   const bool show_flags = (fds->coba_field == FLUID_DOMAIN_FIELD_FLAGS);
+  const bool show_pressure = (fds->coba_field == FLUID_DOMAIN_FIELD_PRESSURE);
   GPUShader *sh = workbench_shader_volume_get(use_slice, fds->use_coba, cubic_interp, true);
 
   if (use_slice) {
@@ -147,12 +148,13 @@ static void workbench_volume_modifier_cache_populate(WORKBENCH_Data *vedata,
     else {
       DRW_shgroup_uniform_texture(grp, "densityTexture", fds->tex_field);
     }
-    if (!show_phi && !show_flags) {
+    if (!show_phi && !show_flags && !show_pressure) {
       DRW_shgroup_uniform_texture(grp, "transferTexture", fds->tex_coba);
     }
     DRW_shgroup_uniform_float_copy(grp, "gridScale", fds->grid_scale);
     DRW_shgroup_uniform_bool_copy(grp, "showPhi", show_phi);
     DRW_shgroup_uniform_bool_copy(grp, "showFlags", show_flags);
+    DRW_shgroup_uniform_bool_copy(grp, "showPressure", show_pressure);
   }
   else {
     static float white[3] = {1.0f, 1.0f, 1.0f};
diff --git a/source/blender/gpu/intern/gpu_draw_smoke.c b/source/blender/gpu/intern/gpu_draw_smoke.c
index 878f5f5ccaf..70aac0809d8 100644
--- a/source/blender/gpu/intern/gpu_draw_smoke.c
+++ b/source/blender/gpu/intern/gpu_draw_smoke.c
@@ -206,6 +206,10 @@ static GPUTexture *create_field_texture(FluidDomainSettings *fds, bool singlePre
       data_format = GPU_DATA_INT;
       texture_format = GPU_R8UI;
       break;
+    case FLUID_DOMAIN_FIELD_PRESSURE:
+      field = manta_get_pressure(fds->fluid);
+      texture_format = GPU_R16F;
+      break;
     default:
       return NULL;
   }
@@ -385,7 +389,8 @@ void GPU_create_smoke_coba_field(FluidModifierData *fmd)
                             fds->coba_field == FLUID_DOMAIN_FIELD_PHI_IN ||
                             fds->coba_field == FLUID_DOMAIN_FIELD_PHI_OUT ||
                             fds->coba_field == FLUID_DOMAIN_FIELD_PHI_OBSTACLE ||
-                            fds->coba_field == FLUID_DOMAIN_FIELD_FLAGS)) {
+                            fds->coba_field == FLUID_DOMAIN_FIELD_FLAGS ||
+                            fds->coba_field == FLUID_DOMAIN_FIELD_PRESSURE)) {
       fds->tex_coba = create_transfer_function(TFUNC_COLOR_RAMP, fds->coba);
     }
   }
diff --git a/source/blender/makesdna/DNA_fluid_types.h b/source/blender/makesdna/DNA_fluid_types.h
index c76ce110250..757f5c8de03 100644
--- a/source/blender/makesdna/DNA_fluid_types.h
+++ b/source/blender/makesdna/DNA_fluid_types.h
@@ -132,6 +132,7 @@ enum {
   FLUID_DOMAIN_FIELD_PHI_OUT = 16,
   FLUID_DOMAIN_FIELD_PHI_OBSTACLE = 17,
   FLUID_DOMAIN_FIELD_FLAGS = 18,
+  FLUID_DOMAIN_FIELD_PRESSURE = 19,
 };
 
 /* Fluid gridline display color field types. */
diff --git a/source/blender/makesrna/intern/rna_fluid.c b/source/blender/makesrna/intern/rna_fluid.c
index 008da0572bb..2427c6f317c 100644
--- a/source/blender/makesrna/intern/rna_fluid.c
+++ b/source/blender/makesrna/intern/rna_fluid.c
@@ -1065,6 +1065,13 @@ static const EnumPropertyItem *rna_Fluid_cobafield_itemf(bContext *UNUSED(C),
   tmp.description = "Flag grid of the fluid domain";
   RNA_enum_item_add(&item, &totitem, &tmp);
 
+  tmp.value = FLUID_DOMAIN_FIELD_PRESSURE;
+  tmp.identifier = "PRESSURE";
+  tmp.icon = 0;
+  tmp.name = "Pressure";
+  tmp.description = "Pressure field of the fluid domain";
+  RNA_enum_item_add(&item, &totitem, &tmp);
+
   tmp.value = FLUID_DOMAIN_FIELD_VELOCITY_X;
   tmp.identifier = "VELOCITY_X";
   tmp.icon = 0;



More information about the Bf-blender-cvs mailing list