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

Joseph Eagar joeedh at gmail.com
Thu May 24 03:08:11 CEST 2007


Revision: 10769
          https://svn.blender.org//revision/?rev=10769&view=rev
Author:   joeedh
Date:     2007-05-24 03:08:08 +0200 (Thu, 24 May 2007)

Log Message:
-----------
BMesh Branch
=Drawing Updates=

Bmesh editmode now draws solid faces and (non-selectable) vertex points.  Object mode now draws correctly.  There's still some bugs though, especially in the conversion of vertex normals.

Modified Paths:
--------------
    branches/bmesh/source/blender/blenkernel/BKE_DerivedMesh.h
    branches/bmesh/source/blender/blenkernel/intern/DerivedMesh.c
    branches/bmesh/source/blender/blenkernel/intern/cdderivedmesh.c
    branches/bmesh/source/blender/blenkernel/intern/mesh.c
    branches/bmesh/source/blender/blenloader/intern/readfile.c
    branches/bmesh/source/blender/src/drawobject.c
    branches/bmesh/source/blender/src/editbmesh_interface.c

Modified: branches/bmesh/source/blender/blenkernel/BKE_DerivedMesh.h
===================================================================
--- branches/bmesh/source/blender/blenkernel/BKE_DerivedMesh.h	2007-05-23 23:09:57 UTC (rev 10768)
+++ branches/bmesh/source/blender/blenkernel/BKE_DerivedMesh.h	2007-05-24 01:08:08 UTC (rev 10769)
@@ -61,41 +61,34 @@
 struct ModifierData;
 struct MCol;
 struct Material;
+struct MemArena;
 
 /* number of sub-elements each mesh element has (for interpolation) */
 #define SUB_ELEMS_VERT 0
 #define SUB_ELEMS_EDGE 2
 #define SUB_ELEMS_FACE 4
 
-
-typedef struct bglTriangle {
-	struct bglTriangle *next, *prev;
-	float uv[3][2];
-	float vert_colors[3][3];
-	float vert_cos[3][3];
-	float vert_nos[3][3];	
-} bglTriangle;
-
-typedef struct bglMesh {
-	float *gl_array; //is interleaved
-	ListBase triangles;
-} bglMesh;
-
-/*ONLY ACCEPTS TRIANGLES!*/
+/*Only accepts triangles!*/
 typedef struct bglCacheDrawInterface {
+	/*this must be called first!*/
+	void (*setMaterials)(void *vself, int totmat, struct Material **materials);
 	void (*beginCache)(void *vself);
-	void (*setMaterials)(void *vself, int totmat, struct Material **materials);
 	
-	/*if v4 == NULL, then the face is assumed to be a triangle.  Will do quads, or triangles,
-      but will NOT automatically tesselate ngons!*/
-	void (*addFace)(void *vself, float *verts, float *normals, char *cols,
-	                              int mat, int sel, int smooth);
+	void (*addTriangle)(void *vself, float verts[][3], float normals[][3], char cols[][3],
+	                              char highcols[4], int mat);
 	                              
-	void (*addEdgeWire)(void *vself, float *v1, float *v2, int sel, int seam);
-	void (*addVertPoint)(void *vself, float *v, int sel, int seam);
+	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);
 	void (*endCache)(void *vself);
-	void (*drawCache)(void *vself, int drawlevel);
-	/* char *colors is an array of per-face colors.*/
+	void (*drawFacesSolid)(void *vself, int usecolors);
+	void (*drawFacesTransp)(void *vself);
+	void (*drawVertPoints)(void *vself, float alpha);
+	void (*drawEdges)(void *vself);
+
+	/*NOTE: does not free the struct pointed to at vself! just direct data*/
+	void (*release)(void *vself);
+
+	/* char *colors is an array of per-triangle colors.*/
 	void (*drawCacheOverloadColors)(void *vself, char *colors, int drawlevel, int flags);
 } bglCacheDrawInterface;
 
@@ -109,20 +102,58 @@
 /*theres always one group per material, that is
   entirely triangles.*/
 
+typedef struct bglTriangle {
+	struct bglTriangle *next, *prev;
+	float uv[3][2];
+	unsigned char colors[3][3];
+	float cos[3][3];
+	float nos[3][3];
+	unsigned char highlightclr[4];
+	int mat;
+} bglTriangle;
+
+typedef struct bglEdgeWire {
+	struct bglEdgeWire *next, *pref;
+	float v1[3], v2[3];
+	char c1[3], c2[3];
+} bglEdgeWire;
+
+typedef struct bglVertPoint {
+	struct bglVertPoint *next, *prev;
+	float co[3];
+	char col[3];
+	float size;
+} bglVertPoint;
+
 typedef struct bglCacheFaceGroup {
 	float *faceverts;
-	float *facecolors;
+	char *facecolors;
+	char *highcolors; /*highlight colors for editmode*/
 	float *facenormals;
-} bglCacheFaceGroup;	
+	int tottris;
+} bglCacheFaceGroup;
 
