[Bf-blender-cvs] [83144efb4dd] fracture_modifier: further automerge speed optimization attempts
Martin Felke
noreply at git.blender.org
Sun Jun 11 18:16:35 CEST 2017
Commit: 83144efb4dd5920d4462ace28af213e665feef38
Author: Martin Felke
Date: Sun Jun 11 17:48:45 2017 +0200
Branches: fracture_modifier
https://developer.blender.org/rB83144efb4dd5920d4462ace28af213e665feef38
further automerge speed optimization attempts
===================================================================
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 b97e3a9df48..90ce57a1c93 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -99,7 +99,7 @@ static void reset_automerge(FractureModifierData *fmd);
typedef struct SharedVertGroup {
struct SharedVertGroup* next, *prev;
int index;
- bool exceeded, deltas_set;
+ bool exceeded, deltas_set, moved;
float rest_co[3];
float delta[3];
ListBase verts;
@@ -108,7 +108,7 @@ typedef struct SharedVertGroup {
typedef struct SharedVert {
struct SharedVert* next, *prev;
int index;
- bool exceeded, deltas_set;
+ bool exceeded, deltas_set, moved;
float rest_co[3];
float delta[3];
} SharedVert;
@@ -3231,10 +3231,12 @@ static void reset_automerge(FractureModifierData *fmd)
for (vg = fmd->shared_verts.first; vg; vg = vg->next) {
vg->exceeded = false;
+ vg->moved = false;
for (sv = vg->verts.first; sv; sv = sv->next)
{
sv->exceeded = false;
+ sv->moved = false;
}
}
}
@@ -3268,6 +3270,7 @@ static void prepare_automerge(FractureModifierData *fmd, BMesh *bm)
SharedVert *sv;
SharedVertGroup *vg;
bool do_calc_delta = fmd->keep_distort;
+ float margin = 0.01f;
int cd_edge_crease_offset = CustomData_get_offset(&bm->edata, CD_CREASE);
if (cd_edge_crease_offset == -1) {
@@ -3320,11 +3323,18 @@ static void prepare_automerge(FractureModifierData *fmd, BMesh *bm)
for (sv = vg->verts.first; sv; sv = sv->next)
{
v2 = bm->vtable[sv->index];
+
+ if ((len_squared_v3v3(co, v2->co) > ((fmd->autohide_dist + margin) * (fmd->autohide_dist + margin))))
+ {
+ sv->moved = true;
+ }
+
if (len_squared_v3v3(co, v2->co) <= fmd->automerge_dist * fmd->automerge_dist)
{
if (!sv->exceeded)
{
copy_v3_v3(v2->co, co);
+ BM_elem_flag_enable(v2, BM_ELEM_SELECT);
}
}
else {
@@ -3341,7 +3351,12 @@ static void prepare_automerge(FractureModifierData *fmd, BMesh *bm)
if (len_squared_v3v3(co, v1->co) <= fmd->automerge_dist * fmd->automerge_dist)
{
+ if ((len_squared_v3v3(co, v1->co) > ((fmd->autohide_dist + margin) * (fmd->autohide_dist + margin))))
+ {
+ vg->moved = true;
+ }
copy_v3_v3(v1->co, co);
+ BM_elem_flag_enable(v1, BM_ELEM_SELECT);
}
else {
@@ -3367,6 +3382,45 @@ static void prepare_automerge(FractureModifierData *fmd, BMesh *bm)
}
}
+static void optimize_automerge(FractureModifierData *fmd)
+{
+ SharedVertGroup *vg = fmd->shared_verts.first, *next = NULL;
+ SharedVert* sv = NULL;
+ int removed = 0, count = 0;
+
+ while(vg) {
+ bool intact = true;
+ sv = vg->verts.first;
+ while (sv) {
+ intact = intact && !sv->moved;
+ sv = sv->next;
+ }
+
+ intact = intact && !vg->moved;
+
+ next = vg->next;
+
+ if (intact) {
+ while(vg->verts.first) {
+ sv = vg->verts.first;
+ BLI_remlink(&vg->verts, sv);
+ MEM_freeN(sv);
+ sv = NULL;
+ }
+
+
+ BLI_remlink(&fmd->shared_verts, vg);
+ MEM_freeN(vg);
+ removed++;
+ }
+
+ vg = next;
+ }
+
+ count = BLI_listbase_count(&fmd->shared_verts);
+ printf("remaining | removed groups: %d | %d\n", count, removed);
+}
+
static DerivedMesh *do_autoHide(FractureModifierData *fmd, DerivedMesh *dm, Object *ob)
{
int totpoly = dm->getNumPolys(dm);
@@ -3385,32 +3439,42 @@ static DerivedMesh *do_autoHide(FractureModifierData *fmd, DerivedMesh *dm, Obje
BM_mesh_elem_hflag_disable_all(bm, BM_FACE | BM_EDGE | BM_VERT , BM_ELEM_SELECT, false);
- if (fmd->automerge_dist > 0)
+ //if (fmd->automerge_dist > 0)
{
- //make vert groups together here, if vert is close enough
- prepare_automerge(fmd, bm);
- }
+ Scene* sc = fmd->modifier.scene;
+ RigidBodyWorld *rbw = sc ? sc->rigidbody_world : NULL;
+ PointCache *cache = rbw ? rbw->pointcache : NULL;
+ int frame = (int)BKE_scene_frame_get(sc);
- if (fmd->face_pairs)
- {
- if (fmd->autohide_dist > 0)
+ if (fmd->automerge_dist > 0)
{
- for (i = 0; i < totpoly; i++) {
- find_other_face(fmd, i, bm, ob, &faces, &del_faces);
- }
+ //make vert groups together here, if vert is close enough
+ prepare_automerge(fmd, bm);
+ }
- for (i = 0; i < del_faces; i++) {
- BMFace *f = faces[i];
- if (f->l_first->e != NULL) { /* a lame check.... */
- BMIter iter;
- BMVert *v;
- BM_ITER_ELEM(v, &iter, f, BM_VERTS_OF_FACE)
- {
- BM_elem_flag_enable(v, BM_ELEM_SELECT);
- }
+ if (cache && cache->endframe == frame)
+ {
+ optimize_automerge(fmd);
+ }
+ }
+
+ if (fmd->face_pairs && fmd->autohide_dist > 0)
+ {
+ for (i = 0; i < totpoly; i++) {
+ find_other_face(fmd, i, bm, ob, &faces, &del_faces);
+ }
- BM_elem_flag_enable(f, BM_ELEM_SELECT);
+ for (i = 0; i < del_faces; i++) {
+ BMFace *f = faces[i];
+ if (f->l_first->e != NULL) { /* a lame check.... */
+ BMIter iter;
+ BMVert *v;
+ BM_ITER_ELEM(v, &iter, f, BM_VERTS_OF_FACE)
+ {
+ BM_elem_flag_enable(v, BM_ELEM_SELECT);
}
+
+ BM_elem_flag_enable(f, BM_ELEM_SELECT);
}
}
@@ -3456,7 +3520,7 @@ static DerivedMesh *do_autoHide(FractureModifierData *fmd, DerivedMesh *dm, Obje
}
}
- if (fmd->automerge_dist > 0 && !fmd->fix_normals)
+ if (!fmd->fix_normals)
{
BM_mesh_normals_update(bm);
}
@@ -3883,12 +3947,16 @@ static DerivedMesh *output_dm(FractureModifierData* fmd, DerivedMesh *dm, Object
}
}
- if (fmd->autohide_dist > 0 || fmd->automerge_dist > 0) {
+ if (fmd->autohide_dist > 0 || fmd->automerge_dist > 0)
+ {
//printf("Autohide \n");
dm_final = do_autoHide(fmd, fmd->visible_mesh_cached, ob);
}
else {
dm_final = CDDM_copy(fmd->visible_mesh_cached);
+ if (!fmd->fix_normals) {
+ dm_final->calcNormals(dm_final);
+ }
}
return dm_final;
@@ -4034,6 +4102,7 @@ static void make_shared_vert_groups(FractureModifierData* fmd, DerivedMesh* dm)
gvert->verts.last = NULL;
gvert->exceeded = false;
gvert->deltas_set = false;
+ gvert->moved = false;
zero_v3(gvert->delta);
copy_v3_v3(gvert->rest_co, mvert[i].co);
@@ -4050,6 +4119,7 @@ static void make_shared_vert_groups(FractureModifierData* fmd, DerivedMesh* dm)
svert->index = index;
svert->exceeded = false;
svert->deltas_set = false;
+ svert->moved = false;
zero_v3(svert->delta);
copy_v3_v3(svert->rest_co, mvert[index].co);
BLI_addtail(&gvert->verts, svert);
More information about the Bf-blender-cvs
mailing list