[Bf-blender-cvs] [89d99b6b77] clay-engine: Added matcap rotation

Clément Foucault noreply at git.blender.org
Tue Jan 10 23:59:58 CET 2017


Commit: 89d99b6b77454e1a238a201d1aef9387e2a16d77
Author: Clément Foucault
Date:   Tue Jan 10 23:10:53 2017 +0100
Branches: clay-engine
https://developer.blender.org/rB89d99b6b77454e1a238a201d1aef9387e2a16d77

Added matcap rotation

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

M	source/blender/blenloader/intern/versioning_280.c
M	source/blender/draw/engines/clay/clay.c
M	source/blender/draw/engines/clay/shaders/clay_frag.glsl
M	source/blender/draw/intern/DRW_render.h
M	source/blender/draw/intern/draw_manager.c

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

diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c
index 8059aab809..22a0aa5613 100644
--- a/source/blender/blenloader/intern/versioning_280.c
+++ b/source/blender/blenloader/intern/versioning_280.c
@@ -143,5 +143,18 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *main)
 				BLI_strncpy(scene->collection->name, "Master Collection", sizeof(scene->collection->name));
 			}
 		}
+
+		/* Clay engine defaults */
+		for (Scene *scene = main->scene.first; scene; scene = scene->id.next) {
+			EngineDataClay *settings = &scene->claydata;
+
+			settings->matcap_rot = 0.0;
+			settings->matcap_hue = 0.0;
+			settings->ssao_distance = 0.2;
+			settings->ssao_attenuation = 1.0f;
+			settings->ssao_factor_cavity = 2.0f;
+			settings->ssao_factor_edge = 2.0f;
+			settings->ssao_samples = 32;
+		}
 	}
 }
diff --git a/source/blender/draw/engines/clay/clay.c b/source/blender/draw/engines/clay/clay.c
index f903e55cf3..074fe6db69 100644
--- a/source/blender/draw/engines/clay/clay.c
+++ b/source/blender/draw/engines/clay/clay.c
@@ -51,6 +51,7 @@ static struct CLAY_data {
 	/* Matcap textures */
 	struct GPUTexture *matcap_array;
 	float matcap_colors[24][3];
+	float matcap_rot[2];
 	int matcap_id;
 
 	/* Ssao */
@@ -110,9 +111,9 @@ static void add_icon_to_rect(PreviewImage *prv, float *final_rect, int layer)
 		}
 	}
 
-	data.matcap_colors[layer][0] /= 16.0f;
-	data.matcap_colors[layer][1] /= 16.0f;
-	data.matcap_colors[layer][2] /= 16.0f;
+	data.matcap_colors[layer][0] /= 16.0f * 2.0f; /* the * 2 is to darken for shadows */
+	data.matcap_colors[layer][1] /= 16.0f * 2.0f;
+	data.matcap_colors[layer][2] /= 16.0f * 2.0f;
 }
 
 static struct GPUTexture *load_matcaps(PreviewImage *prv[24], int nbr)
@@ -188,6 +189,7 @@ static struct GPUTexture *create_jitter_texture(void)
 	float jitter[64 * 64][2];
 	int i;
 
+	/* TODO replace by something more evenly distributed like blue noise */
 	for (i = 0; i < 64 * 64; i++) {
 		jitter[i][0] = 2.0f * BLI_frand() - 1.0f;
 		jitter[i][1] = 2.0f * BLI_frand() - 1.0f;
@@ -252,8 +254,10 @@ static void clay_engine_init(void)
 	if (!data.clay_sh) {
 		const char *defines =
 		        "#define USE_AO;\n"
-		        "//#define USE_ROTATION;\n";
+		        "#define USE_ROTATION;\n";
 
+		/* TODO Optimisation : Create shader combinations and bind the right 
+		 * shader depending on the material settings */
 		data.clay_sh = DRW_shader_create(datatoc_clay_vert_glsl, NULL, datatoc_clay_frag_glsl, defines);
 	}
 }
