[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [39428] branches/bmesh/blender: =bmesh: bridge edge loop tool=
Joseph Eagar
joeedh at gmail.com
Tue Aug 16 01:38:52 CEST 2011
Revision: 39428
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=39428
Author: joeedh
Date: 2011-08-15 23:38:51 +0000 (Mon, 15 Aug 2011)
Log Message:
-----------
=bmesh: bridge edge loop tool=
rough version of a new bridge tool.
ctrl-e -> bridge (two) edge loops
Modified Paths:
--------------
branches/bmesh/blender/release/scripts/startup/bl_ui/space_view3d.py
branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c
branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c
branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c
branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators_private.h
branches/bmesh/blender/source/blender/bmesh/operators/connectops.c
branches/bmesh/blender/source/blender/bmesh/operators/mesh_conv.c
branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c
branches/bmesh/blender/source/blender/editors/mesh/mesh_intern.h
branches/bmesh/blender/source/blender/editors/mesh/mesh_ops.c
Modified: branches/bmesh/blender/release/scripts/startup/bl_ui/space_view3d.py
===================================================================
--- branches/bmesh/blender/release/scripts/startup/bl_ui/space_view3d.py 2011-08-15 21:50:09 UTC (rev 39427)
+++ branches/bmesh/blender/release/scripts/startup/bl_ui/space_view3d.py 2011-08-15 23:38:51 UTC (rev 39428)
@@ -1652,7 +1652,11 @@
layout.operator("mesh.edge_rotate", text="Rotate Edge CCW").direction = 'CCW'
layout.separator()
+
+ layout.operator("mesh.bridge_edge_loops", text="Bridge Two Edge Loops")
+ layout.separator()
+
layout.operator("TRANSFORM_OT_edge_slide")
layout.operator("TRANSFORM_OT_edge_crease")
layout.operator("mesh.loop_multi_select", text="Edge Loop")
Modified: branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c 2011-08-15 21:50:09 UTC (rev 39427)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c 2011-08-15 23:38:51 UTC (rev 39428)
@@ -1886,8 +1886,10 @@
if (ld->disps)
BLI_cellalloc_free(ld->disps);
- ld->disps = BLI_cellalloc_malloc(sizeof(float)*3*side*side, "converted loop mdisps");
- memcpy(ld->disps, disps, sizeof(float)*3*side*side);
+ ld->disps = BLI_cellalloc_calloc(sizeof(float)*3*side*side, "converted loop mdisps");
+ if (fd->disps) {
+ memcpy(ld->disps, disps, sizeof(float)*3*side*side);
+ }
}
}
}
Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c 2011-08-15 21:50:09 UTC (rev 39427)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c 2011-08-15 23:38:51 UTC (rev 39428)
@@ -570,8 +570,9 @@
else if (ese->type == BM_FACE) {
ele = ftable[BM_GetIndex(ese->data)];
}
-
- BM_store_selection(bm, ele);
+
+ if (ele)
+ BM_store_selection(bm, ele);
}
BLI_array_free(etable);
Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c 2011-08-15 21:50:09 UTC (rev 39427)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c 2011-08-15 23:38:51 UTC (rev 39428)
@@ -382,6 +382,19 @@
BMOP_UNTAN_MULTIRES,
};
+/*
+
+ Bridge edge loops with faces
+*/
+static BMOpDefine def_bridge_loops= {
+ "bridge_loops",
+ {{BMOP_OPSLOT_ELEMENT_BUF, "edges"}, /*input edges*/
+ {BMOP_OPSLOT_ELEMENT_BUF, "faceout"}, /*new faces*/
+ {0, /*null-terminating sentinel*/}},
+ bmesh_bridge_loops_exec,
+ 0,
+};
+
static BMOpDefine def_edgenet_fill= {
"edgenet_fill",
{{BMOP_OPSLOT_ELEMENT_BUF, "edges"}, /*input edges*/
@@ -1072,6 +1085,7 @@
&def_bevel,
&def_beautify_fill,
&def_triangle_fill,
+ &def_bridge_loops,
};
int bmesh_total_ops = (sizeof(opdefines) / sizeof(void*));
Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators_private.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators_private.h 2011-08-15 21:50:09 UTC (rev 39427)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators_private.h 2011-08-15 23:38:51 UTC (rev 39428)
@@ -73,5 +73,6 @@
void bmesh_beautify_fill_exec(BMesh *bm, BMOperator *op);
void bmesh_triangle_fill_exec(BMesh *bm, BMOperator *op);
void bmesh_create_circle_exec(BMesh *bm, BMOperator *op);
+void bmesh_bridge_loops_exec(BMesh *bm, BMOperator *op);
#endif
Modified: branches/bmesh/blender/source/blender/bmesh/operators/connectops.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/operators/connectops.c 2011-08-15 21:50:09 UTC (rev 39427)
+++ branches/bmesh/blender/source/blender/bmesh/operators/connectops.c 2011-08-15 23:38:51 UTC (rev 39428)
@@ -14,6 +14,8 @@
#define VERT_INPUT 1
#define EDGE_OUT 1
#define FACE_NEW 2
+#define EDGE_MARK 4
+#define EDGE_DONE 8
void connectverts_exec(BMesh *bm, BMOperator *op)
{
@@ -101,3 +103,153 @@
BLI_array_free(loops);
BLI_array_free(verts);
}
+
+static BMVert *get_outer_vert(BMesh *bm, BMEdge *e)
+{
+ BMIter iter;
+ BMEdge *e2;
+ int i;
+
+ i= 0;
+ BM_ITER(e2, &iter, bm, BM_EDGES_OF_VERT, e->v1) {
+ if (BMO_TestFlag(bm, e2, EDGE_MARK))
+ i++;
+ }
+
+ if (i==2)
+ return e->v2;
+ else
+ return e->v1;
+}
+
+void bmesh_bridge_loops_exec(BMesh *bm, BMOperator *op)
+{
+ BMEdge **ee1 = NULL, **ee2 = NULL;
+ BMVert **vv1 = NULL, **vv2 = NULL;
+ BLI_array_declare(ee1);
+ BLI_array_declare(ee2);
+ BLI_array_declare(vv1);
+ BLI_array_declare(vv2);
+ BMOIter siter;
+ BMIter iter;
+ BMEdge *e;
+ int c=0, cl1=0, cl2=0;
+
+ BMO_ITER(e, &siter, bm, op, "edges", BM_EDGE) {
+ BMO_SetFlag(bm, e, EDGE_MARK);
+ }
+
+ BMO_ITER(e, &siter, bm, op, "edges", BM_EDGE) {
+ if (!BMO_TestFlag(bm, e, EDGE_DONE)) {
+ BMVert *v, *ov;
+ BMEdge *e2, *e3, *oe = e;
+ int i;
+
+ if (c > 2) {
+ printf("eek! more than two edge loops!\n");
+ break;
+ }
+
+ e2 = e;
+ v = e->v1;
+ do {
+ v = BM_OtherEdgeVert(e2, v);
+ BM_ITER(e3, &iter, bm, BM_EDGES_OF_VERT, v) {
+ if (e3 != e2 && BMO_TestFlag(bm, e3, EDGE_MARK)) {
+ break;
+ }
+ }
+ e2 = e3;
+ } while (e2 && e2 != e);
+
+ if (!e2)
+ e2 = e;
+
+ e = e2;
+ ov = v;
+ do {
+ if (c==0) {
+ BLI_array_append(ee1, e2);
+ BLI_array_append(vv1, v);
+ } else {
+ BLI_array_append(ee2, e2);
+ BLI_array_append(vv2, v);
+ }
+
+ BMO_SetFlag(bm, e2, EDGE_DONE);
+
+ v = BM_OtherEdgeVert(e2, v);
+ BM_ITER(e3, &iter, bm, BM_EDGES_OF_VERT, v) {
+ if (e3 != e2 && BMO_TestFlag(bm, e3, EDGE_MARK) && !BMO_TestFlag(bm, e3, EDGE_DONE)) {
+ break;
+ }
+ }
+ e2 = e3;
+ } while (e2 && e2 != e);
+
+ if (v && !e2) {
+ if (c==0) {
+ BLI_array_append(vv1, v);
+ } else {
+ BLI_array_append(vv2, v);
+ }
+ }
+
+ if (v == ov) {
+ if (c==0)
+ cl1 = 1;
+ else
+ cl2 = 1;
+ }
+
+ c++;
+ }
+ }
+
+ if (ee1 && ee2) {
+ int i, j;
+ BMVert *v1, *v2, *v3, *v4;
+ int starti=0, lenv1=BLI_array_count(vv1);
+
+ /*handle case of two unclosed loops*/
+ if (!cl1 && !cl2) {
+ v1 = get_outer_vert(bm, ee1[0]);
+ v2 = BLI_array_count(ee1) > 1 ? get_outer_vert(bm, ee1[1]) : v1;
+ v3 = get_outer_vert(bm, ee2[0]);
+ v4 = BLI_array_count(ee2) > 1 ? get_outer_vert(bm, ee2[1]) : v3;
+\
+ if (len_v3v3(v1->co, v3->co) > len_v3v3(v1->co, v4->co)) {
+ for (i=0; i<BLI_array_count(ee1)/2; i++) {
+ SWAP(void*, ee1[i], ee1[BLI_array_count(ee1)-i-1]);
+ SWAP(void*, vv1[i], vv1[BLI_array_count(vv1)-i-1]);
+ }
+ }
+ }
+
+ if (cl1) {
+ float min = 1e32;
+
+ for (i=0; i<BLI_array_count(vv1); i++) {
+ if (len_v3v3(vv1[i]->co, vv2[0]->co) < min) {
+ min = len_v3v3(vv1[i]->co, vv2[0]->co);
+ starti = i;
+ }
+ }
+ }
+
+ j = 0;
+ for (i=0; i<BLI_array_count(ee1); i++) {
+ BMFace *f;
+
+ if (j >= BLI_array_count(ee2))
+ break;
+
+ f = BM_Make_QuadTri(bm, vv1[(i + starti)%lenv1], vv2[i], vv2[i+1], vv1[(i+1 + starti)%lenv1], NULL, 1);
+ if (!f) {
+ printf("eek!\n");
+ }
+
+ j++;
+ }
+ }
+}
Modified: branches/bmesh/blender/source/blender/bmesh/operators/mesh_conv.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/operators/mesh_conv.c 2011-08-15 21:50:09 UTC (rev 39427)
+++ branches/bmesh/blender/source/blender/bmesh/operators/mesh_conv.c 2011-08-15 23:38:51 UTC (rev 39428)
@@ -146,7 +146,9 @@
if (me->key) {
/*set shape key original index*/
keyi = CustomData_bmesh_get(&bm->vdata, v->head.data, CD_SHAPE_KEYINDEX);
- *keyi = i;
+ if (keyi) {
+ *keyi = i;
+ }
for (block=me->key->block.first, j=0; block; block=block->next, j++) {
float *co = CustomData_bmesh_get_n(&bm->vdata, v->head.data,
@@ -799,6 +801,9 @@
mvert = me->mvert;
while(eve) {
keyi = CustomData_bmesh_get(&bm->vdata, eve->head.data, CD_SHAPE_KEYINDEX);
+ if (!keyi) {
+ break;
+ }
if (*keyi >= 0 && *keyi < currkey->totelem) { // valid old vertex
if(currkey == actkey) {
if(actkey == me->key->refkey) {
Modified: branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c 2011-08-15 21:50:09 UTC (rev 39427)
+++ branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c 2011-08-15 23:38:51 UTC (rev 39428)
@@ -4848,3 +4848,34 @@
RNA_def_boolean(ot->srna, "apply_modifiers", 0, "Apply Modifiers", "Apply Modifiers");
RNA_def_boolean(ot->srna, "relpaths", 0, "Relative Paths", "Use relative paths for textures");
}
+
+static int bridge_edge_loops(bContext *C, wmOperator *op)
+{
+ Object *obedit= CTX_data_edit_object(C);
+ BMEditMesh *em= ((Mesh *)obedit->data)->edit_btmesh;
+
+ if (!EDBM_CallOpf(em, op, "bridge_loops edges=%he", BM_SELECT))
+ return OPERATOR_CANCELLED;
+
+ DAG_id_tag_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+
+ return OPERATOR_FINISHED;
+}
+
+void MESH_OT_bridge_edge_loops(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Bridge edge loops";
+ ot->description= "Make faces between two edge loops";
+ ot->idname= "MESH_OT_bridge_edge_loops";
+
+ /* api callbacks */
+ ot->exec= bridge_edge_loops;
+ ot->poll= ED_operator_editmesh;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ RNA_def_boolean(ot->srna, "inside", 0, "Inside", "");
+}
Modified: branches/bmesh/blender/source/blender/editors/mesh/mesh_intern.h
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/mesh_intern.h 2011-08-15 21:50:09 UTC (rev 39427)
+++ branches/bmesh/blender/source/blender/editors/mesh/mesh_intern.h 2011-08-15 23:38:51 UTC (rev 39428)
@@ -316,5 +316,7 @@
void MESH_OT_knifetool(struct wmOperatorType *ot);
void MESH_OT_bevel(struct wmOperatorType *ot);
+void MESH_OT_bridge_edge_loops(struct wmOperatorType *ot);
+
#endif // MESH_INTERN_H
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list