[Bf-blender-cvs] [b50834bb50b] soc-2020-fluid-tools: Fluid: Improvements in Phi grid display

Sriharsha Kotcharlakot noreply at git.blender.org
Wed Jun 24 15:34:02 CEST 2020


Commit: b50834bb50bd178497c8e28f4f2f5ea4ad4121a5
Author: Sriharsha Kotcharlakot
Date:   Wed Jun 24 19:03:50 2020 +0530
Branches: soc-2020-fluid-tools
https://developer.blender.org/rBb50834bb50bd178497c8e28f4f2f5ea4ad4121a5

Fluid: Improvements in Phi grid display

* Changed field texture format from 'GPU_R8' to 'GPU_R16F' for level-set fields to avoid data normalisation.
* Fragment coloring for level-set fields is now dynamic and does not depend on transfer texture.

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

M	source/blender/blenlib/BLI_math_color.h
M	source/blender/blenlib/intern/math_color.c
M	source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl
M	source/blender/draw/engines/workbench/workbench_private.h
M	source/blender/draw/engines/workbench/workbench_shader.c
M	source/blender/draw/engines/workbench/workbench_volume.c
M	source/blender/gpu/intern/gpu_draw_smoke.c

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

diff --git a/source/blender/blenlib/BLI_math_color.h b/source/blender/blenlib/BLI_math_color.h
index 547c17f0382..ba95da4092e 100644
--- a/source/blender/blenlib/BLI_math_color.h
+++ b/source/blender/blenlib/BLI_math_color.h
@@ -145,7 +145,6 @@ MINLINE void rgba_uchar_args_test_set(unsigned char col[4],
 MINLINE void cpack_cpy_3ub(unsigned char r_col[3], const unsigned int pack);
 
 void blackbody_temperature_to_rgb_table(float *r_table, int width, float min, float max);
-void phi_to_rgb(float *r_table, int width, float min, float max);
 
 /********* lift/gamma/gain / ASC-CDL conversion ***********/
 
diff --git a/source/blender/blenlib/intern/math_color.c b/source/blender/blenlib/intern/math_color.c
index 06333e1f961..625849c01df 100644
--- a/source/blender/blenlib/intern/math_color.c
+++ b/source/blender/blenlib/intern/math_color.c
@@ -714,29 +714,3 @@ void blackbody_temperature_to_rgb_table(float *r_table, int width, float min, fl
     r_table[i * 4 + 3] = 0.0f;
   }
 }
-
-void phi_to_rgb(float *r_table, int width, float min, float max)
-{
-  for (int i = 0; i < width; i++) {
-    float value = min + (max - min) / (float)width * (float)i;
-
-    float rgb[3];
-
-    value = (value < 1.0f) ? value : 1.0f;
-    value = (value >= -1.0f) ? value : -1.0f;
-
-    if (value >= 0.0f) {
-      rgb[0] = value;
-      rgb[1] = 0.0f;
-      rgb[2] = 0.5f;
-    }
-    else {
-      rgb[0] = 0.5f;
-      rgb[1] = 1.0f + value;
-      rgb[2] = 0.0f;
-    }
-
-    copy_v3_v3(&r_table[i * 4], rgb);
-    r_table[i * 4 + 3] = 0.0f;
-  }
-}
\ No newline at end of file
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 f1893faf669..e61d3473f3d 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl
@@ -23,6 +23,8 @@ uniform vec3 activeColor;
 uniform float slicePosition;
 uniform int sliceAxis; /* -1 is no slice, 0 is X, 1 is Y, 2 is Z. */
 
+uniform bool showPhi;
+
 #ifdef VOLUME_SLICE
 in vec3 localPos;
 #endif
