Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Eagar <joeedh@gmail.com>2009-09-14 09:00:03 +0400
committerJoseph Eagar <joeedh@gmail.com>2009-09-14 09:00:03 +0400
commita11ef8030aecfe80e4718b6000ea32d2bbc062a9 (patch)
treec2331d7373adaff7bc4416198fc1d6b329d081d5
parent9f5e42ff7622b5b2dd0ef711769ecc541126efb5 (diff)
2.5 mesh cleanup: merge tools all work again
-rw-r--r--source/blender/editors/mesh/editmesh_tools.c60
-rw-r--r--source/blender/makesdna/DNA_modifier_types.h5
-rw-r--r--source/blender/windowmanager/intern/wm.c6
3 files changed, 59 insertions, 12 deletions
diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c
index 5a4397256de..9c8e8e11e86 100644
--- a/source/blender/editors/mesh/editmesh_tools.c
+++ b/source/blender/editors/mesh/editmesh_tools.c
@@ -98,8 +98,6 @@ static void waitcursor(int val) {}
static int pupmenu() {return 0;}
static int qtest() {return 0;}
#define add_numbut(a, b, c, d, e, f, g) {}
-static int snap_sel_to_curs() {return 0;}
-static int snap_to_center() {return 0;}
/* XXX */
@@ -5735,13 +5733,59 @@ int merge_firstlast(EditMesh *em, int first, int uvmerge)
return removedoublesflag(em, 1, 0, MERGELIMIT);
}
-int merge_target(EditMesh *em, int target, int uvmerge)
+void em_snap_to_center(EditMesh *em)
+{
+ EditVert *eve;
+ float cent[3] = {0.0f, 0.0f, 0.0f};
+ int i=0;
+
+ for (eve=em->verts.first; eve; eve=eve->next) {
+ if (eve->f & SELECT) {
+ VecAddf(cent, cent, eve->co);
+ i++;
+ }
+ }
+
+ if (!i)
+ return;
+
+ VecMulf(cent, 1.0f / (float)i);
+
+ for (eve=em->verts.first; eve; eve=eve->next) {
+ if (eve->f & SELECT) {
+ VECCOPY(eve->co, cent);
+ }
+ }
+}
+
+void em_snap_to_cursor(EditMesh *em, bContext *C)
+{
+ Scene *scene = CTX_data_scene(C);
+ Object *ob= CTX_data_edit_object(C);
+ View3D *v3d = CTX_wm_view3d(C);
+ EditVert *eve;
+ float co[3], *vco, invmat[4][4];
+
+ Mat4Invert(invmat, ob->obmat);
+
+ vco = give_cursor(scene, v3d);
+ VECCOPY(co, vco);
+ Mat4MulVecfl(invmat, co);
+
+ for (eve=em->verts.first; eve; eve=eve->next) {
+ if (eve->f & SELECT) {
+ VECCOPY(eve->co, co);
+ }
+ }
+}
+
+int merge_target(bContext *C, EditMesh *em, int target, int uvmerge)
{
EditVert *eve;
// XXX not working
- if(target) snap_sel_to_curs();
- else snap_to_center();
+ if(target) em_snap_to_cursor(em, C);
+ else em_snap_to_center(em);
if(uvmerge && CustomData_has_layer(&em->fdata, CD_MTFACE)){
for(eve=em->verts.first; eve; eve=eve->next) eve->f1 = 0;
@@ -5763,10 +5807,10 @@ static int merge_exec(bContext *C, wmOperator *op)
switch(RNA_enum_get(op->ptr, "type")) {
case 3:
- count = merge_target(em, 0, uvs);
+ count = merge_target(C, em, 0, uvs);
break;
case 4:
- count = merge_target(em, 1, uvs);
+ count = merge_target(C, em, 1, uvs);
break;
case 1:
count = merge_firstlast(em, 0, uvs);
@@ -5774,7 +5818,7 @@ static int merge_exec(bContext *C, wmOperator *op)
case 6:
count = merge_firstlast(em, 1, uvs);
break;
- case 2:
+ case 5:
count = collapseEdges(em);
break;
}
diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
index be7452c4ae1..d58488ce82d 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -469,8 +469,9 @@ typedef struct BooleanModifierData {
int operation, pad;
} BooleanModifierData;
-#define MOD_MDEF_INVERT_VGROUP (1<<0)
-#define MOD_MDEF_DYNAMIC_BIND (1<<1)
+#define MOD_MDEF_INVERT_VGROUP (1<<0)
+#define MOD_MDEF_DYNAMIC_BIND (1<<1)
+#define MOD_MDEF_USE_FINAL (1<<2)
typedef struct MDefInfluence {
int vertex;
diff --git a/source/blender/windowmanager/intern/wm.c b/source/blender/windowmanager/intern/wm.c
index 38cf39c2081..651394d51af 100644
--- a/source/blender/windowmanager/intern/wm.c
+++ b/source/blender/windowmanager/intern/wm.c
@@ -75,9 +75,11 @@ void WM_operator_free(wmOperator *op)
}
if(op->macro.first) {
- wmOperator *opm;
- for(opm= op->macro.first; opm; opm= opm->next)
+ wmOperator *opm, *opmnext;
+ for(opm= op->macro.first; opm; opm= opmnext) {
+ opmnext = opm->next;
WM_operator_free(opm);
+ }
}
MEM_freeN(op);