[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [10774] branches/bmesh/source/blender: BMesh Branch

Joseph Eagar joeedh at gmail.com
Fri May 25 01:02:05 CEST 2007


Revision: 10774
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bforge-svn&revision=10774
Author:   joeedh
Date:     2007-05-25 01:02:01 +0200 (Fri, 25 May 2007)

Log Message:
-----------
BMesh Branch

Got the drawing stuff for editmode to work a little better.  
There is a problem where the transparent overlay for 
non-backbuffered select in solid mode isn't drawing
transparent.  I need to find a way to force opengl vertex
arrays to draw transparent.

Generalized the new opengl vertex array drawing API a
little bit.  Added drawEditVerts/FacePoints to
DerivedMesh.  Note that the opengl vertex array system is
an optional thing that DerivedMeshes can use, the actual
DerivedMesh drawing stuff is still used for drawing.

Also got non-backbuffered vertex select to work. Wahoo!  
Unfortunately the code for bmesh to work with transforms
isn't working, despite being one of the first things I 
converted.

Modified Paths:
--------------
    branches/bmesh/source/blender/blenkernel/BKE_DerivedMesh.h
    branches/bmesh/source/blender/blenkernel/intern/DerivedMesh.c
    branches/bmesh/source/blender/blenloader/intern/readfile.c
    branches/bmesh/source/blender/include/BDR_drawobject.h
    branches/bmesh/source/blender/include/editbmesh.h
    branches/bmesh/source/blender/src/drawobject.c
    branches/bmesh/source/blender/src/editbmesh_interface.c
    branches/bmesh/source/blender/src/transform_conversions.c

Modified: branches/bmesh/source/blender/blenkernel/BKE_DerivedMesh.h
===================================================================
--- branches/bmesh/source/blender/blenkernel/BKE_DerivedMesh.h	2007-05-24 15:00:10 UTC (rev 10773)
+++ branches/bmesh/source/blender/blenkernel/BKE_DerivedMesh.h	2007-05-24 23:02:01 UTC (rev 10774)
@@ -77,14 +77,26 @@
 	void (*addTriangle)(void *vself, float verts[][3], float normals[][3], char cols[][3],
 	                              char highcols[4], int mat);
 	                              
-	void (*addEdgeWire)(void *vself, float v1[3], float v2[3], char c1[3], char c2[3]);
-	void (*addVertPoint)(void *vself, float v[3], char col[3], float size);
+	/*if index > 0, then this edge wire is included in backbuffered select draw.*/
+	void (*addEdgeWire)(void *vself, float v1[3], float v2[3], char c1[3], char c2[3], int index);
+	void (*addVertPoint)(void *vself, float v[3], char col[3]);
+	void (*addFacePoint)(void *vself, float v[3], char col[3]);
 	void (*endCache)(void *vself);
+	
 	void (*drawFacesSolid)(void *vself, int usecolors);
 	void (*drawFacesTransp)(void *vself);
-	void (*drawVertPoints)(void *vself, float alpha);
+	void (*drawVertPoints)(void *vself, float alpha, float size);
 	void (*drawWireEdges)(void *vself, float alpha);
+	void (*drawFacePoints)(void *vself, float alpha, float size);
 
+	void (*drawFacesBackSel)(void *vself, int offset);
+
+	/*returns start offset to be used with faces*/
+	int (*drawEdgesBackSel)(void *vself, int offset);
+
+	/*returns start offset to be used with edges*/
+	int (*drawVertsBackSel)(void *vself);
+
 	/*NOTE: does not free the struct pointed to at vself! just direct data*/
 	void (*release)(void *vself);
 
@@ -116,13 +128,13 @@
 	struct bglEdgeWire *next, *pref;
 	float v1[3], v2[3];
 	char c1[3], c2[3];
+	int index; /*backbuffered select index*/
 } bglEdgeWire;
 
 typedef struct bglVertPoint {
 	struct bglVertPoint *next, *prev;
 	float co[3];
 	char col[3];
-	float size;
 } bglVertPoint;
 
 typedef struct bglCacheFaceGroup {
@@ -139,20 +151,30 @@
 	bglCacheDrawInterface cinterface;
 	
 	/*temporary stuff used until ->endCache() is called:*/
-	ListBase triangles[MAX_FACEGROUP], wires, points;
-	int tottri, totwire, totpoint;
+	ListBase triangles[MAX_FACEGROUP], wires, points, fpoints;
+	int tottri, totwire, totpoint, totfpoint;
 	struct MemArena *arena;
 	struct MemArena *gl_arena; /*this holds only opengl arrays*/
 
 	struct Material **mats;
-	int  totmat, initilized; /*set to 1 by setmaterials and 2 by begincache, then 3 by endcache (e.g. ready to draw).*/
 
+	/*initilzed is set to 1 by setmaterials and 2 by begincache, 
+	  then 3 by endcache (e.g. ready to draw).*/
+	int  totmat, initilized; 
+
 	/*actual opengl array stuff:*/
 	bglCacheFaceGroup facegroups[MAX_FACEGROUP];
 	float *wireverts;
 	char *wirecols;
+	char *wire_selcols; /*selection colors*/
+
 	float *pointverts;
 	char *pointcols;
+	char *point_selcols; /*backbuffered select colors for vert dots.  this is auto-generated.*/
+
+	float *fpointverts;
+	char *fpointcols;
+	char *fpoint_selcols; /*backbuffered select colors for face dots. this is auto-generated.*/
 } bglCacheMesh;
 
 typedef struct DerivedMesh DerivedMesh;
