[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20968] branches/bmesh/blender/source/ blender: extrude handles active face, and operators now properly restore unmodified mesh on failure

Joseph Eagar joeedh at gmail.com
Thu Jun 18 09:11:55 CEST 2009


Revision: 20968
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20968
Author:   joeedh
Date:     2009-06-18 09:11:55 +0200 (Thu, 18 Jun 2009)

Log Message:
-----------
extrude handles active face, and operators now properly restore unmodified mesh on failure

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/blenkernel/BKE_tessmesh.h
    branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_structure.c
    branches/bmesh/blender/source/blender/bmesh/operators/bmesh_dupeops.c
    branches/bmesh/blender/source/blender/bmesh/operators/extrudeops.c
    branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c

Modified: branches/bmesh/blender/source/blender/blenkernel/BKE_tessmesh.h
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/BKE_tessmesh.h	2009-06-18 04:39:33 UTC (rev 20967)
+++ branches/bmesh/blender/source/blender/blenkernel/BKE_tessmesh.h	2009-06-18 07:11:55 UTC (rev 20968)
@@ -28,6 +28,9 @@
   and not BMesh.  Mesh->editbmesh will store a pointer to this structure.*/
 typedef struct BMEditMesh {
 	struct BMesh *bm;
+
+	/*this is for undoing failed operations*/
+	struct BMEditMesh *emcopy;
 	
 	/*we store tesselations as triplets of three loops,
 	  which each define a triangle.*/

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c	2009-06-18 04:39:33 UTC (rev 20967)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c	2009-06-18 07:11:55 UTC (rev 20968)
@@ -127,7 +127,7 @@
 	BMIter iter, liter;
 	BMFace *f;
 	BMLoop *l;
-	int i = 0;
+	int i = 0, j;
 	
 	if (tm->looptris) MEM_freeN(tm->looptris);
 
@@ -152,6 +152,7 @@
 				looptris[i*3] = l;
 				looptris[i*3+1] = (BMLoop*)l->head.next;
 				looptris[i*3+2] = f->loopbase;
+
 				i += 1;
 			}
 		} else {
@@ -161,7 +162,10 @@
 			EditFace *efa;
 
 			l = BMIter_New(&liter, bm, BM_LOOPS_OF_FACE, f);
-			for (; l; l=BMIter_Step(&liter)) {
+			for (j=0; l; l=BMIter_Step(&liter), j++) {
+				/*mark order*/
+				l->head.eflag2 = j;
+
 				v = BLI_addfillvert(l->v->co);
 				v->tmp.p = l;
 				
@@ -182,10 +186,18 @@
 				V_GROW(looptris);
 				V_GROW(looptris);
 				V_GROW(looptris);
-
+				
 				looptris[i*3] = efa->v1->tmp.p;
 				looptris[i*3+1] = efa->v2->tmp.p;
 				looptris[i*3+2] = efa->v3->tmp.p;
+
+				if (looptris[i*3]->head.eflag2 > looptris[i*3+1]->head.eflag2);
+					SWAP(BMLoop*, looptris[i*3], looptris[i*3+1]);
+				if (looptris[i*3+1]->head.eflag2 > looptris[i*3+2]->head.eflag2);
+					SWAP(BMLoop*, looptris[i*3+1], looptris[i*3+2]);
+				if (looptris[i*3]->head.eflag2 > looptris[i*3+1]->head.eflag2);
+					SWAP(BMLoop*, looptris[i*3], looptris[i*3+1]);
+
 				i += 1;
 			}
 			BLI_end_edgefill();

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c	2009-06-18 04:39:33 UTC (rev 20967)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c	2009-06-18 07:11:55 UTC (rev 20968)
@@ -225,6 +225,9 @@
 	{{BMOP_OPSLOT_ELEMENT_BUF, "geom"},
 	{BMOP_OPSLOT_ELEMENT_BUF, "origout"},
 	{BMOP_OPSLOT_ELEMENT_BUF, "newout"},
+	/*facemap maps from source faces to dupe
+	  faces, and from dupe faces to source faces.*/
+	{BMOP_OPSLOT_MAPPING, "facemap"},
 	{BMOP_OPSLOT_MAPPING, "boundarymap"},
 	{BMOP_OPSLOT_MAPPING, "isovertmap"},
 	{0} /*null-terminating sentinel*/},

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_structure.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_structure.c	2009-06-18 04:39:33 UTC (rev 20967)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_structure.c	2009-06-18 07:11:55 UTC (rev 20968)
@@ -206,6 +206,9 @@
 	BLI_mempool_free(bm->epool, e);
 }
 void bmesh_free_poly(BMesh *bm, BMFace *f){
+	if (f == bm->act_face)
+		bm->act_face = NULL;
+
 	bm->totface--;
 	CustomData_bmesh_free_block(&bm->pdata, &f->data);
 	BLI_mempool_free(bm->flagpool, f->head.flags);

Modified: branches/bmesh/blender/source/blender/bmesh/operators/bmesh_dupeops.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/operators/bmesh_dupeops.c	2009-06-18 04:39:33 UTC (rev 20967)
+++ branches/bmesh/blender/source/blender/bmesh/operators/bmesh_dupeops.c	2009-06-18 07:11:55 UTC (rev 20968)
@@ -101,7 +101,9 @@
  *  Copy an existing face from one bmesh to another.
  *
 */
-static BMFace *copy_face(BMesh *source_mesh, BMFace *source_face, BMesh *target_mesh, BMEdge **edar, GHash *vhash, GHash *ehash)
+static BMFace *copy_face(BMOperator *op, BMesh *source_mesh,
+			 BMFace *source_face, BMesh *target_mesh, 
+			 BMEdge **edar, GHash *vhash, GHash *ehash)
 {
 	BMVert *target_vert1, *target_vert2;
 	BMLoop *source_loop, *target_loop;
@@ -121,7 +123,11 @@
 	
 	/*create new face*/
 	target_face = BM_Make_Ngon(target_mesh, target_vert1, target_vert2, edar, source_face->len, 0);	
-	
+	BMO_Insert_MapPointer(source_mesh, op, 
+	         "facemap", source_face, target_face);
+	BMO_Insert_MapPointer(source_mesh, op, 
+	         "facemap", target_face, source_face);
+
 	BM_Copy_Attributes(source_mesh, target_mesh, source_face, target_face);
 
 	/*mark the face for output*/
@@ -189,7 +195,7 @@
 					BMO_SetFlag(source, (BMHeader*)e, DUPE_DONE);
 				}
 			}
-			copy_face(source, f, target, edar, vhash, ehash);
+			copy_face(op, source, f, target, edar, vhash, ehash);
 			BMO_SetFlag(source, (BMHeader*)f, DUPE_DONE);
 		}
 	}

