[Bf-blender-cvs] [5a377521aad] blender2.8: Mesh Batch Cache: Split Edit Mesh mode Vertex Buffers for faster update.

Clément Foucault noreply at git.blender.org
Mon May 15 16:16:45 CEST 2017


Commit: 5a377521aad51d10222ff69505271024df32af4e
Author: Clément Foucault
Date:   Sat May 13 16:45:06 2017 +0200
Branches: blender2.8
https://developer.blender.org/rB5a377521aad51d10222ff69505271024df32af4e

Mesh Batch Cache: Split Edit Mesh mode Vertex Buffers for faster update.

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

M	source/blender/draw/intern/draw_cache.c
M	source/blender/draw/intern/draw_cache.h
M	source/blender/draw/intern/draw_cache_impl.h
M	source/blender/draw/intern/draw_cache_impl_mesh.c
M	source/blender/draw/modes/edit_mesh_mode.c
D	source/blender/draw/modes/shaders/edit_normals_face_vert.glsl
M	source/blender/draw/modes/shaders/edit_normals_vert.glsl

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

diff --git a/source/blender/draw/intern/draw_cache.c b/source/blender/draw/intern/draw_cache.c
index f5c02f244da..abaab1b9322 100644
--- a/source/blender/draw/intern/draw_cache.c
+++ b/source/blender/draw/intern/draw_cache.c
@@ -1747,6 +1747,19 @@ void DRW_cache_mesh_wire_overlay_get(
 	*r_lverts = DRW_mesh_batch_cache_get_overlay_loose_verts(me);
 }
 
