[Bf-blender-cvs] [cafe14769f8] soc-2020-fluid-tools: Fluid: Added MAC information interpolation for cell-centered display vectors

Sriharsha Kotcharlakot noreply at git.blender.org
Wed Aug 5 10:19:15 CEST 2020


Commit: cafe14769f8ad77bc37740b2769f5a341a73552b
Author: Sriharsha Kotcharlakot
Date:   Wed Aug 5 13:47:57 2020 +0530
Branches: soc-2020-fluid-tools
https://developer.blender.org/rBcafe14769f8ad77bc37740b2769f5a341a73552b

Fluid: Added MAC information interpolation for cell-centered display vectors

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

M	source/blender/draw/engines/overlay/overlay_extra.c
M	source/blender/draw/engines/overlay/shaders/volume_velocity_vert.glsl

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

diff --git a/source/blender/draw/engines/overlay/overlay_extra.c b/source/blender/draw/engines/overlay/overlay_extra.c
index dee02e0b51f..aa408262660 100644
--- a/source/blender/draw/engines/overlay/overlay_extra.c
+++ b/source/blender/draw/engines/overlay/overlay_extra.c
@@ -1428,6 +1428,7 @@ static void OVERLAY_volume_extra(OVERLAY_ExtraCallBuffers *cb,
   if (draw_velocity) {
     const bool use_needle = (fds->vector_draw_type == VECTOR_DRAW_NEEDLE);
     const bool use_mac = (fds->vector_draw_type == VECTOR_DRAW_MAC);
+    const bool cell_centered = (fds->vector_draw_grid_type == VECTOR_DRAW_GRID_FORCE);
     int line_count = 1;
     if (use_needle) {
       line_count = 6;
@@ -1455,6 +1456,7 @@ 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_uniform_bool_copy(grp, "scaleWithMagnitude", fds->vector_scale_with_magnitude);
+    DRW_shgroup_uniform_bool_copy(grp, "isCellCentered", cell_centered);
     DRW_shgroup_call_procedural_lines(grp, ob, line_count);
   }
 
diff --git a/source/blender/draw/engines/overlay/shaders/volume_velocity_vert.glsl b/source/blender/draw/engines/overlay/shaders/volume_velocity_vert.glsl
index da48eb9d7f2..d3486754cd3 100644
--- a/source/blender/draw/engines/overlay/shaders/volume_velocity_vert.glsl
+++ b/source/blender/draw/engines/overlay/shaders/volume_velocity_vert.glsl
@@ -6,6 +6,7 @@ uniform float displaySize = 1.0;
 uniform float slicePosition;
 uniform int sliceAxis; /* -1 is no slice, 0 is X, 1 is Y, 2 is Z. */
 uniform bool scaleWithMagnitude = false;
+uniform bool isCellCentered = false;
 
 /* FluidDomainSettings.cell_size */
 uniform vec3 cellSize;
@@ -69,6 +70,47 @@ mat3 rotation_from_vector(vec3 v)
   return mat3(T, B, N);
 }
 
+vec3 get_vector(ivec3 cell_co)
+{
+  vec3 vector;
+
+  vector.x = texelFetch(velocityX, cell_co, 0).r;
+  vector.y = texelFetch(velocityY, cell_co, 0).r;
+  vector.z = texelFetch(velocityZ, cell_co, 0).r;
+
+  return vector;
+}
+
+/* interpolate MAC information for cell-centered vectors */
+vec3 get_vector_centered(ivec3 cell_co)
+{
+  vec3 vector;
+
+  vector.x = 0.5 * (texelFetch(velocityX, cell_co, 0).r +
+                    texelFetch(velocityX, ivec3(cell_co.x + 1, cell_co.yz), 0).r);
+  vector.y = 0.5 * (texelFetch(velocityY, cell_co, 0).r +
+                    texelFetch(velocityY, ivec3(cell_co.x, cell_co.y + 1, cell_co.z), 0).r);
+  vector.z = 0.5 * (texelFetch(velocityZ, cell_co, 0).r +
+                    texelFetch(velocityZ, ivec3(cell_co.xy, cell_co.z + 1), 0).r);
+
+  return vector;
+}
+
+/* interpolate cell-centered information for MAC vectors */
+vec3 get_vector_mac(ivec3 cell_co)
+{
+  vec3 vector;
+
+  vector.x = 0.5 * (texelFetch(velocityX, ivec3(cell_co.x - 1, cell_co.yz), 0).r +
+                    texelFetch(velocityX, cell_co, 0).r);
+  vector.y = 0.5 * (texelFetch(velocityY, ivec3(cell_co.x, cell_co.y - 1, cell_co.z), 0).r +
+                    texelFetch(velocityY, cell_co, 0).r);
+  vector.z = 0.5 * (texelFetch(velocityZ, ivec3(cell_co.xy, cell_co.z - 1), 0).r +
+                    texelFetch(velocityZ, cell_co, 0).r);
+
+  return vector;
+}
+
 void main()
 {
 #ifdef USE_NEEDLE
@@ -104,13 +146,11 @@ void main()
 
   vec3 pos = domainOriginOffset + cellSize * (vec3(cell_co + adaptiveCellOffset) + 0.5);
 
-  vec3 velocity;
-  velocity.x = texelFetch(velocityX, cell_co, 0).r;
-  velocity.y = texelFetch(velocityY, cell_co, 0).r;
-  velocity.z = texelFetch(velocityZ, cell_co, 0).r;
+  vec3 vector;
 
 #ifdef USE_MAC
   vec3 color;
+  vector = (isCellCentered) ? get_vector_mac(cell_co) : get_vector(cell_co);
 
   switch (gl_VertexID % 6) {
     case 0: /* tail of X component */
@@ -118,7 +158,7 @@ void main()
       color = vec3(1.0, 0.0, 0.0); /* red */
       break;
     case 1: /* head of X component */
-      pos.x += (-0.5 + velocity.x * displaySize) * cellSize.x;
+      pos.x += (-0.5 + vector.x * displaySize) * cellSize.x;
       color = vec3(1.0, 1.0, 0.0); /* yellow */
       break;
     case 2: /* tail of Y component */
@@ -126,7 +166,7 @@ void main()
       color = vec3(0.0, 1.0, 0.0); /* green */
       break;
     case 3: /* head of Y component */
-      pos.y += (-0.5 + velocity.y * displaySize) * cellSize.y;
+      pos.y += (-0.5 + vector.y * displaySize) * cellSize.y;
       color = vec3(1.0, 1.0, 0.0); /* yellow */
       break;
     case 4: /* tail of Z component */
@@ -134,25 +174,27 @@ void main()
       color = vec3(0.0, 0.0, 1.0); /* blue */
       break;
     case 5: /* head of Z component */
-      pos.z += (-0.5 + velocity.z * displaySize) * cellSize.z;
+      pos.z += (-0.5 + vector.z * displaySize) * cellSize.z;
       color = vec3(1.0, 1.0, 0.0); /* yellow */
       break;
   }
 
   finalColor = vec4(color, 1.0);
 #else
-  finalColor = vec4(weight_to_color(length(velocity)), 1.0);
+  vector = (isCellCentered) ? get_vector(cell_co) : get_vector_centered(cell_co);
+
+  finalColor = vec4(weight_to_color(length(vector)), 1.0);
 
   float vector_length = 1.0;
 
   if (scaleWithMagnitude) {
-    vector_length = length(velocity);
+    vector_length = length(vector);
   }
-  else if (length(velocity) == 0.0) {
+  else if (length(vector) == 0.0) {
     vector_length = 0.0;
   }
 
-  mat3 rot_mat = rotation_from_vector(velocity);
+  mat3 rot_mat = rotation_from_vector(vector);
 
 #  ifdef USE_NEEDLE
   vec3 rotated_pos = rot_mat * corners[indices[gl_VertexID % 12]];



More information about the Bf-blender-cvs mailing list