[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [53446] trunk/blender/source/blender: Use GPU_Buffers to draw wireframe when in dynamic-topology sculpt mode

Nicholas Bishop nicholasbishop at gmail.com
Sun Dec 30 19:30:15 CET 2012


Revision: 53446
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=53446
Author:   nicholasbishop
Date:     2012-12-30 18:30:13 +0000 (Sun, 30 Dec 2012)
Log Message:
-----------
Use GPU_Buffers to draw wireframe when in dynamic-topology sculpt mode

This adds an override to the CDDM edge drawing function that switches
to GPU_Buffers drawing for PBVHes of type PBVH_BMESH.

Within the GPU_Buffers code, glPolygonMode() is used to draw lines
instead of faces.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_pbvh.h
    trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c
    trunk/blender/source/blender/blenkernel/intern/pbvh.c
    trunk/blender/source/blender/blenkernel/intern/subsurf_ccg.c
    trunk/blender/source/blender/gpu/GPU_buffers.h
    trunk/blender/source/blender/gpu/intern/gpu_buffers.c

Modified: trunk/blender/source/blender/blenkernel/BKE_pbvh.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_pbvh.h	2012-12-30 18:29:56 UTC (rev 53445)
+++ trunk/blender/source/blender/blenkernel/BKE_pbvh.h	2012-12-30 18:30:13 UTC (rev 53446)
@@ -102,7 +102,7 @@
 
 void BLI_pbvh_node_draw(PBVHNode *node, void *data);
 void BLI_pbvh_draw(PBVH *bvh, float (*planes)[4], float (*face_nors)[3],
-                   int (*setMaterial)(int, void *attribs));
+                   int (*setMaterial)(int, void *attribs), int wireframe);
 
 /* PBVH Access */
 typedef enum {

Modified: trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2012-12-30 18:29:56 UTC (rev 53445)
+++ trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2012-12-30 18:30:13 UTC (rev 53446)
@@ -425,6 +425,14 @@
 	MVert *mvert = cddm->mvert;
 	MEdge *medge = cddm->medge;
 	int i;
+
+	if (cddm->pbvh && cddm->pbvh_draw &&
+		BLI_pbvh_type(cddm->pbvh) == PBVH_BMESH)
+	{
+		BLI_pbvh_draw(cddm->pbvh, NULL, NULL, NULL, TRUE);
+
+		return;
+	}
 	
 	if (GPU_buffer_legacy(dm)) {
 		DEBUG_VBO("Using legacy code. cdDM_drawEdges\n");
@@ -541,7 +549,8 @@
 		if (dm->numTessFaceData) {
 			float (*face_nors)[3] = CustomData_get_layer(&dm->faceData, CD_NORMAL);
 
-			BLI_pbvh_draw(cddm->pbvh, partial_redraw_planes, face_nors, setMaterial);
+			BLI_pbvh_draw(cddm->pbvh, partial_redraw_planes, face_nors,
+						  setMaterial, FALSE);
 			glShadeModel(GL_FLAT);
 		}
 

Modified: trunk/blender/source/blender/blenkernel/intern/pbvh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/pbvh.c	2012-12-30 18:29:56 UTC (rev 53445)
+++ trunk/blender/source/blender/blenkernel/intern/pbvh.c	2012-12-30 18:30:13 UTC (rev 53446)
@@ -1523,8 +1523,15 @@
 
 //#include <GL/glew.h>
 
-void BLI_pbvh_node_draw(PBVHNode *node, void *setMaterial)
+typedef struct {
+	DMSetMaterial setMaterial;
+	int wireframe;
+} PBVHNodeDrawData;
+
+void BLI_pbvh_node_draw(PBVHNode *node, void *data_v)
 {
+	PBVHNodeDrawData *data = data_v;
+
 #if 0
 	/* XXX: Just some quick code to show leaf nodes in different colors */
 	float col[3]; int i;
@@ -1543,7 +1550,9 @@
 #endif
 
 	if (!(node->flag & PBVH_FullyHidden))
-		GPU_draw_buffers(node->draw_buffers, setMaterial);
+		GPU_draw_buffers(node->draw_buffers,
+						 data->setMaterial,
+						 data->wireframe);
 }
 
 typedef enum {
@@ -1612,8 +1621,9 @@
 }
 
 void BLI_pbvh_draw(PBVH *bvh, float (*planes)[4], float (*face_nors)[3],
-                   DMSetMaterial setMaterial)
+                   DMSetMaterial setMaterial, int wireframe)
 {
+	PBVHNodeDrawData draw_data = {setMaterial, wireframe};
 	PBVHNode **nodes;
 	int a, totnode;
 
@@ -1630,10 +1640,10 @@
 
 	if (planes) {
 		BLI_pbvh_search_callback(bvh, BLI_pbvh_node_planes_contain_AABB,
-		                         planes, BLI_pbvh_node_draw, setMaterial);
+		                         planes, BLI_pbvh_node_draw, &draw_data);
 	}
 	else {
-		BLI_pbvh_search_callback(bvh, NULL, NULL, BLI_pbvh_node_draw, setMaterial);
+		BLI_pbvh_search_callback(bvh, NULL, NULL, BLI_pbvh_node_draw, &draw_data);
 	}
 }
 

