[Bf-blender-cvs] [f09d3a7a402] blender2.8: Workbench: Texture Shading mode

Jeroen Bakker noreply at git.blender.org
Mon May 7 15:01:41 CEST 2018


Commit: f09d3a7a4027229df88a0b0c0d42a2b75efcc953
Author: Jeroen Bakker
Date:   Mon May 7 14:59:27 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBf09d3a7a4027229df88a0b0c0d42a2b75efcc953

Workbench: Texture Shading mode

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

M	release/scripts/startup/bl_ui/space_view3d.py
M	source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
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/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 b440ac790f4..76783703820 100644
--- a/release/scripts/startup/bl_ui/space_view3d.py
+++ b/release/scripts/startup/bl_ui/space_view3d.py
@@ -3554,6 +3554,7 @@ class VIEW3D_PT_shading(Panel):
                 col.separator()
                 col.row().prop(shading, "single_color", text="")
 
+        if shading.type in ('SOLID', 'TEXTURED'):
             col.separator()
             col.row().prop(shading, "light", expand=True)
             if shading.light == 'STUDIO':
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
index 7ed5ecca45f..7853e361172 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
@@ -1,9 +1,15 @@
 uniform int object_id = 0;
 uniform vec3 object_color = vec3(1.0, 0.0, 1.0);
+#ifdef OB_TEXTURE
+uniform sampler2D image;
+#endif
 
 #ifdef V3D_LIGHTING_STUDIO
 in vec3 normal_viewport;
 #endif /* V3D_LIGHTING_STUDIO */
+#ifdef OB_TEXTURE
+in vec2 uv_interp;
+#endif /* OB_TEXTURE */
 
 layout(location=0) out uint objectId;
 layout(location=1) out vec4 diffuseColor;
