Bone Overlay: support changing bone wireframe opacity.

When weight painting the bone overlay is extremely intrusive,
effectively requiring either extensive use of hiding individual
bones, or disabling the whole bone overlay between selections.

This addresses the issue by adding a bone opacity slider that
is used for the 'wireframe' armature drawing mode. It directly
controls the uniform opacity as a straightforward option.

Differential Revision: https://developer.blender.org/D11804
This commit is contained in:
Alexander Gavrilov 2022-01-06 15:42:45 +03:00
parent 7bcf21e66e
commit 1785286ecc
Notes: blender-bot 2023-09-23 09:37:05 +02:00
Referenced by issue #112765, Bone opacity option clash with the object/mode overlay split
11 changed files with 235 additions and 60 deletions

View File

@ -6504,18 +6504,38 @@ class VIEW3D_PT_overlay_sculpt(Panel):
row.prop(overlay, "sculpt_mode_face_sets_opacity", text="Face Sets")
class VIEW3D_PT_overlay_pose(Panel):
class VIEW3D_PT_overlay_bones(Panel):
bl_space_type = 'VIEW_3D'
bl_region_type = 'HEADER'
bl_parent_id = 'VIEW3D_PT_overlay'
bl_label = "Pose Mode"
bl_label = "Bones"
@staticmethod
def is_using_wireframe(context):
shading = VIEW3D_PT_shading.get_shading(context)
if shading.type == 'WIREFRAME' or shading.show_xray:
return True
mode = context.mode
if mode in ('POSE', 'PAINT_WEIGHT'):
armature = context.pose_object
elif mode == 'EDIT_ARMATURE':
armature = context.edit_object
else:
return False
return armature and armature.display_type == 'WIRE'
@classmethod
def poll(cls, context):
mode = context.mode
return (
(mode == 'POSE') or
(mode == 'PAINT_WEIGHT' and context.pose_object)
(mode == 'PAINT_WEIGHT' and context.pose_object) or
(mode in ('EDIT_ARMATURE', 'OBJECT') and
VIEW3D_PT_overlay_bones.is_using_wireframe(context))
)
def draw(self, context):
@ -6534,10 +6554,13 @@ class VIEW3D_PT_overlay_pose(Panel):
sub = row.row()
sub.active = display_all and overlay.show_xray_bone
sub.prop(overlay, "xray_alpha_bone", text="Fade Geometry")
else:
elif mode == 'PAINT_WEIGHT':
row = col.row()
row.prop(overlay, "show_xray_bone")
if VIEW3D_PT_overlay_bones.is_using_wireframe(context):
col.prop(overlay, "bone_wire_alpha")
class VIEW3D_PT_overlay_texture_paint(Panel):
bl_space_type = 'VIEW_3D'
@ -7705,7 +7728,7 @@ classes = (
VIEW3D_PT_overlay_texture_paint,
VIEW3D_PT_overlay_vertex_paint,
VIEW3D_PT_overlay_weight_paint,
VIEW3D_PT_overlay_pose,
VIEW3D_PT_overlay_bones,
VIEW3D_PT_overlay_sculpt,
VIEW3D_PT_snapping,
VIEW3D_PT_proportional_edit,

View File

@ -45,6 +45,8 @@
#include "DNA_listBase.h"
#include "DNA_material_types.h"
#include "DNA_modifier_types.h"
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
#include "DNA_text_types.h"
#include "DNA_workspace_types.h"
@ -2526,5 +2528,19 @@ void blo_do_versions_300(FileData *fd, Library *UNUSED(lib), Main *bmain)
}
}
}
/* Initialize the bone wireframe opacity setting. */
if (!DNA_struct_elem_find(fd->filesdna, "View3DOverlay", "float", "bone_wire_alpha")) {
for (bScreen *screen = bmain->screens.first; screen; screen = screen->id.next) {
LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
if (sl->spacetype == SPACE_VIEW3D) {
View3D *v3d = (View3D *)sl;
v3d->overlay.bone_wire_alpha = 1.0f;
}
}
}
}
}
}
}

