[Bf-blender-cvs] [50fb3ea3de] blender2.8: Clay Engine: Separate mode drawing to different files/engines.

Clément Foucault noreply at git.blender.org
Fri Feb 17 17:37:53 CET 2017


Commit: 50fb3ea3de8db278fd135392b990158b745e3e3f
Author: Clément Foucault
Date:   Fri Feb 17 17:29:43 2017 +0100
Branches: blender2.8
https://developer.blender.org/rB50fb3ea3de8db278fd135392b990158b745e3e3f

Clay Engine: Separate mode drawing to different files/engines.

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

M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/engines/clay/clay.c
M	source/blender/draw/intern/DRW_render.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
A	source/blender/draw/modes/edit_mode.c
A	source/blender/draw/modes/edit_mode.h
A	source/blender/draw/modes/object_mode.c
A	source/blender/draw/modes/object_mode.h
M	source/blender/editors/space_view3d/view3d_draw.c
M	source/blender/gpu/GPU_viewport.h
M	source/blender/gpu/intern/gpu_viewport.c

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

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 006fb0fbc2..be517d799a 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -27,6 +27,7 @@ set(INC
 	.
 	intern
 	engines/clay
+	modes/
 
 	../blenkernel
 	../blenlib
@@ -55,12 +56,16 @@ set(SRC
 	intern/draw_cache.c
 	intern/draw_view.c
 	engines/clay/clay.c
+	modes/edit_mode.c
+	modes/object_mode.c
 
 	intern/DRW_render.h
 	intern/draw_mode_pass.h
 	intern/draw_cache.h
 	intern/draw_view.h
 	engines/clay/clay.h
+	modes/edit_mode.h
+	modes/object_mode.h
 
 	./DRW_engine.h
 )
diff --git a/source/blender/draw/engines/clay/clay.c b/source/blender/draw/engines/clay/clay.c
index 1673dd219c..f121eb8600 100644
--- a/source/blender/draw/engines/clay/clay.c
+++ b/source/blender/draw/engines/clay/clay.c
@@ -126,17 +126,9 @@ enum {
 
 /* keep it under MAX_PASSES */
 typedef struct CLAY_PassList{
-	/* default */
-	struct DRWPass *non_meshes_pass;
-	struct DRWPass *ob_center_pass;
-	/* engine specific */
 	struct DRWPass *depth_pass;
 	struct DRWPass *depth_pass_cull;
-	struct DRWPass *depth_pass_hidden_wire;
 	struct DRWPass *clay_pass;
-	struct DRWPass *wire_overlay_pass;
-	struct DRWPass *wire_outline_pass;
-	struct DRWPass *wire_outline_pass_hidden_wire;
 } CLAY_PassList;
 
 //#define GTAO
@@ -286,8 +278,12 @@ MaterialEngineSettings *CLAY_material_settings_create(void)
 	return (MaterialEngineSettings *)settings;
 }
 
-static void CLAY_engine_init(CLAY_StorageList *stl, CLAY_TextureList *txl, CLAY_FramebufferList *fbl)
+static void CLAY_engine_init(void)
 {
+	CLAY_StorageList *stl = DRW_engine_storage_list_get();
+	CLAY_TextureList *txl = DRW_engine_texture_list_get();
+	CLAY_FramebufferList *fbl = DRW_engine_framebuffer_list_get();
+
 	/* Create Texture Array */
 	if (!data.matcap_array) {
 		PreviewImage *prv[24]; /* For now use all of the 24 internal matcaps */
@@ -384,56 +380,56 @@ static void CLAY_engine_init(CLAY_StorageList *stl, CLAY_TextureList *txl, CLAY_
 		                     (int)viewport_size[0], (int)viewport_size[1],
 		                     &tex, 1);
 	}
-}
 
-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();
-	RenderEngineSettingsClay *settings = DRW_render_settings_get(NULL, RE_engine_id_BLENDER_CLAY);
-
-	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]);
-	}
+	/* SSAO setup */
+	{
+		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();
+		RenderEngineSettingsClay *settings = DRW_render_settings_get(NULL, RE_engine_id_BLENDER_CLAY);
+
+		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];
+		/* 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];
+		/* 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];
+		}
 	}
 }
 
@@ -605,112 +601,104 @@ static DRWShadingGroup *CLAY_object_shgrp_get(Object *ob, CLAY_StorageList *stl,
 	return shgrps[id];
 }
 
-static void CLAY_create_cache(CLAY_PassList *passes, CLAY_StorageList *stl, const struct bContext *C)
+static DRWShadingGroup *depth_shgrp;
+static DRWShadingGroup *depth_shgrp_cull;
+
+static void CLAY_cache_init(void)
 {
-	SceneLayer *sl = CTX_data_scene_layer(C);
-	DRWShadingGroup *clay_shgrp;
-	DRWShadingGroup *depth_shgrp;
-	DRWShadingGroup *depth_shgrp_cull;
-	DRWShadingGroup *depth_shgrp_hidden_wire;
+	CLAY_PassList *psl = DRW_engine_pass_list_get();
+	CLAY_StorageList *stl = DRW_engine_storage_list_get();
+
 
 	/* Depth Pass */
 	{
-		passes->depth_pass_cull = DRW_pass_create("Depth Pass Cull", DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS | DRW_STATE_CULL_BACK);
-		depth_shgrp_cull = DRW_shgroup_create(data.depth_sh, passes->depth_pass_cull);
-		passes->depth_pass = DRW_pass_create("Depth Pass", DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS);
-		depth_shgrp = DRW_shgroup_create(data.depth_sh, passes->depth_pass);
-		passes->depth_pass_hidden_wire = DRW_pass_create("Depth Pass Hidden Wire", DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS | DRW_STATE_CULL_BACK);
-		depth_shgrp_hidden_wire = DRW_shgroup_create(data.depth_sh, passes->depth_pass_hidden_wire);
+		psl->depth_pass_cull = DRW_pass_create("Depth Pass Cull", DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS | DRW_STATE_CULL_BACK);
+		psl->depth_pass = DRW_pass_create("Depth Pass", DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS);
+
+		depth_shgrp_cull = DRW_shgroup_create(data.depth_sh, psl->depth_pass_cull);
+		depth_shgrp = DRW_shgroup_create(data.depth_sh, psl->depth_pass);
 	}
 
 	/* Clay Pass */
 	{
-		passes->clay_pass = DRW_pass_create("Clay Pass", DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL);
+		psl->clay_pass = DRW_pass_create("Clay Pass", DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL);
 		stl->storage->ubo_current_id = 0;
 		memset(stl->storage->shgrps, 0, sizeof(DRWShadingGroup *) * MAX_CLAY_MAT);
 	}
