[Bf-blender-cvs] [1941be005d0] fracture_modifier: more tweaks for automerge
Martin Felke
noreply at git.blender.org
Mon Jun 12 11:29:54 CEST 2017
Commit: 1941be005d0fa57f8c33efba395d10a935acf6d9
Author: Martin Felke
Date: Mon Jun 12 11:29:27 2017 +0200
Branches: fracture_modifier
https://developer.blender.org/rB1941be005d0fa57f8c33efba395d10a935acf6d9
more tweaks for automerge
===================================================================
M source/blender/modifiers/intern/MOD_fracture.c
===================================================================
diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index b6fceee35db..17585ce9fb4 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -3139,6 +3139,11 @@ static void make_face_pairs(FractureModifierData *fmd, DerivedMesh *dm, Object *
}
}
+ if (faces == 0 || pairs == 0) {
+ BLI_ghash_free(fmd->face_pairs, NULL, NULL);
+ fmd->face_pairs = NULL;
+ }
+
printf("faces, pairs: %d %d\n", faces, pairs);
BLI_kdtree_free(tree);
}
@@ -3233,11 +3238,15 @@ static void reset_automerge(FractureModifierData *fmd)
for (vg = fmd->shared_verts.first; vg; vg = vg->next) {
vg->exceeded = false;
vg->moved = false;
+ zero_v3(vg->delta);
+ vg->deltas_set = false;
for (sv = vg->verts.first; sv; sv = sv->next)
{
sv->exceeded = false;
sv->moved = false;
+ zero_v3(sv->delta);
+ sv->deltas_set = false;
}
}
}
@@ -3283,11 +3292,12 @@ static void prepare_automerge(FractureModifierData *fmd, BMesh *bm)
BMVert* v1, *v2;
BMIter iter;
BMEdge *e;
- float co[3];
+ float co[3], no[3], inverse;
int verts = 0;
v1 = bm->vtable[vg->index];
copy_v3_v3(co, v1->co);
+ copy_v3_v3(no, v1->no);
verts = 1;
for (sv = vg->verts.first; sv; sv = sv->next)
@@ -3297,6 +3307,7 @@ static void prepare_automerge(FractureModifierData *fmd, BMesh *bm)
if (!sv->exceeded) {
add_v3_v3(co, v2->co);
+ add_v3_v3(no, v2->no);
verts++;
}
else
@@ -3307,7 +3318,7 @@ static void prepare_automerge(FractureModifierData *fmd, BMesh *bm)
}
}
- if (vg->exceeded)
+ if (sv->exceeded)
{
BM_ITER_ELEM(e, &iter2, v2, BM_EDGES_OF_VERT)
{
@@ -3316,10 +3327,12 @@ static void prepare_automerge(FractureModifierData *fmd, BMesh *bm)
}
}
- mul_v3_fl(co, 1.0f/(float)verts);
+ inverse = 1.0f/(float)verts;
+ mul_v3_fl(co, inverse);
+ mul_v3_fl(no, inverse);
verts = 0;
- if (!vg->exceeded)
+ //if (!vg->exceeded)
{
for (sv = vg->verts.first; sv; sv = sv->next)
{
@@ -3335,12 +3348,11 @@ static void prepare_automerge(FractureModifierData *fmd, BMesh *bm)
if (!sv->exceeded)
{
copy_v3_v3(v2->co, co);
- BM_elem_flag_enable(v2, BM_ELEM_SELECT);
+ copy_v3_v3(v2->no, no);
}
}
else {
sv->exceeded = true;
- vg->exceeded = true;
if (!sv->deltas_set){
sub_v3_v3v3(sv->delta, co, v2->co);
@@ -3350,15 +3362,17 @@ static void prepare_automerge(FractureModifierData *fmd, BMesh *bm)
}
}
+ if ((len_squared_v3v3(co, v1->co) > (dist * dist)))
+ {
+ vg->moved = true;
+ }
+
if (len_squared_v3v3(co, v1->co) <= fmd->automerge_dist * fmd->automerge_dist)
{
- if ((len_squared_v3v3(co, v1->co) > (dist * dist)))
- {
- vg->moved = true;
+ if (!vg->exceeded) {
+ copy_v3_v3(v1->co, co);
+ copy_v3_v3(v1->no, no);
}
-
- copy_v3_v3(v1->co, co);
- BM_elem_flag_enable(v1, BM_ELEM_SELECT);
}
else {
@@ -3369,7 +3383,8 @@ static void prepare_automerge(FractureModifierData *fmd, BMesh *bm)
}
}
}
- else
+
+ if (vg->exceeded)
{
if (do_calc_delta && vg->deltas_set)
{
@@ -3439,7 +3454,7 @@ static DerivedMesh *do_autoHide(FractureModifierData *fmd, DerivedMesh *dm, Obje
BM_mesh_elem_table_ensure(bm, BM_FACE | BM_VERT);
BM_mesh_elem_toolflags_ensure(bm);
- BM_mesh_elem_hflag_disable_all(bm, BM_FACE | BM_EDGE | BM_VERT , BM_ELEM_SELECT, false);
+ //BM_mesh_elem_hflag_disable_all(bm, BM_FACE | BM_EDGE | BM_VERT , BM_ELEM_SELECT, false);
//if (fmd->automerge_dist > 0)
{
@@ -3463,6 +3478,8 @@ static DerivedMesh *do_autoHide(FractureModifierData *fmd, DerivedMesh *dm, Obje
if (fmd->face_pairs && fmd->autohide_dist > 0)
{
+ BM_mesh_elem_hflag_disable_all(bm, BM_FACE | BM_EDGE | BM_VERT , BM_ELEM_SELECT, false);
+
for (i = 0; i < totpoly; i++) {
find_other_face(fmd, i, bm, ob, &faces, &del_faces);
}
@@ -3485,11 +3502,11 @@ static DerivedMesh *do_autoHide(FractureModifierData *fmd, DerivedMesh *dm, Obje
{
BMO_op_callf(bm, (BMO_FLAG_DEFAULTS & ~BMO_FLAG_RESPECT_HIDE), "delete_keep_normals geom=%hf context=%i", BM_ELEM_SELECT, DEL_FACES);
}
+ }
- if (del_faces == 0) {
- /*fallback if you want to merge verts but use no filling method, whose faces could be hidden (and you dont have any selection then) */
- BM_mesh_elem_hflag_enable_all(bm, BM_FACE | BM_EDGE | BM_VERT , BM_ELEM_SELECT, false);
- }
+ if (del_faces == 0) {
+ /*fallback if you want to merge verts but use no filling method, whose faces could be hidden (and you dont have any selection then) */
+ BM_mesh_elem_hflag_enable_all(bm, BM_FACE | BM_EDGE | BM_VERT , BM_ELEM_SELECT, false);
}
if (fmd->automerge_dist > 0 && do_merge) {
More information about the Bf-blender-cvs
mailing list