View File

@ -139,6 +139,10 @@ 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;
const float wire_alpha = pd->overlay.bone_wire_alpha;
const bool use_wire_alpha = (wire_alpha < 1.0f);
DRWState state;
if (pd->armature.do_pose_fade_geom) {
@ -164,8 +168,8 @@ void OVERLAY_armature_cache_init(OVERLAY_Data *vedata)
OVERLAY_InstanceFormats *formats = OVERLAY_shader_instance_formats_get();
OVERLAY_ArmatureCallBuffers *cb = &pd->armature_call_buffers[i];
cb->custom_shapes_ghash = BLI_ghash_ptr_new(__func__);
cb->custom_shapes_transp_ghash = BLI_ghash_ptr_new(__func__);
cb->solid.custom_shapes_ghash = BLI_ghash_ptr_new(__func__);
cb->transp.custom_shapes_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;
@ -189,44 +193,85 @@ void OVERLAY_armature_cache_init(OVERLAY_Data *vedata)
grp = DRW_shgroup_create(sh, armature_ps);
DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
DRW_shgroup_uniform_float_copy(grp, "alpha", 1.0f);
cb->point_solid = BUF_INSTANCE(grp, format, DRW_cache_bone_point_get());
cb->solid.point_fill = 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());
DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
DRW_shgroup_uniform_float_copy(grp, "alpha", wire_alpha * 0.4f);
cb->transp.point_fill = BUF_INSTANCE(grp, format, DRW_cache_bone_point_get());
sh = OVERLAY_shader_armature_shape(false);
grp = DRW_shgroup_create(sh, armature_ps);
DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
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());
cb->solid.custom_fill = grp;
cb->solid.box_fill = BUF_INSTANCE(grp, format, DRW_cache_bone_box_get());
cb->solid.octa_fill = 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());
DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
DRW_shgroup_uniform_float_copy(grp, "alpha", wire_alpha * 0.6f);
cb->transp.custom_fill = grp;
cb->transp.box_fill = BUF_INSTANCE(grp, format, DRW_cache_bone_box_get());
cb->transp.octa_fill = BUF_INSTANCE(grp, format, DRW_cache_bone_octahedral_get());
sh = OVERLAY_shader_armature_sphere(true);
grp = DRW_shgroup_create(sh, armature_ps);
DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
cb->point_outline = BUF_INSTANCE(grp, format, DRW_cache_bone_point_wire_outline_get());
DRW_shgroup_uniform_float_copy(grp, "alpha", 1.0f);
cb->solid.point_outline = BUF_INSTANCE(grp, format, DRW_cache_bone_point_wire_outline_get());
if (use_wire_alpha) {
grp = DRW_shgroup_create(sh, armature_ps);
DRW_shgroup_state_enable(grp, DRW_STATE_BLEND_ALPHA);
DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
DRW_shgroup_uniform_float_copy(grp, "alpha", wire_alpha);
cb->transp.point_outline = BUF_INSTANCE(
grp, format, DRW_cache_bone_point_wire_outline_get());
}
else {
cb->transp.point_outline = cb->solid.point_outline;
}
sh = OVERLAY_shader_armature_shape(true);
cb->custom_outline = grp = DRW_shgroup_create(sh, armature_ps);
cb->solid.custom_outline = grp = DRW_shgroup_create(sh, armature_ps);
DRW_shgroup_uniform_block(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());
DRW_shgroup_uniform_float_copy(grp, "alpha", 1.0f);
cb->solid.box_outline = BUF_INSTANCE(grp, format, DRW_cache_bone_box_wire_get());
cb->solid.octa_outline = BUF_INSTANCE(grp, format, DRW_cache_bone_octahedral_wire_get());
if (use_wire_alpha) {
cb->transp.custom_outline = grp = DRW_shgroup_create(sh, armature_ps);
DRW_shgroup_state_enable(grp, DRW_STATE_BLEND_ALPHA);
DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
DRW_shgroup_uniform_float_copy(grp, "alpha", wire_alpha);
cb->transp.box_outline = BUF_INSTANCE(grp, format, DRW_cache_bone_box_wire_get());
cb->transp.octa_outline = BUF_INSTANCE(grp, format, DRW_cache_bone_octahedral_wire_get());
}
else {
cb->transp.custom_outline = cb->solid.custom_outline;
cb->transp.box_outline = cb->solid.box_outline;
cb->transp.octa_outline = cb->solid.octa_outline;
}
sh = OVERLAY_shader_armature_shape_wire();
cb->custom_wire = grp = DRW_shgroup_create(sh, armature_ps);
cb->solid.custom_wire = grp = DRW_shgroup_create(sh, armature_ps);
DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
DRW_shgroup_uniform_float_copy(grp, "alpha", 1.0f);
if (use_wire_alpha) {
cb->transp.custom_wire = grp = DRW_shgroup_create(sh, armature_ps);
DRW_shgroup_state_enable(grp, DRW_STATE_BLEND_ALPHA);
DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
DRW_shgroup_uniform_float_copy(grp, "alpha", wire_alpha);
}
else {
cb->transp.custom_wire = cb->solid.custom_wire;
}
}
{
format = formats->instance_extra;
@ -234,12 +279,35 @@ void OVERLAY_armature_cache_init(OVERLAY_Data *vedata)
sh = OVERLAY_shader_armature_degrees_of_freedom_wire();
grp = DRW_shgroup_create(sh, armature_ps);
DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
cb->dof_lines = BUF_INSTANCE(grp, format, DRW_cache_bone_dof_lines_get());
DRW_shgroup_uniform_float_copy(grp, "alpha", 1.0f);
cb->solid.dof_lines = BUF_INSTANCE(grp, format, DRW_cache_bone_dof_lines_get());
if (use_wire_alpha) {
grp = DRW_shgroup_create(sh, armature_ps);
DRW_shgroup_state_enable(grp, DRW_STATE_BLEND_ALPHA);
DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
DRW_shgroup_uniform_float_copy(grp, "alpha", wire_alpha);
cb->transp.dof_lines = BUF_INSTANCE(grp, format, DRW_cache_bone_dof_lines_get());
}
else {
cb->transp.dof_lines = cb->solid.dof_lines;
}
sh = OVERLAY_shader_armature_degrees_of_freedom_solid();
grp = DRW_shgroup_create(sh, armature_transp_ps);
DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
cb->dof_sphere = BUF_INSTANCE(grp, format, DRW_cache_bone_dof_sphere_get());
DRW_shgroup_uniform_float_copy(grp, "alpha", 1.0f);
cb->solid.dof_sphere = BUF_INSTANCE(grp, format, DRW_cache_bone_dof_sphere_get());
if (use_wire_alpha) {
grp = DRW_shgroup_create(sh, armature_transp_ps);
DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
DRW_shgroup_uniform_float_copy(grp, "alpha", wire_alpha);
cb->transp.dof_sphere = BUF_INSTANCE(grp, format, DRW_cache_bone_dof_sphere_get());
}
else {
cb->transp.dof_sphere = cb->solid.dof_sphere;
}
}
{
format = formats->instance_bone_stick;
@ -247,7 +315,19 @@ void OVERLAY_armature_cache_init(OVERLAY_Data *vedata)
sh = OVERLAY_shader_armature_stick();
grp = DRW_shgroup_create(sh, armature_ps);
DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
cb->stick = BUF_INSTANCE(grp, format, DRW_cache_bone_stick_get());
DRW_shgroup_uniform_float_copy(grp, "alpha", 1.0f);
cb->solid.stick = BUF_INSTANCE(grp, format, DRW_cache_bone_stick_get());
if (use_wire_alpha) {
grp = DRW_shgroup_create(sh, armature_ps);
DRW_shgroup_state_enable(grp, DRW_STATE_BLEND_ALPHA);
DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
DRW_shgroup_uniform_float_copy(grp, "alpha", wire_alpha);
cb->transp.stick = BUF_INSTANCE(grp, format, DRW_cache_bone_stick_get());
}
else {
cb->transp.stick = cb->solid.stick;
}
}
{
format = formats->instance_bone_envelope;
@ -258,29 +338,57 @@ void OVERLAY_armature_cache_init(OVERLAY_Data *vedata)
DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
DRW_shgroup_uniform_bool_copy(grp, "isDistance", false);
DRW_shgroup_uniform_float_copy(grp, "alpha", 1.0f);
cb->envelope_solid = BUF_INSTANCE(grp, format, DRW_cache_bone_envelope_solid_get());
cb->solid.envelope_fill = 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());
DRW_shgroup_uniform_float_copy(grp, "alpha", wire_alpha * 0.6f);
cb->transp.envelope_fill = 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_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
cb->envelope_outline = BUF_INSTANCE(grp, format, DRW_cache_bone_envelope_outline_get());
DRW_shgroup_uniform_float_copy(grp, "alpha", 1.0f);
cb->solid.envelope_outline = BUF_INSTANCE(
grp, format, DRW_cache_bone_envelope_outline_get());
if (use_wire_alpha) {
grp = DRW_shgroup_create(sh, armature_ps);
DRW_shgroup_state_enable(grp, DRW_STATE_BLEND_ALPHA);
DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
DRW_shgroup_uniform_float_copy(grp, "alpha", wire_alpha);
cb->transp.envelope_outline = BUF_INSTANCE(
grp, format, DRW_cache_bone_envelope_outline_get());
}
else {
cb->transp.envelope_outline = cb->solid.envelope_outline;
}
format = formats->instance_bone_envelope_distance;
sh = OVERLAY_shader_armature_envelope(false);
grp = DRW_shgroup_create(sh, armature_transp_ps);
DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
DRW_shgroup_uniform_float_copy(grp, "alpha", 1.0f);
DRW_shgroup_uniform_bool_copy(grp, "isDistance", true);
DRW_shgroup_state_enable(grp, DRW_STATE_CULL_FRONT);
cb->envelope_distance = BUF_INSTANCE(grp, format, DRW_cache_bone_envelope_solid_get());
cb->solid.envelope_distance = BUF_INSTANCE(grp, format, DRW_cache_bone_envelope_solid_get());
if (use_wire_alpha) {
grp = DRW_shgroup_create(sh, armature_transp_ps);
DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
DRW_shgroup_uniform_float_copy(grp, "alpha", wire_alpha);
DRW_shgroup_uniform_bool_copy(grp, "isDistance", true);
DRW_shgroup_state_enable(grp, DRW_STATE_CULL_FRONT);
cb->transp.envelope_distance = BUF_INSTANCE(
grp, format, DRW_cache_bone_envelope_solid_get());
}
else {
cb->transp.envelope_distance = cb->solid.envelope_distance;
}
}
{
format = formats->pos_color;
@ -288,7 +396,19 @@ void OVERLAY_armature_cache_init(OVERLAY_Data *vedata)
sh = OVERLAY_shader_armature_wire();
grp = DRW_shgroup_create(sh, armature_ps);
DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
cb->wire = BUF_LINE(grp, format);
DRW_shgroup_uniform_float_copy(grp, "alpha", 1.0f);
cb->solid.wire = BUF_LINE(grp, format);
if (use_wire_alpha) {
grp = DRW_shgroup_create(sh, armature_ps);
DRW_shgroup_state_enable(grp, DRW_STATE_BLEND_ALPHA);
DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
DRW_shgroup_uniform_float_copy(grp, "alpha", wire_alpha);
cb->transp.wire = BUF_LINE(grp, format);
}
else {
cb->transp.wire = cb->solid.wire;
}
}
}
}
@ -2161,16 +2281,15 @@ static void armature_context_setup(ArmatureDrawContext *ctx,
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];
OVERLAY_ArmatureCallBuffers *cbo = &pd->armature_call_buffers[is_xray];
OVERLAY_ArmatureCallBuffersInner *cb = is_transparent ? &cbo->transp : &cbo->solid;
static const float select_const_color[4] = {1.0f, 1.0f, 1.0f, 1.0f};
switch (arm->drawtype) {
case ARM_ENVELOPE:
ctx->envelope_outline = cb->envelope_outline;
ctx->envelope_solid = (is_filled) ?
(is_transparent ? cb->envelope_transp : cb->envelope_solid) :
NULL;
ctx->envelope_solid = (is_filled) ? cb->envelope_fill : NULL;
ctx->envelope_distance = (do_envelope_dist) ? cb->envelope_distance : NULL;
break;
case ARM_LINE:
@ -2181,24 +2300,23 @@ static void armature_context_setup(ArmatureDrawContext *ctx,
break;
case ARM_B_BONE:
ctx->outline = cb->box_outline;
ctx->solid = (is_filled) ? (is_transparent ? cb->box_transp : cb->box_solid) : NULL;
ctx->solid = (is_filled) ? cb->box_fill : NULL;
break;
case ARM_OCTA:
ctx->outline = cb->octa_outline;
ctx->solid = (is_filled) ? (is_transparent ? cb->octa_transp : cb->octa_solid) : NULL;
ctx->solid = (is_filled) ? cb->octa_fill : 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) ? (is_transparent ? cb->point_transp : cb->point_solid) : NULL;
ctx->point_solid = (is_filled) ? cb->point_fill : NULL;
ctx->point_outline = cb->point_outline;
ctx->custom_solid = (is_filled) ? (is_transparent ? cb->custom_transp : cb->custom_solid) : NULL;
ctx->custom_solid = (is_filled) ? cb->custom_fill : NULL;
ctx->custom_outline = cb->custom_outline;
ctx->custom_wire = cb->custom_wire;
ctx->custom_shapes_ghash = is_transparent ? cb->custom_shapes_transp_ghash :
cb->custom_shapes_ghash;
ctx->custom_shapes_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);
@ -2282,10 +2400,10 @@ void OVERLAY_armature_cache_finish(OVERLAY_Data *vedata)
OVERLAY_PrivateData *pd = vedata->stl->pd;
for (int i = 0; i < 2; i++) {
if (pd->armature_call_buffers[i].custom_shapes_ghash) {
if (pd->armature_call_buffers[i].solid.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);
BLI_ghash_free(pd->armature_call_buffers[i].solid.custom_shapes_ghash, NULL, NULL);
BLI_ghash_free(pd->armature_call_buffers[i].transp.custom_shapes_ghash, NULL, NULL);
}
}
}

