[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [11262] branches/soc-2007-red_fox/source/ blender: Wire bevel added, non-manifold geometry is now recognized.

Levi Schooley redfox at hhofministries.org
Fri Jul 13 06:07:03 CEST 2007


Revision: 11262
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=11262
Author:   red_fox
Date:     2007-07-13 06:07:02 +0200 (Fri, 13 Jul 2007)

Log Message:
-----------
Wire bevel added, non-manifold geometry is now recognized.

This is kind of a miscellaneous commit. I reorganized some
code, moved some functions around, and other little stuff.

The biggest thing is that I added in checks for non-manifold
geometry. Beveling non-manifold geometry doesn't really make
sense, so it is simply ignored. This also should make the
bevel tool able to work on just about any mesh you throw at
it, and fixes most (if not all) the tool crashes.

In addition, I added the support for wire (pure edge
geometry) beveling.

Levi

Modified Paths:
--------------
    branches/soc-2007-red_fox/source/blender/blenkernel/BKE_bmesh.h
    branches/soc-2007-red_fox/source/blender/blenkernel/intern/BME_mesh.c
    branches/soc-2007-red_fox/source/blender/blenkernel/intern/BME_structure.c
    branches/soc-2007-red_fox/source/blender/blenkernel/intern/BME_tools.c
    branches/soc-2007-red_fox/source/blender/blenkernel/intern/modifier.c
    branches/soc-2007-red_fox/source/blender/src/editmesh_tools.c

Added Paths:
-----------
    branches/soc-2007-red_fox/source/blender/blenkernel/intern/BME_conversions.c

Modified: branches/soc-2007-red_fox/source/blender/blenkernel/BKE_bmesh.h
===================================================================
--- branches/soc-2007-red_fox/source/blender/blenkernel/BKE_bmesh.h	2007-07-13 03:06:01 UTC (rev 11261)
+++ branches/soc-2007-red_fox/source/blender/blenkernel/BKE_bmesh.h	2007-07-13 04:07:02 UTC (rev 11262)
@@ -41,6 +41,7 @@
 #include "BLI_ghash.h"
 #include "DNA_customdata_types.h"
 #include "BLI_editVert.h"
+#include "BKE_DerivedMesh.h"
 
 struct BME_Vert;
 struct BME_Edge;
@@ -179,9 +180,11 @@
 /*TOOLS CODE*/
 struct BME_Loop *BME_inset_edge(struct BME_Mesh *bm, struct BME_Loop *l, struct BME_Poly *f);
 struct BME_Poly *BME_inset_poly(struct BME_Mesh *bm, struct BME_Poly *f);
-struct BME_Mesh *BME_bevel_mesh(struct BME_Mesh *bm, float value, int options);
+struct BME_Mesh *BME_bevel_mesh(struct BME_Mesh *bm, float value, int res, int options);
 
 /*CONVERSION FUNCTIONS*/
 struct BME_Mesh *BME_editmesh_to_bmesh(EditMesh *em, struct BME_Mesh *bm);
 struct EditMesh *BME_bmesh_to_editmesh(struct BME_Mesh *bm);
+struct BME_Mesh *BME_derivedmesh_to_bmesh(struct DerivedMesh *dm, struct BME_Mesh *bm);
+struct DerivedMesh *BME_bmesh_to_derivedmesh(struct BME_Mesh *bm, struct DerivedMesh *dm);
 #endif

Added: branches/soc-2007-red_fox/source/blender/blenkernel/intern/BME_conversions.c
===================================================================
--- branches/soc-2007-red_fox/source/blender/blenkernel/intern/BME_conversions.c	                        (rev 0)
+++ branches/soc-2007-red_fox/source/blender/blenkernel/intern/BME_conversions.c	2007-07-13 04:07:02 UTC (rev 11262)
@@ -0,0 +1,389 @@
+/**
+ * BME_mesh.c    jan 2007
+ *
+ *	BMesh mesh level functions.
+ *
+ * $Id: BME_eulers.c,v 1.00 2007/01/17 17:42:01 Briggs Exp $
+ *
+ * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License.  See http://www.blender.org/BL/ for information
+ * about this.	
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2007 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Geoffrey Bantle, Levi Schooley.
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ */
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_listBase.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+
+#include "BKE_utildefines.h"
+#include "BKE_mesh.h"
+#include "BKE_bmesh.h"
+#include "BKE_global.h"
+#include "BKE_DerivedMesh.h"
+#include "BKE_cdderivedmesh.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_editVert.h"
+#include "BLI_edgehash.h"
+#include "BIF_editmesh.h"
+#include "editmesh.h"
+#include "bmesh_private.h"
+
+BME_Mesh *BME_editmesh_to_bmesh(EditMesh *em, BME_Mesh *bm) {
+	BME_Vert *v1, *v2;
+	BME_Edge *e, *edar[4];
+	BME_Poly *f;
+
+	EditVert *eve;
+	EditEdge *eed;
+	EditFace *efa;
+
+	int len;
+
+	BME_model_begin(bm);
+	/*custom data*/
+	
+	/*add verts*/
+	CustomData_copy(&em->vdata, &bm->vdata, CD_MASK_EDITMESH, CD_CALLOC, 0);
+	eve= em->verts.first;
+	while(eve) {
+		v1 = BME_MV(bm,eve->co);
+		v1->flag = eve->f;
+		v1->h = eve->h;
+
+		/* link the verts for edge and face construction;
+		 * kind of a dangerous thing - remember to cast back to BME_Vert before using! */
+		eve->tmp.v = (EditVert*)v1;
+
+		CustomData_em_copy_data(&em->vdata, &bm->vdata, eve->data, &v1->data);
+		
+		eve = eve->next;
+	}
+	
+	/*add edges*/
+	CustomData_copy(&em->edata, &bm->edata, CD_MASK_EDITMESH, CD_CALLOC, 0);
+	eed= em->edges.first;
+	while(eed) {
+		v1 = (BME_Vert*)eed->v1->tmp.l;
+		v2 = (BME_Vert*)eed->v2->tmp.l;
+		e = BME_ME(bm, v1, v2);
+		e->crease = eed->crease;
+		e->flag = eed->f & SELECT;
+		if(eed->sharp) e->flag |= ME_SHARP;
+		if(eed->seam) e->flag |= ME_SEAM;
+		if(eed->h & EM_FGON) e->flag |= ME_FGON;
+		if(eed->h & 1) e->flag |= ME_HIDE;
+		CustomData_em_copy_data(&em->edata, &bm->edata, eed->data, &e->data);
+
+		/* link the edges for face construction;
+		 * kind of a dangerous thing - remember to cast back to BME_Edge before using! */
+		eed->tmp.e = (EditEdge*)e;
+		eed = eed->next;
+	}
+
+	/*add faces.*/
+	CustomData_copy(&em->fdata, &bm->pdata, CD_MASK_EDITMESH, CD_CALLOC, 0);
+	efa= em->faces.first;
+	while(efa) {
+		if(efa->v4) len = 4;
+		else len = 3;
+		
+		edar[0] = (BME_Edge*)efa->e1->tmp.e;
+		edar[1] = (BME_Edge*)efa->e2->tmp.e;
+		edar[2] = (BME_Edge*)efa->e3->tmp.e;
+		if(len == 4){
+			edar[3] = (BME_Edge*)efa->e4->tmp.e;
+		}
+		
+		/*find v1 and v2*/
+		v1 = (BME_Vert*)efa->v1->tmp.v;
+		v2 = (BME_Vert*)efa->v2->tmp.v;
+		
+		f = BME_MF(bm,v1,v2,edar,len);
+		f->mat_nr = efa->mat_nr;
+		f->flag = efa->flag;
+		if(efa->h) {
+			f->flag |= ME_HIDE;
+			f->flag &= ~ME_FACE_SEL;
+		}
+		else {
+			if(efa->f & 1) f->flag |= ME_FACE_SEL;
+			else f->flag &= ~ME_FACE_SEL;
+		}
+		CustomData_em_copy_data(&em->fdata, &bm->pdata, efa->data, &f->data);
+		
+		efa = efa->next;
+	}
+	BME_model_end(bm);
+	return bm;
+}
+
+EditMesh *BME_bmesh_to_editmesh(BME_Mesh *bm) {
+	BME_Vert *v1;
+	BME_Edge *e;
+	BME_Poly *f;
+
+	EditMesh *em, *tem;
+	EditVert *eve1, *eve2, *eve3, *eve4, **evlist;
+	EditEdge *eed;
+	EditFace *efa;
+
+	int totvert, len, i;
+
+	tem = G.editMesh; /* we'll want to restore this later */
+	em = MEM_callocN(sizeof(EditMesh), "newEditMesh");
+	G.editMesh = em; /* silly, but I'm doing this so I can use pre-existing add[vert/edge/face]list stuff */
+
+	/* convert to EditMesh */
+	/* NOTE: Custom data is NOT transferred yet! A big todo. */
+	/* make editverts */
+	CustomData_copy(&bm->vdata, &em->vdata, CD_MASK_EDITMESH, CD_CALLOC, 0);
+	totvert = BLI_countlist(&(bm->verts));
+	evlist= (EditVert **)MEM_mallocN(totvert*sizeof(void *),"evlist");
+	for (i=0,v1=bm->verts.first;v1;v1=v1->next,i++) {
+		v1->tflag1 = i;
+		eve1 = addvertlist(v1->co,NULL);
+		eve1->keyindex = i;
+		evlist[i]= eve1;
+		eve1->f = (unsigned char)v1->flag;
+		eve1->h = (unsigned char)v1->h;
+		CustomData_em_copy_data(&bm->vdata, &em->vdata, v1->data, &eve1->data);
+	}
+	
+	/* make edges */
+	CustomData_copy(&bm->edata, &em->edata, CD_MASK_EDITMESH, CD_CALLOC, 0);
+	for (e=bm->edges.first;e;e=e->next) {
+		eed= addedgelist(evlist[e->v1->tflag1], evlist[e->v2->tflag1], NULL);
+		eed->crease = e->crease;
+		if(e->flag & ME_SEAM) eed->seam = 1;
+		if(e->flag & ME_SHARP) eed->sharp = 1;
+		if(e->flag & SELECT) eed->f |= SELECT;
+		if(e->flag & ME_FGON) eed->h= EM_FGON; // 2 different defines!
+		if(e->flag & ME_HIDE) eed->h |= 1;
+		if(G.scene->selectmode==SCE_SELECT_EDGE) 
+			EM_select_edge(eed, eed->f & SELECT);
+		CustomData_em_copy_data(&bm->edata, &em->edata, e->data, &eed->data);
+	}
+
+	/* make faces */
+	CustomData_copy(&bm->pdata, &em->fdata, CD_MASK_EDITMESH, CD_CALLOC, 0);
+	for (f=bm->polys.first;f;f=f->next) {
+		len = BME_cycle_length(f->loopbase);
+		if (len==3 || len==4) {
+			eve1= evlist[f->loopbase->v->tflag1];
+			eve2= evlist[f->loopbase->next->v->tflag1];
+			eve3= evlist[f->loopbase->next->next->v->tflag1];
+			if (len == 4) {
+				eve4= evlist[f->loopbase->prev->v->tflag1];
+			}
+			else {
+				eve4= NULL;
+			}
+
+			efa = addfacelist(eve1, eve2, eve3, eve4, NULL, NULL);
+			CustomData_em_copy_data(&bm->pdata, &em->fdata, f->data, &efa->data);
+			efa->mat_nr = (unsigned char)f->mat_nr;
+			efa->flag= f->flag & ~ME_HIDE;
+			if(f->flag & ME_FACE_SEL) {
+				efa->f |= SELECT;
+			}
+			if(f->flag & ME_HIDE) efa->h= 1;
+			if((G.f & G_FACESELECT) && (efa->f & SELECT))
+				EM_select_face(efa, 1); /* flush down */
+		}
+	}
+
+	MEM_freeN(evlist);
+
+	/* make sure we restore this */
+	G.editMesh = tem;
+
+	return em;
+}
+
+/* Adds the geometry found in dm to bm
+ * NOTE: it does not allocate a new BME_Mesh!
+ */
+BME_Mesh *BME_derivedmesh_to_bmesh(DerivedMesh *dm, BME_Mesh *bm)
+{
+	MVert *mvert, *mv;
+	MEdge *medge, *me;
+	MFace *mface, *mf;
+	int totface,totedge,totvert,i,len;
+
+	BME_Vert *v1=NULL,*v2=NULL;
+	BME_Edge *e=NULL;
+	BME_Poly *f=NULL;
+	
+	EdgeHash *edge_hash = BLI_edgehash_new();
+	
+	totvert = dm->getNumVerts(dm);
+	totedge = dm->getNumEdges(dm);
+	totface = dm->getNumFaces(dm);
+	mvert = dm->getVertArray(dm);
+	medge = dm->getEdgeArray(dm);
+	mface = dm->getFaceArray(dm);
+
+	bm = BME_make_mesh();
+	BME_model_begin(bm);
+	/*custom data*/
+	/* NOTE: I haven't tested whether or not custom data is being copied correctly */
+	CustomData_copy(&dm->vertData, &bm->vdata, CD_MASK_DERIVEDMESH,
+	                CD_CALLOC, totvert);
+	CustomData_copy(&dm->edgeData, &bm->edata, CD_MASK_DERIVEDMESH,
+	                CD_CALLOC, totedge);
+	CustomData_copy(&dm->faceData, &bm->pdata, CD_MASK_DERIVEDMESH,
+	                CD_CALLOC, totface);
+	/*add verts*/
+	for(i=0,mv = mvert; i < totvert;i++,mv++){
+		v1 = BME_MV(bm,mv->co);
+		v1->flag = mv->flag;
+		CustomData_to_em_block(&dm->vertData, &bm->vdata, i, &v1->data);
+	}
+	/*add edges*/
+	for(i=0,me = medge; i < totedge;i++,me++){
+		v1 = BLI_findlink(&(bm->verts),me->v1);
+		v2 = BLI_findlink(&(bm->verts),me->v2);
+		e = BME_ME(bm, v1, v2);
+		e->crease = me->crease;
+		e->flag = (unsigned char)me->flag;
+		BLI_edgehash_insert(edge_hash,me->v1,me->v2,e);
+		CustomData_to_em_block(&dm->edgeData, &bm->edata, i, &e->data);
+	}
+	/*add faces.*/
+	for(i=0,mf = mface; i < totface;i++,mf++){
+		BME_Edge *edar[4];
+		if(mf->v4) len = 4;
+		else len = 3;
+		
+		edar[0] = BLI_edgehash_lookup(edge_hash,mf->v1,mf->v2);
+		edar[1] = BLI_edgehash_lookup(edge_hash,mf->v2,mf->v3);
+		if(len == 4){
+			edar[2] = BLI_edgehash_lookup(edge_hash,mf->v3,mf->v4);
+			edar[3] = BLI_edgehash_lookup(edge_hash,mf->v4,mf->v1);
+		}
+		else
+			edar[2] = BLI_edgehash_lookup(edge_hash,mf->v3,mf->v1);
+		
+		/*find v1 and v2*/
+		v1 = BLI_findlink(&(bm->verts),mf->v1);
+		v2 = BLI_findlink(&(bm->verts),mf->v2);
+		

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list