[Bf-blender-cvs] [2507d219711] soc-2020-fluid-tools: Fluid: Added range highlighting options for gridlines

Sriharsha Kotcharlakot noreply at git.blender.org
Fri Jul 10 14:23:55 CEST 2020


Commit: 2507d2197114d8944d0fd9aae75a98d86397333e
Author: Sriharsha Kotcharlakot
Date:   Fri Jul 10 17:37:22 2020 +0530
Branches: soc-2020-fluid-tools
https://developer.blender.org/rB2507d2197114d8944d0fd9aae75a98d86397333e

Fluid: Added range highlighting options for gridlines

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

M	release/scripts/startup/bl_ui/properties_physics_fluid.py
M	source/blender/blenkernel/intern/fluid.c
M	source/blender/draw/engines/overlay/overlay_extra.c
M	source/blender/draw/engines/overlay/overlay_private.h
M	source/blender/draw/engines/overlay/overlay_shader.c
M	source/blender/draw/engines/overlay/shaders/volume_gridlines_vert.glsl
M	source/blender/gpu/GPU_draw.h
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/release/scripts/startup/bl_ui/properties_physics_fluid.py b/release/scripts/startup/bl_ui/properties_physics_fluid.py
index 1fa27566f6d..1070b0976d9 100644
--- a/release/scripts/startup/bl_ui/properties_physics_fluid.py
+++ b/release/scripts/startup/bl_ui/properties_physics_fluid.py
@@ -1361,6 +1361,18 @@ class PHYSICS_PT_viewport_display_advanced(PhysicButtonsPanel, Panel):
         col = layout.column()
         col.prop(domain, "gridlines_color_field", text="Color Gridlines")
 
