[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