From 6c6ecdd2306b9680ac171b9b80d4a9911fdb8a19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Mon, 30 Jul 2018 14:17:53 +0200 Subject: Armature: Fix bone always transparent when enabling MSAA --- source/blender/draw/intern/draw_armature.c | 29 +++++++++++++--------- source/blender/draw/intern/draw_common.c | 10 +++++--- source/blender/draw/intern/draw_common.h | 10 ++++---- source/blender/draw/modes/edit_armature_mode.c | 25 +++++++++++-------- source/blender/draw/modes/pose_mode.c | 12 +++++---- .../shaders/armature_envelope_solid_frag.glsl | 4 ++- .../modes/shaders/armature_shape_solid_frag.glsl | 4 ++- .../modes/shaders/armature_sphere_solid_frag.glsl | 4 +-- 8 files changed, 58 insertions(+), 40 deletions(-) (limited to 'source') diff --git a/source/blender/draw/intern/draw_armature.c b/source/blender/draw/intern/draw_armature.c index f0a32dfc8e0..8cd7431cfc0 100644 --- a/source/blender/draw/intern/draw_armature.c +++ b/source/blender/draw/intern/draw_armature.c @@ -95,6 +95,8 @@ static struct { DRWShadingGroup *lines_ik_spline; DRWArmaturePasses passes; + + bool transparent; } g_data = {NULL}; @@ -139,7 +141,8 @@ static void drw_shgroup_bone_octahedral( } if (g_data.bone_octahedral_solid == NULL) { struct GPUBatch *geom = DRW_cache_bone_octahedral_get(); - g_data.bone_octahedral_solid = shgroup_instance_bone_shape_solid(g_data.passes.bone_solid, geom); + g_data.bone_octahedral_solid = shgroup_instance_bone_shape_solid(g_data.passes.bone_solid, geom, + g_data.transparent); } float final_bonemat[4][4]; mul_m4_m4m4(final_bonemat, g_data.ob->obmat, bone_mat); @@ -160,7 +163,7 @@ static void drw_shgroup_bone_box( } if (g_data.bone_box_solid == NULL) { struct GPUBatch *geom = DRW_cache_bone_box_get(); - g_data.bone_box_solid = shgroup_instance_bone_shape_solid(g_data.passes.bone_solid, geom); + g_data.bone_box_solid = shgroup_instance_bone_shape_solid(g_data.passes.bone_solid, geom, g_data.transparent); } float final_bonemat[4][4]; mul_m4_m4m4(final_bonemat, g_data.ob->obmat, bone_mat); @@ -234,13 +237,13 @@ static void drw_shgroup_bone_envelope( g_data.bone_point_wire = shgroup_instance_bone_sphere_outline(g_data.passes.bone_wire); } if (g_data.bone_point_solid == NULL) { - g_data.bone_point_solid = shgroup_instance_bone_sphere_solid(g_data.passes.bone_solid); + g_data.bone_point_solid = shgroup_instance_bone_sphere_solid(g_data.passes.bone_solid, g_data.transparent); } if (g_data.bone_envelope_wire == NULL) { g_data.bone_envelope_wire = shgroup_instance_bone_envelope_outline(g_data.passes.bone_wire); } if (g_data.bone_envelope_solid == NULL) { - g_data.bone_envelope_solid = shgroup_instance_bone_envelope_solid(g_data.passes.bone_solid); + g_data.bone_envelope_solid = shgroup_instance_bone_envelope_solid(g_data.passes.bone_solid, g_data.transparent); /* We can have a lot of overdraw if we don't do this. Also envelope are not subject to * inverted matrix. */ DRW_shgroup_state_enable(g_data.bone_envelope_solid, DRW_STATE_CULL_BACK); @@ -329,7 +332,8 @@ static void drw_shgroup_bone_custom_solid( } if (surf) { - DRWShadingGroup *shgrp_geom_solid = shgroup_instance_bone_shape_solid(g_data.passes.bone_solid, surf); + DRWShadingGroup *shgrp_geom_solid = shgroup_instance_bone_shape_solid(g_data.passes.bone_solid, surf, + g_data.transparent); DRW_shgroup_call_dynamic_add(shgrp_geom_solid, final_bonemat, bone_color, hint_color); } @@ -372,7 +376,7 @@ static void drw_shgroup_bone_point( g_data.bone_point_wire = shgroup_instance_bone_sphere_outline(g_data.passes.bone_wire); } if (g_data.bone_point_solid == NULL) { - g_data.bone_point_solid = shgroup_instance_bone_sphere_solid(g_data.passes.bone_solid); + g_data.bone_point_solid = shgroup_instance_bone_sphere_solid(g_data.passes.bone_solid, g_data.transparent); } float final_bonemat[4][4]; mul_m4_m4m4(final_bonemat, g_data.ob->obmat, bone_mat); @@ -1732,11 +1736,12 @@ static void draw_armature_pose(Object *ob, const float const_color[4]) /** * This function set the object space to use for all subsequent `DRW_shgroup_bone_*` calls. */ -static void drw_shgroup_armature(Object *ob, DRWArmaturePasses passes) +static void drw_shgroup_armature(Object *ob, DRWArmaturePasses passes, bool transp) { memset(&g_data, 0x0, sizeof(g_data)); g_data.ob = ob; g_data.passes = passes; + g_data.transparent = transp; memset(&g_color, 0x0, sizeof(g_color)); } @@ -1745,19 +1750,19 @@ void DRW_shgroup_armature_object(Object *ob, ViewLayer *view_layer, DRWArmatureP float *color; DRW_object_wire_theme_get(ob, view_layer, &color); passes.bone_envelope = NULL; /* Don't do envelope distance in object mode. */ - drw_shgroup_armature(ob, passes); + drw_shgroup_armature(ob, passes, false); draw_armature_pose(ob, color); } -void DRW_shgroup_armature_pose(Object *ob, DRWArmaturePasses passes) +void DRW_shgroup_armature_pose(Object *ob, DRWArmaturePasses passes, bool transp) { - drw_shgroup_armature(ob, passes); + drw_shgroup_armature(ob, passes, transp); draw_armature_pose(ob, NULL); } -void DRW_shgroup_armature_edit(Object *ob, DRWArmaturePasses passes) +void DRW_shgroup_armature_edit(Object *ob, DRWArmaturePasses passes, bool transp) { - drw_shgroup_armature(ob, passes); + drw_shgroup_armature(ob, passes, transp); draw_armature_edit(ob); } diff --git a/source/blender/draw/intern/draw_common.c b/source/blender/draw/intern/draw_common.c index c9fc5eba079..77d6e888771 100644 --- a/source/blender/draw/intern/draw_common.c +++ b/source/blender/draw/intern/draw_common.c @@ -552,7 +552,7 @@ DRWShadingGroup *shgroup_instance_bone_envelope_distance(DRWPass *pass) return grp; } -DRWShadingGroup *shgroup_instance_bone_envelope_solid(DRWPass *pass) +DRWShadingGroup *shgroup_instance_bone_envelope_solid(DRWPass *pass, bool transp) { if (g_shaders.bone_envelope == NULL) { g_shaders.bone_envelope = DRW_shader_create( @@ -572,6 +572,7 @@ DRWShadingGroup *shgroup_instance_bone_envelope_solid(DRWPass *pass) g_shaders.bone_envelope, pass, DRW_cache_bone_envelope_solid_get(), g_formats.instance_bone_envelope); + DRW_shgroup_uniform_float_copy(grp, "alpha", transp ? 0.6f : 1.0f); return grp; } @@ -623,7 +624,7 @@ DRWShadingGroup *shgroup_instance_bone_shape_outline(DRWPass *pass, struct GPUBa return grp; } -DRWShadingGroup *shgroup_instance_bone_shape_solid(DRWPass *pass, struct GPUBatch *geom) +DRWShadingGroup *shgroup_instance_bone_shape_solid(DRWPass *pass, struct GPUBatch *geom, bool transp) { if (g_shaders.shape_solid == NULL) { g_shaders.shape_solid = DRW_shader_create( @@ -641,11 +642,12 @@ DRWShadingGroup *shgroup_instance_bone_shape_solid(DRWPass *pass, struct GPUBatc g_shaders.shape_solid, pass, geom, g_formats.instance_bone); DRW_shgroup_uniform_vec2(grp, "viewportSize", DRW_viewport_size_get(), 1); + DRW_shgroup_uniform_float_copy(grp, "alpha", transp ? 0.6f : 1.0f); return grp; } -DRWShadingGroup *shgroup_instance_bone_sphere_solid(DRWPass *pass) +DRWShadingGroup *shgroup_instance_bone_sphere_solid(DRWPass *pass, bool transp) { if (g_shaders.bone_sphere == NULL) { g_shaders.bone_sphere = DRW_shader_create( @@ -662,6 +664,8 @@ DRWShadingGroup *shgroup_instance_bone_sphere_solid(DRWPass *pass) DRWShadingGroup *grp = DRW_shgroup_instance_create( g_shaders.bone_sphere, pass, DRW_cache_bone_point_get(), g_formats.instance_bone); + /* More transparent than the shape to be less distractive. */ + DRW_shgroup_uniform_float_copy(grp, "alpha", transp ? 0.4f : 1.0f); return grp; } diff --git a/source/blender/draw/intern/draw_common.h b/source/blender/draw/intern/draw_common.h index 80b2ec8db71..0ad1402f29e 100644 --- a/source/blender/draw/intern/draw_common.h +++ b/source/blender/draw/intern/draw_common.h @@ -128,11 +128,11 @@ struct DRWShadingGroup *shgroup_instance_mball_handles(struct DRWPass *pass); struct DRWShadingGroup *shgroup_instance_bone_axes(struct DRWPass *pass); struct DRWShadingGroup *shgroup_instance_bone_envelope_distance(struct DRWPass *pass); struct DRWShadingGroup *shgroup_instance_bone_envelope_outline(struct DRWPass *pass); -struct DRWShadingGroup *shgroup_instance_bone_envelope_solid(struct DRWPass *pass); +struct DRWShadingGroup *shgroup_instance_bone_envelope_solid(struct DRWPass *pass, bool transp); struct DRWShadingGroup *shgroup_instance_bone_shape_outline(struct DRWPass *pass, struct GPUBatch *geom); -struct DRWShadingGroup *shgroup_instance_bone_shape_solid(struct DRWPass *pass, struct GPUBatch *geom); +struct DRWShadingGroup *shgroup_instance_bone_shape_solid(struct DRWPass *pass, struct GPUBatch *geom, bool transp); struct DRWShadingGroup *shgroup_instance_bone_sphere_outline(struct DRWPass *pass); -struct DRWShadingGroup *shgroup_instance_bone_sphere_solid(struct DRWPass *pass); +struct DRWShadingGroup *shgroup_instance_bone_sphere_solid(struct DRWPass *pass, bool transp); struct DRWShadingGroup *shgroup_instance_bone_stick(struct DRWPass *pass); struct GPUShader *mpath_line_shader_get(void); @@ -155,8 +155,8 @@ typedef struct DRWArmaturePasses { } DRWArmaturePasses; void DRW_shgroup_armature_object(struct Object *ob, struct ViewLayer *view_layer, struct DRWArmaturePasses passes); -void DRW_shgroup_armature_pose(struct Object *ob, struct DRWArmaturePasses passes); -void DRW_shgroup_armature_edit(struct Object *ob, struct DRWArmaturePasses passes); +void DRW_shgroup_armature_pose(struct Object *ob, struct DRWArmaturePasses passes, bool transp); +void DRW_shgroup_armature_edit(struct Object *ob, struct DRWArmaturePasses passes, bool transp); /* draw_hair.c */ diff --git a/source/blender/draw/modes/edit_armature_mode.c b/source/blender/draw/modes/edit_armature_mode.c index 285e703afbf..1e8293b5dbb 100644 --- a/source/blender/draw/modes/edit_armature_mode.c +++ b/source/blender/draw/modes/edit_armature_mode.c @@ -60,7 +60,7 @@ typedef struct EDIT_ARMATURE_Data { /* *********** STATIC *********** */ typedef struct EDIT_ARMATURE_PrivateData { - char pad; /* UNUSED */ + bool transparent_bones; } EDIT_ARMATURE_PrivateData; /* Transient data */ /* *********** FUNCTIONS *********** */ @@ -69,15 +69,18 @@ static void EDIT_ARMATURE_cache_init(void *vedata) { EDIT_ARMATURE_PassList *psl = ((EDIT_ARMATURE_Data *)vedata)->psl; EDIT_ARMATURE_StorageList *stl = ((EDIT_ARMATURE_Data *)vedata)->stl; + const DRWContextState *draw_ctx = DRW_context_state_get(); if (!stl->g_data) { /* Alloc transient pointers */ - stl->g_data = MEM_mallocN(sizeof(*stl->g_data), __func__); + stl->g_data = MEM_callocN(sizeof(*stl->g_data), __func__); } + stl->g_data->transparent_bones = (draw_ctx->v3d->overlay.arm_flag & V3D_OVERLAY_ARM_TRANSP_BONES) != 0; { /* Solid bones */ - DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_CULL_BACK; + DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_CULL_BACK; + state |= (stl->g_data->transparent_bones) ? DRW_STATE_BLEND : DRW_STATE_WRITE_DEPTH; psl->bone_solid = DRW_pass_create("Bone Solid Pass", state); } @@ -116,10 +119,12 @@ static void EDIT_ARMATURE_cache_init(void *vedata) static void EDIT_ARMATURE_cache_populate(void *vedata, Object *ob) { bArmature *arm = ob->data; - EDIT_ARMATURE_PassList *psl = ((EDIT_ARMATURE_Data *)vedata)->psl; if (ob->type == OB_ARMATURE) { if (arm->edbo) { + EDIT_ARMATURE_PassList *psl = ((EDIT_ARMATURE_Data *)vedata)->psl; + EDIT_ARMATURE_StorageList *stl = ((EDIT_ARMATURE_Data *)vedata)->stl; + DRWArmaturePasses passes = { .bone_solid = psl->bone_solid, .bone_outline = psl->bone_outline, @@ -128,7 +133,7 @@ static void EDIT_ARMATURE_cache_populate(void *vedata, Object *ob) .bone_axes = psl->bone_axes, .relationship_lines = psl->relationship, }; - DRW_shgroup_armature_edit(ob, passes); + DRW_shgroup_armature_edit(ob, passes, stl->g_data->transparent_bones); } } } @@ -136,22 +141,20 @@ static void EDIT_ARMATURE_cache_populate(void *vedata, Object *ob) static void EDIT_ARMATURE_draw_scene(void *vedata) { EDIT_ARMATURE_PassList *psl = ((EDIT_ARMATURE_Data *)vedata)->psl; + EDIT_ARMATURE_StorageList *stl = ((EDIT_ARMATURE_Data *)vedata)->stl; DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get(); DefaultTextureList *dtxl = DRW_viewport_texture_list_get(); - const DRWContextState *draw_ctx = DRW_context_state_get(); - const bool transparent_bones = (draw_ctx->v3d->overlay.arm_flag & V3D_OVERLAY_ARM_TRANSP_BONES) != 0; DRW_draw_pass(psl->bone_envelope); - if (transparent_bones) { - DRW_pass_state_add(psl->bone_solid, DRW_STATE_BLEND); - DRW_pass_state_remove(psl->bone_solid, DRW_STATE_WRITE_DEPTH); + if (stl->g_data->transparent_bones) { + /* For performance reason, avoid blending on MS target. */ DRW_draw_pass(psl->bone_solid); } MULTISAMPLE_SYNC_ENABLE(dfbl, dtxl) - if (!transparent_bones) { + if (!stl->g_data->transparent_bones) { DRW_draw_pass(psl->bone_solid); } diff --git a/source/blender/draw/modes/pose_mode.c b/source/blender/draw/modes/pose_mode.c index 040195b889b..7a4abcac179 100644 --- a/source/blender/draw/modes/pose_mode.c +++ b/source/blender/draw/modes/pose_mode.c @@ -75,6 +75,7 @@ typedef struct POSE_PrivateData { DRWShadingGroup *bone_selection_invert_shgrp; float blend_color[4]; float blend_color_invert[4]; + bool transparent_bones; } POSE_PrivateData; /* Transient data */ static struct { @@ -112,9 +113,10 @@ static void POSE_cache_init(void *vedata) if (!stl->g_data) { /* Alloc transient pointers */ - stl->g_data = MEM_mallocN(sizeof(*stl->g_data), __func__); + stl->g_data = MEM_callocN(sizeof(*stl->g_data), __func__); } POSE_PrivateData *ppd = stl->g_data; + ppd->transparent_bones = (draw_ctx->v3d->overlay.arm_flag & V3D_OVERLAY_ARM_TRANSP_BONES) != 0; { /* Solid bones */ @@ -195,7 +197,7 @@ static bool POSE_is_driven_by_active_armature(Object *ob) static void POSE_cache_populate(void *vedata, Object *ob) { POSE_PassList *psl = ((POSE_Data *)vedata)->psl; - POSE_StorageList *stl = ((POSE_Data *)vedata)->stl; + POSE_PrivateData *ppd = ((POSE_Data *)vedata)->stl->g_data; const DRWContextState *draw_ctx = DRW_context_state_get(); /* In the future this will allow us to implement face gizmos, @@ -214,7 +216,7 @@ static void POSE_cache_populate(void *vedata, Object *ob) .bone_axes = psl->bone_axes, .relationship_lines = psl->relationship, }; - DRW_shgroup_armature_pose(ob, passes); + DRW_shgroup_armature_pose(ob, passes, ppd->transparent_bones); } } else if (ob->type == OB_MESH && @@ -224,10 +226,10 @@ static void POSE_cache_populate(void *vedata, Object *ob) struct GPUBatch *geom = DRW_cache_object_surface_get(ob); if (geom) { if (POSE_is_driven_by_active_armature(ob)) { - DRW_shgroup_call_object_add(stl->g_data->bone_selection_shgrp, geom, ob); + DRW_shgroup_call_object_add(ppd->bone_selection_shgrp, geom, ob); } else { - DRW_shgroup_call_object_add(stl->g_data->bone_selection_invert_shgrp, geom, ob); + DRW_shgroup_call_object_add(ppd->bone_selection_invert_shgrp, geom, ob); } } } diff --git a/source/blender/draw/modes/shaders/armature_envelope_solid_frag.glsl b/source/blender/draw/modes/shaders/armature_envelope_solid_frag.glsl index b20656ff326..78b29296601 100644 --- a/source/blender/draw/modes/shaders/armature_envelope_solid_frag.glsl +++ b/source/blender/draw/modes/shaders/armature_envelope_solid_frag.glsl @@ -1,4 +1,6 @@ +uniform float alpha = 0.6; + flat in vec3 finalStateColor; flat in vec3 finalBoneColor; in vec3 normalView; @@ -12,5 +14,5 @@ void main() float n = normalize(normalView).z; float fac = clamp((n * (1.0 - s)) + s, 0.0, 1.0); fragColor.rgb = mix(finalStateColor, finalBoneColor, fac); - fragColor.a = 0.6; /* Hardcoded transparency factor. */ + fragColor.a = alpha; } diff --git a/source/blender/draw/modes/shaders/armature_shape_solid_frag.glsl b/source/blender/draw/modes/shaders/armature_shape_solid_frag.glsl index 89f4d97f29b..45748bf5644 100644 --- a/source/blender/draw/modes/shaders/armature_shape_solid_frag.glsl +++ b/source/blender/draw/modes/shaders/armature_shape_solid_frag.glsl @@ -1,9 +1,11 @@ +uniform float alpha = 0.6; + in vec4 finalColor; out vec4 fragColor; void main() { - fragColor = vec4(finalColor.rgb, 0.6); /* Hardcoded transparency factor. */ + fragColor = vec4(finalColor.rgb, alpha); } diff --git a/source/blender/draw/modes/shaders/armature_sphere_solid_frag.glsl b/source/blender/draw/modes/shaders/armature_sphere_solid_frag.glsl index 3c80f629d79..a0fdd55931f 100644 --- a/source/blender/draw/modes/shaders/armature_sphere_solid_frag.glsl +++ b/source/blender/draw/modes/shaders/armature_sphere_solid_frag.glsl @@ -3,6 +3,7 @@ uniform mat4 ViewMatrixInverse; uniform mat4 ProjectionMatrix; +uniform float alpha = 0.4; flat in vec3 finalStateColor; flat in vec3 finalBoneColor; @@ -73,8 +74,7 @@ void main() float dither = (0.5 + dot(vec2(ivec2(gl_FragCoord.xy) & ivec2(1)), vec2(1.0, 2.0))) * 0.25; dither *= (1.0 / 255.0); /* Assume 8bit per color buffer. */ - /* Hardcoded transparency factor. Less than shape to be less distractive. */ - fragColor = vec4(fragColor.rgb + dither, 0.4); + fragColor = vec4(fragColor.rgb + dither, alpha); t /= ray_len; gl_FragDepth = get_depth_from_view_z(ray_dir_view.z * t + ray_ori_view.z); -- cgit v1.2.3