[Bf-blender-cvs] [1c91b6ee298] master: UVEdit: Port texpaint_loop_wire to batch request

Clément Foucault noreply at git.blender.org
Fri Jan 11 16:00:57 CET 2019


Commit: 1c91b6ee29845c323ffd3f477b56f3a68f4e76be
Author: Clément Foucault
Date:   Thu Jan 10 22:22:42 2019 +0100
Branches: master
https://developer.blender.org/rB1c91b6ee29845c323ffd3f477b56f3a68f4e76be

UVEdit: Port texpaint_loop_wire to batch request

This removes code duplication and put an end to the old "create at request"
batch creation.

Also it uses the same vbo as the uv layer used for shading. Reducing VRAM
usage.

Also fixes the modified uv display in uv edit mode.

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

M	source/blender/draw/intern/draw_cache_impl.h
M	source/blender/draw/intern/draw_cache_impl_mesh.c
M	source/blender/editors/uvedit/uvedit_draw.c
M	source/blender/gpu/GPU_shader.h
M	source/blender/gpu/intern/gpu_shader.c
M	source/blender/gpu/shaders/gpu_shader_2D_vert.glsl

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

diff --git a/source/blender/draw/intern/draw_cache_impl.h b/source/blender/draw/intern/draw_cache_impl.h
index 9f4162195bf..63af602873d 100644
--- a/source/blender/draw/intern/draw_cache_impl.h
+++ b/source/blender/draw/intern/draw_cache_impl.h
@@ -139,12 +139,11 @@ struct GPUBatch *DRW_mesh_batch_cache_get_edituv_faces(struct Mesh *me);
 struct GPUBatch *DRW_mesh_batch_cache_get_edituv_edges(struct Mesh *me);
 struct GPUBatch *DRW_mesh_batch_cache_get_edituv_verts(struct Mesh *me);
 struct GPUBatch *DRW_mesh_batch_cache_get_edituv_facedots(struct Mesh *me);
+/* For Image UV editor. */
+struct GPUBatch *DRW_mesh_batch_cache_get_uv_edges(struct Mesh *me);
 
 void DRW_mesh_cache_sculpt_coords_ensure(struct Mesh *me);
 
-/* For Image UV editor. */
-struct GPUBatch *DRW_mesh_batch_cache_get_texpaint_loop_wire(struct Mesh *me);
-
 /* Edit mesh bitflags (is this the right place?) */
 
 enum {
diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c b/source/blender/draw/intern/draw_cache_impl_mesh.c
index 0bac64df567..92131a2e74c 100644
--- a/source/blender/draw/intern/draw_cache_impl_mesh.c
+++ b/source/blender/draw/intern/draw_cache_impl_mesh.c
@@ -2100,15 +2100,13 @@ typedef struct MeshBatchCache {
 		GPUBatch *loose_edges;
 		GPUBatch *edge_detection;
 		GPUBatch *wire_loops; /* Loops around faces. */
+		GPUBatch *wire_loops_uvs; /* Same as wire_loops but only has uvs. */
 		GPUBatch *wire_triangles; /* Triangles for object mode wireframe. */
 	} batch;
 
 	GPUIndexBuf **surf_per_mat_tris;
 	GPUBatch **surf_per_mat;
 
-	/* OLD BATCH METHOD, thoses needs to be ported and added in the structs above. */
-	GPUBatch *texpaint_uv_loops;
-
 	/* arrays of bool uniform names (and value) that will be use to
 	 * set srgb conversion for auto attribs.*/
 	char *auto_layer_names;
@@ -2272,10 +2270,6 @@ static void mesh_batch_cache_discard_uvedit(MeshBatchCache *cache)
 	GPU_BATCH_DISCARD_SAFE(cache->batch.edituv_edges);
 	GPU_BATCH_DISCARD_SAFE(cache->batch.edituv_verts);
 	GPU_BATCH_DISCARD_SAFE(cache->batch.edituv_facedots);
-
-	gpu_batch_presets_unregister(cache->texpaint_uv_loops);
-
-	GPU_BATCH_DISCARD_SAFE(cache->texpaint_uv_loops);
 }
 
 void DRW_mesh_batch_cache_dirty_tag(Mesh *me, int mode)
@@ -4667,56 +4661,11 @@ GPUBatch *DRW_mesh_batch_cache_get_edituv_facedots(Mesh *me)
 	return DRW_batch_request(&cache->batch.edituv_facedots);
 }
 
