Commit: e3bcc2d0d5010ea95aa40aac6b8d54f850378740 Author: Martin Felke Date: Tue Nov 27 15:35:01 2018 +0100 Branches: temp-fracture-modifier-2.8 https://developer.blender.org/rBe3bcc2d0d5010ea95aa40aac6b8d54f850378740
dynamic fracture: when using constraints, keep those of unaffected shards in place internally all constraints are removed just after bullet step, and rebuilt in modifier eval call following it, so it will be there on next bullet step. else you mess up the sim if you stop and restart it. =================================================================== M source/blender/blenkernel/BKE_fracture.h M source/blender/blenkernel/intern/fracture.c M source/blender/blenkernel/intern/fracture_automerge.c M source/blender/blenkernel/intern/fracture_constraints.c M source/blender/blenkernel/intern/fracture_dynamic.c M source/blender/blenkernel/intern/fracture_external.c M source/blender/blenkernel/intern/fracture_prefractured.c M source/blender/blenkernel/intern/fracture_rigidbody.c M source/blender/blenkernel/intern/rigidbody.c M source/blender/makesrna/intern/rna_fracture.c =================================================================== diff --git a/source/blender/blenkernel/BKE_fracture.h b/source/blender/blenkernel/BKE_fracture.h index a6e42cdb21a..38acd4abfdd 100644 --- a/source/blender/blenkernel/BKE_fracture.h +++ b/source/blender/blenkernel/BKE_fracture.h @@ -120,7 +120,7 @@ void BKE_fracture_mesh_island_remove(struct FractureModifierData *fmd, struct Sh void BKE_fracture_mesh_island_remove_all(struct FractureModifierData *fmd, struct Scene* scene); void BKE_fracture_mesh_constraint_remove(struct FractureModifierData *fmd, struct RigidBodyShardCon* con, struct Scene *scene); -void BKE_fracture_constraints_free(struct FractureModifierData *fmd, struct Scene *scene); +void BKE_fracture_constraints_free(struct FractureModifierData *fmd, struct RigidBodyWorld *rbw); struct RigidBodyShardCon *BKE_fracture_mesh_constraint_create(struct Scene *scene, struct FractureModifierData *fmd, struct Shard *mi1, struct Shard *mi2, short con_type); @@ -152,7 +152,7 @@ struct Mesh* BKE_fracture_bmesh_to_mesh(struct BMesh* bm); void BKE_update_velocity_layer(struct FractureModifierData *fmd, struct Mesh *dm); bool BKE_rigidbody_remove_modifier(struct RigidBodyWorld* rbw, struct ModifierData *md, struct Object *ob); -void BKE_fracture_external_constraints_setup(struct FractureModifierData *fmd, struct Scene *scene, struct Object *ob); +void BKE_fracture_external_constraints_setup(struct FractureModifierData *fmd, struct Scene *scene, struct Object *ob, int frame); struct Mesh* BKE_fracture_apply(struct FractureModifierData *fmd, struct Object *ob, struct Mesh *me, struct Depsgraph* depsgraph); diff --git a/source/blender/blenkernel/intern/fracture.c b/source/blender/blenkernel/intern/fracture.c index 28d7fdc90af..a707c4569b2 100644 --- a/source/blender/blenkernel/intern/fracture.c +++ b/source/blender/blenkernel/intern/fracture.c @@ -96,7 +96,7 @@ static void parse_cell_verts(cell c, MVert *mvert, int totvert); static void parse_cell_polys(cell c, MPoly *mpoly, int totpoly); static void parse_cell_loops(cell c, MLoop *mloop, MPoly *mpoly, int totpoly); static void parse_cell_neighbors(cell c, int *neighbors, int totpoly); -static void do_island_index_map(FractureModifierData *fmd, Object *obj); +static void do_island_index_map(FractureModifierData *fmd, Object *obj, int frame); static void fracture_meshisland_custom(FractureModifierData *fmd, Object *obj, Shard* mii, Scene* scene, int frame, Depsgraph *depsgraph); static void intersect_mesh_by_mesh(FractureModifierData* fmd, Object* ob, Mesh* meA, Mesh* meB, Mesh***temp_meshs); static void meshisland_inner_vertexgroup_do(FractureModifierData *fmd, Object* ob, Shard* mi); @@ -557,8 +557,11 @@ static void process_cells(FractureModifierData* fmd, Shard* mii, Object* ob, Sce int k = 0; for (k = 0; k < fmd->shared->last_islands_count; k++) { - BLI_remlink(&fmd->shared->shards, fmd->shared->last_islands[k]); - BKE_fracture_mesh_island_free(fmd->shared->last_islands[k], scene); + if (fmd->shared->last_islands[k]) + { + BLI_remlink(&fmd->shared->shards, fmd->shared->last_islands[k]); + BKE_fracture_mesh_island_free(fmd->shared->last_islands[k], scene); + } } MEM_freeN(fmd->shared->last_islands); @@ -3156,7 +3159,7 @@ void BKE_fracture_split_islands(FractureModifierData *fmd, Object* ob, Mesh *me, printf("Splitting to islands done, %g \n", PIL_check_seconds_timer() - start); } -static void do_island_index_map(FractureModifierData *fmd, Object* obj) +static void do_island_index_map(FractureModifierData *fmd, Object* obj, int frame) { Shard *mi; @@ -3177,6 +3180,11 @@ static void do_island_index_map(FractureModifierData *fmd, Object* obj) if (fmdi) { for (mi = fmdi->shared->shards.first; mi; mi = mi->next){ + + if (BKE_fracture_meshisland_check_frame(fmdi, mi, frame)) { + continue; + } + for (i = 0; i < mi->mesh->totvert; i++) { if (!BLI_ghash_haskey(fmd->shared->vertex_island_map, POINTER_FROM_INT(i + j))) @@ -3194,6 +3202,11 @@ static void do_island_index_map(FractureModifierData *fmd, Object* obj) else { int i,j = 0; for (mi = fmd->shared->shards.first; mi; mi = mi->next){ + + if (BKE_fracture_meshisland_check_frame(fmd, mi, frame)) { + continue; + } + for (i = 0; i < mi->mesh->totvert; i++) { if (!BLI_ghash_haskey(fmd->shared->vertex_island_map, POINTER_FROM_INT(i+j))) @@ -3256,7 +3269,7 @@ BMesh* BKE_fracture_mesh_to_bmesh(Mesh* me) return bm; } -void BKE_fracture_external_constraints_setup(FractureModifierData *fmd, Scene *scene, Object *ob) +void BKE_fracture_external_constraints_setup(FractureModifierData *fmd, Scene *scene, Object *ob, int frame) { if (fmd->shared->flag & (MOD_FRACTURE_REFRESH | MOD_FRACTURE_REFRESH_CONSTRAINTS)) { @@ -3280,7 +3293,7 @@ void BKE_fracture_external_constraints_setup(FractureModifierData *fmd, Scene *s pob = obj; fmdi->shared->flag |= MOD_FRACTURE_REFRESH_CONSTRAINTS; - BKE_fracture_constraints_free(fmdi, scene); + BKE_fracture_constraints_free(fmdi, scene->rigidbody_world); break; } } @@ -3290,7 +3303,7 @@ void BKE_fracture_external_constraints_setup(FractureModifierData *fmd, Scene *s FOREACH_COLLECTION_OBJECT_RECURSIVE_END; } - do_island_index_map(fmd, ob); + do_island_index_map(fmd, ob, frame); BKE_fracture_constraints_refresh(fmd, ob, scene); if (fmd->pack_group && (fmd->flag & MOD_FRACTURE_USE_GROUP_CONSTRAINTS_ONLY)) @@ -3305,7 +3318,7 @@ void BKE_fracture_external_constraints_setup(FractureModifierData *fmd, Scene *s if (pfmd && pob) { double start = PIL_check_seconds_timer(); - do_island_index_map(pfmd, pob); + do_island_index_map(pfmd, pob, frame); BKE_fracture_constraints_refresh(pfmd, pob, scene); pfmd->shared->flag &= ~MOD_FRACTURE_REFRESH_CONSTRAINTS; printf("Rebuilding external constraints done, %g\n", PIL_check_seconds_timer() - start); diff --git a/source/blender/blenkernel/intern/fracture_automerge.c b/source/blender/blenkernel/intern/fracture_automerge.c index 5aceddf4f6e..ce0b3ae8d1b 100644 --- a/source/blender/blenkernel/intern/fracture_automerge.c +++ b/source/blender/blenkernel/intern/fracture_automerge.c @@ -218,29 +218,68 @@ static void find_other_face(FractureModifierData *fmd, int i, BMesh* bm, Object* bool in_filter = false; /*filter out face pairs, if we have an autohide filter group */ - if (fmd->autohide_filter_group){ + if (fmd->autohide_filter_group) + { CollectionObject *go; - for (go = fmd->autohide_filter_group->gobject.first; go; go = go->next) { + for (go = fmd->autohide_filter_group->gobject.first; go; go = go->next) + { /*check location and scale (maximum size if nonuniform) for now */ /*if not in any filter range, delete... else keep */ Object* obj = go->ob; float f1_loc[3], f2_loc[3]; - float radius = MAX3(obj->size[0], obj->size[1], obj->size[2]); + float radius = 0.1f; //autohide_filter_dist + //MAX3(obj->size[0], obj->size[1], obj->size[2]); /* TODO XXX watch out if go->ob is parented to ob (Transformation error ?) */ mul_v3_m4v3(f1_loc, ob->obmat, f_centr); mul_v3_m4v3(f2_loc, ob->obmat, f_centr_other); radius = radius * radius; - if ((len_squared_v3v3(f1_loc, obj->loc) < radius) && - (len_squared_v3v3(f2_loc, obj->loc) < radius)) + if (obj->type == OB_MESH) { - in_filter = true; - break; + /* use geometry of meshes */ + MVert* mvert = NULL, *mv = NULL; + Mesh *dm = obj->runtime.mesh_eval; + int totvert, v; + + if (!dm) { + dm = obj->data; + } + + mvert = dm->mvert; + totvert = dm->totvert; + + for (v = 0, mv = mvert; v < totvert; v++, mv++) + { + float loc[3]; + mul_v3_m4v3(loc, obj->obmat, mv->co); + + if ((len_squared_v3v3(f1_loc, loc) < radius) && + (len_squared_v3v3(f2_loc, loc) < radius)) + { + in_filter = true; + break; + } + else + { + in_filter = false; + } + } + if (in_filter) { + break; + } } - else - { - in_filter = false; + else { + if ((len_squared_v3v3(f1_loc, obj->loc) < radius) && + (len_squared_v3v3(f2_loc, obj->loc) < radius)) + { + in_filter = true; + break; + } + else + { + in_filter = false; + } } } } diff --git a/source/blender/blenkernel/intern/fracture_constraints.c b/source/blender/blenkernel/intern/fracture_constraints.c index 13976a6001a..8c56c36fd1e 100644 --- a/source/blender/blenkernel/intern/fracture_constraints.c +++ b/source/blender/blenkernel/intern/fracture_constraints.c @@ -329,29 +329,27 @@ static void search_tree_based(FractureModifierData *rmd, Shard *mi, Shard **mesh if ((mi != mi2) && (mi2 != NULL)) { float thresh = rmd->breaking_threshold; int con_type = rmd->constraint_type; + int startframe = 1; if ((i >= limit) && (limit > 0)) { break; } - if (rmd->flag & MOD_FRACTURE_USE_GROUP_CONSTRAINTS_ONLY) - { - int startframe = 1; - if (scene->rigidbody_world) { - startframe = scene->rigidbody_world->shared->pointcache->startframe; - } - if (rmd->dynamic_new_constraints == MOD_FRACTURE_MIXED_DYNAMIC_CONSTRAINTS) { - //only build between old and new (old = mi startframe == pointcache startframe) - if (mi->startframe > startframe && mi2->startframe > startframe) { - continue; - } + if (scene->rigidbody_world) { + startframe = scene->rigidbody_world->shared->pointcache->startframe; + } + + if (rmd->dynamic_new_constraints == MOD_FRACTURE_MIXED_DYNAMIC_CONSTRAINTS) { + //only build between old and new (old = mi startframe == pointcache startframe) + if (mi->startframe > startframe && mi2->startframe > startframe) { + continue; } + } - if (rmd->dynamic_new_constraints == MOD_FRACTURE_NO_DYNAMIC_CONSTRAINTS) - { //only build between old - if (mi->startframe > startframe || mi2->startframe > startframe) { - continue; - } + if (rmd->dynamic_new_constraints == MOD_FRACTURE_NO_DYNAMIC_CONSTRAINTS) + { //only build between old + if ( @@ 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