[Bf-blender-cvs] [dad10ab1183] blender2.8: DwM: Support flat-shaded w/ clay & eevee engines

Campbell Barton noreply at git.blender.org
Thu May 18 12:43:41 CEST 2017


Commit: dad10ab11836a164b0c92f3252e1b60d206c2f13
Author: Campbell Barton
Date:   Thu May 18 20:43:53 2017 +1000
Branches: blender2.8
https://developer.blender.org/rBdad10ab11836a164b0c92f3252e1b60d206c2f13

DwM: Support flat-shaded w/ clay & eevee engines

Needed for sculpt mode drawing w/ engines, see: T51497

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

M	source/blender/draw/engines/clay/clay_engine.c
M	source/blender/draw/engines/clay/shaders/clay_frag.glsl
M	source/blender/draw/engines/clay/shaders/clay_vert.glsl
M	source/blender/draw/engines/eevee/eevee_engine.c
M	source/blender/draw/engines/eevee/eevee_private.h
M	source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl
M	source/blender/draw/engines/eevee/shaders/lit_surface_vert.glsl
M	source/blender/draw/intern/DRW_render.h
M	source/blender/draw/intern/draw_manager.c

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

diff --git a/source/blender/draw/engines/clay/clay_engine.c b/source/blender/draw/engines/clay/clay_engine.c
index c2b7a3a7258..4ac54386f61 100644
--- a/source/blender/draw/engines/clay/clay_engine.c
+++ b/source/blender/draw/engines/clay/clay_engine.c
@@ -104,6 +104,7 @@ typedef struct CLAY_Storage {
 	int ubo_current_id;
 	int hair_ubo_current_id;
 	DRWShadingGroup *shgrps[MAX_CLAY_MAT];
+	DRWShadingGroup *shgrps_flat[MAX_CLAY_MAT];
 	DRWShadingGroup *hair_shgrps[MAX_CLAY_MAT];
 } CLAY_Storage;
 
@@ -125,6 +126,7 @@ typedef struct CLAY_PassList {
 	struct DRWPass *depth_pass;
 	struct DRWPass *depth_pass_cull;
 	struct DRWPass *clay_pass;
+	struct DRWPass *clay_pass_flat;
 	struct DRWPass *hair_pass;
 } CLAY_PassList;
 
@@ -143,6 +145,7 @@ static struct {
 	struct GPUShader *depth_sh;
 	/* Shading Pass */
 	struct GPUShader *clay_sh;
+	struct GPUShader *clay_flat_sh;
 	struct GPUShader *hair_sh;
 
 	/* Matcap textures */
@@ -338,8 +341,6 @@ static void CLAY_engine_init(void *vedata)
 	/* Shading pass */
 	if (!e_data.clay_sh) {
 		DynStr *ds = BLI_dynstr_new();
-		const char *max_mat =
-			SHADER_DEFINES;
 		char *matcap_with_ao;
 
 		BLI_dynstr_append(ds, datatoc_clay_frag_glsl);
@@ -347,7 +348,13 @@ static void CLAY_engine_init(void *vedata)
 
 		matcap_with_ao = BLI_dynstr_get_cstring(ds);
 
-		e_data.clay_sh = DRW_shader_create(datatoc_clay_vert_glsl, NULL, matcap_with_ao, max_mat);
+		e_data.clay_sh = DRW_shader_create(
+		        datatoc_clay_vert_glsl, NULL, matcap_with_ao,
+		        SHADER_DEFINES);
+		e_data.clay_flat_sh = DRW_shader_create(
+		        datatoc_clay_vert_glsl, NULL, matcap_with_ao,
+		        SHADER_DEFINES
+		        "#define USE_FLAT_NORMAL\n");
 
 		BLI_dynstr_free(ds);
 		MEM_freeN(matcap_with_ao);
@@ -452,9 +459,9 @@ static void CLAY_engine_init(void *vedata)
 	}
 }
 
