From e4a727626e34eef20e2b41cc3e26b41db4f360a0 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Fri, 1 Jun 2018 17:06:25 +0200 Subject: X-Ray: Added a slider for the alpha - will not render when set to 0.0 for speed reasons. so when user sets transparency to hide everything the bigger passes will be skipped. --- release/scripts/startup/bl_ui/space_view3d.py | 3 +++ source/blender/blenloader/intern/versioning_280.c | 13 +++++++++++++ .../shaders/workbench_forward_composite_frag.glsl | 6 ++++-- .../workbench_forward_transparent_accum_frag.glsl | 2 +- .../workbench_forward_transparent_revealage_frag.glsl | 4 ++-- .../blender/draw/engines/workbench/workbench_forward.c | 17 +++++++++++------ source/blender/editors/space_view3d/space_view3d.c | 3 ++- source/blender/makesdna/DNA_view3d_types.h | 2 +- source/blender/makesrna/intern/rna_space.c | 9 +++++++++ 9 files changed, 46 insertions(+), 13 deletions(-) diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py index 6010b1e209f..4f3396c9ed8 100644 --- a/release/scripts/startup/bl_ui/space_view3d.py +++ b/release/scripts/startup/bl_ui/space_view3d.py @@ -3538,6 +3538,9 @@ class VIEW3D_PT_shading(Panel): row = col.row() row.prop(shading, "show_xray") + sub = row.row() + sub.active = shading.show_xray + sub.prop(shading, "xray_alpha", text="") row = col.row() row.active = not shading.show_xray diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c index 50ed9bfd146..ffc078c3061 100644 --- a/source/blender/blenloader/intern/versioning_280.c +++ b/source/blender/blenloader/intern/versioning_280.c @@ -1522,5 +1522,18 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *main) } } } + + if (!DNA_struct_elem_find(fd->filesdna, "View3DShading", "float", "xray_alpha")) { + for (bScreen *screen = main->screen.first; screen; screen = screen->id.next) { + for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) { + for (SpaceLink *sl = sa->spacedata.first; sl; sl = sl->next) { + if (sl->spacetype == SPACE_VIEW3D) { + View3D *v3d = (View3D *)sl; + v3d->shading.xray_alpha = 0.5f; + } + } + } + } + } } } diff --git a/source/blender/draw/engines/workbench/shaders/workbench_forward_composite_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_forward_composite_frag.glsl index 12d6296655d..f335e1a15bd 100644 --- a/source/blender/draw/engines/workbench/shaders/workbench_forward_composite_frag.glsl +++ b/source/blender/draw/engines/workbench/shaders/workbench_forward_composite_frag.glsl @@ -21,18 +21,20 @@ void main() float transparent_revealage = texelFetch(transparentRevealage, texel, 0).r; #endif vec4 color; + vec4 bg_color; #ifdef V3D_SHADING_OBJECT_OUTLINE float outline = calculate_object_outline(objectId, texel, object_id); #else /* V3D_SHADING_OBJECT_OUTLINE */ float outline = 1.0; #endif /* V3D_SHADING_OBJECT_OUTLINE */ - + bg_color = vec4(background_color(world_data, uv_viewport.y), 0.0); if (object_id == NO_OBJECT_ID) { - color = vec4(background_color(world_data, uv_viewport.y), 0.0); + color = bg_color; } else { #ifdef WORKBENCH_REVEALAGE_ENABLED color = vec4((transparent_accum.xyz / max(transparent_accum.a, EPSILON)) * (1.0 - transparent_revealage), 1.0); + color = mix(bg_color, color, clamp(1.0 - transparent_revealage, 0.0, 1.0)); #else color = vec4(transparent_accum.xyz / max(transparent_accum.a, EPSILON), 1.0); #endif diff --git a/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl index 88b32cb9b20..3f271ec439b 100644 --- a/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl +++ b/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl @@ -2,6 +2,7 @@ uniform sampler2D image; #endif uniform mat3 normalWorldMatrix; +uniform float alpha = 0.5; #ifdef NORMAL_VIEWPORT_PASS_ENABLED in vec3 normal_viewport; @@ -53,7 +54,6 @@ void main() #endif /* V3D_LIGHTING_STUDIO */ - float alpha = 0.5 ; vec4 premultiplied = vec4(shaded_color.rgb * alpha, alpha); transparentAccum = calculate_transparent_accum(premultiplied); } diff --git a/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_revealage_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_revealage_frag.glsl index da87fe8f542..c591425b950 100644 --- a/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_revealage_frag.glsl +++ b/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_revealage_frag.glsl @@ -1,7 +1,7 @@ layout(location=0) out float transparentRevealage; - +uniform float alpha = 0.5; void main() { - transparentRevealage = 0.5; + transparentRevealage = alpha; } diff --git a/source/blender/draw/engines/workbench/workbench_forward.c b/source/blender/draw/engines/workbench/workbench_forward.c index 279e6a745ee..50cf5676239 100644 --- a/source/blender/draw/engines/workbench/workbench_forward.c +++ b/source/blender/draw/engines/workbench/workbench_forward.c @@ -178,6 +178,7 @@ static WORKBENCH_MaterialData *get_or_create_material_data( drawtype == OB_SOLID ? wpd->transparent_accum_sh : wpd->transparent_accum_texture_sh, psl->transparent_accum_pass); DRW_shgroup_uniform_block(grp, "world_block", wpd->world_ubo); + DRW_shgroup_uniform_float(grp, "alpha", &wpd->shading.xray_alpha, 1); workbench_material_set_normal_world_matrix(grp, wpd, e_data.normal_world_matrix); material->object_id = engine_object_data->object_id; copy_v4_v4(material->material_data.diffuse_color, material_template.material_data.diffuse_color); @@ -343,6 +344,7 @@ void workbench_forward_engine_init(WORKBENCH_Data *vedata) int state = DRW_STATE_WRITE_COLOR | DRW_STATE_TRANSPARENT_REVEALAGE; psl->transparent_revealage_pass = DRW_pass_create("Transparent Revealage", state); grp = DRW_shgroup_create(e_data.transparent_revealage_sh, psl->transparent_revealage_pass); + DRW_shgroup_uniform_float(grp, "alpha", &wpd->shading.xray_alpha, 1); wpd->transparent_revealage_shgrp = grp; } #endif @@ -546,14 +548,17 @@ void workbench_forward_draw_scene(WORKBENCH_Data *vedata) /* Write Depth + Object ID */ GPU_framebuffer_bind(fbl->object_outline_fb); DRW_draw_pass(psl->object_outline_pass); - - /* Shade */ - GPU_framebuffer_bind(fbl->transparent_accum_fb); - DRW_draw_pass(psl->transparent_accum_pass); + + if (wpd->shading.xray_alpha > 0.0) { + /* Shade */ + GPU_framebuffer_bind(fbl->transparent_accum_fb); + DRW_draw_pass(psl->transparent_accum_pass); #ifdef WORKBENCH_REVEALAGE_ENABLED - GPU_framebuffer_bind(fbl->transparent_revealage_fb); - DRW_draw_pass(psl->transparent_revealage_pass); + GPU_framebuffer_bind(fbl->transparent_revealage_fb); + DRW_draw_pass(psl->transparent_revealage_pass); #endif + } + /* Composite */ GPU_framebuffer_bind(fbl->composite_fb); DRW_draw_pass(psl->composite_pass); diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c index fcea40d7f4c..605e678be93 100644 --- a/source/blender/editors/space_view3d/space_view3d.c +++ b/source/blender/editors/space_view3d/space_view3d.c @@ -325,7 +325,8 @@ static SpaceLink *view3d_new(const ScrArea *UNUSED(sa), const Scene *scene) v3d->drawtype = OB_SOLID; v3d->shading.flag = V3D_SHADING_SPECULAR_HIGHLIGHT; v3d->shading.light = V3D_LIGHTING_STUDIO; - v3d->shading.shadow_intensity = 0.5; + v3d->shading.shadow_intensity = 0.5f; + v3d->shading.xray_alpha = 0.5f; copy_v3_fl(v3d->shading.single_color, 0.8f); v3d->overlay.flag = V3D_OVERLAY_LOOK_DEV; diff --git a/source/blender/makesdna/DNA_view3d_types.h b/source/blender/makesdna/DNA_view3d_types.h index 2ef5350c70e..7bb2ce7af02 100644 --- a/source/blender/makesdna/DNA_view3d_types.h +++ b/source/blender/makesdna/DNA_view3d_types.h @@ -148,7 +148,7 @@ typedef struct View3DShading { float studiolight_background; float object_outline_color[3]; - float pad2; + float xray_alpha; } View3DShading; /* 3D Viewport Overlay setings */ diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c index a4b9f077738..b36014370f6 100644 --- a/source/blender/makesrna/intern/rna_space.c +++ b/source/blender/makesrna/intern/rna_space.c @@ -2342,6 +2342,15 @@ static void rna_def_space_view3d_shading(BlenderRNA *brna) RNA_def_property_ui_text(prop, "X-Ray", "Show whole scene transparent"); RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL); + prop = RNA_def_property(srna, "xray_alpha", PROP_FLOAT, PROP_FACTOR); + RNA_def_property_float_sdna(prop, NULL, "shading.xray_alpha"); + RNA_def_property_float_default(prop, 0.5); + RNA_def_property_ui_text(prop, "X-Ray Alpha", "Amount of alpha to use"); + RNA_def_property_range(prop, 0.0f, 1.0f); + RNA_def_property_ui_range(prop, 0.04f, 1.0f, 1, 1); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); + RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL); + prop = RNA_def_property(srna, "use_scene_light", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "shading.flag", V3D_SHADING_SCENE_LIGHT); RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); -- cgit v1.2.3