@@ -115,14 +117,29 @@ void volume_properties(vec3 ls_pos, out vec3 scattering, out float extinction)
 {
   vec3 co = ls_pos * 0.5 + 0.5;
 #ifdef USE_COBA
-  float val = sample_volume_texture(densityTexture, co).r;
-#  ifdef SHOW_PHI
-  /* Scaling the value holding 0.5 as neutral. */
-  val = 0.5 + (val - 0.5) * gridScale;
-#  else
-  val *= gridScale;
-#  endif
-  vec4 tval = texture(transferTexture, val) * densityScale;
+  float val = sample_volume_texture(densityTexture, co).r * gridScale;
+  vec4 tval;
+  if(showPhi) {
+    /* Color mapping for level-set representation */
+    val = (val * 0.2 < 1.0) ? val * 0.2 : 1.0;
+    val = (val >= -1.0) ? val : -1.0;
+
+    if (val >= 0.0) {
+      tval.r = val;
+      tval.g = 0.0;
+      tval.b = 0.5;
+    }
+    else {
+      tval.r = 0.5;
+      tval.g = 1.0 + val;
+      tval.b = 0.0;
+    }
+    tval.a = 0.06;
+  }
+  else {
+    tval = texture(transferTexture, val);
+  }
+  tval *= densityScale;
   tval.rgb = pow(tval.rgb, vec3(2.2));
   scattering = tval.rgb * 1500.0;
   extinction = max(1e-4, tval.a * 50.0);
diff --git a/source/blender/draw/engines/workbench/workbench_private.h b/source/blender/draw/engines/workbench/workbench_private.h
index 63f613b93dd..edb2046568c 100644
--- a/source/blender/draw/engines/workbench/workbench_private.h
+++ b/source/blender/draw/engines/workbench/workbench_private.h
@@ -420,8 +420,7 @@ GPUShader *workbench_shader_outline_get(void);
 GPUShader *workbench_shader_antialiasing_accumulation_get(void);
 GPUShader *workbench_shader_antialiasing_get(int stage);
 
-GPUShader *workbench_shader_volume_get(
-    bool slice, bool coba, InterpType cubic, bool smoke, bool show_phi);
+GPUShader *workbench_shader_volume_get(bool slice, bool coba, InterpType cubic, bool smoke);
 
 void workbench_shader_depth_of_field_get(GPUShader **prepare_sh,
                                          GPUShader **downsample_sh,
diff --git a/source/blender/draw/engines/workbench/workbench_shader.c b/source/blender/draw/engines/workbench/workbench_shader.c
index 3eac723a858..43749f2688a 100644
--- a/source/blender/draw/engines/workbench/workbench_shader.c
+++ b/source/blender/draw/engines/workbench/workbench_shader.c
@@ -441,8 +441,7 @@ GPUShader *workbench_shader_antialiasing_get(int stage)
   return e_data.smaa_sh[stage];
 }
 
-GPUShader *workbench_shader_volume_get(
-    bool slice, bool coba, InterpType cubic, bool smoke, bool show_phi)
+GPUShader *workbench_shader_volume_get(bool slice, bool coba, InterpType cubic, bool smoke)
 {
   GPUShader **shader = &e_data.volume_sh[slice][coba][cubic][smoke];
 
@@ -466,9 +465,6 @@ GPUShader *workbench_shader_volume_get(
     if (smoke) {
       BLI_dynstr_append(ds, "#define VOLUME_SMOKE\n");
     }
-    if (show_phi) {
-      BLI_dynstr_append(ds, "#define SHOW_PHI\n");
-    }
 
     char *defines = BLI_dynstr_get_cstring(ds);
     BLI_dynstr_free(ds);
diff --git a/source/blender/draw/engines/workbench/workbench_volume.c b/source/blender/draw/engines/workbench/workbench_volume.c
index 84c796dfc46..499249e62b2 100644
--- a/source/blender/draw/engines/workbench/workbench_volume.c
+++ b/source/blender/draw/engines/workbench/workbench_volume.c
@@ -99,8 +99,7 @@ static void workbench_volume_modifier_cache_populate(WORKBENCH_Data *vedata,
                          mds->coba_field == FLUID_DOMAIN_FIELD_PHI_IN ||
                          mds->coba_field == FLUID_DOMAIN_FIELD_PHI_OUT ||
                          mds->coba_field == FLUID_DOMAIN_FIELD_PHI_OBSTACLE);
-  GPUShader *sh = workbench_shader_volume_get(
-      use_slice, mds->use_coba, cubic_interp, true, show_phi);
+  GPUShader *sh = workbench_shader_volume_get(use_slice, mds->use_coba, cubic_interp, true);
 
   if (use_slice) {
     float invviewmat[4][4];
@@ -142,8 +141,11 @@ static void workbench_volume_modifier_cache_populate(WORKBENCH_Data *vedata,
 
   if (mds->use_coba) {
     DRW_shgroup_uniform_texture(grp, "densityTexture", mds->tex_field);
-    DRW_shgroup_uniform_texture(grp, "transferTexture", mds->tex_coba);
+    if (!show_phi) {
+      DRW_shgroup_uniform_texture(grp, "transferTexture", mds->tex_coba);
+    }
     DRW_shgroup_uniform_float_copy(grp, "gridScale", mds->grid_scale);
+    DRW_shgroup_uniform_bool_copy(grp, "showPhi", show_phi);
   }
   else {
     static float white[3] = {1.0f, 1.0f, 1.0f};
@@ -206,7 +208,7 @@ static void workbench_volume_object_cache_populate(WORKBENCH_Data *vedata,
   wpd->volumes_do = true;
 
   /* Create shader. */
-  GPUShader *sh = workbench_shader_volume_get(false, false, false, false, false);
+  GPUShader *sh = workbench_shader_volume_get(false, false, false, false);
 
   /* Compute color. */
   float color[3];
diff --git a/source/blender/gpu/intern/gpu_draw_smoke.c b/source/blender/gpu/intern/gpu_draw_smoke.c
index d9b55dede0f..b5618a4954b 100644
--- a/source/blender/gpu/intern/gpu_draw_smoke.c
+++ b/source/blender/gpu/intern/gpu_draw_smoke.c
@@ -52,7 +52,6 @@
 enum {
   TFUNC_FLAME_SPECTRUM = 0,
   TFUNC_COLOR_RAMP = 1,
-  TFUNC_PHI_SPECTRUM = 2,
 };
 
 #  define TFUNC_WIDTH 256
@@ -103,35 +102,6 @@ static void create_color_ramp(const struct ColorBand *coba, float *data)
   }
 }
 
-static void create_phi_spectrum_texture(float *data)
-{
-#  define MAX_PHI_VALUE 1.0f
-#  define MIN_PHI_VALUE -1.0f
-
-  float *spec_pixels = MEM_mallocN(TFUNC_WIDTH * 4 * 16 * 16 * sizeof(float), "spec_pixels");
-
-  phi_to_rgb(data, TFUNC_WIDTH, MIN_PHI_VALUE, MAX_PHI_VALUE);
-
-  for (int i = 0; i < 16; i++) {
-    for (int j = 0; j < 16; j++) {
-      for (int k = 0; k < TFUNC_WIDTH; k++) {
-        int index = (j * TFUNC_WIDTH * 16 + i * TFUNC_WIDTH + k) * 4;
-        spec_pixels[index] = (data[k * 4]);
-        spec_pixels[index + 1] = (data[k * 4 + 1]);
-        spec_pixels[index + 2] = (data[k * 4 + 2]);
-        spec_pixels[index + 3] = 0.06f;
-      }
-    }
-  }
-
-  memcpy(data, spec_pixels, sizeof(float) * 4 * TFUNC_WIDTH);
-
-  MEM_freeN(spec_pixels);
-
-#  undef MAX_PHI_VALUE
-#  undef MIN_PHI_VALUE
-}
-
 static GPUTexture *create_transfer_function(int type, const struct ColorBand *coba)
 {
   float *data = MEM_mallocN(sizeof(float) * 4 * TFUNC_WIDTH, __func__);
@@ -143,9 +113,6 @@ static GPUTexture *create_transfer_function(int type, const struct ColorBand *co
     case TFUNC_COLOR_RAMP:
       create_color_ramp(coba, data);
       break;
-    case TFUNC_PHI_SPECTRUM:
-      create_phi_spectrum_texture(data);
-      break;
   }
 
   GPUTexture *tex = GPU_texture_create_1d(TFUNC_WIDTH, GPU_RGBA8, data, NULL);
@@ -167,6 +134,7 @@ static void swizzle_texture_channel_single(GPUTexture *tex)
 static GPUTexture *create_field_texture(FluidDomainSettings *mds)
 {
   float *field = NULL;
+  eGPUTextureFormat texture_format = GPU_R8;
 
   switch (mds->coba_field) {
     case FLUID_DOMAIN_FIELD_DENSITY:
@@ -213,22 +181,34 @@ static GPUTexture *create_field_texture(FluidDomainSettings *mds)
       break;
     case FLUID_DOMAIN_FIELD_PHI:
       field = manta_get_phi(mds->fluid);
+      texture_format = GPU_R16F;
       break;
     case FLUID_DOMAIN_FIELD_PHI_IN:
       field = manta_get_phi_in(mds->fluid);
+      texture_format = GPU_R16F;
       break;
     case FLUID_DOMAIN_FIELD_PHI_OUT:
       field = manta_get_phiout_in(mds->fluid);
+      texture_format = GPU_R16F;
       break;
     case FLUID_DOMAIN_FIELD_PHI_OBSTACLE:
       field = manta_get_phiobs_in(mds->fluid);
+      texture_format = GPU_R16F;
       break;
     default:
       return NULL;
   }
 
-  GPUTexture *tex = GPU_texture_create_nD(
-      mds->res[0], mds->res[1], mds->res[2], 3, field, GPU_R8, GPU_DATA_FLOAT, 0, true, NULL);
+  GPUTexture *tex = GPU_texture_create_nD(mds->res[0],
+                                          mds->res[1],
+                                          mds->res[2],
+                                          3,
+                                          field,
+                                          texture_format,
+                                          GPU_DATA_FLOAT,
+                                          0,
+                               

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list