@@ -164,7 +186,7 @@
 	int numVertData, numEdgeData, numFaceData, numLoopData, numPolyData;
 	int needsFree; /* checked on ->release, is set to 0 for cached results */
 	int needsDrawCacheUpdate;
-	bglCacheDrawInterface *drawer;
+	int backbuf_wireoff, backbuf_faceoff;
 	
 	/* Misc. Queries */
 
@@ -294,9 +316,20 @@
 	void (*drawVerts)(DerivedMesh *dm);
 
 	/* Draw edit verts. 
-	   This will be generalized somewhat obviously. */
+	Note that the dm->backbuf_wireoff/faceoff will be used.*/
 	void (*drawEditVerts)(DerivedMesh *dm, float alpha);
 
+	/* Draw edit verts.*/
+	int (*drawEditVertsBackbuffer)(DerivedMesh *dm);
+
+	/* Draw edit face points.  */
+	void (*drawEditFacePoints)(DerivedMesh *dm, float alpha);
+
+	/* Draw edit face points for backbuffer select.  
+	Note that the dm->backbuf_wireoff/faceoff will be used.*/
+	void (*drawEditFacePointsBackbuffer)(DerivedMesh *dm);
+
+
 	/* Draw edges in the UV mesh (if exists) */
 	void (*drawUVEdges)(DerivedMesh *dm);
 

Modified: branches/bmesh/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- branches/bmesh/source/blender/blenkernel/intern/DerivedMesh.c	2007-05-24 15:00:10 UTC (rev 10773)
+++ branches/bmesh/source/blender/blenkernel/intern/DerivedMesh.c	2007-05-24 23:02:01 UTC (rev 10774)
@@ -639,6 +639,7 @@
 static void emDM_drawMappedEdgesInterp(DerivedMesh *dm, int (*setDrawOptions)(void *userData, int index), void (*setDrawInterpOptions)(void *userData, int index, float t), void *userData) 
 {
 	EditBMeshDerivedMesh *emdm = (EditBMeshDerivedMesh*) dm;
+	emdm->bmesh = emdm->bmesh; /* stupid warning suppression! */
 }
 
 static void emDM_drawUVEdges(DerivedMesh *dm)