+}
 
-	/* Object Mode */
-	{
-		DRW_pass_setup_common(&passes->wire_overlay_pass,
-			                  &passes->wire_outline_pass,
-			                  &passes->wire_outline_pass_hidden_wire,
-			                  &passes->non_meshes_pass,
-			                  &passes->ob_center_pass);
-	}
+static void CLAY_cache_populate(Object *ob)
+{
+	const bContext *C = DRW_get_context();
+	int mode = CTX_data_mode_enum(C);
+	CLAY_StorageList *stl = DRW_engine_storage_list_get();
+	CLAY_PassList *psl = DRW_engine_pass_list_get();
+	struct Batch *geom;
+	DRWShadingGroup *clay_shgrp;
+	bool do_occlude_wire = false;
+	bool do_cull = false;
+	CollectionEngineSettings *ces_mode_ed, *ces_mode_ob;
 
-	/* TODO Create hash table of batch based on material id*/
-	DEG_OBJECT_ITER(sl, ob);
-	{
-		if ((ob->base_flag & BASE_VISIBLED) == 0) {
-			continue;
-		}
+	if ((ob->base_flag & BASE_VISIBLED) == 0)
+		return;
 
-		CollectionEngineSettings *ces_mode_ob = BKE_object_collection_engine_get(ob, COLLECTION_MODE_OBJECT, "");
-		CollectionEngineSettings *ces_mode_ed = BKE_object_collection_engine_get(ob, COLLECTION_MODE_EDIT, "");
-
-		struct Batch *geom;
-		bool do_wire = BKE_collection_engine_property_value_get_bool(ces_mode_ob, "show_wire");
-		bool do_cull = BKE_collection_engine_property_value_get_bool(ces_mode_ob, "show_backface_culling");
-		bool do_occlude_wire = BKE_collection_engine_property_value_get_bool(ces_mode_ed, "show_occlude_wire");
-		bool do_outlines = ((ob->base_flag & BASE_SELECTED) != 0) || do_wire;
-
-		switch (ob->type) {
-			case OB_MESH:
-				geom = DRW_cache_surface_get(ob);
-
-				/* Depth Prepass */
-				if (do_occlude_wire)
-					DRW_shgroup_call_add(depth_shgrp_hidden_wire, geom, ob->obmat);
-				else
-					DRW_shgroup_call_add((do_cull) ? depth_shgrp_cull : depth_shgrp, geom, ob->obmat);
-
-				/* Shading */
-				if (!do_occlude_wire) {
-					clay_shgrp = CLAY_object_shgrp_get(ob, stl, passes);
-					DRW_shgroup_call_add(clay_shgrp, geom, ob->obmat);
-				}
-
-				//DRW_shgroup_wire_overlay(passes->wire_overlay_pass, ob);
-
-				/* Wires / Outlines */
-				if (do_occlude_wire) {
-					DRW_shgroup_wire_outline(passes->wire_outline_pass_hidden_wire, ob, true, false, true);
-				}
-				else {
-					DRW_shgroup_wire_outline(passes->wire_outline_pass, ob, do_wire, false, do_outlines);
-				}
-
-				break;
-			case OB_LAMP:
-			case OB_CAMERA:
-			case OB_EMPTY:
-			default:
-				DRW_shgroup_non_meshes(passes->non_meshes_pass, ob);
-				break;
-		}
+	switch (mode) {
+		case CTX_MODE_EDIT_MESH:
+		case CTX_MODE_EDIT_CURVE:
+		case CTX_MODE_EDIT_SURFACE:
+		case CTX_MODE_EDIT_TEXT:
+		case 

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list