+        if (domain.gridlines_color_field == 'RANGE'):
+            if (domain.use_color_ramp and domain.coba_field != "FLAGS"):
+                col.prop(domain, "gridlines_lower_bound")
+                col.prop(domain, "gridlines_upper_bound")
+                col.prop(domain, "gridlines_range_color")
+            else:
+                note = layout.split()
+                if (not domain.use_color_ramp):
+                    note.label(icon='INFO', text="Enable Color Mapping to use range highlighting!")
+                else:
+                    note.label(icon='INFO', text="Range highlighting for flags is not available!")
+
 classes = (
     FLUID_PT_presets,
     PHYSICS_PT_fluid,
diff --git a/source/blender/blenkernel/intern/fluid.c b/source/blender/blenkernel/intern/fluid.c
index bf2cdc11843..b8accf6b0c6 100644
--- a/source/blender/blenkernel/intern/fluid.c
+++ b/source/blender/blenkernel/intern/fluid.c
@@ -4996,6 +4996,12 @@ void BKE_fluid_modifier_create_type_data(struct FluidModifierData *fmd)
     fmd->domain->use_coba = false;
     fmd->domain->coba_field = FLUID_DOMAIN_FIELD_DENSITY;
     fmd->domain->gridlines_color_field = 0;
+    fmd->domain->gridlines_lower_bound = 0.0f;
+    fmd->domain->gridlines_upper_bound = 1.0f;
+    fmd->domain->gridlines_range_color[0] = 1.0f;
+    fmd->domain->gridlines_range_color[1] = 0.0f;
+    fmd->domain->gridlines_range_color[2] = 0.0f;
+    fmd->domain->gridlines_range_color[3] = 1.0f;
 
     /* -- Deprecated / unsed options (below)-- */
 
@@ -5239,6 +5245,12 @@ void BKE_fluid_modifier_copy(const struct FluidModifierData *fmd,
     tfds->coba_field = fds->coba_field;
     tfds->grid_scale = fds->grid_scale;
     tfds->gridlines_color_field = fds->gridlines_color_field;
+    tfds->gridlines_lower_bound = fds->gridlines_lower_bound;
+    tfds->gridlines_upper_bound = fds->gridlines_upper_bound;
+    tfds->gridlines_range_color[0] = fds->gridlines_range_color[0];
+    tfds->gridlines_range_color[1] = fds->gridlines_range_color[1];
+    tfds->gridlines_range_color[2] = fds->gridlines_range_color[2];
+    tfds->gridlines_range_color[3] = fds->gridlines_range_color[3];
 
     /* -- Deprecated / unsed options (below)-- */
 
diff --git a/source/blender/draw/engines/overlay/overlay_extra.c b/source/blender/draw/engines/overlay/overlay_extra.c
index b15ea7fc587..77c7d4e0b6d 100644
--- a/source/blender/draw/engines/overlay/overlay_extra.c
+++ b/source/blender/draw/engines/overlay/overlay_extra.c
@@ -1371,7 +1371,10 @@ static void OVERLAY_volume_extra(OVERLAY_ExtraCallBuffers *cb,
                                (fds->interp_method == VOLUME_INTERP_RAW ||
                                 fds->coba_field == FLUID_DOMAIN_FIELD_FLAGS));
 
-  const bool color_with_flags = (fds->gridlines_color_field == FLUID_DOMAIN_FIELD_FLAGS);
+  const bool color_with_flags = (fds->gridlines_color_field == FLUID_GRIDLINE_COLOR_TYPE_FLAGS);
+
+  const bool color_range = (fds->gridlines_color_field == FLUID_GRIDLINE_COLOR_TYPE_RANGE &&
+                            fds->use_coba && fds->coba_field != FLUID_DOMAIN_FIELD_FLAGS);
 
   /* Small cube showing voxel size. */
   {
@@ -1431,7 +1434,7 @@ static void OVERLAY_volume_extra(OVERLAY_ExtraCallBuffers *cb,
   if (show_gridlines) {
     int line_count = 4 * fds->res[0] * fds->res[1] * fds->res[2] / fds->res[slice_axis];
 
-    GPUShader *sh = OVERLAY_shader_volume_gridlines(color_with_flags);
+    GPUShader *sh = OVERLAY_shader_volume_gridlines(color_with_flags, color_range);
     DRWShadingGroup *grp = DRW_shgroup_create(sh, data->psl->extra_ps[0]);
     DRW_shgroup_uniform_ivec3_copy(grp, "volumeSize", fds->res);
     DRW_shgroup_uniform_float_copy(grp, "slicePosition", fds->slice_depth);
@@ -1439,10 +1442,20 @@ static void OVERLAY_volume_extra(OVERLAY_ExtraCallBuffers *cb,
     DRW_shgroup_uniform_vec3_copy(grp, "domainOriginOffset", fds->p0);
     DRW_shgroup_uniform_ivec3_copy(grp, "adaptiveCellOffset", fds->res_min);
     DRW_shgroup_uniform_int_copy(grp, "sliceAxis", slice_axis);
+
     if (color_with_flags) {
       GPU_create_fluid_flags(fmd);
       DRW_shgroup_uniform_texture(grp, "flagTexture", fds->tex_flags);
     }
+
+    if (color_range) {
+      GPU_create_fluid_range_field(fmd);
+      DRW_shgroup_uniform_texture(grp, "fieldTexture", fds->tex_range_field);
+      DRW_shgroup_uniform_float_copy(grp, "lowerBound", fds->gridlines_lower_bound);
+      DRW_shgroup_uniform_float_copy(grp, "upperBound", fds->gridlines_upper_bound);
+      DRW_shgroup_uniform_vec4_copy(grp, "rangeColor", fds->gridlines_range_color);
+    }
+
     DRW_shgroup_call_procedural_lines(grp, ob, line_count);
   }
 
diff --git a/source/blender/draw/engines/overlay/overlay_private.h b/source/blender/draw/engines/overlay/overlay_private.h
index c0d124f43b7..722f6b840ae 100644
--- a/source/blender/draw/engines/overlay/overlay_private.h
+++ b/source/blender/draw/engines/overlay/overlay_private.h
@@ -623,7 +623,7 @@ GPUShader *OVERLAY_shader_particle_shape(void);
 GPUShader *OVERLAY_shader_pointcloud_dot(void);
 GPUShader *OVERLAY_shader_sculpt_mask(void);
 GPUShader *OVERLAY_shader_volume_velocity(bool use_needle);
-GPUShader *OVERLAY_shader_volume_gridlines(bool color_with_flags);
+GPUShader *OVERLAY_shader_volume_gridlines(bool color_with_flags, bool color_range);
 GPUShader *OVERLAY_shader_wireframe(bool custom_bias);
 GPUShader *OVERLAY_shader_wireframe_select(void);
 GPUShader *OVERLAY_shader_xray_fade(void);
diff --git a/source/blender/draw/engines/overlay/overlay_shader.c b/source/blender/draw/engines/overlay/overlay_shader.c
index 034a3124d33..5a4bb367f81 100644
--- a/source/blender/draw/engines/overlay/overlay_shader.c
+++ b/source/blender/draw/engines/overlay/overlay_shader.c
@@ -199,6 +199,7 @@ typedef struct OVERLAY_Shaders {
   GPUShader *volume_velocity_sh;
   GPUShader *volume_gridlines_sh;
   GPUShader *volume_gridlines_flags_sh;
+  GPUShader *volume_gridlines_range_sh;
   GPUShader *wireframe_select;
   GPUShader *wireframe[2];
   GPUShader *xray_fade;
@@ -1387,7 +1388,7 @@ struct GPUShader *OVERLAY_shader_volume_velocity(bool use_needle)
   return (use_needle) ? sh_data->volume_velocity_needle_sh : sh_data->volume_velocity_sh;
 }
 
-struct GPUShader *OVERLAY_shader_volume_gridlines(bool color_with_flags)
+struct GPUShader *OVERLAY_shader_volume_gridlines(bool color_with_flags, bool color_range)
 {
   OVERLAY_Shaders *sh_data = &e_data.sh_data[0];
   if (!sh_data->volume_gridlines_flags_sh && color_with_flags) {
@@ -1399,6 +1400,15 @@ struct GPUShader *OVERLAY_shader_volume_gridlines(bool color_with_flags)
         "#define blender_srgb_to_framebuffer_space(a) a\n"
         "#define SHOW_FLAGS\n");
   }
+  else if (!sh_data->volume_gridlines_range_sh && color_range) {
+    sh_data->volume_gridlines_range_sh = DRW_shader_create_with_lib(
+        datatoc_volume_gridlines_vert_glsl,
+        NULL,
+        datatoc_gpu_shader_flat_color_frag_glsl,
+        datatoc_common_view_lib_glsl,
+        "#define blender_srgb_to_framebuffer_space(a) a\n"
+        "#define SHOW_RANGE\n");
+  }
   else if (!sh_data->volume_gridlines_sh) {
     sh_data->volume_gridlines_sh = DRW_shader_create_with_lib(
         datatoc_volume_gridlines_vert_glsl,
@@ -1407,7 +1417,15 @@ struct GPUShader *OVERLAY_shader_volume_gridlines(bool color_with_flags)
         datatoc_common_view_lib_glsl,
         "#define blender_srgb_to_framebuffer_space(a) a\n");
   }
-  return (color_with_flags) ? sh_data->volume_gridlines_flags_sh : sh_data->volume_gridlines_sh;
+
+  if (color_with_flags) {
+    return sh_data->volume_gridlines_flags_sh;
+  }
+  if (color_range) {
+    return sh_data->volume_gridlines_range_sh;
+  }
+
+  return sh_data->volume_gridlines_sh;
 }
 
 GPUShader *OVERLAY_shader_wireframe_select(void)
diff --git a/source/blender/draw/engines/overlay/shaders/volume_gridlines_vert.glsl b/source/blender/draw/engines/overlay/shaders/volume_gridlines_vert.glsl
index e6e41bc29a8..ae4d684d5b3 100644
--- a/source/blender/draw/engines/overlay/shaders/volume_gridlines_vert.glsl
+++ b/source/blender/draw/engines/overlay/shaders/volume_gridlines_vert.glsl
@@ -14,6 +14,13 @@ uniform ivec3 adaptiveCellOffset;
 uniform usampler3D flagTexture;
 #endif
 
+#ifdef SHOW_RANGE
+uniform sampler3D fieldTexture;
+uniform float lowerBound = 0.0;
+uniform float upperBound = 0.0;
+uniform vec4 rangeColor;
+#endif
+
 flat out vec4 finalColor;
 
 const vec3 corners[4] = vec3[4](vec3(-0.5, 0.5, 0.0),
@@ -90,6 +97,13 @@ void main()
   finalColor = flag_to_color(flag);
 #endif
 
+#ifdef SHOW_RANGE
+  float value = texelFetch(fieldTexture, cell_co + ivec3(cell_offset), 0).r;
+  if (value >= lowerBound && value <= upperBound) {
+    finalColor = rangeColor;
+  }
+#endif
+
   vec3 pos = domainOriginOffset + cellSize * (vec3(cell_co + adaptiveCellOffset) + cell_offset);
   vec3 rotated_pos = rot_mat * corners[indices[gl_VertexID % 8]];
   pos += rotated_pos * cellSize;
diff --git a/source/blender/gpu/GPU_draw.h b/source/blender/gpu/GPU_draw.h
index c6782a0d579..78f194556ae 100644
--- a/source/blender/gpu/GPU_draw.h
+++ b/source/blender/gpu/GPU_draw.h
@@ -85,6 +85,7 @@ void GPU_create_smoke(struct FluidModifierData *fmd, int highres);
 void GPU_create_smoke_coba_field(struct FluidModifierData *fmd);
 void GPU_create_smoke_velocity(struct FluidModifierData *fmd);
 void GPU_create_fluid_flags(struct FluidModifierData *fmd);
+void GPU_create_fluid_range_field(struct FluidModifierData *fmd);
 
 /* Delayed free of OpenGL buffers by main thread */
 void GPU_free_unused_buffers(void);
diff --git a/source/blender/gpu/intern/gpu_draw_smoke.c b/source/blender/gpu/intern/gpu_draw_smoke.c
index 15d0497dd33..4e5756db9d2 100644
--- a/source/blender/gpu/intern/gpu_dra

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list