-static DRWShadingGroup *CLAY_shgroup_create(CLAY_Data *UNUSED(vedata), DRWPass *pass, int *material_id)
+static DRWShadingGroup *CLAY_shgroup_create(CLAY_Data *UNUSED(vedata), DRWPass *pass, int *material_id, bool use_flat)
 {
-	DRWShadingGroup *grp = DRW_shgroup_create(e_data.clay_sh, pass);
+	DRWShadingGroup *grp = DRW_shgroup_create(use_flat ? e_data.clay_flat_sh : e_data.clay_sh, pass);
 
 	DRW_shgroup_uniform_vec2(grp, "screenres", DRW_viewport_size_get(), 1);
 	DRW_shgroup_uniform_buffer(grp, "depthtex", &e_data.depth_dup);
@@ -614,9 +621,10 @@ static void hair_ubo_mat_from_object(Object *ob,  CLAY_HAIR_UBO_Material *r_ubo)
 	r_ubo->matcap_id = matcap_to_index(matcap_icon);
 }
 
-static DRWShadingGroup *CLAY_object_shgrp_get(CLAY_Data *vedata, Object *ob, CLAY_StorageList *stl, CLAY_PassList *psl)
+static DRWShadingGroup *CLAY_object_shgrp_get(
+        CLAY_Data *vedata, Object *ob, CLAY_StorageList *stl, CLAY_PassList *psl, bool use_flat)
 {
-	DRWShadingGroup **shgrps = stl->storage->shgrps;
+	DRWShadingGroup **shgrps = use_flat ? stl->storage->shgrps_flat : stl->storage->shgrps;
 	CLAY_UBO_Material mat_ubo_test;
 
 	ubo_mat_from_object(ob, &mat_ubo_test);
@@ -624,7 +632,8 @@ static DRWShadingGroup *CLAY_object_shgrp_get(CLAY_Data *vedata, Object *ob, CLA
 	int id = mat_in_ubo(stl->storage, &mat_ubo_test);
 
 	if (shgrps[id] == NULL) {
-		shgrps[id] = CLAY_shgroup_create(vedata, psl->clay_pass, &e_data.ubo_mat_idxs[id]);
+		shgrps[id] = CLAY_shgroup_create(
+		        vedata, use_flat ? psl->clay_pass_flat : psl->clay_pass, &e_data.ubo_mat_idxs[id], use_flat);
 		/* if it's the first shgrp, pass bind the material UBO */
 		if (stl->storage->ubo_current_id == 1) {
 			DRW_shgroup_uniform_block(shgrps[0], "material_block", stl->mat_ubo);
@@ -654,6 +663,13 @@ static DRWShadingGroup *CLAY_hair_shgrp_get(Object *ob, CLAY_StorageList *stl, C
 	return hair_shgrps[hair_id];
 }
 
+static DRWShadingGroup *CLAY_object_shgrp_default_mode_get(
+        CLAY_Data *vedata, Object *ob, CLAY_StorageList *stl, CLAY_PassList *psl)
+{
+	bool use_flat = DRW_object_is_flat_normal(ob);
+	return CLAY_object_shgrp_get(vedata, ob, stl, psl, use_flat);
+}
+
 static void CLAY_cache_init(void *vedata)
 {
 	CLAY_PassList *psl = ((CLAY_Data *)vedata)->psl;
@@ -682,6 +698,12 @@ static void CLAY_cache_init(void *vedata)
 		memset(stl->storage->shgrps, 0, sizeof(DRWShadingGroup *) * MAX_CLAY_MAT);
 	}
 
+	/* Clay Pass (Flat) */
+	{
+		psl->clay_pass_flat = DRW_pass_create("Clay Pass Flat", DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL);
+		memset(stl->storage->shgrps_flat, 0, sizeof(DRWShadingGroup *) * MAX_CLAY_MAT);
+	}
+
 	/* Hair Pass */
 	{
 		psl->hair_pass = DRW_pass_create(
@@ -715,6 +737,7 @@ static void CLAY_cache_populate(void *vedata, Object *ob)
 		IDProperty *ces_mode_ob = BKE_layer_collection_engine_evaluated_get(ob, COLLECTION_MODE_OBJECT, "");
 		const bool do_cull = BKE_collection_engine_property_value_get_bool(ces_mode_ob, "show_backface_culling");
 		const bool is_sculpt_mode = is_active && (ob->mode & OB_MODE_SCULPT) != 0;
+		const bool is_default_mode_shader = is_sculpt_mode;
 
 		/* Depth Prepass */
 		{
@@ -728,7 +751,12 @@ static void CLAY_cache_populate(void *vedata, Object *ob)
 		}
 
 		/* Shading */
-		clay_shgrp = CLAY_object_shgrp_get(vedata, ob, stl, psl);
+		if (is_default_mode_shader) {
+			clay_shgrp = CLAY_object_shgrp_default_mode_get(vedata, ob, stl, psl);
+		}
+		else {
+			clay_shgrp = CLAY_object_shgrp_get(vedata, ob, stl, psl, false);
+		}
 
 		if (is_sculpt_mode) {
 			DRW_shgroup_call_sculpt_add(clay_shgrp, ob, ob->obmat);
@@ -809,6 +837,7 @@ static void CLAY_draw_scene(void *vedata)
 
 	/* Pass 3 : Shading */
 	DRW_draw_pass(psl->clay_pass);
+	DRW_draw_pass(psl->clay_pass_flat);
 	DRW_draw_pass(psl->hair_pass);
 }
 
@@ -842,6 +871,7 @@ static void CLAY_scene_layer_settings_create(RenderEngine *UNUSED(engine), IDPro
 static void CLAY_engine_free(void)
 {
 	DRW_SHADER_FREE_SAFE(e_data.clay_sh);
+	DRW_SHADER_FREE_SAFE(e_data.clay_flat_sh);
 	DRW_SHADER_FREE_SAFE(e_data.hair_sh);
 	DRW_TEXTURE_FREE_SAFE(e_data.matcap_array);
 	DRW_TEXTURE_FREE_SAFE(e_data.jitter_tx);
diff --git a/source/blender/draw/engines/clay/shaders/clay_frag.glsl b/source/blender/draw/engines/clay/shaders/clay_frag.glsl
index 8eb0f6e7827..033db365337 100644
--- a/source/blender/draw/engines/clay/shaders/clay_frag.glsl
+++ b/source/blender/draw/engines/clay/shaders/clay_frag.glsl
@@ -38,7 +38,12 @@ uniform int mat_id;
 #define matcap_index		matcaps_param[mat_id].matcap_hsv_id.w
 #define matcap_rotation		matcaps_param[mat_id].matcap_rot.xy
 
+#ifdef USE_FLAT_NORMAL
+flat in vec3 normal;
+#else
 in vec3 normal;
+#endif
+
 out vec4 fragColor;
 
 /* TODO Move this to SSAO modules */
diff --git a/source/blender/draw/engines/clay/shaders/clay_vert.glsl b/source/blender/draw/engines/clay/shaders/clay_vert.glsl
index 557445d5ef9..8f8866b3839 100644
--- a/source/blender/draw/engines/clay/shaders/clay_vert.glsl
+++ b/source/blender/draw/engines/clay/shaders/clay_vert.glsl
@@ -3,7 +3,12 @@ uniform mat3 NormalMatrix;
 
 in vec3 pos;
 in vec3 nor;
+
+#ifdef USE_FLAT_NORMAL
+flat out vec3 normal;
+#else
 out vec3 normal;
+#endif
 
 void main()
 {
diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c
index 209584426bf..8d87ec94b5a 100644
--- a/source/blender/draw/engines/eevee/eevee_engine.c
+++ b/source/blender/draw/engines/eevee/eevee_engine.c
@@ -52,6 +52,7 @@ static struct {
 	char *frag_shader_lib;
 
 	struct GPUShader *default_lit;
+	struct GPUShader *default_lit_flat;
 	struct GPUShader *default_world;
 	struct GPUShader *default_background;
 	struct GPUShader *depth_sh;
@@ -253,6 +254,12 @@ static void EEVEE_engine_init(void *ved)
 		e_data.default_lit = DRW_shader_create(
 		        datatoc_lit_surface_vert_glsl, NULL, frag_str, SHADER_DEFINES "#define MESH_SHADER\n");
 
+		e_data.default_lit_flat = DRW_shader_create(
+		        datatoc_lit_surface_vert_glsl, NULL, frag_str,
+		        SHADER_DEFINES
+		        "#define MESH_SHADER\n"
+		        "#define USE_FLAT_NORMAL\n");
+
 		MEM_freeN(frag_str);
 	}
 
@@ -515,17 +522,32 @@ static void EEVEE_cache_init(void *vedata)
 		DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL;
 		psl->default_pass = DRW_pass_create("Default Shader Pass", state);
 
-		stl->g_data->default_lit_grp = DRW_shgroup_create(e_data.default_lit, psl->default_pass);
-		DRW_shgroup_uniform_block(stl->g_data->default_lit_grp, "light_block", stl->light_ubo);
-		DRW_shgroup_uniform_block(stl->g_data->default_lit_grp, "shadow_block", stl->shadow_ubo);
-		DRW_shgroup_uniform_int(stl->g_data->default_lit_grp, "light_count", &stl->lamps->num_light, 1);
-		DRW_shgroup_uniform_float(stl->g_data->default_lit_grp, "lodMax", &stl->probes->lodmax, 1);
-		DRW_shgroup_uniform_vec3(stl->g_data->default_lit_grp, "shCoefs[0]", (float *)stl->probes->shcoefs, 9);
-		DRW_shgroup_uniform_vec3(stl->g_data->default_lit_grp, "cameraPos", e_data.camera_pos, 1);
-		DRW_shgroup_uniform_texture(stl->g_data->default_lit_grp, "ltcMat", e_data.ltc_mat);
-		DRW_shgroup_uniform_texture(stl->g_data->default_lit_grp, "brdfLut", e_data.brdf_lut);
-		DRW_shgroup_uniform_texture(stl->g_data->default_lit_grp, "probeFiltered", txl->probe_pool);
-		/* NOTE : Adding Shadow Map textures uniform in EEVEE_cache_finish */
+		for (uint j = 0; j < 2; j++) {
+			struct GPUShader *shader;
+			struct DRWShadingGroup *shgrp;
+
+			if (j == 0) {
+				shader = e_data.default_lit;
+				shgrp = DRW_shgroup_create(shader, psl->default_pass);
+				stl->g_data->default_lit_grp = shgrp;
+			}
+			else {
+				shader = e_data.default_lit_flat;
+				shgrp = DRW_shgroup_create(shader, psl->default_pass);
+				stl->g_data->default_lit_grp_flat = shgrp;
+			}
+
+			DRW_shgroup_uniform_block(shgrp, "light_block", stl->light_ubo);
+			DRW_shgroup_uniform_block(shgrp, "shadow_block", stl->shadow_ubo);
+			DRW_shgroup_uniform_int(shgrp, "light_count", &stl->lamps->num_light, 1);
+			DRW_shgroup_uniform_float(shgrp, "lodMax", &stl->probes->lodmax, 1);
+			DRW_shgroup_uniform_vec3(shgrp, "shCoefs[0]", (float *)stl->probes->shcoefs, 9);
+			DRW_shgroup_uniform_vec3(shgrp, "cameraPos", e_data.camera_pos, 1);
+			DRW_shgroup_uniform_texture(shgrp, "ltcMat", e_data.ltc_mat);
+			DRW_shgroup_uniform_texture(shgrp, "brdfLut", e_data.brdf_lut);
+			DRW_shgro

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list