[Bf-blender-cvs] [58da6432d65] soc-2020-fluid-tools: Fluid: Added an option for coloring fluid gridlines with flags.

Sriharsha Kotcharlakot noreply at git.blender.org
Sun Jul 5 17:09:27 CEST 2020


Commit: 58da6432d651a358ed7104455acef47b26fb902c
Author: Sriharsha Kotcharlakot
Date:   Sun Jul 5 20:38:56 2020 +0530
Branches: soc-2020-fluid-tools
https://developer.blender.org/rB58da6432d651a358ed7104455acef47b26fb902c

Fluid: Added an option for coloring fluid gridlines with flags.

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

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 aa97e595a13..1fa27566f6d 100644
--- a/release/scripts/startup/bl_ui/properties_physics_fluid.py
+++ b/release/scripts/startup/bl_ui/properties_physics_fluid.py
@@ -1343,6 +1343,23 @@ class PHYSICS_PT_viewport_display_debug(PhysicButtonsPanel, Panel):
             note.label(icon='INFO', text="Enable Guides first! Defaulting to Fluid Velocity.")
         col.prop(domain, "vector_scale")
 
+class PHYSICS_PT_viewport_display_advanced(PhysicButtonsPanel, Panel):
+    bl_label = "Advanced"
+    bl_parent_id = 'PHYSICS_PT_viewport_display'
+    bl_options = {'DEFAULT_CLOSED'}
+
+    @classmethod
+    def poll(cls, context):
+        return (PhysicButtonsPanel.poll_fluid_domain(context) and context.fluid.domain_settings.show_gridlines)
+
+    def draw(self, context):
+        layout = self.layout
+        layout.use_property_split = True
+
+        domain = context.fluid.domain_settings
+
+        col = layout.column()
+        col.prop(domain, "gridlines_color_field", text="Color Gridlines")
 
 classes = (
     FLUID_PT_presets,
@@ -1369,6 +1386,7 @@ classes = (
     PHYSICS_PT_viewport_display,
     PHYSICS_PT_viewport_display_color,
     PHYSICS_PT_viewport_display_debug,
+    PHYSICS_PT_viewport_display_advanced,
 )
 
 
diff --git a/source/blender/blenkernel/intern/fluid.c b/source/blender/blenkernel/intern/fluid.c
index 9d15538569c..bf2cdc11843 100644
--- a/source/blender/blenkernel/intern/fluid.c
+++ b/source/blender/blenkernel/intern/fluid.c
@@ -4995,6 +4995,7 @@ void BKE_fluid_modifier_create_type_data(struct FluidModifierData *fmd)
     fmd->domain->vector_draw_grid_type = VECTOR_DRAW_GRID_FLUID_VELOCITY;
     fmd->domain->use_coba = false;
     fmd->domain->coba_field = FLUID_DOMAIN_FIELD_DENSITY;
+    fmd->domain->gridlines_color_field = 0;
 
     /* -- Deprecated / unsed options (below)-- */
 
@@ -5237,6 +5238,7 @@ void BKE_fluid_modifier_copy(const struct FluidModifierData *fmd,
     tfds->use_coba = fds->use_coba;
     tfds->coba_field = fds->coba_field;
     tfds->grid_scale = fds->grid_scale;
+    tfds->gridlines_color_field = fds->gridlines_color_field;
 
     /* -- 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 b3bb8beb0e2..b15ea7fc587 100644
--- a/source/blender/draw/engines/overlay/overlay_extra.c
+++ b/source/blender/draw/engines/overlay/overlay_extra.c
@@ -1371,6 +1371,8 @@ 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);
+
   /* Small cube showing voxel size. */
   {
     float min[3];
@@ -1424,14 +1426,12 @@ static void OVERLAY_volume_extra(OVERLAY_ExtraCallBuffers *cb,
     DRW_shgroup_uniform_ivec3_copy(grp, "adaptiveCellOffset", fds->res_min);
     DRW_shgroup_uniform_int_copy(grp, "sliceAxis", slice_axis);
     DRW_shgroup_call_procedural_lines(grp, ob, line_count);
-
-    BLI_addtail(&data->stl->pd->smoke_domains, BLI_genericNodeN(fmd));
   }
 
   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();
+    GPUShader *sh = OVERLAY_shader_volume_gridlines(color_with_flags);
     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,8 +1439,16 @@ 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);
+    }
     DRW_shgroup_call_procedural_lines(grp, ob, line_count);
   }
+
+  if (draw_velocity || show_gridlines) {
+    BLI_addtail(&data->stl->pd->smoke_domains, BLI_genericNodeN(fmd));
+  }
 }
 
 static void OVERLAY_volume_free_smoke_textures(OVERLAY_Data *data)
diff --git a/source/blender/draw/engines/overlay/overlay_private.h b/source/blender/draw/engines/overlay/overlay_private.h
index ddbe505bbf6..c0d124f43b7 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(void);
+GPUShader *OVERLAY_shader_volume_gridlines(bool color_with_flags);
 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 6879f5dde96..034a3124d33 100644
