[Bf-blender-cvs] [c0fbc4cfec1] soc-2020-fluid-tools: Fluid: Used procedural lines to draw gridlines

Sriharsha Kotcharlakot noreply at git.blender.org
Fri Jul 3 08:31:38 CEST 2020


Commit: c0fbc4cfec13e0d713bebab6d5e5c8d941b1f965
Author: Sriharsha Kotcharlakot
Date:   Fri Jul 3 12:01:06 2020 +0530
Branches: soc-2020-fluid-tools
https://developer.blender.org/rBc0fbc4cfec13e0d713bebab6d5e5c8d941b1f965

Fluid: Used procedural lines to draw gridlines

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

M	source/blender/draw/CMakeLists.txt
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
A	source/blender/draw/engines/overlay/shaders/volume_gridlines_vert.glsl
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

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

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 1ddae11999b..6ec87d58569 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -391,6 +391,7 @@ data_to_c_simple(engines/overlay/shaders/pointcloud_frag.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/sculpt_mask_vert.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/sculpt_mask_frag.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/volume_velocity_vert.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/volume_gridlines_vert.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/wireframe_vert.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/wireframe_frag.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/xray_fade_frag.glsl SRC)
diff --git a/source/blender/draw/engines/overlay/overlay_extra.c b/source/blender/draw/engines/overlay/overlay_extra.c
index 895adcf6a88..13d4754ed2a 100644
--- a/source/blender/draw/engines/overlay/overlay_extra.c
+++ b/source/blender/draw/engines/overlay/overlay_extra.c
@@ -1365,6 +1365,12 @@ static void OVERLAY_volume_extra(OVERLAY_ExtraCallBuffers *cb,
   const bool draw_velocity = (mds->draw_velocity && mds->fluid &&
                               CFRA >= mds->point_cache[0]->startframe);
 
+  /* Show gridlines only for slices without interpolation */
+  const bool show_gridlines = (mds->show_gridlines &&
+                               (mds->axis_slice_method == AXIS_SLICE_SINGLE) &&
+                               (mds->interp_method == VOLUME_INTERP_RAW ||
+                                mds->coba_field == FLUID_DOMAIN_FIELD_FLAGS));
+
   /* Small cube showing voxel size. */
   {
     float min[3];
@@ -1384,20 +1390,24 @@ static void OVERLAY_volume_extra(OVERLAY_ExtraCallBuffers *cb,
     DRW_buffer_add_entry(cb->empty_cube, color, voxel_cubemat);
   }
 
+  int slice_axis = -1;
+
+  if (mds->axis_slice_method == AXIS_SLICE_SINGLE) {
+    float viewinv[4][4];
+    DRW_view_viewmat_get(NULL, viewinv, true);
+
+    const int axis = (mds->slice_axis == SLICE_AXIS_AUTO) ? axis_dominant_v3_single(viewinv[2]) :
+                                                            mds->slice_axis - 1;
+    slice_axis = axis;
+  }
+
   if (draw_velocity) {
     const bool use_needle = (mds->vector_draw_type == VECTOR_DRAW_NEEDLE);
     int line_count = (use_needle) ? 6 : 1;
-    int slice_axis = -1;
     line_count *= mds->res[0] * mds->res[1] * mds->res[2];
 
     if (mds->axis_slice_method == AXIS_SLICE_SINGLE) {
-      float viewinv[4][4];
-      DRW_view_viewmat_get(NULL, viewinv, true);
-
-      const int axis = (mds->slice_axis == SLICE_AXIS_AUTO) ? axis_dominant_v3_single(viewinv[2]) :
-                                                              mds->slice_axis - 1;
-      slice_axis = axis;
-      line_count /= mds->res[axis];
+      line_count /= mds->res[slice_axis];
     }
 
     GPU_create_smoke_velocity(mmd);
@@ -1417,6 +1427,20 @@ static void OVERLAY_volume_extra(OVERLAY_ExtraCallBuffers *cb,
 
     BLI_addtail(&data->stl->pd->smoke_domains, BLI_genericNodeN(mmd));
   }
+
+  if (show_gridlines) {
+    int line_count = 4 * mds->res[0] * mds->res[1] * mds->res[2] / mds->res[slice_axis];
+
+    GPUShader *sh = OVERLAY_shader_volume_gridlines();
+    DRWShadingGroup *grp = DRW_shgroup_create(sh, data->psl->extra_ps[0]);
+    DRW_shgroup_uniform_ivec3_copy(grp, "volumeSize", mds->res);
+    DRW_shgroup_uniform_float_copy(grp, "slicePosition", mds->slice_depth);
+    DRW_shgroup_uniform_vec3_copy(grp, "cellSize", mds->cell_size);
+    DRW_shgroup_uniform_vec3_copy(grp, "domainOriginOffset", mds->p0);
+    DRW_shgroup_uniform_ivec3_copy(grp, "adaptiveCellOffset", mds->res_min);
+    DRW_shgroup_uniform_int_copy(grp, "sliceAxis", slice_axis);
+    DRW_shgroup_call_procedural_lines(grp, ob, line_count);
+  }
 }
 
 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 b643b8f535f..452e1ae5137 100644
--- a/source/blender/draw/engines/overlay/overlay_private.h
+++ b/source/blender/draw/engines/overlay/overlay_private.h
@@ -618,6 +618,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_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 edf91c99531..6879f5dde96 100644
--- a/source/blender/draw/engines/overlay/overlay_shader.c
+++ b/source/blender/draw/engines/overlay/overlay_shader.c
@@ -108,6 +108,7 @@ extern char datatoc_pointcloud_frag_glsl[];
 extern char datatoc_sculpt_mask_vert_glsl[];
 extern char datatoc_sculpt_mask_frag_glsl[];
 extern char datatoc_volume_velocity_vert_glsl[];
+extern char datatoc_volume_gridlines_vert_glsl[];
 extern char datatoc_wireframe_vert_glsl[];
 extern char datatoc_wireframe_frag_glsl[];
 extern char datatoc_xray_fade_frag_glsl[];
@@ -196,6 +197,7 @@ typedef struct OVERLAY_Shaders {
   GPUShader *uniform_color;
   GPUShader *volume_velocity_needle_sh;
   GPUShader *volume_velocity_sh;
+  GPUShader *volume_gridlines_sh;
   GPUShader *wireframe_select;
   GPUShader *wireframe[2];
   GPUShader *xray_fade;
@@ -1384,6 +1386,20 @@ 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)
+{
+  OVERLAY_Shaders *sh_data = &e_data.sh_data[0];
+  if (!sh_data->volume_gridlines_sh) {
+    sh_data->volume_gridlines_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");
+  }
+  return sh_data->volume_gridlines_sh;
+}
+
 GPUShader *OVERLAY_shader_wireframe_select(void)
 {
   const DRWContextState *draw_ctx = DRW_context_state_get();
diff --git a/source/blender/draw/engines/overlay/shaders/volume_gridlines_vert.glsl b/source/blender/draw/engines/overlay/shaders/volume_gridlines_vert.glsl
new file mode 100644
index 00000000000..dcf147cf029
--- /dev/null
+++ b/source/blender/draw/engines/overlay/shaders/volume_gridlines_vert.glsl
@@ -0,0 +1,65 @@
+uniform float slicePosition;
+uniform int sliceAxis; /* -1 is no slice, 0 is X, 1 is Y, 2 is Z. */
+
+/* FluidDomainSettings.res */
+uniform ivec3 volumeSize;
+/* FluidDomainSettings.cell_size */
+uniform vec3 cellSize;
+/* FluidDomainSettings.p0 */
+uniform vec3 domainOriginOffset;
+/* FluidDomainSettings.res_min */
+uniform ivec3 adaptiveCellOffset;
+
+flat out vec4 finalColor;
+
+const vec3 corners[4] = vec3[4](vec3(-0.5, 0.5, 0.0),
+                                vec3(0.5, 0.5, 0.0),
+                                vec3(0.5, -0.5, 0.0),
+                                vec3(-0.5, -0.5, 0.0));
+
+const int indices[8] = int[8](0, 1, 1, 2, 2, 3, 3, 0);
+
+void main()
+{
+  int cell = gl_VertexID / 8;
+  mat3 rot_mat = mat3(0.0);
+
+  vec3 cell_offset = vec3(0.5);
+  ivec3 cell_div = volumeSize;
+  if (sliceAxis == 0) {
+    cell_offset.x = slicePosition * float(volumeSize.x);
+    cell_div.x = 1;
+    rot_mat[2].x = 1.0;
+    rot_mat[0].y = 1.0;
+    rot_mat[1].z = 1.0;
+  }
+  else if (sliceAxis == 1) {
+    cell_offset.y = slicePosition * float(volumeSize.y);
+    cell_div.y = 1;
+    rot_mat[1].x = 1.0;
+    rot_mat[2].y = 1.0;
+    rot_mat[0].z = 1.0;
+  }
+  else if (sliceAxis == 2) {
+    cell_offset.z = slicePosition * float(volumeSize.z);
+    cell_div.z = 1;
+    rot_mat[0].x = 1.0;
+    rot_mat[1].y = 1.0;
+    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;
+
+  vec3 pos = domainOriginOffset + cellSize * (cell_co + vec3(adaptiveCellOffset));
+  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/draw/engines/workbench/shaders/workbench_volume_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl
index 4f4544488c8..ff194524d76 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl
@@ -26,7 +26,6 @@ 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 showGridlines = false;
 
 #ifdef VOLUME_SLICE
 in vec3 localPos;
@@ -54,25 +53,6 @@ float line_unit_box_intersect_dist(vec3 lineorigin, vec3 linedirection)
   return max_v3(furthestplane);
 }
 
-bool on_gridline(vec3 texture_size, vec3 co)
-{
-  if (!showGridlines) {
-    return false;
-  }
-  vec3 texel_size = 1.0 / texture_size;
-  vec3 offset = mod(co, texel_size);
-  offset = min(offset, texel_size - offset);
-  vec3 gridline_thickness = 0.025 * texel_size;
-  if (((sliceAxis == 0) && (offset.y < gridline_thickness.y || offset.z < gridline_thickness.z)) ||
-      ((sliceAxis == 1) && (offset.x < gridline_thickness.x || offset.z < gridline_thickness.z)) ||
-      ((sliceAxis == 2) && (offset.x < gridline_thickness.x || offset.y < gridline_thickness.y))) {
-    return true;
-  }
-  else {
-    return false;
-  }
-}
-
 #define sample_trilinear(ima, co) texture(ima, co)
 
 vec4 sample_tricubic(sampler3D ima, vec3 co)
@@ -138,15 +118,6 @@ vec4 sample_raw(sampler3D ima, vec3 co)
 void volume_properties(vec3 ls_pos, out vec3 scattering, out float extinction)
 {
   vec3 co = ls_pos * 0.5 + 0.5;
-#if defined(VOLUME_SLICE) && (defined(USE_RAW) ||

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list