-typedef struct bglCacheDrawer {
-	bglCacheDrawInterface *interface;
-	bglCacheFaceGroup facegroups[16];
+#define MAX_FACEGROUP	16 /*actually a copy of the maximum number of materials, which is 16*/
+
+typedef struct bglCacheMesh {
+	bglCacheDrawInterface cinterface;
+	
+	/*temporary stuff used until ->endCache() is called:*/
+	ListBase triangles[MAX_FACEGROUP], wires, points;
+	int tottri, totwire, totpoint;
+	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).*/
+
+	/*actual opengl array stuff:*/
+	bglCacheFaceGroup facegroups[MAX_FACEGROUP];
 	float *edgeverts;
-	float *edgecols;
+	char *edgecols;
 	float *pointverts;
-	float *pointcols;
-} bglCacheDrawer;
+	char *pointcols;
+} bglCacheMesh;
 
 typedef struct DerivedMesh DerivedMesh;
 struct DerivedMesh {
@@ -262,6 +293,10 @@
 	/* Draw all vertices as bgl points (no options) */
 	void (*drawVerts)(DerivedMesh *dm);
 
+	/* Draw edit verts. 
+	   This will be generalized somewhat obviously. */
+	void (*drawEditVerts)(DerivedMesh *dm, float alpha);
+
 	/* Draw edges in the UV mesh (if exists) */
 	void (*drawUVEdges)(DerivedMesh *dm);
 
@@ -354,6 +389,9 @@
 	void (*release)(DerivedMesh *dm);
 };
 
+/*create a new cache drawing interface*/
+bglCacheDrawInterface *bglCacheNew(void);
+
 /* utility function to initialise a DerivedMesh's function pointers to
  * the default implementation (for those functions which have a default)
  */

Modified: branches/bmesh/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- branches/bmesh/source/blender/blenkernel/intern/DerivedMesh.c	2007-05-23 23:09:57 UTC (rev 10768)
+++ branches/bmesh/source/blender/blenkernel/intern/DerivedMesh.c	2007-05-24 01:08:08 UTC (rev 10769)
@@ -83,6 +83,7 @@
 
 #include "BIF_gl.h"
 #include "BIF_glutil.h"
+#include "BIF_resources.h"
 
 #include "multires.h"
 
