[Bf-blender-cvs] [dfe088c5d9c] blender2.8: Workbench: SeeThrough draw option

Jeroen Bakker noreply at git.blender.org
Tue May 22 15:06:00 CEST 2018


Commit: dfe088c5d9c819e7266e8e88fb31e92ac2ee8592
Author: Jeroen Bakker
Date:   Tue May 22 14:12:47 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBdfe088c5d9c819e7266e8e88fb31e92ac2ee8592

Workbench: SeeThrough draw option

Option to see through all meshes (transparency)

Works for OB_SOLID and OB_TEXTURED. Does not work for
V3D_SHADING_SHADOW.

TODO: Fresnel effect

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

M	release/scripts/startup/bl_ui/space_view3d.py
M	source/blender/blenloader/intern/versioning_280.c
M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
R088	source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl	source/blender/draw/engines/workbench/shaders/workbench_deferred_composite_frag.glsl
A	source/blender/draw/engines/workbench/shaders/workbench_forward_composite_frag.glsl
A	source/blender/draw/engines/workbench/shaders/workbench_forward_depth_frag.glsl
A	source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl
A	source/blender/draw/engines/workbench/shaders/workbench_object_outline_lib.glsl
D	source/blender/draw/engines/workbench/shaders/workbench_object_overlap_lib.glsl
M	source/blender/draw/engines/workbench/solid_mode.c
A	source/blender/draw/engines/workbench/transparent_mode.c
A	source/blender/draw/engines/workbench/workbench_data.c
A	source/blender/draw/engines/workbench/workbench_deferred.c
M	source/blender/draw/engines/workbench/workbench_engine.h
A	source/blender/draw/engines/workbench/workbench_forward.c
M	source/blender/draw/engines/workbench/workbench_materials.c
M	source/blender/draw/engines/workbench/workbench_private.h
M	source/blender/draw/intern/draw_manager.c
M	source/blender/editors/space_view3d/space_view3d.c
M	source/blender/editors/space_view3d/view3d_header.c
M	source/blender/editors/space_view3d/view3d_intern.h
M	source/blender/editors/space_view3d/view3d_ops.c
M	source/blender/makesdna/DNA_view3d_types.h
M	source/blender/makesrna/intern/rna_space.c

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

diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py
index 6bf10231be5..b415afd9097 100644
--- a/release/scripts/startup/bl_ui/space_view3d.py
+++ b/release/scripts/startup/bl_ui/space_view3d.py
@@ -3516,12 +3516,24 @@ class VIEW3D_PT_shading(Panel):
             col.separator()
 
             row = col.row()
+            row.prop(shading, "show_see_through")
+            sub = row.row()
+            sub.active = shading.show_see_through
+            sub.prop(shading, "see_through_transparency", text="")
+
+            row = col.row()
+            row.active = not shading.show_see_through
             row.prop(shading, "show_shadows")
             sub = row.row()
-            sub.active = shading.show_shadows
+            sub.active = shading.show_shadows and not shading.show_see_through
             sub.prop(shading, "shadow_intensity", text="")
 
-            col.prop(shading, "show_object_outline")
+
+            row = col.row()
+            row.prop(shading, "show_object_outline")
+            sub = row.row()
+            sub.active = shading.show_object_outline
+            sub.prop(shading, "object_outline_color", text="")
 
 
 class VIEW3D_PT_overlay(Panel):
diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c
index 63fe9642ee7..be0ae64faa4 100644
--- a/source/blender/blenloader/intern/versioning_280.c
+++ b/source/blender/blenloader/intern/versioning_280.c
@@ -1479,6 +1479,19 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *main)
 			}
 		}
 
