[Bf-blender-cvs] [1cd754a] blender2.8: OpenGL: simple batch of all mesh triangles

Mike Erwin noreply at git.blender.org
Mon Nov 7 20:15:11 CET 2016


Commit: 1cd754ad31f29ec25510aa017474cd6d0fc639a1
Author: Mike Erwin
Date:   Sun Nov 6 21:51:49 2016 +0100
Branches: blender2.8
https://developer.blender.org/rB1cd754ad31f29ec25510aa017474cd6d0fc639a1

OpenGL: simple batch of all mesh triangles

Can be used for drawing basic surfaces, hit testing, depth pre-pass, ...

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

M	source/blender/editors/space_view3d/drawobject.c

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

diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c
index e1f577d..106a6ef 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -215,11 +215,11 @@ typedef struct drawBMSelect_userData {
 typedef struct {
 	VertexBuffer *pos_in_order;
 	ElementList *edges_in_order;
-	ElementList *faces_in_order;
+	ElementList *triangles_in_order;
 
 	Batch *all_verts;
 	Batch *all_edges;
-	Batch *all_faces;
+	Batch *all_triangles;
 
 	Batch *fancy_edges; /* owns its vertex buffer (not shared) */
 } MeshBatchCache;
@@ -239,11 +239,11 @@ static void MBC_discard(MeshBatchCache *cache)
 {
 	if (cache->all_verts) Batch_discard(cache->all_verts);
 	if (cache->all_edges) Batch_discard(cache->all_edges);
-	if (cache->all_faces) Batch_discard(cache->all_faces);
+	if (cache->all_triangles) Batch_discard(cache->all_triangles);
 
 	if (cache->pos_in_order) VertexBuffer_discard(cache->pos_in_order);
 	if (cache->edges_in_order) ElementList_discard(cache->edges_in_order);
-	if (cache->faces_in_order) ElementList_discard(cache->faces_in_order);
+	if (cache->triangles_in_order) ElementList_discard(cache->triangles_in_order);
 
 	if (cache->fancy_edges) {
 		Batch_discard_all(cache->fancy_edges);
@@ -316,6 +316,30 @@ static ElementList *MBC_get_edges_in_order(DerivedMesh *dm)
 	return cache->edges_in_order;
 }
 
+static ElementList *MBC_get_triangles_in_order(DerivedMesh *dm)
+{
+	MeshBatchCache *cache = MBC_get(dm);
+
+	if (cache->triangles_in_order == NULL) {
+		const int vertex_ct = dm->getNumVerts(dm);
+		const int tessface_ct = dm->getNumTessFaces(dm);
+		const MFace *tessfaces = dm->getTessFaceArray(dm);
+		ElementListBuilder elb;
+		ElementListBuilder_init(&elb, GL_TRIANGLES, tessface_ct, vertex_ct);
+		for (int i = 0; i < tessface_ct; ++i) {
+			const MFace *tess = tessfaces + i;
+			add_triangle_vertices(&elb, tess->v1, tess->v2, tess->v3);
+			/* tessface can be triangle or quad */
+			if (tess->v4) {
+				add_triangle_vertices(&elb, tess->v3, tess->v2, tess->v4);
+			}
+		}
+		cache->triangles_in_order = ElementList_build(&elb);
+	}
+
+	return cache->triangles_in_order;
+}
+
 static Batch *MBC_get_all_edges(DerivedMesh *dm)
 {
 	MeshBatchCache *cache = MBC_get(dm);
@@ -328,15 +352,16 @@ static Batch *MBC_get_all_edges(DerivedMesh *dm)
 	return cache->all_edges;
 }
 
-static Batch *MBC_get_all_faces(DerivedMesh *dm)
+static Batch *MBC_get_all_triangles(DerivedMesh *dm)
 {
 	MeshBatchCache *cache = MBC_get(dm);
 
-	if (cache->all_faces == NULL) {
+	if (cache->all_triangles == NULL) {
 		/* create batch from DM */
+		cache->all_triangles = Batch_create(GL_TRIANGLES, MBC_get_pos_in_order(dm), MBC_get_triangles_in_order(dm));
 	}
 
-	return cache->all_faces;
+	return cache->all_triangles;
 }
 
 static Batch *MBC_get_fancy_edges(DerivedMesh *dm)




More information about the Bf-blender-cvs mailing list