@@ -272,6 +273,7 @@
 void DM_from_template(DerivedMesh *dm, DerivedMesh *source,
                       int numVerts, int numEdges, int numFaces, int numLoops, int numPolys)
 {
+	printf("DM_from_template called!\n");
 	CustomData_copy(&source->vertData, &dm->vertData, CD_MASK_DERIVEDMESH,
 	                CD_CALLOC, numVerts);
 	CustomData_copy(&source->edgeData, &dm->edgeData, CD_MASK_DERIVEDMESH,
@@ -286,6 +288,8 @@
 	dm->numVertData = numVerts;
 	dm->numEdgeData = numEdges;
 	dm->numFaceData = numFaces;
+	dm->numLoopData = numLoops;
+	dm->numPolyData = numPolys;
 
 	DM_init_funcs(dm);
 
@@ -320,9 +324,13 @@
 	Mesh tmp = *me;
 	int totvert, totedge, totface, totloop, totpoly;
 
+	printf("DM_to_mesh called!\n");
+
 	memset(&tmp.vdata, 0, sizeof(tmp.vdata));
 	memset(&tmp.edata, 0, sizeof(tmp.edata));
 	memset(&tmp.fdata, 0, sizeof(tmp.fdata));
+	memset(&tmp.ldata, 0, sizeof(tmp.ldata));
+	memset(&tmp.pdata, 0, sizeof(tmp.pdata));
 
 	totvert = tmp.totvert = dm->getNumVerts(dm);
 	totedge = tmp.totedge = dm->getNumEdges(dm);
@@ -566,6 +574,8 @@
 	float (*vertexCos)[3];
 	float (*vertexNos)[3];
 	float (*faceNos)[3];
+	bglCacheDrawInterface *cdraw;
+	int recalc_cdraw;
 } EditBMeshDerivedMesh;
 
 typedef struct {
@@ -577,12 +587,14 @@
 	float (*faceNos)[3];
 } EditMeshDerivedMesh;
 
+static void emDM_recalcDrawCache(EditBMeshDerivedMesh *emdm);
+
 static void emDM_foreachMappedVert(DerivedMesh *dm, void (*func)(void *userData, int index, float *co, float *no_f, short *no_s), void *userData)
 {
 	EditBMeshDerivedMesh *bem = (EditBMeshDerivedMesh*) dm;
 	BME_Vert *bev;
 	int i;
-	short no[3];
+	//short no[3];
 	
 	for (bev=bem->bmesh->verts.first, i=0; bev; i++, bev=bev->next) {
 		if (bem->vertexCos) {
@@ -597,7 +609,7 @@
 	EditBMeshDerivedMesh *bem = (EditBMeshDerivedMesh*) dm;
 	BME_Edge *bed;
 	int i;
-	short no[3];
+	//short no[3];
 	
 	for (bed=bem->bmesh->edges.first, i=0; bed; i++, bed=bed->next) {
 		if (bem->vertexCos) {
@@ -610,32 +622,111 @@
 
 static void emDM_drawMappedEdges(DerivedMesh *dm, int (*setDrawOptions)(void *userData, int index), void *userData) 
 {
+	EditBMeshDerivedMesh *emdm = (EditBMeshDerivedMesh*) dm;
+	emdm->bmesh = emdm->bmesh;
+}
 
-}
 static void emDM_drawEdges(DerivedMesh *dm, int drawLooseEdges)
 {
+	EditBMeshDerivedMesh *emdm = (EditBMeshDerivedMesh*) dm;
+	emdm->bmesh = emdm->bmesh;
+}
 
-}
 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;
 
 }
 
 static void emDM_drawUVEdges(DerivedMesh *dm)
 {
+	EditBMeshDerivedMesh *emdm = (EditBMeshDerivedMesh*) dm;
+	emdm->bmesh = emdm->bmesh;
+
 }
 
+static void emDM_drawEditVerts(DerivedMesh *dm, float alpha)
+{
+	EditBMeshDerivedMesh *emdm = (EditBMeshDerivedMesh*) dm;
+   if (emdm->recalc_cdraw) emDM_recalcDrawCache(emdm);
+
+   emdm->cdraw->drawVertPoints(emdm->cdraw, alpha);
+}
+
+static void emDM_recalcDrawCache(EditBMeshDerivedMesh *emdm)
+{
+	BME_Poly *efa;
+	BME_Loop *loop;
+	BME_Vert *eve;
+	float v[3][3], no[3][3];
+	float nor[3], vsize;
+	char high[4], vcol[3], svcol[3];
+
+	BIF_GetThemeColor3ubv(TH_VERTEX, vcol);
+	BIF_GetThemeColor3ubv(TH_VERTEX_SELECT, svcol);
+	vsize = BIF_GetThemeValuef(TH_VERTEX_SIZE);
+
+	/*Eck! remember to write code to set high (which is the transparent highlight color!)*/
+	if (!emdm->cdraw) emdm->cdraw = bglCacheNew();
+
+	printf("in emDM_recalcDrawCache!\n");
+	emdm->cdraw->release(emdm->cdraw); /*resets the entire draw cache*/
+	emdm->cdraw->setMaterials(emdm->cdraw, G.obedit->totcol, G.obedit->mat);
+	emdm->cdraw->beginCache(emdm->cdraw);
+
+	printf("bleh 1\n");
+	for (efa=emdm->bmesh->polys.first; efa; efa=efa->next) {
+		loop = efa->loopbase->next;
+		do {
+			VECCOPY(v[0], loop->v->co);
+			VECCOPY(v[1], loop->next->v->co);
+			VECCOPY(v[2], efa->loopbase->v->co);
+			if (efa->flag & ME_NSMOOTH) {
+				VECCOPY(no[0], loop->v->no);
+				VECCOPY(no[1], loop->next->v->no);
+				VECCOPY(no[2], efa->loopbase->v->no);
+				printf("smooth face!\n");
+			} else {
+				CalcNormFloat(efa->loopbase->v->co, efa->loopbase->next->v->co, 
+				              efa->loopbase->next->next->v->co, nor);
+				VECCOPY(no[0], nor);
+				VECCOPY(no[1], nor);
+				VECCOPY(no[2], nor);
+			}
+			emdm->cdraw->addTriangle(emdm->cdraw, v, no, NULL, high, efa->mat_nr);
+			loop=loop->next;
+		} while (loop != efa->loopbase->prev);
+	}
+	
+	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);
+	}
+
+	emdm->recalc_cdraw = 0;
+	emdm->cdraw->endCache(emdm->cdraw);
+}
+
 static void emDM__calcFaceCent(EditFace *efa, float cent[3], float (*vertexCos)[3])
 {
 
 }
 static void emDM_foreachMappedFaceCenter(DerivedMesh *dm, void (*func)(void *userData, int index, float *co, float *no), void *userData)
 {
+	EditBMeshDerivedMesh *emdm = (EditBMeshDerivedMesh*) dm;

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list