[Bf-blender-cvs] [00c3c6824d] clay-engine: Integrated MBC functions. Added Object centers and empties.

Clément Foucault noreply at git.blender.org
Thu Jan 26 15:57:46 CET 2017


Commit: 00c3c6824d6304ffbb3d858fa936edc2c1c4c2fa
Author: Clément Foucault
Date:   Thu Jan 26 15:56:40 2017 +0100
Branches: clay-engine
https://developer.blender.org/rB00c3c6824d6304ffbb3d858fa936edc2c1c4c2fa

Integrated MBC functions. Added Object centers and empties.

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

M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/DRW_engine.h
M	source/blender/draw/engines/clay/clay.c
M	source/blender/draw/engines/clay/shaders/clay_frag.glsl
M	source/blender/draw/engines/clay/shaders/ssao_groundtruth.glsl
M	source/blender/draw/intern/DRW_render.h
A	source/blender/draw/intern/draw_cache.c
A	source/blender/draw/intern/draw_cache.h
M	source/blender/draw/intern/draw_manager.c
M	source/blender/draw/intern/draw_mode_pass.c
M	source/blender/draw/intern/draw_mode_pass.h
M	source/blender/editors/space_view3d/view3d_draw.c
M	source/blender/editors/space_view3d/view3d_intern.h
M	source/blender/gpu/intern/gpu_viewport.c

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

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 1aababc350..4cc69c0ea0 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -52,10 +52,12 @@ set(INC_SYS
 set(SRC
 	intern/draw_manager.c
 	intern/draw_mode_pass.c
+	intern/draw_cache.c
 	engines/clay/clay.c
 
 	intern/DRW_render.h
 	intern/draw_mode_pass.h
+	intern/draw_cache.h
 	engines/clay/clay.h
 
 	./DRW_engine.h
diff --git a/source/blender/draw/DRW_engine.h b/source/blender/draw/DRW_engine.h
index 43e0657e4d..ad05cf625f 100644
--- a/source/blender/draw/DRW_engine.h
+++ b/source/blender/draw/DRW_engine.h
@@ -31,6 +31,7 @@ struct DRWPass;
 void DRW_engines_init(void);
 void DRW_engines_free(void);
 
+/* This is here because GPUViewport needs it */
 void DRW_pass_free(struct DRWPass *pass);
 
 #endif /* __DRW_ENGINE_H__ */
\ No newline at end of file
diff --git a/source/blender/draw/engines/clay/clay.c b/source/blender/draw/engines/clay/clay.c
index 459a413454..a6b6fc95d5 100644
--- a/source/blender/draw/engines/clay/clay.c
+++ b/source/blender/draw/engines/clay/clay.c
@@ -113,8 +113,10 @@ typedef struct CLAY_TextureList{
 typedef struct CLAY_PassList{
 	struct DRWPass *depth_pass;
 	struct DRWPass *clay_pass;
-	struct DRWPass *mode_ob_wire_pass;
-	struct DRWPass *mode_ob_center_pass;
+	struct DRWPass *wire_overlay_pass;
+	struct DRWPass *wire_outline_pass;
+	struct DRWPass *non_meshes_pass;
+	struct DRWPass *ob_center_pass;
 } CLAY_PassList;
 
 //#define GTAO
@@ -312,6 +314,57 @@ static void CLAY_engine_init(void)
 	}
 }
 
+static void CLAY_ssao_setup(void)
+{
+	float invproj[4][4];
+	float dfdyfacs[2];
+	bool is_persp = DRW_viewport_is_persp_get();
+	/* view vectors for the corners of the view frustum. Can be used to recreate the world space position easily */
+	float viewvecs[3][4] = {
+	    {-1.0f, -1.0f, -1.0f, 1.0f},
+	    {1.0f, -1.0f, -1.0f, 1.0f},
+	    {-1.0f, 1.0f, -1.0f, 1.0f}
+	};
+	int i;
+	float *size = DRW_viewport_size_get();
+	EngineDataClay *settings = DRW_render_settings();
+
+	DRW_get_dfdy_factors(dfdyfacs);
+
+	data.ssao_params[0] = settings->ssao_samples;
+	data.ssao_params[1] = size[0] / 64.0;
+	data.ssao_params[2] = size[1] / 64.0;
+	data.ssao_params[3] = dfdyfacs[1]; /* dfdy sign for offscreen */
+
+	/* invert the view matrix */
+	DRW_viewport_matrix_get(data.winmat, DRW_MAT_WIN);
+	invert_m4_m4(invproj, data.winmat);
+
+	/* convert the view vectors to view space */
+	for (i = 0; i < 3; i++) {
+		mul_m4_v4(invproj, viewvecs[i]);
+		/* normalized trick see http://www.derschmale.com/2014/01/26/reconstructing-positions-from-the-depth-buffer */
+		mul_v3_fl(viewvecs[i], 1.0f / viewvecs[i][3]);
+		if (is_persp)
+			mul_v3_fl(viewvecs[i], 1.0f / viewvecs[i][2]);
+		viewvecs[i][3] = 1.0;
+
+		copy_v4_v4(data.viewvecs[i], viewvecs[i]);
+	}
+
+	/* we need to store the differences */
+	data.viewvecs[1][0] -= data.viewvecs[0][0];
+	data.viewvecs[1][1] = data.viewvecs[2][1] - data.viewvecs[0][1];
+
+	/* calculate a depth offset as well */
+	if (!is_persp) {
+		float vec_far[] = {-1.0f, -1.0f, 1.0f, 1.0f};
+		mul_m4_v4(invproj, vec_far);
+		mul_v3_fl(vec_far, 1.0f / vec_far[3]);
+		data.viewvecs[1][2] = vec_far[2] - data.viewvecs[0][2];
+	}
+}
+
 static DRWShadingGroup *CLAY_shgroup_create(DRWPass *pass, int *material_id)
 {
 	const int depthloc = 0, matcaploc = 1, jitterloc = 2, sampleloc = 3;
@@ -319,7 +372,7 @@ static DRWShadingGroup *CLAY_shgroup_create(DRWPass *pass, int *material_id)
 	CLAY_UBO_Material *mat = &data.mat_storage.materials[0];
 	DRWShadingGroup *grp = DRW_shgroup_create(data.clay_sh, pass);
 
-	DRW_shgroup_uniform_ivec2(grp, "screenres", DRW_viewport_size_get(), 1);
+	DRW_shgroup_uniform_vec2(grp, "screenres", DRW_viewport_size_get(), 1);
 	DRW_shgroup_uniform_buffer(grp, "depthtex", SCENE_DEPTH, depthloc);
 	DRW_shgroup_uniform_texture(grp, "matcaps", data.matcap_array, matcaploc);
 	DRW_shgroup_uniform_mat4(grp, "WinMatrix", (float *)data.winmat);
@@ -463,84 +516,50 @@ static void CLAY_create_cache(CLAY_PassList *passes, const struct bContext *C)
 
 	/* Object Mode */
 	{
-		DRW_mode_object_setup(&passes->mode_ob_wire_pass, &passes->mode_ob_center_pass);
+		DRW_pass_setup_common(&passes->wire_overlay_pass,
+			                  &passes->wire_outline_pass,
+			                  &passes->non_meshes_pass,
+			                  &passes->ob_center_pass);
 	}
 
 	/* TODO Create hash table of batch based on material id*/
 	FOREACH_OBJECT(sl, ob)
 	{
-		if (ob->type == OB_MESH) {
-			struct Batch *geom = DRW_cache_surface_get(ob);
-
-			/* Add everything for now */
-			DRW_shgroup_call_add(default_shgrp, geom, &ob->obmat);
-
-			/* When encountering a new material :
-			 * - Create new Batch
-			 * - Initialize Batch
-			 * - Push it to the hash table
-			 * - The pass takes care of inserting it
-			 * next to the same shader calls */
-
-			DRW_shgroup_call_add(depthbatch, geom, &ob->obmat);
-
-			/* Free hash table */
-
-			DRW_mode_object_add(passes->mode_ob_wire_pass, passes->mode_ob_center_pass, ob);
+		struct Batch *geom;
+
+		switch (ob->type) {
+			case OB_MESH:
+				geom = DRW_cache_surface_get(ob);
+
+				/* Add everything for now */
+				DRW_shgroup_call_add(depthbatch, geom, &ob->obmat);
+				DRW_shgroup_call_add(default_shgrp, geom, &ob->obmat);
+
+				/* When encountering a new material :
+				 * - Create new Batch
+				 * - Initialize Batch
+				 * - Push it to the hash table
+				 * - The pass takes care of inserting it
+				 * next to the same shader calls */
+
+				/* Free hash table */
+				break;
+			case OB_LAMP:
+			case OB_CAMERA:
+			case OB_EMPTY:
+			default:
+				DRW_shgroup_non_meshes(passes->non_meshes_pass, ob);
+				break;
 		}
-	}
-	FOREACH_OBJECT_END
-}
-
-static void CLAY_ssao_setup(void)
-{
-	float invproj[4][4];
-	float dfdyfacs[2];
-	bool is_persp = DRW_viewport_is_persp_get();
-	/* view vectors for the corners of the view frustum. Can be used to recreate the world space position easily */
-	float viewvecs[3][4] = {
-	    {-1.0f, -1.0f, -1.0f, 1.0f},
-	    {1.0f, -1.0f, -1.0f, 1.0f},
-	    {-1.0f, 1.0f, -1.0f, 1.0f}
-	};
-	int i;
-	int *size = DRW_viewport_size_get();
-	EngineDataClay *settings = DRW_render_settings();
-
-	DRW_get_dfdy_factors(dfdyfacs);
-
-	data.ssao_params[0] = settings->ssao_samples;
-	data.ssao_params[1] = size[0] / 64.0;
-	data.ssao_params[2] = size[1] / 64.0;
-	data.ssao_params[3] = dfdyfacs[1]; /* dfdy sign for offscreen */
 
-	/* invert the view matrix */
-	DRW_viewport_matrix_get(data.winmat, DRW_MAT_WIN);
-	invert_m4_m4(invproj, data.winmat);
-
-	/* convert the view vectors to view space */
-	for (i = 0; i < 3; i++) {
-		mul_m4_v4(invproj, viewvecs[i]);
-		/* normalized trick see http://www.derschmale.com/2014/01/26/reconstructing-positions-from-the-depth-buffer */
-		mul_v3_fl(viewvecs[i], 1.0f / viewvecs[i][3]);
-		if (is_persp)
-			mul_v3_fl(viewvecs[i], 1.0f / viewvecs[i][2]);
-		viewvecs[i][3] = 1.0;
-
-		copy_v4_v4(data.viewvecs[i], viewvecs[i]);
+		/* Add all object center for now */
+		DRW_shgroup_object_center(passes->ob_center_pass, ob);
 	}
+	FOREACH_OBJECT_END
 
-	/* we need to store the differences */
-	data.viewvecs[1][0] -= data.viewvecs[0][0];
-	data.viewvecs[1][1] = data.viewvecs[2][1] - data.viewvecs[0][1];
-
-	/* calculate a depth offset as well */
-	if (!is_persp) {
-		float vec_far[] = {-1.0f, -1.0f, 1.0f, 1.0f};
-		mul_m4_v4(invproj, vec_far);
-		mul_v3_fl(vec_far, 1.0f / vec_far[3]);
-		data.viewvecs[1][2] = vec_far[2] - data.viewvecs[0][2];
-	}
+	/* Optimization */
+	// DRWShadingGroup *shgrp = DRW_pass_nth_shgroup_get(passes->ob_center_pass, 0);
+	// DRW_shgroup_batch_calls_object_center(shgrp);
 }
 
 static void CLAY_view_draw(RenderEngine *UNUSED(engine), const struct bContext *context)
@@ -560,7 +579,11 @@ 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 */
-	if (DRW_viewport_cache_is_dirty()) {
+	//static bool once = false;
+	if (DRW_viewport_cache_is_dirty()
+		//&& !once
+		) {
+		//once = true;
 		CLAY_create_cache(passes, context);
 	}
 
@@ -580,7 +603,8 @@ static void CLAY_view_draw(RenderEngine *UNUSED(engine), const struct bContext *
 
 	/* Pass 4 : Overlays */
 	DRW_framebuffer_texture_attach(buffers->default_fb, textures->depth, 0);
-	DRW_draw_pass(passes->mode_ob_wire_pass);
+	DRW_draw_pass(passes->non_meshes_pass);
+	DRW_draw_pass(passes->ob_center_pass);
 
 	/* Always finish by this */
 	DRW_state_reset();
diff --git a/source/blender/draw/engines/clay/shaders/clay_frag.glsl b/source/blender/draw/engines/clay/shaders/clay_frag.glsl
index be10f0d509..d9b372b652 100644
--- a/source/blender/draw/engines/clay/shaders/clay_frag.glsl
+++ b/source/blender/draw/engines/clay/shaders/clay_frag.glsl
@@ -1,4 +1,4 @@
-uniform ivec2 screenres;
+uniform vec2 screenres;
 uniform sampler2D depthtex;
 uniform mat4 WinMatrix;
 
@@ -164,7 +164,7 @@ void ssao_factors(in float depth, in vec3 normal, in vec3 position, in vec2 scre
 #endif
 
 void main() {
-	vec2 screenco = vec2(gl_FragCoord.xy) / vec2(screenres);
+	vec2 screenco = vec2(gl_FragCoord.xy) / screenres;
 	float depth = texture(depthtex, screenco).r;
 
 	vec3 position = get_view_space_from_depth(screenco, depth);
diff --git a/source/blender/draw/engines/clay/shaders/ssao_groundtruth.glsl b/source/blender/draw/engines/clay/shaders/ssao_groundtruth.glsl
index f4f6a4259f..2f29624824 100644
--- a/source/blender/draw/engines/clay/shaders/ssao_groundtruth.glsl
+++ b/source/blender/draw/engines/clay/shaders/ssao_groundtruth.glsl
@@ -67,8 +67,8 @@ void ssao_factors(in float depth, in vec3 normal, in vec3 position, in vec2 scre
 	const float phi_step = 16.0;
 	const float theta_step = 16.0;
 	const float m_pi = 3.14159265358979323846;
-	vec2 pixel_ratio = vec2(float(screenres.y) / float(screenres.x), 1.0);
-	vec2 pixel_size = vec2(1.0) / vec2(screenres.xy);
+	vec2 pixel_ratio = vec2(screenres.y / screenres.x, 1.0);
+	vec2 pixel_size = vec2(1.0) / screenres.xy;
 	float min_stride = length(pixel_size);
 	float homcco = WinMatrix[2][3] * position.z + WinMatrix[3][3];
 	float n

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list