@@ -651,20 +652,35 @@
 static void emDM_drawEditVerts(DerivedMesh *dm, float alpha)
 {
 	EditBMeshDerivedMesh *emdm = (EditBMeshDerivedMesh*) dm;
-   if (emdm->recalc_cdraw) emDM_recalcDrawCache(emdm);
+	float vsize;
 
-   emdm->cdraw->drawVertPoints(emdm->cdraw, alpha);
+	if (emdm->recalc_cdraw) emDM_recalcDrawCache(emdm);
+
+	vsize = BIF_GetThemeValuef(TH_VERTEX_SIZE);
+	emdm->cdraw->drawVertPoints(emdm->cdraw, alpha, vsize);
 }
 
+static void emDM_drawEditFacePoints(DerivedMesh *dm, float alpha)
+{
+	EditBMeshDerivedMesh *emdm = (EditBMeshDerivedMesh*) dm;
+	float fsize;
+
+	if (emdm->recalc_cdraw) emDM_recalcDrawCache(emdm);
+
+	fsize = BIF_GetThemeValuef(TH_FACEDOT_SIZE);
+	emdm->cdraw->drawFacePoints(emdm->cdraw, alpha, fsize);
+}
+
 static void emDM_recalcDrawCache(EditBMeshDerivedMesh *emdm)
 {
 	BME_Poly *efa;
 	BME_Loop *loop;
 	BME_Edge *eed;
 	BME_Vert *eve;
-	float v[3][3], no[3][3];
+	float v[3][3], no[3][3], facedot[3];
 	float nor[3], vsize;
-	char high[4], vcol[3], svcol[3], ecol[3], secol[3];
+	char high[4], vcol[3], svcol[3], ecol[3], secol[3], fcol[3], sfcol[3];
+	int i;
 
 	BIF_GetThemeColor3ubv(TH_VERTEX, vcol);
 	BIF_GetThemeColor3ubv(TH_VERTEX_SELECT, svcol);
@@ -673,6 +689,9 @@
 	BIF_GetThemeColor3ubv(TH_EDGE, ecol);
 	BIF_GetThemeColor3ubv(TH_EDGE_SELECT, secol);
 
+	BIF_GetThemeColor3ubv(TH_FACE, fcol);
+	BIF_GetThemeColor3ubv(TH_FACE_SELECT, sfcol);
+
 	/*Eck! remember to write code to set high (which is the transparent highlight color!)*/
 	if (!emdm->cdraw) emdm->cdraw = bglCacheNew();
 
@@ -683,6 +702,21 @@
 
 	printf("bleh 1\n");
 	for (efa=emdm->bmesh->polys.first; efa; efa=efa->next) {
+
+		/*do face dot*/
+		loop = efa->loopbase;
+		facedot[0] = facedot[1] = facedot[2] = 0.0;
+		i = 0;
+		do {
+			VecAddf(facedot, facedot, loop->v->co);
+			i++;
+			loop = loop->next;
+		} while (loop != efa->loopbase);
+		VecMulf(facedot, 1.0f/(float)i);
+		if (efa->flag & SELECT) emdm->cdraw->addFacePoint(emdm->cdraw, facedot, sfcol);
+		else emdm->cdraw->addFacePoint(emdm->cdraw, facedot, fcol);
+		
+		/*do face itself, triangulate via trangle-fan.*/
 		loop = efa->loopbase->next;
 		do {
 			VECCOPY(v[0], loop->v->co);
@@ -707,14 +741,14 @@
 	
 	printf("bleh 2\n");
 	for (eve=emdm->bmesh->verts.first; eve; eve=eve->next) {
-		if (eve->flag & SELECT) emdm->cdraw->addVertPoint(emdm->cdraw, eve->co, svcol, vsize);
-		else emdm->cdraw->addVertPoint(emdm->cdraw, eve->co, vcol, vsize);
+		if (eve->flag & SELECT) emdm->cdraw->addVertPoint(emdm->cdraw, eve->co, svcol);
+		else emdm->cdraw->addVertPoint(emdm->cdraw, eve->co, vcol);
 	}
 
 	printf("bleh 3\n");
-	for (eed=emdm->bmesh->edges.first; eed; eed=eed->next) {
-		if (eed->flag & SELECT) emdm->cdraw->addEdgeWire(emdm->cdraw, eed->v1->co, eed->v2->co, secol, secol);
-		else emdm->cdraw->addEdgeWire(emdm->cdraw, eed->v1->co, eed->v2->co, ecol, ecol);
+	for (eed=emdm->bmesh->edges.first, i=0; eed; i++, eed=eed->next) {
+		if (eed->flag & SELECT) emdm->cdraw->addEdgeWire(emdm->cdraw, eed->v1->co, eed->v2->co, secol, secol, i);
+		else emdm->cdraw->addEdgeWire(emdm->cdraw, eed->v1->co, eed->v2->co, ecol, ecol, i);
 	}
 	emdm->recalc_cdraw = 0;
 	emdm->cdraw->endCache(emdm->cdraw);
@@ -848,6 +882,7 @@
 	emdm->dm.foreachMappedEdge = emDM_foreachMappedEdge;
 	emdm->dm.foreachMappedFaceCenter = emDM_foreachMappedFaceCenter;
 
+	emdm->dm.drawEditFacePoints = emDM_drawEditFacePoints;
 	emdm->dm.drawEditVerts = emDM_drawEditVerts;
 	emdm->dm.drawEdges = emDM_drawEdges;
 	emdm->dm.drawMappedEdges = emDM_drawMappedEdges;

Modified: branches/bmesh/source/blender/blenloader/intern/readfile.c
===================================================================
--- branches/bmesh/source/blender/blenloader/intern/readfile.c	2007-05-24 15:00:10 UTC (rev 10773)
+++ branches/bmesh/source/blender/blenloader/intern/readfile.c	2007-05-24 23:02:01 UTC (rev 10774)
@@ -6540,6 +6540,9 @@
 			}
 			
 			freeConvEHash(hash);
+
+			CustomData_free(&mesh->fdata, mesh->totface);
+			mesh->mface = NULL;
 			mesh->totface = 0;
 		}
 	}

Modified: branches/bmesh/source/blender/include/BDR_drawobject.h
===================================================================
--- branches/bmesh/source/blender/include/BDR_drawobject.h	2007-05-24 15:00:10 UTC (rev 10773)
+++ branches/bmesh/source/blender/include/BDR_drawobject.h	2007-05-24 23:02:01 UTC (rev 10774)
@@ -49,11 +49,14 @@
 struct EditVert;
 struct EditFace;
 struct EditEdge;
+struct BME_Vert;
+struct BME_Edge;
+struct BME_Poly;
 
 int set_gl_material(int nr);
 int init_gl_materials(struct Object *ob, int check_alpha);
 
-void mesh_foreachScreenVert(void (*func)(void *userData, struct EditVert *eve, int x, int y, int index), void *userData, int clipVerts);
+void mesh_foreachScreenVert(void (*func)(void *userData, struct BME_Vert *eve, int x, int y, int index), void *userData, int clipVerts);
 void mesh_foreachScreenEdge(void (*func)(void *userData, struct EditEdge *eed, int x0, int y0, int x1, int y1, int index), void *userData, int clipVerts);
 void mesh_foreachScreenFace(void (*func)(void *userData, struct EditFace *efa, int x, int y, int index), void *userData);
 

Modified: branches/bmesh/source/blender/include/editbmesh.h
===================================================================
--- branches/bmesh/source/blender/include/editbmesh.h	2007-05-24 15:00:10 UTC (rev 10773)
+++ branches/bmesh/source/blender/include/editbmesh.h	2007-05-24 23:02:01 UTC (rev 10774)
@@ -12,9 +12,14 @@
 void EditBME_makeEditMesh(void);
 void EditBME_loadEditMesh(struct Mesh *mesh);

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list