Commit: 6249febf45432d34522867dce91b5a0ee76d16f8 Author: Martin Felke Date: Wed Feb 14 18:41:30 2018 +0100 Branches: fracture_modifier https://developer.blender.org/rB6249febf45432d34522867dce91b5a0ee76d16f8
re-implementation of external constraints =================================================================== M source/blender/makesdna/DNA_modifier_types.h M source/blender/modifiers/intern/MOD_fracture.c =================================================================== diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h index 5d8306ad26e..cd52b0757db 100644 --- a/source/blender/makesdna/DNA_modifier_types.h +++ b/source/blender/makesdna/DNA_modifier_types.h @@ -1497,9 +1497,10 @@ typedef struct MeshIsland { int linear_index; /* index in rigidbody world */ int particle_index; int constraint_index; + int object_index; int totcol; /*store number of used materials here, from the original object*/ int totdef; /*store number of used vertexgroups here, from the original object*/ - //char pad[4]; + char pad[4]; } MeshIsland; diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c index a4c0481f56a..67750157880 100644 --- a/source/blender/modifiers/intern/MOD_fracture.c +++ b/source/blender/modifiers/intern/MOD_fracture.c @@ -94,7 +94,7 @@ static void free_shared_verts(ListBase *lb); static void reset_automerge(FractureModifierData *fmd); static void do_refresh_automerge(FractureModifierData *fmd); static void free_shards(FractureModifierData *fmd); -static void do_island_index_map(FractureModifierData *fmd); +static void do_island_index_map(FractureModifierData *fmd, Object *ob); //TODO XXX Make BKE static FracMesh* copy_fracmesh(FracMesh* fm) @@ -896,7 +896,7 @@ static DerivedMesh *get_group_dm(FractureModifierData *fmd, DerivedMesh *dm, Obj GHash *mat_index_map = NULL; - if (fmd->dm_group && do_refresh) + if (fmd->dm_group && do_refresh && !fmd->use_constraint_group) { mat_index_map = BLI_ghash_int_new("mat_index_map"); if (fmd->vert_index_map != NULL) { @@ -2608,6 +2608,8 @@ static void connect_meshislands(FractureModifierData *fmd, MeshIsland *mi1, Mesh bool ok = mi1 && mi1->rigidbody; ok = ok && mi2 && mi2->rigidbody; ok = ok && fmd->use_constraints; + ok = ok && (!(fmd->dm_group && fmd->use_constraint_group) || + (fmd->dm_group && fmd->use_constraint_group && mi1->object_index != mi2->object_index)); if (ok) { /* search local constraint list instead of global one !!! saves lots of time */ @@ -2632,80 +2634,7 @@ static void connect_meshislands(FractureModifierData *fmd, MeshIsland *mi1, Mesh } if (!con_found && ok) { - - if (fmd->dm_group && fmd->use_constraint_group) { - //map back to "original" mesh islands and only create here if objects differ - int index1 = GET_INT_FROM_POINTER(BLI_ghash_lookup(fmd->vert_index_map, SET_INT_IN_POINTER(mi1->vertex_indices[0]))); - int index2 = GET_INT_FROM_POINTER(BLI_ghash_lookup(fmd->vert_index_map, SET_INT_IN_POINTER(mi2->vertex_indices[0]))); - bool error = false; - - if (index1 != index2) - { - //different index in group, different objects - Object *ob1 = NULL, *ob2 = NULL; - FractureModifierData *fmd1 = NULL, *fmd2 = NULL; - MeshIsland *mi_1 = NULL, *mi_2 = NULL; - int i = 0; - int v = 0, v1 = 0, v2 = 0; - - GroupObject *go; - DerivedMesh *dm; - - for (go = fmd->dm_group->gobject.first; go; go = go->next) - { - if (i == index1) - { - ob1 = go->ob; - v1 = v; - } - - if (i == index2) - { - ob2 = go->ob; - v2 = v; - } - - i++; - - dm = get_object_dm(go->ob); - if (!dm) { - error = true; - break; - } - - v += dm->getNumVerts(dm); - } - - if (ob1 && ob2 && !error) - { - fmd1 = (FractureModifierData*)modifiers_findByType(ob1, eModifierType_Fracture); - fmd2 = (FractureModifierData*)modifiers_findByType(ob2, eModifierType_Fracture); - - if (fmd1 && fmd2) - { - if (!fmd1->vertex_island_map) { - do_island_index_map(fmd1); - } - - if (!fmd2->vertex_island_map) { - do_island_index_map(fmd2); - } - - mi_1 = BLI_ghash_lookup(fmd1->vertex_island_map, SET_INT_IN_POINTER(mi1->vertex_indices[0] - v1)); - mi_2 = BLI_ghash_lookup(fmd2->vertex_island_map, SET_INT_IN_POINTER(mi2->vertex_indices[0] - v2)); - - if (mi_1 && mi_2) - { - BKE_meshisland_constraint_create(fmd, mi_1, mi_2, con_type, thresh); - } - } - } - } - } - else - { - BKE_meshisland_constraint_create(fmd, mi1, mi2, con_type, thresh); - } + BKE_meshisland_constraint_create(fmd, mi1, mi2, con_type, thresh); } } @@ -2713,11 +2642,11 @@ static void search_tree_based(FractureModifierData *rmd, MeshIsland *mi, MeshIsl { int r = 0, limit = 0, i = 0; KDTreeNearest *n3 = NULL; - float dist, obj_centr[3], factor; + float dist, obj_centr[3]; limit = rmd->constraint_limit; dist = rmd->contact_dist; - factor = rmd->mass_threshold_factor; + //factor = rmd->mass_threshold_factor; if ((rmd->fracture_mode == MOD_FRACTURE_DYNAMIC) && (rmd->dynamic_new_constraints != MOD_FRACTURE_ALL_DYNAMIC_CONSTRAINTS)) @@ -2742,7 +2671,13 @@ static void search_tree_based(FractureModifierData *rmd, MeshIsland *mi, MeshIsl mul_v3_m4v3(obj_centr, ob->obmat, mi->centroid); } else if (rmd->constraint_target == MOD_FRACTURE_VERTEX){ - mul_v3_m4v3(obj_centr, ob->obmat, co); + if (!(rmd->dm_group && rmd->use_constraint_group)) + { + mul_v3_m4v3(obj_centr, ob->obmat, co); + } + else { + copy_v3_v3(obj_centr, co); + } } r = BLI_kdtree_range_search(*combined_tree, obj_centr, &n3, dist); @@ -2794,16 +2729,64 @@ static void search_tree_based(FractureModifierData *rmd, MeshIsland *mi, MeshIsl n3 = NULL; } } -static int prepareConstraintSearch(FractureModifierData *rmd, MeshIsland ***mesh_islands, KDTree **combined_tree, Object *ob) +static int prepareConstraintSearch(FractureModifierData *rmd, MeshIsland ***mesh_islands, KDTree **combined_tree, Object *ob, + MVert** mverts) { MeshIsland *mi; int i = 0, ret = 0; + int islands = 0; + + if (rmd->dm_group && rmd->use_constraint_group) + { + GroupObject *go; + + for (go = rmd->dm_group->gobject.first; go; go = go->next) + { + if ( go->ob != ob) + { + FractureModifierData *fmdi = (FractureModifierData *)modifiers_findByType(go->ob, eModifierType_Fracture); + if (fmdi) { + islands += BLI_listbase_count(&fmdi->meshIslands); + } + } + } + } + else { + + islands = BLI_listbase_count(&rmd->meshIslands); + } - int islands = BLI_listbase_count(&rmd->meshIslands); *mesh_islands = MEM_reallocN(*mesh_islands, islands * sizeof(MeshIsland *)); - for (mi = rmd->meshIslands.first; mi; mi = mi->next) { - (*mesh_islands)[i] = mi; - i++; + + if (rmd->dm_group && rmd->use_constraint_group) + { + GroupObject *go; + int j = 0; + + for (go = rmd->dm_group->gobject.first; go; go = go->next) + { + if ( go->ob != ob) + { + FractureModifierData *fmdi = (FractureModifierData *)modifiers_findByType(go->ob, eModifierType_Fracture); + if (fmdi) { + for (mi = fmdi->meshIslands.first; mi; mi = mi->next) { + mi->object_index = j; + (*mesh_islands)[i] = mi; + i++; + } + } + + j++; + } + } + } + else { + + for (mi = rmd->meshIslands.first; mi; mi = mi->next) { + mi->object_index = 0; + (*mesh_islands)[i] = mi; + i++; + } } if (rmd->constraint_target == MOD_FRACTURE_CENTROID) @@ -2820,19 +2803,63 @@ static int prepareConstraintSearch(FractureModifierData *rmd, MeshIsland ***mesh } else if (rmd->constraint_target == MOD_FRACTURE_VERTEX) { - int totvert = rmd->visible_mesh_cached->getNumVerts(rmd->visible_mesh_cached); - MVert *mvert = rmd->visible_mesh_cached->getVertArray(rmd->visible_mesh_cached); + int totvert = 0; + MVert *mvert = NULL; MVert *mv; + if (rmd->dm_group && rmd->use_constraint_group) + { + GroupObject *go; + mvert = MEM_mallocN(sizeof(MVert), "mvert"); + + for (go = rmd->dm_group->gobject.first; go; go = go->next) + { + if ( go->ob != ob) + { + float imat[4][4]; + FractureModifierData *fmdi = (FractureModifierData *)modifiers_findByType(go->ob, eModifierType_Fracture); + if (fmdi) { + int v = fmdi->visible_mesh_cached->getNumVerts(fmdi->visible_mesh_cached); + int x = 0; + + //invert_m4_m4(imat, go->ob->obmat); + copy_m4_m4(imat, go->ob->obmat); + + mvert = MEM_reallocN(mvert, sizeof(MVert) * (totvert + v)); + memcpy(mvert + totvert, fmdi->visible_mesh_cached->getVertArray(fmdi->visible_mesh_cached), v * sizeof(MVert)); + + for (x = totvert; x < totvert + v; x++) + { + mul_v3_m4v3(mvert[x].co, imat, mvert[x].co); + } + + totvert += v; + } + } + } + } + else { + totvert = rmd->visible_mesh_cached->getNumVerts(rmd->visible_mesh_cached); + mvert = rmd->visible_mesh_cached->getVertArray(rmd->visible_mesh_cached); + } + *combined_tree = BLI_kdtree_new(totvert); for (i = 0, mv = mvert; i < totvert; i++, mv++) { float co[3]; - mul_v3_m4v3(co, ob->obmat, mv->co); + if (rmd->dm_group && rmd->use_constraint_group) + { + copy_v3_v3(co, mv->co); + } + else { + mul_v3_m4v3(co, ob->obmat, mv->co); + } + BLI_kdtree_insert(*combined_tree, i, co); } BLI_kdtree_balance(*combined_tree); ret = totvert; + *mverts = mvert; } return ret; @@ -2844,6 +2871,8 @@ static void create_constraints(FractureModifierData *rmd, Object *ob) MeshIsland **mesh_islands = MEM_mallocN(sizeof(MeshIsland *), "mesh_islands"); int count, i = 0; MeshIsland *mi; + MVert *mvert = NULL; + float max_mass = 0.0f; if (rmd->visible_mesh_cached && rmd->contact_dist == 0.0f) { @@ -2864,18 +2893,18 @@ static void create_constraints(FractureModifierData *rmd, Object *ob) } - count = prepareConstraintSearch(rmd, &mesh_islands, &coord_tree, ob); + count = prepareConstraintSearch(rmd, &mesh_islands, &coord_tree, ob, &mvert); for (i = 0; i < count; i++) { if (rmd->constraint_target == MOD_FRACTURE_CENTROID) { search_tree_based(rmd, mesh_islands[i], mesh_islands, &coord_tree, NULL, ob); } else if (rmd->constraint_target == MOD_FRACTURE_VERTEX) { - MVert mv; + //MVert mv; MeshIsland *mii = NULL; - rmd->visible_mesh_cached->getVert(rmd->visible_mesh_cached, i, &mv); + //rmd->visible_mesh_cached->getVert(rmd->visible_mesh_cached, i, &mv); mii = BLI_ghash_lookup(rmd->vertex_island_map, SET_INT_IN_POINTER(i)); - search_tree_based(rmd, mi @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs