diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2020-02-03 19:31:26 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2020-02-03 19:31:26 +0300 |
commit | 7799890d8e7514186cf252daa5f8ccd713122007 (patch) | |
tree | eef5f18da8329f8227a5f07aa0c212e52019f8f4 /source/blender/draw | |
parent | ed8e110b5ab37bdb112bef2d6698d5f42eb2a0df (diff) | |
parent | 3125cfceec35ef14374ae98f9a400e7a678287a2 (diff) |
Merge branch 'blender-v2.82-release'
Diffstat (limited to 'source/blender/draw')
6 files changed, 67 insertions, 24 deletions
diff --git a/source/blender/draw/engines/overlay/overlay_armature.c b/source/blender/draw/engines/overlay/overlay_armature.c index 416283e321b..97290abe4b7 100644 --- a/source/blender/draw/engines/overlay/overlay_armature.c +++ b/source/blender/draw/engines/overlay/overlay_armature.c @@ -185,10 +185,10 @@ void OVERLAY_armature_cache_init(OVERLAY_Data *vedata) 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__); 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 | - (pd->armature.transparent ? DRW_STATE_BLEND_ALPHA : DRW_STATE_WRITE_DEPTH); + 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; @@ -202,32 +202,44 @@ void OVERLAY_armature_cache_init(OVERLAY_Data *vedata) sh = OVERLAY_shader_armature_sphere(false); grp = DRW_shgroup_create(sh, armature_ps); DRW_shgroup_uniform_block_persistent(grp, "globalsBlock", G_draw.block_ubo); - DRW_shgroup_uniform_float_copy(grp, "alpha", pd->armature.transparent ? 0.4f : 1.0f); + DRW_shgroup_uniform_float_copy(grp, "alpha", 1.0f); cb->point_solid = BUF_INSTANCE(grp, format, DRW_cache_bone_point_get()); + grp = DRW_shgroup_create(sh, armature_ps); + DRW_shgroup_state_disable(grp, DRW_STATE_WRITE_DEPTH); + DRW_shgroup_state_enable(grp, DRW_STATE_BLEND_ALPHA); + DRW_shgroup_uniform_float_copy(grp, "alpha", 0.4f); + cb->point_transp = BUF_INSTANCE(grp, format, DRW_cache_bone_point_get()); + sh = OVERLAY_shader_armature_shape(false); - cb->custom_solid = grp = DRW_shgroup_create(sh, armature_ps); + grp = DRW_shgroup_create(sh, armature_ps); DRW_shgroup_uniform_block_persistent(grp, "globalsBlock", G_draw.block_ubo); - DRW_shgroup_uniform_float_copy(grp, "alpha", pd->armature.transparent ? 0.6f : 1.0f); + DRW_shgroup_uniform_float_copy(grp, "alpha", 1.0f); + cb->custom_solid = grp; cb->box_solid = BUF_INSTANCE(grp, format, DRW_cache_bone_box_get()); cb->octa_solid = BUF_INSTANCE(grp, format, DRW_cache_bone_octahedral_get()); + grp = DRW_shgroup_create(sh, armature_ps); + DRW_shgroup_state_disable(grp, DRW_STATE_WRITE_DEPTH); + DRW_shgroup_state_enable(grp, DRW_STATE_BLEND_ALPHA); + DRW_shgroup_uniform_float_copy(grp, "alpha", 0.6f); + cb->custom_transp = grp; + cb->box_transp = BUF_INSTANCE(grp, format, DRW_cache_bone_box_get()); + cb->octa_transp = BUF_INSTANCE(grp, format, DRW_cache_bone_octahedral_get()); + sh = OVERLAY_shader_armature_sphere(true); grp = DRW_shgroup_create(sh, armature_ps); - DRW_shgroup_state_disable(grp, DRW_STATE_BLEND_ALPHA); DRW_shgroup_uniform_block_persistent(grp, "globalsBlock", G_draw.block_ubo); cb->point_outline = BUF_INSTANCE(grp, format, DRW_cache_bone_point_wire_outline_get()); sh = OVERLAY_shader_armature_shape(true); cb->custom_outline = grp = DRW_shgroup_create(sh, armature_ps); - DRW_shgroup_state_disable(grp, DRW_STATE_BLEND_ALPHA); DRW_shgroup_uniform_block_persistent(grp, "globalsBlock", G_draw.block_ubo); cb->box_outline = BUF_INSTANCE(grp, format, DRW_cache_bone_box_wire_get()); cb->octa_outline = BUF_INSTANCE(grp, format, DRW_cache_bone_octahedral_wire_get()); sh = OVERLAY_shader_armature_shape_wire(); cb->custom_wire = grp = DRW_shgroup_create(sh, armature_ps); - DRW_shgroup_state_disable(grp, DRW_STATE_BLEND_ALPHA); DRW_shgroup_uniform_block_persistent(grp, "globalsBlock", G_draw.block_ubo); } { @@ -236,7 +248,6 @@ void OVERLAY_armature_cache_init(OVERLAY_Data *vedata) sh = OVERLAY_shader_armature_degrees_of_freedom(); grp = DRW_shgroup_create(sh, armature_ps); DRW_shgroup_uniform_block_persistent(grp, "globalsBlock", G_draw.block_ubo); - DRW_shgroup_state_disable(grp, DRW_STATE_BLEND_ALPHA); cb->dof_lines = BUF_INSTANCE(grp, format, DRW_cache_bone_dof_lines_get()); grp = DRW_shgroup_create(sh, psl->armature_transp_ps); @@ -256,16 +267,22 @@ void OVERLAY_armature_cache_init(OVERLAY_Data *vedata) sh = OVERLAY_shader_armature_envelope(false); grp = DRW_shgroup_create(sh, armature_ps); + DRW_shgroup_state_enable(grp, DRW_STATE_CULL_BACK); DRW_shgroup_uniform_block_persistent(grp, "globalsBlock", G_draw.block_ubo); DRW_shgroup_uniform_bool_copy(grp, "isDistance", false); - DRW_shgroup_uniform_float_copy(grp, "alpha", pd->armature.transparent ? 0.6f : 1.0f); + DRW_shgroup_uniform_float_copy(grp, "alpha", 1.0f); cb->envelope_solid = BUF_INSTANCE(grp, format, DRW_cache_bone_envelope_solid_get()); + grp = DRW_shgroup_create(sh, armature_ps); + DRW_shgroup_state_disable(grp, DRW_STATE_WRITE_DEPTH); + DRW_shgroup_state_enable(grp, DRW_STATE_BLEND_ALPHA | DRW_STATE_CULL_BACK); + DRW_shgroup_uniform_float_copy(grp, "alpha", 0.6f); + cb->envelope_transp = BUF_INSTANCE(grp, format, DRW_cache_bone_envelope_solid_get()); + format = formats->instance_bone_envelope_outline; sh = OVERLAY_shader_armature_envelope(true); grp = DRW_shgroup_create(sh, armature_ps); - DRW_shgroup_state_disable(grp, DRW_STATE_BLEND_ALPHA); DRW_shgroup_uniform_block_persistent(grp, "globalsBlock", G_draw.block_ubo); cb->envelope_outline = BUF_INSTANCE(grp, format, DRW_cache_bone_envelope_outline_get()); @@ -283,7 +300,6 @@ void OVERLAY_armature_cache_init(OVERLAY_Data *vedata) sh = OVERLAY_shader_armature_wire(); grp = DRW_shgroup_create(sh, armature_ps); - DRW_shgroup_state_disable(grp, DRW_STATE_BLEND_ALPHA); DRW_shgroup_uniform_block_persistent(grp, "globalsBlock", G_draw.block_ubo); cb->wire = BUF_LINE(grp, format); } @@ -2221,9 +2237,12 @@ static void armature_context_setup(ArmatureDrawContext *ctx, const bool is_pose_mode, float *const_color) { + const bool is_object_mode = !do_envelope_dist; const bool is_xray = (ob->dtx & OB_DRAWXRAY) != 0 || (pd->armature.do_pose_fade_geom && is_pose_mode); - const bool is_filled = !pd->armature.transparent || do_envelope_dist; + const bool draw_as_wire = (ob->dt < OB_SOLID); + const bool is_filled = (!pd->armature.transparent && !draw_as_wire) || !is_object_mode; + const bool is_transparent = pd->armature.transparent || (draw_as_wire && !is_object_mode); bArmature *arm = ob->data; OVERLAY_ArmatureCallBuffers *cb = &pd->armature_call_buffers[is_xray]; @@ -2232,7 +2251,9 @@ static void armature_context_setup(ArmatureDrawContext *ctx, switch (arm->drawtype) { case ARM_ENVELOPE: ctx->envelope_outline = cb->envelope_outline; - ctx->envelope_solid = (is_filled) ? cb->envelope_solid : NULL; + ctx->envelope_solid = (is_filled) ? + (is_transparent ? cb->envelope_transp : cb->envelope_solid) : + NULL; ctx->envelope_distance = (do_envelope_dist) ? cb->envelope_distance : NULL; break; case ARM_LINE: @@ -2243,31 +2264,31 @@ static void armature_context_setup(ArmatureDrawContext *ctx, break; case ARM_B_BONE: ctx->outline = cb->box_outline; - ctx->solid = (is_filled) ? cb->box_solid : NULL; + ctx->solid = (is_filled) ? (is_transparent ? cb->box_transp : cb->box_solid) : NULL; break; case ARM_OCTA: ctx->outline = cb->octa_outline; - ctx->solid = (is_filled) ? cb->octa_solid : NULL; + ctx->solid = (is_filled) ? (is_transparent ? cb->octa_transp : cb->octa_solid) : NULL; break; } ctx->ob = ob; ctx->extras = &pd->extra_call_buffers[is_xray]; ctx->dof_lines = cb->dof_lines; ctx->dof_sphere = cb->dof_sphere; - ctx->point_solid = (is_filled) ? cb->point_solid : NULL; + ctx->point_solid = (is_filled) ? (is_transparent ? cb->point_transp : cb->point_solid) : NULL; ctx->point_outline = cb->point_outline; - ctx->custom_solid = (is_filled) ? cb->custom_solid : NULL; + ctx->custom_solid = (is_filled) ? (is_transparent ? cb->custom_transp : cb->custom_solid) : NULL; ctx->custom_outline = cb->custom_outline; ctx->custom_wire = cb->custom_wire; - ctx->custom_shapes_ghash = cb->custom_shapes_ghash; - ctx->transparent = pd->armature.transparent; + ctx->custom_shapes_ghash = is_transparent ? cb->custom_shapes_transp_ghash : + cb->custom_shapes_ghash; ctx->show_relations = pd->armature.show_relations; ctx->do_relations = !DRW_state_is_select() && pd->armature.show_relations && (is_edit_mode | is_pose_mode); ctx->const_color = DRW_state_is_select() ? select_const_color : const_color; ctx->const_wire = (((ob->base_flag & BASE_SELECTED) || (arm->drawtype == ARM_WIRE)) ? 1.5f : - ((ctx->transparent) ? 1.0f : 0.0f)); + ((!is_filled || is_transparent) ? 1.0f : 0.0f)); /** See: 'set_pchan_color'*/ #define NO_ALPHA(c) (((c)[3] = 1.0f), (c)) @@ -2363,6 +2384,7 @@ void OVERLAY_armature_cache_finish(OVERLAY_Data *vedata) if (pd->armature_call_buffers[i].custom_shapes_ghash) { /* TODO(fclem): Do not free it for each frame but reuse it. Avoiding alloc cost. */ BLI_ghash_free(pd->armature_call_buffers[i].custom_shapes_ghash, NULL, NULL); + BLI_ghash_free(pd->armature_call_buffers[i].custom_shapes_transp_ghash, NULL, NULL); } } } diff --git a/source/blender/draw/engines/overlay/overlay_private.h b/source/blender/draw/engines/overlay/overlay_private.h index 996ee845799..afec20b477d 100644 --- a/source/blender/draw/engines/overlay/overlay_private.h +++ b/source/blender/draw/engines/overlay/overlay_private.h @@ -177,6 +177,7 @@ typedef struct OVERLAY_ExtraCallBuffers { typedef struct OVERLAY_ArmatureCallBuffers { DRWCallBuffer *box_outline; DRWCallBuffer *box_solid; + DRWCallBuffer *box_transp; DRWCallBuffer *dof_lines; DRWCallBuffer *dof_sphere; @@ -184,20 +185,25 @@ typedef struct OVERLAY_ArmatureCallBuffers { DRWCallBuffer *envelope_distance; DRWCallBuffer *envelope_outline; DRWCallBuffer *envelope_solid; + DRWCallBuffer *envelope_transp; DRWCallBuffer *octa_outline; DRWCallBuffer *octa_solid; + DRWCallBuffer *octa_transp; DRWCallBuffer *point_outline; DRWCallBuffer *point_solid; + DRWCallBuffer *point_transp; DRWCallBuffer *stick; DRWCallBuffer *wire; - DRWShadingGroup *custom_solid; DRWShadingGroup *custom_outline; + DRWShadingGroup *custom_solid; + DRWShadingGroup *custom_transp; DRWShadingGroup *custom_wire; + GHash *custom_shapes_transp_ghash; GHash *custom_shapes_ghash; } OVERLAY_ArmatureCallBuffers; 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..6398426952c 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; @@ -68,7 +70,7 @@ void main(void) /* Offset away from the center to avoid overlap with solid shape. */ gl_Position.xy += (edge_dir - perp) * sizeViewportInv.xy * gl_Position.w; /* Improve AA bleeding inside bone silhouette. */ - gl_Position.z -= 1e-4; + gl_Position.z -= (is_persp) ? 1e-4 : 1e-6; edgeStart = edgePos = ((gl_Position.xy / gl_Position.w) * 0.5 + 0.5) * sizeViewport.xy; #ifdef USE_WORLD_CLIP_PLANES world_clip_planes_set_clip_distance(gl_in[1].gl_ClipDistance); @@ -79,7 +81,7 @@ void main(void) /* Offset away from the center to avoid overlap with solid shape. */ gl_Position.xy += (edge_dir + perp) * sizeViewportInv.xy * gl_Position.w; /* Improve AA bleeding inside bone silhouette. */ - gl_Position.z -= 1e-4; + gl_Position.z -= (is_persp) ? 1e-4 : 1e-6; edgeStart = edgePos = ((gl_Position.xy / gl_Position.w) * 0.5 + 0.5) * sizeViewport.xy; #ifdef USE_WORLD_CLIP_PLANES world_clip_planes_set_clip_distance(gl_in[2].gl_ClipDistance); 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); |