[Bf-blender-cvs] [f06af897231] temp-T95933-object-mode-curve-selection: Fix pushing thickness when curve doens't have a thickness.

Jeroen Bakker noreply at git.blender.org
Fri Jul 1 09:00:00 CEST 2022


Commit: f06af89723138796ca7e17037da2cdc6ce00dd09
Author: Jeroen Bakker
Date:   Fri Jul 1 08:49:37 2022 +0200
Branches: temp-T95933-object-mode-curve-selection
https://developer.blender.org/rBf06af89723138796ca7e17037da2cdc6ce00dd09

Fix pushing thickness when curve doens't have a thickness.

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

M	source/blender/draw/engines/overlay/shaders/overlay_outline_prepass_curves_vert.glsl
M	source/blender/draw/intern/shaders/common_hair_lib.glsl

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

diff --git a/source/blender/draw/engines/overlay/shaders/overlay_outline_prepass_curves_vert.glsl b/source/blender/draw/engines/overlay/shaders/overlay_outline_prepass_curves_vert.glsl
index 2cd05353984..6b57cb27169 100644
--- a/source/blender/draw/engines/overlay/shaders/overlay_outline_prepass_curves_vert.glsl
+++ b/source/blender/draw/engines/overlay/shaders/overlay_outline_prepass_curves_vert.glsl
@@ -31,29 +31,31 @@ void main()
 {
   bool is_persp = (ProjectionMatrix[3][3] == 0.0);
   float time, thick_time, thickness;
-  vec3 world_pos, tan, binor;
-  hair_get_pos_tan_binor_time(is_persp,
-                              ModelMatrixInverse,
-                              ViewMatrixInverse[3].xyz,
-                              ViewMatrixInverse[2].xyz,
-                              world_pos,
-                              tan,
-                              binor,
-                              time,
-                              thickness,
-                              thick_time);
+  vec3 center_world_pos, world_pos, tan, binor;
+
+  hair_get_pos_tan_binor_time_ex(is_persp,
+                                 ModelMatrixInverse,
+                                 ViewMatrixInverse[3].xyz,
+                                 ViewMatrixInverse[2].xyz,
+                                 center_world_pos,
+                                 world_pos,
+                                 tan,
+                                 binor,
+                                 time,
+                                 thickness,
+                                 thick_time);
 
   vec4 pos_ndc = point_world_to_ndc(world_pos);
 
-#if 0
-  /* TODO: make screen size aware. */
   if (hairThicknessRes > 1) {
-    vec3 orig_pos;
-    orig_pos = world_pos + binor * -thick_time;
-    vec4 orig_pos_ndc = point_world_to_ndc(orig_pos);
+    if (thick_time == 0.0) {
+      float thick_time = ((gl_VertexID % hairThicknessRes) == 0 ? -1.0 : 1.0) * 0.0001;
+      world_pos = center_world_pos + binor * thick_time;
+    }
     vec3 pos_view = point_world_to_view(world_pos);
-    vec3 orig_pos_view = point_world_to_view(orig_pos);
+    vec3 orig_pos_view = point_world_to_view(center_world_pos);
     vec3 d = pos_view - orig_pos_view;
+    /* TODO: make screen size aware. */
     float distance = length(d.xy);
     if (distance < 0.0001) {
       distance = 0.0001;
@@ -61,12 +63,11 @@ void main()
     pos_view = orig_pos_view + distance * normalize(d);
     pos_ndc = point_view_to_ndc(pos_view);
   }
-#endif
 
   gl_Position = pos_ndc;
 
 #ifdef USE_GEOM
-  vert.pos = point_world_to_view(world_pos);
+  vert.pos = point_world_to_view(world_pos);  // TODO: use pos_view...
 #endif
 
   /* Small bias to always be on top of the geom. */
diff --git a/source/blender/draw/intern/shaders/common_hair_lib.glsl b/source/blender/draw/intern/shaders/common_hair_lib.glsl
index d6bde2ac2ec..097a1af0fea 100644
--- a/source/blender/draw/intern/shaders/common_hair_lib.glsl
+++ b/source/blender/draw/intern/shaders/common_hair_lib.glsl
@@ -164,41 +164,42 @@ float hair_shaperadius(float shape, float root, float tip, float time)
 in float dummy;
 #  endif
 
-void hair_get_pos_tan_binor_time(bool is_persp,
-                                 mat4 invmodel_mat,
-                                 vec3 camera_pos,
-                                 vec3 camera_z,
-                                 out vec3 wpos,
-                                 out vec3 wtan,
-                                 out vec3 wbinor,
-                                 out float time,
-                                 out float thickness,
-                                 out float thick_time)
+void hair_get_pos_tan_binor_time_ex(bool is_persp,
+                                    mat4 invmodel_mat,
+                                    vec3 camera_pos,
+                                    vec3 camera_z,
+                                    out vec3 orig_wpos,
+                                    out vec3 wpos,
+                                    out vec3 wtan,
+                                    out vec3 wbinor,
+                                    out float time,
+                                    out float thickness,
+                                    out float thick_time)
 {
   int id = hair_get_base_id();
   vec4 data = texelFetch(hairPointBuffer, id);
-  wpos = data.point_position;
+  orig_wpos = data.point_position;
   time = data.point_time;
 
 #  if defined(OS_MAC) && defined(GPU_OPENGL)
   /* Generate a dummy read to avoid the driver bug with shaders having no
    * vertex reads on macOS (T60171) */
-  wpos.y += dummy * 0.0;
+  orig_wpos.y += dummy * 0.0;
 #  endif
 
   if (time == 0.0) {
     /* Hair root */
-    wtan = texelFetch(hairPointBuffer, id + 1).point_position - wpos;
+    wtan = texelFetch(hairPointBuffer, id + 1).point_position - orig_wpos;
   }
   else {
-    wtan = wpos - texelFetch(hairPointBuffer, id - 1).point_position;
+    wtan = orig_wpos - texelFetch(hairPointBuffer, id - 1).point_position;
   }
 
   mat4 obmat = hairDupliMatrix;
-  wpos = (obmat * vec4(wpos, 1.0)).xyz;
+  orig_wpos = (obmat * vec4(orig_wpos, 1.0)).xyz;
   wtan = -normalize(mat3(obmat) * wtan);
 
-  vec3 camera_vec = (is_persp) ? camera_pos - wpos : camera_z;
+  vec3 camera_vec = (is_persp) ? camera_pos - orig_wpos : camera_z;
   wbinor = normalize(cross(camera_vec, wtan));
 
   thickness = hair_shaperadius(hairRadShape, hairRadRoot, hairRadTip, time);
@@ -211,14 +212,38 @@ void hair_get_pos_tan_binor_time(bool is_persp,
      * NOTE: This only works fine with uniform scaling. */
     float scale = 1.0 / length(mat3(invmodel_mat) * wbinor);
     thick_time *= scale;  // HACK: thick_time is now in world space...
-
-    wpos += wbinor * thick_time;
   }
   else {
     /* NOTE: Ensures 'hairThickTime' is initialized -
      * avoids undefined behavior on certain macOS configurations. */
     thick_time = 0.0;
   }
+  wpos = orig_wpos + wbinor * thick_time;
+}
+
+void hair_get_pos_tan_binor_time(bool is_persp,
+                                 mat4 invmodel_mat,
+                                 vec3 camera_pos,
+                                 vec3 camera_z,
+                                 out vec3 wpos,
+                                 out vec3 wtan,
+                                 out vec3 wbinor,
+                                 out float time,
+                                 out float thickness,
+                                 out float thick_time)
+{
+  vec3 orig_wpos;
+  hair_get_pos_tan_binor_time_ex(is_persp,
+                                 invmodel_mat,
+                                 camera_pos,
+                                 camera_z,
+                                 orig_wpos,
+                                 wpos,
+                                 wtan,
+                                 wbinor,
+                                 time,
+                                 thickness,
+                                 thick_time);
 }
 
 float hair_get_customdata_float(const samplerBuffer cd_buf)



More information about the Bf-blender-cvs mailing list