[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