Modified: trunk/blender/source/blender/blenkernel/intern/subsurf_ccg.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/subsurf_ccg.c	2012-12-30 18:29:56 UTC (rev 53445)
+++ trunk/blender/source/blender/blenkernel/intern/subsurf_ccg.c	2012-12-30 18:30:13 UTC (rev 53446)
@@ -1707,7 +1707,8 @@
 
 	if (ccgdm->pbvh && ccgdm->multires.mmd && !fast) {
 		if (dm->numTessFaceData) {
-			BLI_pbvh_draw(ccgdm->pbvh, partial_redraw_planes, NULL, setMaterial);
+			BLI_pbvh_draw(ccgdm->pbvh, partial_redraw_planes, NULL,
+						  setMaterial, FALSE);
 			glShadeModel(GL_FLAT);
 		}
 

Modified: trunk/blender/source/blender/gpu/GPU_buffers.h
===================================================================
--- trunk/blender/source/blender/gpu/GPU_buffers.h	2012-12-30 18:29:56 UTC (rev 53445)
+++ trunk/blender/source/blender/gpu/GPU_buffers.h	2012-12-30 18:30:13 UTC (rev 53446)
@@ -184,7 +184,8 @@
                              int *grid_indices, int totgrid, const struct CCGKey *key,
                              int show_diffuse_color);
 
-void GPU_draw_buffers(GPU_Buffers *buffers, DMSetMaterial setMaterial);
+void GPU_draw_buffers(GPU_Buffers *buffers, DMSetMaterial setMaterial,
+					  int wireframe);
 
 int GPU_buffers_diffuse_changed(GPU_Buffers *buffers, int show_diffuse_color);
 

Modified: trunk/blender/source/blender/gpu/intern/gpu_buffers.c
===================================================================
--- trunk/blender/source/blender/gpu/intern/gpu_buffers.c	2012-12-30 18:29:56 UTC (rev 53445)
+++ trunk/blender/source/blender/gpu/intern/gpu_buffers.c	2012-12-30 18:30:13 UTC (rev 53446)
@@ -2312,7 +2312,8 @@
 	}
 }
 
-void GPU_draw_buffers(GPU_Buffers *buffers, DMSetMaterial setMaterial)
+void GPU_draw_buffers(GPU_Buffers *buffers, DMSetMaterial setMaterial,
+					  int wireframe)
 {
 	if (buffers->totface) {
 		const MFace *f = &buffers->mface[buffers->face_indices[0]];
@@ -2329,14 +2330,19 @@
 
 	if (buffers->vert_buf) {
 		glEnableClientState(GL_VERTEX_ARRAY);
-		glEnableClientState(GL_NORMAL_ARRAY);
-		gpu_colors_enable(VBO_ENABLED);
+		if (!wireframe) {
+			glEnableClientState(GL_NORMAL_ARRAY);
+			gpu_colors_enable(VBO_ENABLED);
+		}
 
 		glBindBufferARB(GL_ARRAY_BUFFER_ARB, buffers->vert_buf);
 
 		if (buffers->index_buf)
 			glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, buffers->index_buf);
 
+		if (wireframe)
+			glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+
 		if (buffers->tot_quad) {
 			char *offset = 0;
 			int i, last = buffers->has_hidden ? 1 : buffers->totgrid;
@@ -2369,13 +2375,18 @@
 				glDrawArrays(GL_TRIANGLES, 0, totelem);
 		}
 
+		if (wireframe)
+			glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+
 		glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
 		if (buffers->index_buf)
 			glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
 
 		glDisableClientState(GL_VERTEX_ARRAY);
-		glDisableClientState(GL_NORMAL_ARRAY);
-		gpu_colors_disable(VBO_ENABLED);
+		if (!wireframe) {
+			glDisableClientState(GL_NORMAL_ARRAY);
+			gpu_colors_disable(VBO_ENABLED);
+		}
 	}
 	/* fallbacks if we are out of memory or VBO is disabled */
 	else if (buffers->totface) {




More information about the Bf-blender-cvs mailing list