@@ -298,7 +302,7 @@ static void clay_populate_passes(CLAY_PassList *passes, const struct bContext *C
 		DRW_batch_uniform_buffer(batch, "depthtex", SCENE_DEPTH, depthloc);
 		DRW_batch_uniform_texture(batch, "matcaps", data.matcap_array, matcaploc);
 		DRW_batch_uniform_vec3(batch, "matcaps_color", (float *)data.matcap_colors, 24);
-		DRW_batch_uniform_vec3(batch, "matcaps_color", (float *)data.matcap_colors, 24);
+		DRW_batch_uniform_vec2(batch, "matcap_rotation", (float *)data.matcap_rot, 1);
 		DRW_batch_uniform_int(batch, "matcap_index", &data.matcap_id, 1);
 
 		/* SSAO */
@@ -313,23 +317,46 @@ static void clay_populate_passes(CLAY_PassList *passes, const struct bContext *C
 		pop_clay = true;
 	}
 
-	Object *ob;
-	FOREACH_OBJECT(sl, ob)
+	/* Update default material */
 	{
-		/* Create hash table of batch based on material id*/
+		EngineDataClay *settings = DRW_render_settings();
 
-		/* Add everything for now */
-		if (pop_clay) {
-			DRW_batch_add_surface(matcapbatch, ob);
-		}
+		data.matcap_rot[0] = cosf(settings->matcap_rot * 3.14159f * 2.0f);
+		data.matcap_rot[1] = sinf(settings->matcap_rot * 3.14159f * 2.0f);
 
-		if (pop_depth) {
-			DRW_batch_add_surface(depthbatch, ob);
-		}
+		data.ssao_params_var[0] = settings->ssao_distance;
+		data.ssao_params_var[1] = settings->ssao_factor_cavity;
+		data.ssao_params_var[2] = settings->ssao_factor_edge;
+		data.ssao_params_var[3] = settings->ssao_attenuation;
+	}
+
+	static bool first = true;
+	if (first) {
+		first = false;
+
+		/* TODO Why this is crashing? we want to start from an empty list
+		 * Seems like ob genericNode (see below) is freed two times */
+		// DRW_batch_surface_clear(matcapbatch);
+		// DRW_batch_surface_clear(depthbatch);
 
-		/* Free hash table */
+		Object *ob;
+		FOREACH_OBJECT(sl, ob)
+		{
+			/* Create hash table of batch based on material id*/
+
+			/* Add everything for now */
+			if (pop_clay) {
+				DRW_batch_surface_add(matcapbatch, ob);
+			}
+
+			if (pop_depth) {
+				DRW_batch_surface_add(depthbatch, ob);
+			}
+
+			/* Free hash table */
+		}
+		FOREACH_OBJECT_END
 	}
-	FOREACH_OBJECT_END
 }
 
 static void clay_ssao_setup(void)
@@ -349,11 +376,6 @@ static void clay_ssao_setup(void)
 
 	DRW_get_dfdy_factors(dfdyfacs);
 
-	data.ssao_params_var[0] = settings->ssao_distance;
-	data.ssao_params_var[1] = settings->ssao_factor_cavity;
-	data.ssao_params_var[2] = settings->ssao_factor_edge;
-	data.ssao_params_var[3] = settings->ssao_attenuation;
-
 	data.ssao_params[0] = settings->ssao_samples;
 	data.ssao_params[1] = size[0] / 64.0;
 	data.ssao_params[2] = size[1] / 64.0;
