[Bf-blender-cvs] [dcf44dfe8e0] blender-v2.82-release: Fix T65114 Overlay: Armature: Bones with negative scale have wrong display
Clément Foucault
noreply at git.blender.org
Mon Feb 3 16:17:25 CET 2020
Commit: dcf44dfe8e0b0a084554ecb2cb2d34f0e273d933
Author: Clément Foucault
Date: Mon Feb 3 13:30:41 2020 +0100
Branches: blender-v2.82-release
https://developer.blender.org/rBdcf44dfe8e0b0a084554ecb2cb2d34f0e273d933
Fix T65114 Overlay: Armature: Bones with negative scale have wrong display
This moves the backface culling to the fragment shader to avoid all the
limitations of the current system. This has a cost but it is unlikely that
bone drawing will be a bottleneck.
===================================================================
M source/blender/draw/engines/overlay/overlay_armature.c
M source/blender/draw/engines/overlay/shaders/armature_shape_outline_geom.glsl
M source/blender/draw/engines/overlay/shaders/armature_shape_outline_vert.glsl
M source/blender/draw/engines/overlay/shaders/armature_shape_solid_frag.glsl
M source/blender/draw/engines/overlay/shaders/armature_shape_solid_vert.glsl
===================================================================
diff --git a/source/blender/draw/engines/overlay/overlay_armature.c b/source/blender/draw/engines/overlay/overlay_armature.c
index 0b77fcad265..9fde3ec0902 100644
--- a/source/blender/draw/engines/overlay/overlay_armature.c
+++ b/source/blender/draw/engines/overlay/overlay_armature.c
@@ -186,7 +186,7 @@ void OVERLAY_armature_cache_init(OVERLAY_Data *vedata)
cb->custom_shapes_ghash = BLI_ghash_ptr_new(__func__);
DRWState infront_state = (DRW_state_is_select() && (i == 1)) ? DRW_STATE_IN_FRONT_SELECT : 0;
- state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_CULL_BACK |
+ state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_LESS_EQUAL |
(pd->armature.transparent ? DRW_STATE_BLEND_ALPHA : DRW_STATE_WRITE_DEPTH);
DRW_PASS_CREATE(*p_armature_ps, state | pd->clipping_state | infront_state);
diff --git a/source/blender/draw/engines/overlay/shaders/armature_shape_outline_geom.glsl b/source/blender/draw/engines/overlay/shaders/armature_shape_outline_geom.glsl
index ffc941149c7..db5975ea226 100644
--- a/source/blender/draw/engines/overlay/shaders/armature_shape_outline_geom.glsl
+++ b/source/blender/draw/engines/overlay/shaders/armature_shape_outline_geom.glsl
@@ -7,6 +7,7 @@ in vec3 vPos[];
in vec2 ssPos[];
in vec2 ssNor[];
in vec4 vColSize[];
+in int inverted[];
flat out vec4 finalColor;
flat out vec2 edgeStart;
@@ -39,6 +40,7 @@ void main(void)
}
}
+ n0 = (inverted[0] == 1) ? -n0 : n0;
/* Don't outline if concave edge. */
if (dot(n0, v13) > 0.0001) {
return;
diff --git a/source/blender/draw/engines/overlay/shaders/armature_shape_outline_vert.glsl b/source/blender/draw/engines/overlay/shaders/armature_shape_outline_vert.glsl
index cd9368a997a..b720be0c7d1 100644
--- a/source/blender/draw/engines/overlay/shaders/armature_shape_outline_vert.glsl
+++ b/source/blender/draw/engines/overlay/shaders/armature_shape_outline_vert.glsl
@@ -12,6 +12,7 @@ out vec3 vPos;
out vec2 ssPos;
out vec2 ssNor;
out vec4 vColSize;
+out int inverted;
/* project to screen space */
vec2 proj(vec4 pos)
@@ -30,6 +31,8 @@ void main()
vPos = viewpos.xyz;
pPos = ProjectionMatrix * viewpos;
+ inverted = int(dot(cross(model_mat[0].xyz, model_mat[1].xyz), model_mat[2].xyz) < 0.0);
+
/* This is slow and run per vertex, but it's still faster than
* doing it per instance on CPU and sending it on via instance attribute. */
mat3 normal_mat = transpose(inverse(mat3(model_mat)));
diff --git a/source/blender/draw/engines/overlay/shaders/armature_shape_solid_frag.glsl b/source/blender/draw/engines/overlay/shaders/armature_shape_solid_frag.glsl
index 54cd807edaa..17e8d0da5d9 100644
--- a/source/blender/draw/engines/overlay/shaders/armature_shape_solid_frag.glsl
+++ b/source/blender/draw/engines/overlay/shaders/armature_shape_solid_frag.glsl
@@ -2,12 +2,19 @@
uniform float alpha = 0.6;
in vec4 finalColor;
+flat in int inverted;
layout(location = 0) out vec4 fragColor;
layout(location = 1) out vec4 lineOutput;
void main()
{
+ /* Manual backface cullling.. Not ideal for performance
+ * but needed for view clarity in xray mode and support
+ * for inverted bone matrices. */
+ if ((inverted == 1) == gl_FrontFacing) {
+ discard;
+ }
fragColor = vec4(finalColor.rgb, alpha);
lineOutput = vec4(0.0);
}
diff --git a/source/blender/draw/engines/overlay/shaders/armature_shape_solid_vert.glsl b/source/blender/draw/engines/overlay/shaders/armature_shape_solid_vert.glsl
index 8284bd43adc..a6af7214de1 100644
--- a/source/blender/draw/engines/overlay/shaders/armature_shape_solid_vert.glsl
+++ b/source/blender/draw/engines/overlay/shaders/armature_shape_solid_vert.glsl
@@ -7,6 +7,7 @@ in vec3 nor;
in mat4 inst_obmat;
out vec4 finalColor;
+flat out int inverted;
void main()
{
@@ -18,6 +19,8 @@ void main()
mat3 normal_mat = transpose(inverse(mat3(model_mat)));
vec3 normal = normalize(normal_world_to_view(normal_mat * nor));
+ inverted = int(dot(cross(model_mat[0].xyz, model_mat[1].xyz), model_mat[2].xyz) < 0.0);
+
/* Do lighting at an angle to avoid flat shading on front facing bone. */
const vec3 light = vec3(0.1, 0.1, 0.8);
float n = dot(normal, light);
More information about the Bf-blender-cvs
mailing list