-/* TODO port to batch request. Is basically batch.wire_loops. */
-GPUBatch *DRW_mesh_batch_cache_get_texpaint_loop_wire(Mesh *me)
+GPUBatch *DRW_mesh_batch_cache_get_uv_edges(Mesh *me)
 {
 	MeshBatchCache *cache = mesh_batch_cache_get(me);
-
-	if (cache->texpaint_uv_loops == NULL) {
-		/* create batch from DM */
-		const int datatype = MR_DATATYPE_LOOP | MR_DATATYPE_POLY | MR_DATATYPE_LOOPUV;
-		MeshRenderData *rdata = mesh_render_data_create(me, datatype);
-
-		const MLoopUV *mloopuv_base = rdata->mloopuv;
-		if (mloopuv_base == NULL) {
-			return NULL;
-		}
-
-		uint vidx = 0;
-
-		static GPUVertFormat format = { 0 };
-		static struct { uint uv; } attr_id;
-		if (format.attr_len == 0) {
-			attr_id.uv = GPU_vertformat_attr_add(&format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
-		}
-
-		const uint vert_len = mesh_render_data_loops_len_get(rdata);
-		const uint poly_len = mesh_render_data_polys_len_get(rdata);
-		const uint idx_len = vert_len + poly_len;
-
-		GPUIndexBufBuilder elb;
-		GPU_indexbuf_init_ex(&elb, GPU_PRIM_LINE_LOOP, idx_len, vert_len, true);
-
-		GPUVertBuf *vbo = GPU_vertbuf_create_with_format(&format);
-		GPU_vertbuf_data_alloc(vbo, vert_len);
-
-		const MPoly *mpoly = rdata->mpoly;
-		for (int a = 0; a < poly_len; a++, mpoly++) {
-			const MLoopUV *mloopuv = mloopuv_base + mpoly->loopstart;
-			for (int b = 0; b < mpoly->totloop; b++, mloopuv++) {
-				GPU_vertbuf_attr_set(vbo, attr_id.uv, vidx, mloopuv->uv);
-				GPU_indexbuf_add_generic_vert(&elb, vidx++);
-			}
-			GPU_indexbuf_add_primitive_restart(&elb);
-		}
-
-		cache->texpaint_uv_loops = GPU_batch_create_ex(GPU_PRIM_LINE_LOOP,
-		                                               vbo, GPU_indexbuf_build(&elb),
-		                                               GPU_BATCH_OWNS_VBO | GPU_BATCH_OWNS_INDEX);
-		gpu_batch_presets_register(cache->texpaint_uv_loops);
-		mesh_render_data_free(rdata);
-	}
-	return cache->texpaint_uv_loops;
+	texpaint_request_active_uv(cache, me);
+	return DRW_batch_request(&cache->batch.wire_loops_uvs);
 }
 
 GPUBatch *DRW_mesh_batch_cache_get_surface_edges(Mesh *me)
@@ -5154,6 +5103,13 @@ void DRW_mesh_batch_cache_create_requested(
 		DRW_ibo_request(cache->batch.wire_loops, &cache->ibo.loops_lines);
 		DRW_vbo_request(cache->batch.wire_loops, &cache->ordered.loop_pos_nor);
 	}
+	if (DRW_batch_requested(cache->batch.wire_loops_uvs, GPU_PRIM_LINE_STRIP)) {
+		DRW_ibo_request(cache->batch.wire_loops_uvs, &cache->ibo.loops_lines);
+		/* For paint overlay. Active layer should have been queried. */
+		if (cache->cd_lused[CD_MLOOPUV] != 0) {
+			DRW_vbo_request(cache->batch.wire_loops_uvs, &cache->ordered.loop_uv_tan);
+		}
+	}
 	if (DRW_batch_requested(cache->batch.wire_triangles, GPU_PRIM_TRIS)) {
 		DRW_vbo_request(cache->batch.wire_triangles, &cache->tess.pos_nor);
 		DRW_vbo_request(cache->batch.wire_triangles, &cache->tess.wireframe_data);
diff --git a/source/blender/editors/uvedit/uvedit_draw.c b/source/blender/editors/uvedit/uvedit_draw.c
index 46c62c4a086..356f24e0758 100644
--- a/source/blender/editors/uvedit/uvedit_draw.c
+++ b/source/blender/editors/uvedit/uvedit_draw.c
@@ -199,16 +199,15 @@ static void uvedit_get_batches(
 static void draw_uvs_shadow(SpaceImage *UNUSED(sima), Scene *scene, Object *obedit, Depsgraph *depsgraph)
 {
 	Object *eval_ob = DEG_get_evaluated_object(depsgraph, obedit);
+	Mesh *me = eval_ob->data;
 	float col[4];
 	UI_GetThemeColor4fv(TH_UV_SHADOW, col);
 
-	/* TODO get real modified edges. */
-	GPUBatch *edges = DRW_mesh_batch_cache_get_edituv_edges(eval_ob->data);
-
-	DRW_mesh_batch_cache_create_requested(eval_ob, eval_ob->data, scene->toolsettings, false, false);
+	GPUBatch *edges = DRW_mesh_batch_cache_get_uv_edges(me);
+	DRW_mesh_batch_cache_create_requested(eval_ob, me, scene->toolsettings, false, false);
 
 	if (edges) {
-		GPU_batch_program_set_builtin(edges, GPU_SHADER_2D_UNIFORM_COLOR);
+		GPU_batch_program_set_builtin(edges, GPU_SHADER_2D_UV_UNIFORM_COLOR);
 		GPU_batch_uniform_4fv(edges, "color", col);
 		GPU_batch_draw(edges);
 	}
@@ -219,14 +218,17 @@ static void draw_uvs_texpaint(Scene *scene, Object *ob, Depsgraph *depsgraph)
 	Object *eval_ob = DEG_get_evaluated_object(depsgraph, ob);
 	Mesh *me = eval_ob->data;
 	ToolSettings *ts = scene->toolsettings;
-	GPUBatch *geom = DRW_mesh_batch_cache_get_texpaint_loop_wire(me);
 	float col[4];
 	UI_GetThemeColor4fv(TH_UV_SHADOW, col);
 
-	if (!geom)
+	if (me->mloopuv == NULL) {
 		return;
+	}
+
+	GPUBatch *geom = DRW_mesh_batch_cache_get_uv_edges(me);
+	DRW_mesh_batch_cache_create_requested(eval_ob, me, scene->toolsettings, false, false);
 
-	GPU_batch_program_set_builtin(geom, GPU_SHADER_2D_UNIFORM_COLOR);
+	GPU_batch_program_set_builtin(geom, GPU_SHADER_2D_UV_UNIFORM_COLOR);
 	GPU_batch_uniform_4fv(geom, "color", col);
 
 	const bool do_material_masking = (ts->uv_flag & UV_SHOW_SAME_IMAGE);
@@ -275,8 +277,12 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit, Depsgraph *
 	float col1[4], col2[4], col3[4], transparent[4] = {0.0f, 0.0f, 0.0f, 0.0f};
 
 	if (sima->flag & SI_DRAWSHADOW) {
-		/* XXX TODO: Need to check if shadow mesh is different than original mesh. */
-		bool is_cage_like_final_meshes = true;
+		bool is_cage_like_final_meshes = false;
+		Mesh *me = (Mesh *)eval_ob->data;
+		BMEditMesh *embm = me->edit_btmesh;
+		is_cage_like_final_meshes = embm &&
+		                            embm->mesh_eval_final &&
+		                            embm->mesh_eval_final->runtime.is_original;
 
 		/* When sync selection is enabled, all faces are drawn (except for hidden)
 		 * so if cage is the same as the final, there is no point in drawing this. */
diff --git a/source/blender/gpu/GPU_shader.h b/source/blender/gpu/GPU_shader.h
index 71536523caf..4803c6c0792 100644
--- a/source/blender/gpu/GPU_shader.h
+++ b/source/blender/gpu/GPU_shader.h
@@ -344,6 +344,7 @@ typedef enum GPUBuiltinShader {
 	GPU_SHADER_2D_NODELINK,
 	GPU_SHADER_2D_NODELINK_INST,
 	/* specialized for edituv drawing */
+	GPU_SHADER_2D_UV_UNIFORM_COLOR,
 	GPU_SHADER_2D_UV_VERTS,
 	GPU_SHADER_2D_UV_FACEDOTS,
 	GPU_SHADER_2D_UV_EDGES,
diff --git a/source/blender/gpu/intern/gpu_shader.c b/source/blender/gpu/intern/gpu_shader.c
index 8a3581c54df..8a141eaa2b2 100644
--- a/source/blender/gpu/intern/gpu_shader.c
+++ b/source/blender/gpu/intern/gpu_shader.c
@@ -918,6 +918,9 @@ static const GPUShaderStages builtin_shader_stages[GPU_NUM_BUILTIN_SHADERS] = {
 		{ datatoc_gpu_shader_2D_nodelink_vert_glsl,
 		  datatoc_gpu_shader_2D_nodelink_frag_glsl },
 
+	[GPU_SHADER_2D_UV_UNIFORM_COLOR] =
+		{ datatoc_gpu_shader_2D_vert_glsl,
+		  datatoc_gpu_shader_uniform_color_frag_glsl },
 	[GPU_SHADER_2D_UV_VERTS] =
 		{ datatoc_gpu_shader_2D_edituvs_points_vert_glsl,
 		  datatoc_gpu_shader_point_varying_color_varying_outline_aa_frag_glsl },
@@ -1007,6 +1010,9 @@ static const char *gpu_shader_get_builtin_shader_defines(
 		case GPU_SHADER_SIMPLE_LIGHTING_FLAT_COLOR:
 			return "#define USE_FLAT_NORMAL\n";
 
+		case GPU_SHADER_2D_UV_UNIFORM_COLOR:
+			return "#define UV_POS\n";
+
 		case GPU_SHADER_2D_UV_EDGES_SMOOTH:
 			return "#define SMOOTH_COLOR\n";
 
diff --git a/source/blender/gpu/shaders/gpu_shader_2D_vert.glsl b/source/blender/gpu/shaders/gpu_shader_2D_vert.glsl
index 89e3c52f9f8..b3b897da3c6 100644
--- a/source/blender/gpu/shaders/gpu_shader_2D_vert.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_2D_vert.glsl
@@ -1,7 +1,12 @@
 
 uniform mat4 ModelViewProjectionMatrix;
 
+#ifdef UV_POS
+in vec2 u;
+#  define pos u
+#else
 in vec2 pos;
+#endif
 
 void main()
 {



More information about the Bf-blender-cvs mailing list