@@ -18,7 +24,13 @@ layout(location=2) out vec3 normalViewport;
 void main()
 {
 	objectId = uint(object_id);
+#ifdef OB_SOLID
 	diffuseColor = vec4(object_color, 0.0);
+#endif /* OB_SOLID */
+#ifdef OB_TEXTURE
+	diffuseColor = texture(image, uv_interp);
+#endif /* OB_TEXTURE */
+
 #ifdef V3D_LIGHTING_STUDIO
 #ifdef WORKBENCH_ENCODE_NORMALS
 	if (!gl_FrontFacing) {
@@ -26,6 +38,7 @@ void main()
 		diffuseColor.a = 1.0;
 	} else {
 		normalViewport = normal_encode(normal_viewport);
+		diffuseColor.a = 0.0;
 	}
 #else /* WORKBENCH_ENCODE_NORMALS */
 	normalViewport = normal_viewport;
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl b/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
index 8f62ddb161d..22b16bf1d6a 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
@@ -7,13 +7,22 @@ in vec3 pos;
 #ifdef V3D_LIGHTING_STUDIO
 in vec3 nor;
 #endif /* V3D_LIGHTING_STUDIO */
+#ifdef OB_TEXTURE
+in vec2 uv;
+#endif
 
 #ifdef V3D_LIGHTING_STUDIO
 out vec3 normal_viewport;
 #endif /* V3D_LIGHTING_STUDIO */
+#ifdef OB_TEXTURE
+out vec2 uv_interp;
+#endif
 
 void main()
 {
+#ifdef OB_TEXTURE
+	uv_interp = uv;
+#endif
 #ifdef V3D_LIGHTING_STUDIO
 	normal_viewport = normalize(NormalMatrix * nor);
 #endif /* V3D_LIGHTING_STUDIO */
diff --git a/source/blender/draw/engines/workbench/workbench_materials.c b/source/blender/draw/engines/workbench/workbench_materials.c
index 258ce500191..b9c51552b50 100644
--- a/source/blender/draw/engines/workbench/workbench_materials.c
+++ b/source/blender/draw/engines/workbench/workbench_materials.c
@@ -25,15 +25,24 @@
 
 #include "workbench_private.h"
 
+#include "BIF_gl.h"
+
 #include "BLI_alloca.h"
 #include "BLI_dynstr.h"
 #include "BLI_utildefines.h"
 
+#include "BKE_node.h"
 #include "BKE_particle.h"
 
+#include "DNA_image_types.h"
+#include "DNA_mesh_types.h"
 #include "DNA_modifier_types.h"
+#include "DNA_node_types.h"
+
+#include "ED_uvedit.h"
 
 #include "GPU_shader.h"
+#include "GPU_texture.h"
 
 #include "UI_resources.h"
 
@@ -75,7 +84,7 @@ extern DrawEngineType draw_engine_workbench_solid;
 #define OBJECT_ID_PASS_ENABLED(wpd) (wpd->shading.flag & V3D_SHADING_OBJECT_OVERLAP)
 #define NORMAL_VIEWPORT_PASS_ENABLED(wpd) (wpd->shading.light & V3D_LIGHTING_STUDIO)
 #define SHADOW_ENABLED(wpd) (wpd->shading.flag & V3D_SHADING_SHADOW)
-static char *workbench_build_defines(WORKBENCH_PrivateData *wpd)
+static char *workbench_build_defines(WORKBENCH_PrivateData *wpd, int drawtype)
 {
 	char *str = NULL;
 
@@ -87,6 +96,14 @@ static char *workbench_build_defines(WORKBENCH_PrivateData *wpd)
 	if (wpd->shading.light & V3D_LIGHTING_STUDIO) {
 		BLI_dynstr_appendf(ds, "#define V3D_LIGHTING_STUDIO\n");
 	}
+	switch(drawtype) {
+		case OB_SOLID:
+			BLI_dynstr_appendf(ds, "#define OB_SOLID\n");
+			break;
+		case OB_TEXTURE:
+			BLI_dynstr_appendf(ds, "#define OB_TEXTURE\n");
+			break;
+	}
 
 #ifdef WORKBENCH_ENCODE_NORMALS
 	BLI_dynstr_appendf(ds, "#define WORKBENCH_ENCODE_NORMALS\n");
@@ -135,44 +152,65 @@ static char *workbench_build_prepass_frag(void)
 	return str;
 }
 
-static int get_shader_index(WORKBENCH_PrivateData *wpd)
+static int get_shader_index(WORKBENCH_PrivateData *wpd, int drawtype)
 {
 	const int DRAWOPTIONS_MASK = V3D_SHADING_OBJECT_OVERLAP;
 	int index = (wpd->shading.flag & DRAWOPTIONS_MASK);
 	index = (index << 2) + wpd->shading.light;
+	/* set the drawtype flag
+	   0 = OB_SOLID,
+	   1 = OB_TEXTURE */
+	index = index << 1;
+	SET_FLAG_FROM_TEST(index, drawtype == OB_TEXTURE, 1);
 	return index;
 }
 
-static void select_deferred_shaders(WORKBENCH_PrivateData *wpd)
-{
-	int index = get_shader_index(wpd);
-
+static void ensure_deferred_shaders(WORKBENCH_PrivateData *wpd, int index, int drawtype) {
 	if (e_data.prepass_sh_cache[index] == NULL) {
-		char *defines = workbench_build_defines(wpd);
+		char *defines = workbench_build_defines(wpd, drawtype);
 		char *composite_frag = workbench_build_composite_frag(wpd);
 		char *prepass_frag = workbench_build_prepass_frag();
 		e_data.prepass_sh_cache[index] = DRW_shader_create(datatoc_workbench_prepass_vert_glsl, NULL, prepass_frag, defines);
-		e_data.composite_sh_cache[index] = DRW_shader_create_fullscreen(composite_frag, defines);
+		if (drawtype == OB_SOLID) {
+			e_data.composite_sh_cache[index] = DRW_shader_create_fullscreen(composite_frag, defines);
+		}
 		MEM_freeN(prepass_frag);
 		MEM_freeN(composite_frag);
 		MEM_freeN(defines);
 	}
+}
+
+static void select_deferred_shaders(WORKBENCH_PrivateData *wpd)
+{
+	int index_solid = get_shader_index(wpd, OB_SOLID);
+	int index_texture = get_shader_index(wpd, OB_TEXTURE);
+
+	ensure_deferred_shaders(wpd, index_solid, OB_SOLID);
+	ensure_deferred_shaders(wpd, index_texture, OB_TEXTURE);
 
-	wpd->prepass_sh = e_data.prepass_sh_cache[index];
-	wpd->composite_sh = e_data.composite_sh_cache[index];
+	wpd->prepass_solid_sh = e_data.prepass_sh_cache[index_solid];
+	wpd->prepass_texture_sh = e_data.prepass_sh_cache[index_texture];
+	wpd->composite_sh = e_data.composite_sh_cache[index_solid];
 }
 
 /* Functions */
 static uint get_material_hash(WORKBENCH_MaterialData *material_template)
 {
+	/* TODO: make a C-string with settings and hash the string */
 	uint input[4];
+	uint result;
 	float *color = material_template->color;
 	input[0] = (uint)(color[0] * 512);
 	input[1] = (uint)(color[1] * 512);
 	input[2] = (uint)(color[2] * 512);
 	input[3] = material_template->object_id;
+	result = BLI_ghashutil_uinthash_v4_murmur(input);
 
-	return BLI_ghashutil_uinthash_v4_murmur(input);
+	if (material_template->drawtype == OB_TEXTURE) {
+		/* add texture reference */
+		result += BLI_ghashutil_inthash_p_murmur(material_template->ima);
+	}
+	return result;
 }
 
 static void workbench_init_object_data(ObjectEngineData *engine_data)
@@ -183,11 +221,13 @@ static void workbench_init_object_data(ObjectEngineData *engine_data)
 
 static void get_material_solid_color(WORKBENCH_PrivateData *wpd, Object *ob, Material *mat, float *color, float hsv_saturation, float hsv_value)
 {
+	/* When in OB_TEXTURE always uyse V3D_SHADING_MATERIAL_COLOR as fallback when no texture could be determined */
+	int color_type = wpd->drawtype == OB_SOLID? wpd->shading.color_type:V3D_SHADING_MATERIAL_COLOR;
 	static float default_color[] = {0.8f, 0.8f, 0.8f};
-	if (DRW_object_is_paint_mode(ob) || wpd->shading.color_type == V3D_SHADING_SINGLE_COLOR) {
+	if (DRW_object_is_paint_mode(ob) || color_type == V3D_SHADING_SINGLE_COLOR) {
 		copy_v3_v3(color, wpd->shading.single_color);
 	}
-	else if (wpd->shading.color_type == V3D_SHADING_RANDOM_COLOR) {
+	else if (color_type == V3D_SHADING_RANDOM_COLOR) {
 		uint hash = BLI_ghashutil_strhash_p_murmur(ob->id.name);
 		if (ob->id.lib) {
 			hash = (hash * 13) ^ BLI_ghashutil_strhash_p_murmur(ob->id.lib->name);
@@ -197,7 +237,7 @@ static void get_material_solid_color(WORKBENCH_PrivateData *wpd, Object *ob, Mat
 		float hsv[3] = {offset, hsv_saturation, hsv_value};
 		hsv_to_rgb_v(hsv, color);
 	}
-	else if (wpd->shading.color_type == V3D_SHADING_OBJECT_COLOR) {
+	else if (color_type == V3D_SHADING_OBJECT_COLOR) {
 		copy_v3_v3(color, ob->col);
 	}
 	else {
@@ -299,12 +339,15 @@ void workbench_materials_cache_init(WORKBENCH_Data *vedata)
 	View3D *v3d = DCS->v3d;
 	if (v3d) {
 		wpd->shading = v3d->shading;
+		wpd->drawtype = v3d->drawtype;
 	}
 	else {
+		/* XXX: We should get the default shading from the view layer, after we implemented the render callback */
 		memset(&wpd->shading, 0, sizeof(wpd->shading));
 		wpd->shading.light = V3D_LIGHTING_STUDIO;
 		wpd->shading.shadow_intensity = 0.5;
 		copy_v3_fl(wpd->shading.single_color, 0.8f);
+		wpd->drawtype = OB_SOLID;
 	}
 
 	select_deferred_shaders(wpd);
@@ -365,7 +408,7 @@ void workbench_materials_cache_init(WORKBENCH_Data *vedata)
 		}
 	}
 }
-static WORKBENCH_MaterialData *get_or_create_material_data(WORKBENCH_Data *vedata, IDProperty *props, Object *ob, Material *mat)
+static WORKBENCH_MaterialData *get_or_create_material_data(WORKBENCH_Data *vedata, IDProperty *props, Object *ob, Material *mat, Image *ima, int drawtype)
 {
 	WORKBENCH_StorageList *stl = vedata->stl;
 	WORKBENCH_PassList *psl = vedata->psl;
@@ -374,24 +417,35 @@ static WORKBENCH_MaterialData *get_or_create_material_data(WORKBENCH_Data *vedat
 	WORKBENCH_ObjectData *engine_object_data = (WORKBENCH_ObjectData *)DRW_object_engine_data_ensure(
 	        ob, &draw_engine_workbench_solid, sizeof(WORKBENCH_ObjectData), &workbench_init_object_data, NULL);
 	WORKBENCH_MaterialData material_template;
-	float color[3];
 	const float hsv_saturation = BKE_collection_engine_property_value_get_float(props, "random_object_color_saturation");
 	const float hsv_value = BKE_collection_engine_property_value_get_float(props, "random_object_color_v

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list