--- a/source/blender/draw/engines/overlay/overlay_shader.c
+++ b/source/blender/draw/engines/overlay/overlay_shader.c
@@ -198,6 +198,7 @@ typedef struct OVERLAY_Shaders {
   GPUShader *volume_velocity_needle_sh;
   GPUShader *volume_velocity_sh;
   GPUShader *volume_gridlines_sh;
+  GPUShader *volume_gridlines_flags_sh;
   GPUShader *wireframe_select;
   GPUShader *wireframe[2];
   GPUShader *xray_fade;
@@ -1386,10 +1387,19 @@ 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(void)
+struct GPUShader *OVERLAY_shader_volume_gridlines(bool color_with_flags)
 {
   OVERLAY_Shaders *sh_data = &e_data.sh_data[0];
-  if (!sh_data->volume_gridlines_sh) {
+  if (!sh_data->volume_gridlines_flags_sh && color_with_flags) {
+    sh_data->volume_gridlines_flags_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_FLAGS\n");
+  }
+  else if (!sh_data->volume_gridlines_sh) {
     sh_data->volume_gridlines_sh = DRW_shader_create_with_lib(
         datatoc_volume_gridlines_vert_glsl,
         NULL,
@@ -1397,7 +1407,7 @@ struct GPUShader *OVERLAY_shader_volume_gridlines(void)
         datatoc_common_view_lib_glsl,
         "#define blender_srgb_to_framebuffer_space(a) a\n");
   }
-  return sh_data->volume_gridlines_sh;
+  return (color_with_flags) ? sh_data->volume_gridlines_flags_sh : 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 dcf147cf029..e6e41bc29a8 100644
--- a/source/blender/draw/engines/overlay/shaders/volume_gridlines_vert.glsl
+++ b/source/blender/draw/engines/overlay/shaders/volume_gridlines_vert.glsl
@@ -10,6 +10,10 @@ uniform vec3 domainOriginOffset;
 /* FluidDomainSettings.res_min */
 uniform ivec3 adaptiveCellOffset;
 
+#ifdef SHOW_FLAGS
+uniform usampler3D flagTexture;
+#endif
+
 flat out vec4 finalColor;
 
 const vec3 corners[4] = vec3[4](vec3(-0.5, 0.5, 0.0),
@@ -19,6 +23,32 @@ const vec3 corners[4] = vec3[4](vec3(-0.5, 0.5, 0.0),
 
 const int indices[8] = int[8](0, 1, 1, 2, 2, 3, 3, 0);
 
+vec4 flag_to_color(uint flag)
+{
+  /* Color mapping for flags */
+  vec4 color = vec4(0.0, 0.0, 0.0, 1.0);
+  /* Cell types: 1 is Fluid, 2 is Obstacle, 4 is Empty, 8 is Inflow, 16 is Outflow */
+  if (bool(flag & uint(1))) {
+    color.rgb += vec3(0.0, 0.0, 0.75); /* blue */
+  }
+  if (bool(flag & uint(2))) {
+    color.rgb += vec3(0.4, 0.4, 0.4); /* gray */
+  }
+  if (bool(flag & uint(4))) {
+    color.rgb += vec3(0.25, 0.0, 0.2); /* dark purple */
+  }
+  if (bool(flag & uint(8))) {
+    color.rgb += vec3(0.0, 0.5, 0.0); /* dark green */
+  }
+  if (bool(flag & uint(16))) {
+    color.rgb += vec3(0.9, 0.3, 0.0); /* orange */
+  }
+  if (color.rgb == vec3(0.0)) {
+    color.rgb += vec3(0.5, 0.0, 0.0); /* medium red */
+  }
+  return color;
+}
+
 void main()
 {
   int cell = gl_VertexID / 8;
@@ -48,18 +78,22 @@ void main()
     rot_mat[2].z = 1.0;
   }
 
-  vec3 cell_co;
-  cell_co.x = float(cell % cell_div.x);
-  cell_co.y = float((cell / cell_div.x) % cell_div.y);
-  cell_co.z = float(cell / (cell_div.x * cell_div.y));
-  cell_co += cell_offset;
+  ivec3 cell_co;
+  cell_co.x = cell % cell_div.x;
+  cell_co.y = (cell / cell_div.x) % cell_div.y;
+  cell_co.z = cell / (cell_div.x * cell_div.y);
+
+  finalColor = vec4(0.0, 0.0, 0.0, 1.0);
 
-  vec3 pos = domainOriginOffset + cellSize * (cell_co + vec3(adaptiveCellOffset));
+#ifdef SHOW_FLAGS
+  uint flag = texelFetch(flagTexture, cell_co + ivec3(cell_offset), 0).r; 
+  finalColor = flag_to_color(flag);
+#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;
 
-  finalColor = vec4(0.0, 0.0, 0.0, 1.0);
-
   vec3 world_pos = point_object_to_world(pos);
   gl_Position = point_world_to_ndc(world_pos);
 }
diff --git a/source/blender/gpu/GPU_draw.h b/source/blender/gpu/GPU_draw.h
index b364bd0ef95..c6782a0d579 100644
--- a/source/blender/gpu/GPU_draw.h
+++ b/source/blender/gpu/GPU_draw.h
@@ -84,6 +84,7 @@ void GPU_free_smoke_velocity(struct FluidModifierData *fmd);
 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

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list