Modified: branches/bmesh/blender/source/blender/bmesh/operators/extrudeops.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/operators/extrudeops.c	2009-06-18 04:39:33 UTC (rev 20967)
+++ branches/bmesh/blender/source/blender/bmesh/operators/extrudeops.c	2009-06-18 07:11:55 UTC (rev 20968)
@@ -101,8 +101,11 @@
 	                         EXT_DEL, DEL_ONLYTAGGED);
 
 	BMO_CopySlot(op, &dupeop, "edgefacein", "geom");
-	
 	BMO_Exec_Op(bm, &dupeop);
+
+	if (bm->act_face && BMO_TestFlag(bm, bm->act_face, EXT_INPUT))
+		bm->act_face = BMO_Get_MapPointer(bm, &dupeop, "facemap", bm->act_face);
+
 	if (delorig) BMO_Exec_Op(bm, &delop);
 	
 	/*if not delorig, reverse loops of original faces*/
@@ -113,7 +116,7 @@
 			}
 		}
 	}
-
+	
 	BMO_CopySlot(&dupeop, op, "newout", "geomout");
 	e = BMO_IterNew(&siter, bm, &dupeop, "boundarymap");
 	for (; e; e=BMO_IterStep(&siter)) {

Modified: branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c	2009-06-18 04:39:33 UTC (rev 20967)
+++ branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c	2009-06-18 07:11:55 UTC (rev 20968)
@@ -158,6 +158,8 @@
 		return 0;
 	}
 
+	em->emcopy = BMEdit_Copy(em);
+
 	va_end(list);
 }
 
@@ -169,24 +171,17 @@
 	BMO_Finish_Op(em->bm, bmop);
 
 	if (BMO_GetError(em->bm, &errmsg, NULL)) {
-		if (report) BKE_report(op->reports, RPT_ERROR, errmsg);
-		/*BMESH_TODOwe should really undo here or something, back 
-		  out of the failed op :/*/
-		return 0;
-	}
+		BMEditMesh *emcopy = em->emcopy;
 
-	return 1;
-}
-
-/*returns 0 on error, 1 on success*/
-static int finalize_bmop(BMesh *bm, BMEditMesh *em, wmOperator *op, int report) {
-	char *errmsg;
-
-	if (BMO_GetError(bm, &errmsg, NULL)) {
 		if (report) BKE_report(op->reports, RPT_ERROR, errmsg);
-		/*BMESH_TODOwe should really undo here or something, back 
-		  out of the failed op :/*/
+
+		BMEdit_Free(em);
+		*em = *emcopy;
 		return 0;
+	} else {
+		BMEdit_Free(em->emcopy);
+		MEM_freeN(em->emcopy);
+		em->emcopy = NULL;
 	}
 
 	return 1;
@@ -207,12 +202,12 @@
 		return 0;
 	}
 
+	em->emcopy = BMEdit_Copy(em);
+
 	BMO_Exec_Op(bm, &bmop);
-	BMO_Finish_Op(bm, &bmop);
 
 	va_end(list);
-
-	return finalize_bmop(bm, em, op, 1);
+	return EDBM_FinishOp(em, &bmop, op, 1);
 }
 
 int EDBM_CallOpfSilent(BMEditMesh *em, char *fmt, ...)
@@ -228,12 +223,12 @@
 		return 0;
 	}
 
+	em->emcopy = BMEdit_Copy(em);
+
 	BMO_Exec_Op(bm, &bmop);
-	BMO_Finish_Op(bm, &bmop);
 
 	va_end(list);
-
-	return finalize_bmop(bm, em, NULL, 0);
+	return EDBM_FinishOp(em, &bmop, NULL, 0);
 }
 
 void EDBM_MakeEditBMesh(Scene *scene, Object *ob)





More information about the Bf-blender-cvs mailing list