View File

@ -216,37 +216,37 @@ typedef struct OVERLAY_ExtraCallBuffers {
DRWShadingGroup *extra_loose_points;
} OVERLAY_ExtraCallBuffers;
typedef struct OVERLAY_ArmatureCallBuffers {
typedef struct OVERLAY_ArmatureCallBuffersInner {
DRWCallBuffer *box_outline;
DRWCallBuffer *box_solid;
DRWCallBuffer *box_transp;
DRWCallBuffer *box_fill;
DRWCallBuffer *dof_lines;
DRWCallBuffer *dof_sphere;
DRWCallBuffer *envelope_distance;
DRWCallBuffer *envelope_outline;
DRWCallBuffer *envelope_solid;
DRWCallBuffer *envelope_transp;
DRWCallBuffer *envelope_fill;
DRWCallBuffer *octa_outline;
DRWCallBuffer *octa_solid;
DRWCallBuffer *octa_transp;
DRWCallBuffer *octa_fill;
DRWCallBuffer *point_outline;
DRWCallBuffer *point_solid;
DRWCallBuffer *point_transp;
DRWCallBuffer *point_fill;
DRWCallBuffer *stick;
DRWCallBuffer *wire;
DRWShadingGroup *custom_outline;
DRWShadingGroup *custom_solid;
DRWShadingGroup *custom_transp;
DRWShadingGroup *custom_fill;
DRWShadingGroup *custom_wire;
GHash *custom_shapes_transp_ghash;
GHash *custom_shapes_ghash;
} OVERLAY_ArmatureCallBuffersInner;
typedef struct OVERLAY_ArmatureCallBuffers {
OVERLAY_ArmatureCallBuffersInner solid;
OVERLAY_ArmatureCallBuffersInner transp;
} OVERLAY_ArmatureCallBuffers;
typedef struct OVERLAY_PrivateData {

View File

@ -1,4 +1,6 @@
uniform float alpha = 1.0;
flat in vec4 finalColor;
layout(location = 0) out vec4 fragColor;
@ -6,6 +8,6 @@ layout(location = 1) out vec4 lineOutput;
void main()
{
fragColor = finalColor;
fragColor = vec4(finalColor.rgb, finalColor.a * alpha);
lineOutput = vec4(0.0);
}

View File

@ -14,7 +14,7 @@ void main()
float n = normalize(normalView).z;
if (isDistance) {
n = 1.0 - clamp(-n, 0.0, 1.0);
fragColor = vec4(1.0, 1.0, 1.0, 0.2) * n;
fragColor = vec4(1.0, 1.0, 1.0, 0.33 * alpha) * n;
}
else {
/* Smooth lighting factor. */

View File

@ -1,4 +1,6 @@
uniform float alpha = 1.0;
noperspective in float colorFac;
flat in vec4 finalWireColor;
flat in vec4 finalInnerColor;
@ -10,6 +12,6 @@ void main()
{
float fac = smoothstep(1.0, 0.2, colorFac);
fragColor.rgb = mix(finalInnerColor.rgb, finalWireColor.rgb, fac);
fragColor.a = 1.0;
fragColor.a = alpha;
lineOutput = vec4(0.0);
}

View File

@ -1,4 +1,6 @@
uniform float alpha = 1.0;
flat in vec4 finalColor;
flat in vec2 edgeStart;
noperspective in vec2 edgePos;
@ -9,5 +11,5 @@ layout(location = 1) out vec4 lineOutput;
void main()
{
lineOutput = pack_line_data(gl_FragCoord.xy, edgeStart, edgePos);
fragColor = finalColor;
fragColor = vec4(finalColor.rgb, finalColor.a * alpha);
}

View File

@ -53,6 +53,7 @@
.wireframe_threshold = 1.0f, \
.wireframe_opacity = 1.0f, \
.xray_alpha_bone = 0.5f, \
.bone_wire_alpha = 1.0f, \
.fade_alpha = 0.40f, \
.texture_paint_mode_opacity = 1.0f, \
.weight_paint_mode_opacity = 1.0f, \

View File

@ -224,6 +224,8 @@ typedef struct View3DOverlay {
/** Armature edit/pose mode settings. */
float xray_alpha_bone;
float bone_wire_alpha;
char _pad1[4];
/** Darken Inactive. */
float fade_alpha;

View File

@ -4301,6 +4301,15 @@ static void rna_def_space_view3d_overlay(BlenderRNA *brna)
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, "rna_GPencil_update");
prop = RNA_def_property(srna, "bone_wire_alpha", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_float_sdna(prop, NULL, "overlay.bone_wire_alpha");
RNA_def_property_ui_text(
prop, "Bone Wireframe Opacity", "Maximim opacity of bones in wireframe display mode");
RNA_def_property_range(prop, 0.0f, FLT_MAX);
RNA_def_property_ui_range(prop, 0.0f, 1.0f, 1, 2);
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, "rna_GPencil_update");
prop = RNA_def_property(srna, "show_motion_paths", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(
prop, NULL, "overlay.flag", V3D_OVERLAY_HIDE_MOTION_PATHS);