[Bf-blender-cvs] [0236863c6d6] blender-v2.83-release: Fix T73115: In Front Drawing Bone Envelope Distance

Jeroen Bakker noreply at git.blender.org
Fri May 22 15:10:28 CEST 2020


Commit: 0236863c6d66e8332bd06228e9a52d82d645daa0
Author: Jeroen Bakker
Date:   Fri May 22 15:09:01 2020 +0200
Branches: blender-v2.83-release
https://developer.blender.org/rB0236863c6d66e8332bd06228e9a52d82d645daa0

Fix T73115: In Front Drawing Bone Envelope Distance

The in front drawing was not supported for transparent part of the   armature. This patch adds a second transparent pass for drawing in
front.

Reviewed By: Clément Foucault

Differential Revision: https://developer.blender.org/D7763

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

M	source/blender/draw/engines/overlay/overlay_armature.c
M	source/blender/draw/engines/overlay/overlay_private.h

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

diff --git a/source/blender/draw/engines/overlay/overlay_armature.c b/source/blender/draw/engines/overlay/overlay_armature.c
index bbcfcaf777d..c65cdf48206 100644
--- a/source/blender/draw/engines/overlay/overlay_armature.c
+++ b/source/blender/draw/engines/overlay/overlay_armature.c
@@ -137,9 +137,7 @@ void OVERLAY_armature_cache_init(OVERLAY_Data *vedata)
   pd->armature.do_pose_fade_geom = pd->armature.do_pose_xray &&
                                    ((draw_ctx->object_mode & OB_MODE_WEIGHT_PAINT) == 0) &&
                                    draw_ctx->object_pose != NULL;
-
-  DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_BLEND_ADD;
-  DRW_PASS_CREATE(psl->armature_transp_ps, state | pd->clipping_state);
+  DRWState state;
 
   if (pd->armature.do_pose_fade_geom) {
     state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL | DRW_STATE_BLEND_ALPHA;
@@ -163,17 +161,21 @@ void OVERLAY_armature_cache_init(OVERLAY_Data *vedata)
 
     OVERLAY_InstanceFormats *formats = OVERLAY_shader_instance_formats_get();
     OVERLAY_ArmatureCallBuffers *cb = &pd->armature_call_buffers[i];
-    DRWPass **p_armature_ps = &psl->armature_ps[i];
 
     cb->custom_shapes_ghash = BLI_ghash_ptr_new(__func__);
     cb->custom_shapes_transp_ghash = BLI_ghash_ptr_new(__func__);
 
+    DRWPass **p_armature_ps = &psl->armature_ps[i];
     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_WRITE_DEPTH;
     DRW_PASS_CREATE(*p_armature_ps, state | pd->clipping_state | infront_state);
-
     DRWPass *armature_ps = *p_armature_ps;
 
+    DRWPass **p_armature_trans_ps = &psl->armature_transp_ps[i];
+    state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_BLEND_ADD;
+    DRW_PASS_CREATE(*p_armature_trans_ps, state | pd->clipping_state);
+    DRWPass *armature_transp_ps = *p_armature_trans_ps;
+
 #define BUF_INSTANCE DRW_shgroup_call_buffer_instance
 #define BUF_LINE(grp, format) DRW_shgroup_call_buffer(grp, format, GPU_PRIM_LINES)
 
@@ -231,7 +233,7 @@ void OVERLAY_armature_cache_init(OVERLAY_Data *vedata)
       DRW_shgroup_uniform_block_persistent(grp, "globalsBlock", G_draw.block_ubo);
       cb->dof_lines = BUF_INSTANCE(grp, format, DRW_cache_bone_dof_lines_get());
 
-      grp = DRW_shgroup_create(sh, psl->armature_transp_ps);
+      grp = DRW_shgroup_create(sh, armature_transp_ps);
       DRW_shgroup_uniform_block_persistent(grp, "globalsBlock", G_draw.block_ubo);
       cb->dof_sphere = BUF_INSTANCE(grp, format, DRW_cache_bone_dof_sphere_get());
     }
@@ -270,7 +272,7 @@ void OVERLAY_armature_cache_init(OVERLAY_Data *vedata)
       format = formats->instance_bone_envelope_distance;
 
       sh = OVERLAY_shader_armature_envelope(false);
-      grp = DRW_shgroup_create(sh, psl->armature_transp_ps);
+      grp = DRW_shgroup_create(sh, armature_transp_ps);
       DRW_shgroup_uniform_block_persistent(grp, "globalsBlock", G_draw.block_ubo);
       DRW_shgroup_uniform_bool_copy(grp, "isDistance", true);
       DRW_shgroup_state_enable(grp, DRW_STATE_CULL_FRONT);
@@ -2255,7 +2257,7 @@ void OVERLAY_armature_draw(OVERLAY_Data *vedata)
 {
   OVERLAY_PassList *psl = vedata->psl;
 
-  DRW_draw_pass(psl->armature_transp_ps);
+  DRW_draw_pass(psl->armature_transp_ps[0]);
   DRW_draw_pass(psl->armature_ps[0]);
 }
 
@@ -2264,6 +2266,7 @@ void OVERLAY_armature_in_front_draw(OVERLAY_Data *vedata)
   OVERLAY_PassList *psl = vedata->psl;
 
   if (psl->armature_bone_select_ps == NULL || DRW_state_is_select()) {
+    DRW_draw_pass(psl->armature_transp_ps[1]);
     DRW_draw_pass(psl->armature_ps[1]);
   }
 }
@@ -2285,6 +2288,7 @@ void OVERLAY_pose_draw(OVERLAY_Data *vedata)
       GPU_framebuffer_clear_depth(fbl->overlay_line_in_front_fb, 1.0f);
     }
 
+    DRW_draw_pass(psl->armature_transp_ps[1]);
     DRW_draw_pass(psl->armature_ps[1]);
   }
 }
diff --git a/source/blender/draw/engines/overlay/overlay_private.h b/source/blender/draw/engines/overlay/overlay_private.h
index 257cf777ed2..fa7c7f6d090 100644
--- a/source/blender/draw/engines/overlay/overlay_private.h
+++ b/source/blender/draw/engines/overlay/overlay_private.h
@@ -54,7 +54,7 @@ typedef struct OVERLAY_PassList {
   DRWPass *antialiasing_ps;
   DRWPass *armature_ps[2];
   DRWPass *armature_bone_select_ps;
-  DRWPass *armature_transp_ps;
+  DRWPass *armature_transp_ps[2];
   DRWPass *background_ps;
   DRWPass *clipping_frustum_ps;
   DRWPass *edit_curve_wire_ps[2];



More information about the Bf-blender-cvs mailing list