[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [22178] branches/soc-2009-imbusy/source/ blender/editors: improved vertex drawing

Lukas Steiblys imbusy at imbusy.org
Mon Aug 3 16:00:25 CEST 2009


Revision: 22178
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22178
Author:   imbusy
Date:     2009-08-03 16:00:23 +0200 (Mon, 03 Aug 2009)

Log Message:
-----------
improved vertex drawing

Modified Paths:
--------------
    branches/soc-2009-imbusy/source/blender/editors/include/BIF_glutil.h
    branches/soc-2009-imbusy/source/blender/editors/screen/glutil.c
    branches/soc-2009-imbusy/source/blender/editors/space_view3d/drawobject.c

Modified: branches/soc-2009-imbusy/source/blender/editors/include/BIF_glutil.h
===================================================================
--- branches/soc-2009-imbusy/source/blender/editors/include/BIF_glutil.h	2009-08-03 13:46:45 UTC (rev 22177)
+++ branches/soc-2009-imbusy/source/blender/editors/include/BIF_glutil.h	2009-08-03 14:00:23 UTC (rev 22178)
@@ -197,6 +197,7 @@
 /* use this for platform hacks. glPointSize is solved here */
 void bglBegin(int mode);
 void bglEnd(void);
+int bglPointHack();
 void bglVertex3fv(float *vec);
 void bglVertex3f(float x, float y, float z);
 void bglVertex2fv(float *vec);

Modified: branches/soc-2009-imbusy/source/blender/editors/screen/glutil.c
===================================================================
--- branches/soc-2009-imbusy/source/blender/editors/screen/glutil.c	2009-08-03 13:46:45 UTC (rev 22177)
+++ branches/soc-2009-imbusy/source/blender/editors/screen/glutil.c	2009-08-03 14:00:23 UTC (rev 22178)
@@ -720,6 +720,18 @@
 	}
 }
 
+int bglPointHack() {
+	float value[4];
+	int pointhack;
+	glGetFloatv(GL_POINT_SIZE_RANGE, value);
+	if(value[1]<2.0) {
+		glGetFloatv(GL_POINT_SIZE, value);
+		pointhack= floor(value[0]+0.5);
+		if(pointhack>4) pointhack= 4;
+		return pointhack;
+	}
+	return 0;
+}
 
 void bglVertex3fv(float *vec)
 {

Modified: branches/soc-2009-imbusy/source/blender/editors/space_view3d/drawobject.c
===================================================================
--- branches/soc-2009-imbusy/source/blender/editors/space_view3d/drawobject.c	2009-08-03 13:46:45 UTC (rev 22177)
+++ branches/soc-2009-imbusy/source/blender/editors/space_view3d/drawobject.c	2009-08-03 14:00:23 UTC (rev 22178)
@@ -1512,7 +1512,7 @@
 			
 			bglEnd();
 			
-			glPointSize(size);
+			//glPointSize(size);
 			bglBegin(GL_POINTS);
 			bglVertex3fv(co);
 			bglEnd();
@@ -1525,15 +1525,72 @@
 		}
 	}
 }
+/* originally defined in DerivedMesh.c */
+typedef struct {
+	DerivedMesh dm;
+
+	EditMesh *em;
+	float (*vertexCos)[3];
+	float (*vertexNos)[3];
+	float (*faceNos)[3];
+} EditMeshDerivedMesh;
+
 static void draw_dm_verts(DerivedMesh *dm, int sel, EditVert *eve_act)
 {
 	struct { int sel; EditVert *eve_act; } data;
+	GPUBuffer *buffer;
+	float *varray;
 	data.sel = sel;
 	data.eve_act = eve_act;
-	
-	bglBegin(GL_POINTS);
-	dm->foreachMappedVert(dm, draw_dm_verts__mapFunc, &data);
-	bglEnd();
+
+	/* first come the unselected vertices, then the selected */
+	buffer = GPU_buffer_alloc( sizeof(float)*3*dm->getNumVerts(dm)*2, 0 );
+
+	if( (varray = GPU_buffer_lock_stream( buffer )) && bglPointHack() == 0 ) {
+		EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
+		EditVert *eve;
+		int i;
+		int numverts = 0, numselected = 0;
+		int datatype[] = { GPU_BUFFER_INTER_V3F, GPU_BUFFER_INTER_END };
+		GPU_buffer_unlock( buffer );
+		GPU_interleaved_setup( buffer, datatype );
+		GPU_buffer_lock_stream( buffer );
+
+		glBegin(GL_POINTS);
+		for (i=0,eve= emdm->em->verts.first; eve; i++,eve=eve->next) {
+			if (eve->h==0 && (eve->f&SELECT)==data.sel) {
+				if (eve==data.eve_act) {
+					if (emdm->vertexCos) {
+						VECCOPY(&varray[3*(dm->getNumVerts(dm)+numselected)],emdm->vertexCos[i]);
+					}
+					else {
+						VECCOPY(&varray[3*(dm->getNumVerts(dm)+numselected)],eve->co);
+					}
+					numselected++;
+				} else {
+					if (emdm->vertexCos) {
+						VECCOPY(&varray[3*numverts],emdm->vertexCos[i]);
+					} else {
+						VECCOPY(&varray[3*numverts],eve->co);
+					}
+					numverts++;
+				}
+			}
+		}
+		glEnd();
+		GPU_buffer_unlock( buffer );
+		glDrawArrays(GL_POINTS,0,numverts);
+		UI_ThemeColor4(TH_EDITMESH_ACTIVE);
+		glDrawArrays(GL_POINTS,dm->getNumVerts(dm),numselected);
+		UI_ThemeColor4(data.sel?TH_VERTEX_SELECT:TH_VERTEX);
+		GPU_buffer_unbind();
+	}
+	else {
+		bglBegin(GL_POINTS);
+		dm->foreachMappedVert(dm, draw_dm_verts__mapFunc, &data);
+		bglEnd();
+	}
+	GPU_buffer_free( buffer, 0 );
 }
 
 	/* Draw edges with color set based on selection */
@@ -1602,16 +1659,6 @@
 				col0[3] + (col1[3]-col0[3])*t);
 }
 
-/* originally defined in DerivedMesh.c */
-typedef struct {
-	DerivedMesh dm;
-
-	EditMesh *em;
-	float (*vertexCos)[3];
-	float (*vertexNos)[3];
-	float (*faceNos)[3];
-} EditMeshDerivedMesh;
-
 static void draw_dm_edges_sel_interp(DerivedMesh *dm, unsigned char *baseCol, unsigned char *selCol)
 {
 	unsigned char *cols[2];





More information about the Bf-blender-cvs mailing list