+		if (!DNA_struct_elem_find(fd->filesdna, "View3DShading", "float", "see_through_transparency")) {
+			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.see_through_transparency = 0.3f;
+						}
+					}
+				}
+			}
+		}
+
 		for (Scene *scene = main->scene.first; scene; scene = scene->id.next) {
 			switch (scene->toolsettings->snap_mode) {
 				case 0: scene->toolsettings->snap_mode = SCE_SNAP_MODE_INCREMENT; break;
diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 9478d41f6db..71bdcc7496c 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -105,10 +105,14 @@ set(SRC
 	engines/eevee/eevee_subsurface.c
 	engines/eevee/eevee_temporal_sampling.c
 	engines/eevee/eevee_volumes.c
+	engines/workbench/workbench_data.c
 	engines/workbench/workbench_engine.c
+	engines/workbench/workbench_deferred.c
+	engines/workbench/workbench_forward.c
 	engines/workbench/workbench_materials.c
 	engines/workbench/workbench_studiolight.c
 	engines/workbench/solid_mode.c
+	engines/workbench/transparent_mode.c
 	engines/external/external_engine.c
 
 	DRW_engine.h
@@ -208,17 +212,20 @@ data_to_c_simple(engines/eevee/shaders/volumetric_resolve_frag.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/volumetric_scatter_frag.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/volumetric_integration_frag.glsl SRC)
 
+data_to_c_simple(engines/workbench/shaders/workbench_background_lib.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_common_lib.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_data_lib.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_deferred_composite_frag.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_forward_composite_frag.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_forward_depth_frag.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_object_outline_lib.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_prepass_vert.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_prepass_frag.glsl SRC)
-data_to_c_simple(engines/workbench/shaders/workbench_composite_frag.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_shadow_vert.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_shadow_geom.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_shadow_caps_geom.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_shadow_debug_frag.glsl SRC)
-data_to_c_simple(engines/workbench/shaders/workbench_background_lib.glsl SRC)
-data_to_c_simple(engines/workbench/shaders/workbench_common_lib.glsl SRC)
-data_to_c_simple(engines/workbench/shaders/workbench_data_lib.glsl SRC)
-data_to_c_simple(engines/workbench/shaders/workbench_object_overlap_lib.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_world_light_lib.glsl SRC)
 
 data_to_c_simple(modes/shaders/common_globals_lib.glsl SRC)
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl b/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
index a698a5afeaa..e72ee1c2eac 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
@@ -7,4 +7,6 @@ struct WorldData {
 	vec4 diffuse_light_z_neg;
 	vec4 background_color_low;
 	vec4 background_color_high;
+	vec4 object_outline_color;
+	float see_through_transparency;
 };
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_deferred_composite_frag.glsl
similarity index 88%
rename from source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
rename to source/blender/draw/engines/workbench/shaders/workbench_deferred_composite_frag.glsl
index 17477e56b40..35867a566f1 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_deferred_composite_frag.glsl
@@ -5,7 +5,6 @@ uniform sampler2D colorBuffer;
 uniform sampler2D normalBuffer;
 /* normalBuffer contains viewport normals */
 uniform vec2 invertedViewportSize;
-uniform vec3 objectOverlapColor = vec3(0.0);
 uniform float shadowMultiplier;
 uniform float lightMultiplier;
 uniform float shadowShift = 0.1;
@@ -29,15 +28,15 @@ void main()
 		return;
 	}
 #else /* !V3D_SHADING_OBJECT_OUTLINE */
-	float object_overlap = calculate_object_overlap(objectId, texel, object_id);
+	float object_outline = calculate_object_outline(objectId, texel, object_id);
 
 	if (object_id == NO_OBJECT_ID) {
 		vec3 background = background_color(world_data, uv_viewport.y);
-		if (object_overlap == 0.0) {
+		if (object_outline == 0.0) {
 			fragColor = vec4(background, 0.0);
 		}
 		else {
-			fragColor = vec4(mix(objectOverlapColor, background, object_overlap), 1.0-object_overlap);
+			fragColor = vec4(mix(world_data.object_outline_color.rgb, background, object_outline), 1.0-object_outline);
 		}
 		return;
 	}
@@ -84,7 +83,7 @@ void main()
 	shaded_color *= light_multiplier;
 
 #ifdef V3D_SHADING_OBJECT_OUTLINE
-	shaded_color = mix(objectOverlapColor, shaded_color, object_overlap);
+	shaded_color = mix(world_data.object_outline_color.rgb, shaded_color, object_outline);
 #endif /* V3D_SHADING_OBJECT_OUTLINE */
 	fragColor = vec4(shaded_color, 1.0);
 }
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
new file mode 100644
index 00000000000..054e8d308cb
--- /dev/null
+++ b/source/blender/draw/engines/workbench/shaders/workbench_forward_composite_frag.glsl
@@ -0,0 +1,34 @@
+out vec4 fragColor;
+
+uniform usampler2D objectId;
+uniform sampler2D transparentAccum;
+uniform sampler2D transparentRevealage;
+uniform vec2 invertedViewportSize;
+
+layout(std140) uniform world_block {
+	WorldData world_data;
+};
+
+void main()
+{
+	ivec2 texel = ivec2(gl_FragCoord.xy);
+	vec2 uv_viewport = gl_FragCoord.xy * invertedViewportSize;
+	uint object_id = texelFetch(objectId, texel, 0).r;
+	vec4 transparent_accum = texelFetch(transparentAccum, texel, 0);
+	float revealage = texelFetch(transparentRevealage, texel, 0).r;
+	vec4 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 */
+
+	if (object_id == NO_OBJECT_ID) {
+		color = vec4(background_color(world_data, uv_viewport.y), 0.0);
+	} else {
+		color = transparent_accum;
+	}
+
+	fragColor = vec4(mix(world_data.object_outline_color.rgb, color.xyz, outline), 1.0);
+}
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_forward_depth_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_forward_depth_frag.glsl
new file mode 100644
index 00000000000..450cb3e680b
--- /dev/null
+++ b/source/blender/draw/engines/workbench/shaders/workbench_forward_depth_frag.glsl
@@ -0,0 +1,8 @@
+uniform int object_id = 0;
+layout(location=0) out uint objectId;
+
+void main()
+{
+	objectId = uint(object_id);
+}
+
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
new file mode 100644
index 00000000000..7eb5336e303
--- /dev/null
+++ b/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl
@@ -0,0 +1,54 @@
+uniform vec4 color = vec4(0.0, 0.0, 1.0, 1.0);
+#ifdef OB_TEXTURE
+uniform sampler2D image;
+#endif
+uniform mat3 normalWorldMatrix;
+
+#ifdef NORMAL_VIEWPORT_PASS_ENABLED
+in vec3 normal_viewport;
+#endif /* NORMAL_VIEWPORT_PASS_ENABLED */
+#ifdef OB_TEXTURE
+in vec2 uv_interp;
+#endif
+
+layout(std140) uniform world_block {
+	WorldData world_data;
+};
+
+layout(location=0) out vec4 transparentAccum;
+
+vec4 calculate_transparent_accum(vec4 premultiplied) {
+	float a = min(1.0, premultiplied.a) * 8.0 + 0.01;
+	float b = -gl_FragCoord.z * 0.95 + 1.0;
+	float w = clamp(a * a * a * 1e8 * b * b * b, 1e-2, 3e2);
+	return vec4(

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list