+void DRW_cache_mesh_normals_overlay_get(
+        Object *ob,
+        Batch **r_tris, Batch **r_ledges, Batch **r_lverts)
+{
+	BLI_assert(ob->type == OB_MESH);
+
+	Mesh *me = ob->data;
+
+	*r_tris = DRW_mesh_batch_cache_get_overlay_triangles_nor(me);
+	*r_ledges = DRW_mesh_batch_cache_get_overlay_loose_edges_nor(me);
+	*r_lverts = DRW_mesh_batch_cache_get_overlay_loose_verts(me);
+}
+
 Batch *DRW_cache_face_centers_get(Object *ob)
 {
 	BLI_assert(ob->type == OB_MESH);
diff --git a/source/blender/draw/intern/draw_cache.h b/source/blender/draw/intern/draw_cache.h
index 0da09bcc332..417630ef935 100644
--- a/source/blender/draw/intern/draw_cache.h
+++ b/source/blender/draw/intern/draw_cache.h
@@ -91,6 +91,9 @@ struct Batch *DRW_cache_mesh_surface_overlay_get(struct Object *ob);
 void DRW_cache_mesh_wire_overlay_get(
         struct Object *ob,
         struct Batch **r_tris, struct Batch **r_ledges, struct Batch **r_lverts);
+void DRW_cache_mesh_normals_overlay_get(
+        struct Object *ob,
+        struct Batch **r_tris, struct Batch **r_ledges, struct Batch **r_lverts);
 struct Batch *DRW_cache_face_centers_get(struct Object *ob);
 struct Batch *DRW_cache_mesh_wire_outline_get(struct Object *ob);
 struct Batch *DRW_cache_mesh_surface_get(struct Object *ob);
diff --git a/source/blender/draw/intern/draw_cache_impl.h b/source/blender/draw/intern/draw_cache_impl.h
index 2363d097261..3dd6b07dd71 100644
--- a/source/blender/draw/intern/draw_cache_impl.h
+++ b/source/blender/draw/intern/draw_cache_impl.h
@@ -85,7 +85,9 @@ struct Batch *DRW_mesh_batch_cache_get_points_with_normals(struct Mesh *me);
 struct Batch *DRW_mesh_batch_cache_get_all_verts(struct Mesh *me);
 struct Batch *DRW_mesh_batch_cache_get_fancy_edges(struct Mesh *me);
 struct Batch *DRW_mesh_batch_cache_get_overlay_triangles(struct Mesh *me);
+struct Batch *DRW_mesh_batch_cache_get_overlay_triangles_nor(struct Mesh *me);
 struct Batch *DRW_mesh_batch_cache_get_overlay_loose_edges(struct Mesh *me);
+struct Batch *DRW_mesh_batch_cache_get_overlay_loose_edges_nor(struct Mesh *me);
 struct Batch *DRW_mesh_batch_cache_get_overlay_loose_verts(struct Mesh *me);
 struct Batch *DRW_mesh_batch_cache_get_overlay_facedots(struct Mesh *me);
 
diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c b/source/blender/draw/intern/draw_cache_impl_mesh.c
index 83101e65d49..3b8d758ae58 100644
--- a/source/blender/draw/intern/draw_cache_impl_mesh.c
+++ b/source/blender/draw/intern/draw_cache_impl_mesh.c
@@ -1190,7 +1190,10 @@ static bool mesh_render_data_looptri_cos_nors_smooth_get(
         MeshRenderData *rdata, const int tri_idx,
         float *(*r_vert_cos)[3], short **r_tri_nor, short *(*r_vert_nors)[3], bool *r_is_smooth)
 {
-	BLI_assert(rdata->types & (MR_DATATYPE_VERT | MR_DATATYPE_LOOPTRI | MR_DATATYPE_LOOP | MR_DATATYPE_POLY));
+	BLI_assert(rdata->types & MR_DATATYPE_VERT);
+	BLI_assert(rdata->types & MR_DATATYPE_LOOPTRI);
+	BLI_assert(rdata->types & MR_DATATYPE_LOOP);
+	BLI_assert(rdata->types & MR_DATATYPE_POLY);
 
 	if (rdata->edit_bmesh) {
 		const BMLoop **bm_looptri = (const BMLoop **)rdata->edit_bmesh->looptris[tri_idx];
@@ -1549,62 +1552,115 @@ static unsigned char mesh_render_data_vertex_flag(MeshRenderData *rdata, const i
 }
 
 static void add_overlay_tri(
-        MeshRenderData *rdata, VertexBuffer *vbo, const unsigned int pos_id, const unsigned int edgeMod_id,
+        MeshRenderData *rdata, VertexBuffer *vbo_pos, VertexBuffer *vbo_nor, VertexBuffer *vbo_data,
+        const unsigned int pos_id, const unsigned int vnor_id, const unsigned int lnor_id, const unsigned int data_id,
         const int tri_vert_idx[3], const int tri_edge_idx[3], const int f, const int base_vert_idx)
 {
-	const float *pos;
 	EdgeDrawAttr *eattr;
-	unsigned char  fflag;
-	unsigned char  vflag;
-
-	pos = mesh_render_data_vert_co(rdata, tri_vert_idx[0]);
-	eattr = mesh_render_data_edge_flag(rdata, tri_edge_idx[1]);
-	fflag = mesh_render_data_looptri_flag(rdata, f);
-	vflag = mesh_render_data_vertex_flag(rdata, tri_vert_idx[0]);
-	eattr->v_flag = fflag | vflag;
-	VertexBuffer_set_attrib(vbo, pos_id, base_vert_idx + 0, pos);
-	VertexBuffer_set_attrib(vbo, edgeMod_id, base_vert_idx + 0, eattr);
-
-	pos = mesh_render_data_vert_co(rdata, tri_vert_idx[1]);
-	eattr = mesh_render_data_edge_flag(rdata, tri_edge_idx[2]);
-	vflag = mesh_render_data_vertex_flag(rdata, tri_vert_idx[1]);
-	eattr->v_flag = fflag | vflag;
-	VertexBuffer_set_attrib(vbo, pos_id, base_vert_idx + 1, pos);
-	VertexBuffer_set_attrib(vbo, edgeMod_id, base_vert_idx + 1, eattr);
-
-	pos = mesh_render_data_vert_co(rdata, tri_vert_idx[2]);
-	eattr = mesh_render_data_edge_flag(rdata, tri_edge_idx[0]);
-	vflag = mesh_render_data_vertex_flag(rdata, tri_vert_idx[2]);
-	eattr->v_flag = fflag | vflag;
-	VertexBuffer_set_attrib(vbo, pos_id, base_vert_idx + 2, pos);
-	VertexBuffer_set_attrib(vbo, edgeMod_id, base_vert_idx + 2, eattr);
+	unsigned char fflag;
+	unsigned char vflag;
+
+	if (vbo_pos) {
+		for (int i = 0; i < 3; ++i) {
+			const float *pos = mesh_render_data_vert_co(rdata, tri_vert_idx[i]);
+			VertexBuffer_set_attrib(vbo_pos, pos_id, base_vert_idx + i, pos);
+		}
+	}
+
+	if (vbo_nor) {
+		float *tri_vert_cos[3];
+		short *tri_nor, *tri_vert_nors[3];
+		bool is_smooth;
+
+		mesh_render_data_looptri_cos_nors_smooth_get(
+		        rdata, f, &tri_vert_cos, &tri_nor, &tri_vert_nors, &is_smooth);
+		for (int i = 0; i < 3; ++i) {
+			/* TODO real loop normal */
+			const short *svnor = mesh_render_data_vert_nor(rdata, tri_vert_idx[i]);
+			const short *slnor = tri_vert_nors[i];
+			fflag = mesh_render_data_looptri_flag(rdata, f);
+#if USE_10_10_10
+			PackedNormal vnor = convert_i10_s3(svnor);
+			PackedNormal lnor = convert_i10_s3(slnor);
+			VertexBuffer_set_attrib(vbo_nor, vnor_id, base_vert_idx + i, &vnor);
+			VertexBuffer_set_attrib(vbo_nor, lnor_id, base_vert_idx + i, &lnor);
+#else
+			VertexBuffer_set_attrib(vbo_nor, vnor_id, base_vert_idx + i, svnor);
+			VertexBuffer_set_attrib(vbo_nor, lnor_id, base_vert_idx + i, slnor);
+#endif
+		}
+	}
+
+	if (vbo_data) {
+		fflag = mesh_render_data_looptri_flag(rdata, f);
+		for (int i = 0; i < 3; ++i) {
+			int iedge = (i == 2) ? 0 : i+1;
+			eattr = mesh_render_data_edge_flag(rdata, tri_edge_idx[iedge]);
+			vflag = mesh_render_data_vertex_flag(rdata, tri_vert_idx[i]);
+			eattr->v_flag = fflag | vflag;
+			VertexBuffer_set_attrib(vbo_data, data_id, base_vert_idx + i, eattr);
+		}
+	}
 }
 
 static void add_overlay_loose_edge(
-        MeshRenderData *rdata, VertexBuffer *vbo, const unsigned int pos_id, const unsigned int edgeMod_id,
-        const int v1, const int v2, const int e, const int base_vert_idx)
+        MeshRenderData *rdata, VertexBuffer *vbo_pos, VertexBuffer *vbo_nor, VertexBuffer *vbo_data,
+        const unsigned int pos_id, const unsigned int vnor_id, const unsigned int data_id,
+        const int edge_vert_idx[2], const int e, const int base_vert_idx)
 {
-	EdgeDrawAttr *eattr = mesh_render_data_edge_flag(rdata, e);
-	const float *pos = mesh_render_data_vert_co(rdata, v1);
-	eattr->v_flag = mesh_render_data_vertex_flag(rdata, v1);
-	VertexBuffer_set_attrib(vbo, pos_id, base_vert_idx + 0, pos);
-	VertexBuffer_set_attrib(vbo, edgeMod_id, base_vert_idx + 0, eattr);
+	if (vbo_pos) {
+		for (int i = 0; i < 2; ++i) {
+			const float *pos = mesh_render_data_vert_co(rdata, edge_vert_idx[i]);
+			VertexBuffer_set_attrib(vbo_pos, pos_id, base_vert_idx + i, pos);
+		}
+	}
 
-	pos = mesh_render_data_vert_co(rdata, v2);
-	eattr->v_flag = mesh_render_data_vertex_flag(rdata, v2);
-	VertexBuffer_set_attrib(vbo, pos_id, base_vert_idx + 1, pos);
-	VertexBuffer_set_attrib(vbo, edgeMod_id, base_vert_idx + 1, eattr);
+	if (vbo_nor) {
+		for (int i = 0; i < 2; ++i) {
+			short *nor = mesh_render_data_vert_nor(rdata, edge_vert_idx[i]);
+#if USE_10_10_10
+			PackedNormal vnor = convert_i10_s3(nor);
+			VertexBuffer_set_attrib(vbo_nor, vnor_id, base_vert_idx + i, &vnor);
+#else
+			VertexBuffer_set_attrib(vbo_nor, vnor_id, base_vert_idx + i, &nor);
+#endif
+		}
+	}
+
+	if (vbo_data) {
+		EdgeDrawAttr *eattr = mesh_render_data_edge_flag(rdata, e);
+		for (int i = 0; i < 2; ++i) {
+			eattr->v_flag = mesh_render_data_vertex_flag(rdata, edge_vert_idx[i]);
+			VertexBuffer_set_attrib(vbo_data, data_id, base_vert_idx + i, eattr);
+		}
+	}
 }
 
 static void add_overlay_loose_vert(
-        MeshRenderData *rdata, VertexBuffer *vbo, const unsigned int pos_id, const unsigned int edgeMod_id,
+        MeshRenderData *rdata, VertexBuffer *vbo_pos, VertexBuffer *vbo_nor, VertexBuffer *vbo_data,
+        const unsigned int pos_id, const unsigned int vnor_id, const unsigned int data_id,
         const int v, const int base_vert_idx)
 {
-	unsigned char vflag[4] = {0, 0, 0, 0};
-	const float *pos = mesh_render_data_vert_co(rdata, v);
-	vflag[0] = mesh_render_data_vertex_flag(rdata, v);
-	VertexBuffer_set_attrib(vbo, pos_id, base_vert_idx + 0, pos);
-	VertexBuffer_set_attrib(vbo, edgeMod_id, base_vert_idx + 0, vflag);
+	if (vbo_pos) {
+		const float *pos = mesh_render_data_vert_co(rdata, v);
+		VertexBuffer_set_attrib(vbo_pos, pos_id, base_vert_idx, pos);
+	}
+
+	if (vbo_nor) {
+		short *nor = mesh_render_data_vert_nor(rdata, v);
+#if USE_10_10_10
+		PackedNormal vnor = convert_i10_s3(edge_nor);
+		VertexBuffer_set_attrib(vbo_nor, vnor_id, base_vert_idx, &vnor);
+#else
+		VertexBuffer_set_attrib(vbo_nor, vnor_id, base_vert_idx, nor);
+#endif
+	}
+
+	if (vbo_data) {
+		unsigned char vflag[4] = {0, 0, 0, 0};
+		vflag[0] = mesh_render_data_vertex_flag(rdata, v);
+		VertexBuffer_set_attrib(vbo_data, data_id, base_vert_idx, vflag);
+	}
 }
 
 /** \} */
@@ -1646,14 +1702,29 @@ typedef struct MeshBatchCache {
 	ElementList **shaded_triangles_in_order;
 	Batch **shaded_triangles;
 
-	/* TODO : split in 2 buffers to avoid unnecessary
-	 * data transfer when selecting/deselecting
-

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list