@@ -414,11 +436,7 @@ static void clay_view_draw(RenderEngine *UNUSED(engine), const struct bContext *
 	/* TODO : tag to refresh by the deps graph */
 	/* ideally only refresh when objects are added/removed */
 	/* or render properties / materials change */
-	static bool first = true;
-	if (first) {
-		first = false;
-		clay_populate_passes(passes, context);
-	}
+	clay_populate_passes(passes, context);
 
 	DRW_draw_background();
 
diff --git a/source/blender/draw/engines/clay/shaders/clay_frag.glsl b/source/blender/draw/engines/clay/shaders/clay_frag.glsl
index f40fe63db2..d79cc615ab 100644
--- a/source/blender/draw/engines/clay/shaders/clay_frag.glsl
+++ b/source/blender/draw/engines/clay/shaders/clay_frag.glsl
@@ -51,6 +51,7 @@ vec3 get_view_space_from_depth(in vec2 uvcoords, in vec3 viewvec_origin, in vec3
 	return zview * (viewvec_origin + vec3(uvcoords, 0.0) * viewvec_diff);
 }
 
+/* TODO remove this when switching to geometric normals */
 vec3 calculate_view_space_normal(in vec3 viewposition)
 {
 	vec3 normal = cross(normalize(dFdx(viewposition)), dfdy_sign * normalize(dFdy(viewposition)));
@@ -58,6 +59,7 @@ vec3 calculate_view_space_normal(in vec3 viewposition)
 	return normalize(normal);
 }
 
+#ifdef USE_AO
 void calculate_ssao_factor(in float depth, in vec3 normal, in vec3 position, out float cavities, out float edges)
 {
 	vec2 uvs = vec2(gl_FragCoord.xy) / vec2(screenres);
@@ -118,7 +120,7 @@ void calculate_ssao_factor(in float depth, in vec3 normal, in vec3 position, out
 	cavities = clamp(cavities * ssao_factor_cavity, 0.0, 0.85);
 	edges = edges * ssao_factor_edge;
 }
-
+#endif
 
 void main() {
 	vec2 uvs = vec2(gl_FragCoord.xy) / vec2(screenres);
@@ -133,11 +135,12 @@ void main() {
 	if (gl_FragCoord.z > depth + 1e-5)
 		discard;
 
-	vec2 texco = abs(normal.xy * .49 + 0.5);
 #ifdef USE_ROTATION
 	/* Rotate texture coordinates */
-	vec2 rotY = vec2(-matcap_roation.y, matcap_roation.x);
-	texco = vec2(dot(texco, matcap_roation), dot(texco, rotY));
+	vec2 rotY = vec2(-matcap_rotation.y, matcap_rotation.x);
+	vec2 texco = abs(vec2(dot(normal.xy, matcap_rotation), dot(normal.xy, rotY)) * .49 + 0.5);
+#else
+	vec2 texco = abs(normal.xy * .49 + 0.5);
 #endif
 	vec3 col = texture(matcaps, vec3(texco, float(matcap_index))).rgb;
 
@@ -145,7 +148,7 @@ void main() {
 	float cavity, edges;
 	calculate_ssao_factor(depth, normal, position, cavity, edges);
 
-	col = mix(col, matcaps_color[int(matcap_index)] * 0.5, cavity);
+	col = mix(col, matcaps_color[int(matcap_index)], cavity);
 	col *= edges + 1.0;
 #endif
 
diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h
index 47af819195..5a3835b8ee 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -131,7 +131,8 @@ void DRW_shader_free(struct GPUShader *shader);
 /* Batches */
 DRWBatch *DRW_batch_create(struct GPUShader *shader, DRWPass *pass);
 void DRW_batch_free(struct DRWBatch *batch);
-void DRW_batch_add_surface(DRWBatch *batch, struct Object *ob);
+void DRW_batch_surface_add(DRWBatch *batch, struct Object *ob);
+void DRW_batch_surface_clear(DRWBatch *batch);
 
 void DRW_batch_uniform_texture(DRWBatch *batch, const char *name, const struct GPUTexture *tex, int loc);
 void DRW_batch_uniform_buffer(DRWBatch *batch, const char *name, const int value, int loc);
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index 86ff210908..3576ff312a 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -345,11 +345,20 @@ void DRW_batch_free(struct DRWBatch *batch)
 }
 
 /* Later use VBO */
-void DRW_batch_add_surface(DRWBatch *batch, Object *ob)
+void DRW_batch_surface_add(DRWBatch *batch, Object *ob)
 {
 	BLI_addtail(&batch->objects, BLI_genericNodeN(ob));
 }
 
+void DRW_batch_surface_clear(DRWBatch *batch)
+{
+	for (LinkData *link = batch->objects.first; link; link = link->next) {
+		MEM_freeN(link->data);
+	}
+	BLI_freelistN(&batch->objects);
+	//BLI_listbase_clear(&batch->objects);
+}
+
 void DRW_batch_uniform_texture(DRWBatch *batch, const char *name, const GPUTexture *tex, int loc)
 {
 	DRW_interface_uniform(batch, name, DRW_UNIFORM_TEXTURE, tex, 0, 0, loc);




More information about the Bf-blender-cvs mailing list