Commit: e63c6cd345b9bd804888fcf857a59cf2b1dde9a0 Author: Martin Felke Date: Sat Mar 11 18:52:01 2017 +0100 Branches: fracture_modifier https://developer.blender.org/rBe63c6cd345b9bd804888fcf857a59cf2b1dde9a0
fix attempt for passive fakeparenting with dynamic/external, and first version of combined cuttergroup and procedural (boolean only) fracture =================================================================== M source/blender/blenkernel/BKE_fracture.h M source/blender/blenkernel/intern/fracture.c M source/blender/blenkernel/intern/rigidbody.c M source/blender/modifiers/intern/MOD_fracture.c =================================================================== diff --git a/source/blender/blenkernel/BKE_fracture.h b/source/blender/blenkernel/BKE_fracture.h index c2ac1d17964..f2268103f1c 100644 --- a/source/blender/blenkernel/BKE_fracture.h +++ b/source/blender/blenkernel/BKE_fracture.h @@ -93,7 +93,7 @@ struct DerivedMesh *BKE_shard_create_dm(struct Shard *s, bool doCustomData); void BKE_fracture_shard_by_points(struct FracMesh *fmesh, ShardID id, struct FracPointCloud *points, int algorithm, struct Object *obj, struct DerivedMesh *dm, short inner_material_index, float mat[4][4], int num_cuts, float fractal, bool smooth, int num_levels, int mode, bool reset, int active_setting, - int num_settings, char uv_layer[], bool threaded, int solver, float thresh, bool shards_to_islands); + int num_settings, char uv_layer[], bool threaded, int solver, float thresh, bool shards_to_islands, int override_count); /* create shards from a base mesh and a set of other objects / cutter planes */ void BKE_fracture_shard_by_planes(struct FractureModifierData *fmd, struct Object *obj, short inner_material_index, float mat[4][4]); diff --git a/source/blender/blenkernel/intern/fracture.c b/source/blender/blenkernel/intern/fracture.c index a05c1d1d192..aa986e90647 100644 --- a/source/blender/blenkernel/intern/fracture.c +++ b/source/blender/blenkernel/intern/fracture.c @@ -712,7 +712,8 @@ static bool handle_boolean_bisect(FracMesh *fm, Object *obj, int expected_shards } static void do_prepare_cells(FracMesh *fm, cell *cells, int expected_shards, int algorithm, Shard *p, float (*centroid)[3], - DerivedMesh **dm_parent, BMesh** bm_parent, Shard ***tempshards, Shard ***tempresults) + DerivedMesh **dm_parent, BMesh** bm_parent, Shard ***tempshards, Shard ***tempresults, int override_count, + FractureModifierData *fmd) { int i; Shard *s = NULL; @@ -802,6 +803,8 @@ static void do_prepare_cells(FracMesh *fm, cell *cells, int expected_shards, int //BLI_lock_thread(LOCK_CUSTOM1); //skipping /deletion pass + + for (i = 0; i < expected_shards; i++) { if (fm->cancel == 1) { @@ -833,7 +836,8 @@ static void do_prepare_cells(FracMesh *fm, cell *cells, int expected_shards, int if (!t) continue; - if (true) //i < expected_shards) + + if ((override_count == -1) || ((override_count > 0) && (i < override_count+1))) { printf("Deleting shard: %d %d %d\n", i, t->shard_id, t->setting_id); BLI_remlink_safe(&fm->shard_map, t); @@ -846,6 +850,15 @@ static void do_prepare_cells(FracMesh *fm, cell *cells, int expected_shards, int } } } + + if (override_count > -1) { + printf("Deleting island shards!\n"); + while (fmd->islandShards.first) { + Shard *s = fmd->islandShards.first; + BLI_remlink_safe(&fmd->islandShards, s); + BKE_shard_free(s, false); + } + } //BLI_unlock_thread(LOCK_CUSTOM1); fm->last_expected_shards = expected_shards; @@ -859,7 +872,7 @@ static void do_prepare_cells(FracMesh *fm, cell *cells, int expected_shards, int //static ThreadMutex prep_lock = BLI_MUTEX_INITIALIZER; static void parse_cells(cell *cells, int expected_shards, ShardID parent_id, FracMesh *fm, int algorithm, Object *obj, DerivedMesh *dm, short inner_material_index, float mat[4][4], int num_cuts, float fractal, bool smooth, int num_levels, int mode, - bool reset, int active_setting, int num_settings, char uv_layer[64], bool threaded, int solver, float thresh) + bool reset, int active_setting, int num_settings, char uv_layer[64], bool threaded, int solver, float thresh, int override_count) { /*Parse voronoi raw data*/ int i = 0, j = 0, count = 0; @@ -874,6 +887,7 @@ static void parse_cells(cell *cells, int expected_shards, ShardID parent_id, Fra bool do_tree = (algorithm != MOD_FRACTURE_BISECT_FAST && algorithm != MOD_FRACTURE_BISECT_FAST_FILL && algorithm != MOD_FRACTURE_BOOLEAN_FRACTAL); + FractureModifierData *fmd = (FractureModifierData*) modifiers_findByType(obj, eModifierType_Fracture); if (p == NULL || reset) { @@ -965,7 +979,7 @@ static void parse_cells(cell *cells, int expected_shards, ShardID parent_id, Fra unit_m4(obmat); - do_prepare_cells(fm, cells, expected_shards, algorithm, p, ¢roid, &dm_parent, &bm_parent, &tempshards, &tempresults); + do_prepare_cells(fm, cells, expected_shards, algorithm, p, ¢roid, &dm_parent, &bm_parent, &tempshards, &tempresults, override_count, fmd); if (fm->last_shard_tree) { @@ -1609,6 +1623,7 @@ typedef struct FractureData { char uv_layer[64]; int solver; float thresh; + int override_count; } FractureData; @@ -1620,7 +1635,7 @@ static void compute_fracture(TaskPool *UNUSED(pool), void *taskdata, int UNUSED( if (fd->totpoints > 0) { parse_cells(fd->voro_cells, fd->totpoints, fd->id, fd->fmesh, fd->algorithm, fd->obj, fd->dm, fd->inner_material_index, fd->mat, fd->num_cuts, fd->fractal, fd->smooth, fd->num_levels,fd->mode, fd->reset, fd->active_setting, fd->num_settings, fd->uv_layer, - true, fd->solver, fd->thresh); + true, fd->solver, fd->thresh, fd->override_count); } } @@ -1628,7 +1643,7 @@ static void compute_fracture(TaskPool *UNUSED(pool), void *taskdata, int UNUSED( static FractureData segment_cells(cell *voro_cells, int startcell, int totcells, FracMesh *fmesh, ShardID id, FracPointCloud *pointcloud, int algorithm, Object *obj, DerivedMesh *dm, short inner_material_index, float mat[4][4], int num_cuts, float fractal, bool smooth, int num_levels, int mode, - bool reset, int active_setting, int num_settings, char uv_layer[64], int solver, float thresh) + bool reset, int active_setting, int num_settings, char uv_layer[64], int solver, float thresh, int override_count) { FractureData fd; fd.fmesh = fmesh; @@ -1650,6 +1665,7 @@ static FractureData segment_cells(cell *voro_cells, int startcell, int totcells, strncpy(fd.uv_layer, uv_layer, 64); fd.solver = solver; fd.thresh = thresh; + fd.override_count = override_count; //cell start pointer, only take fd.totpoints cells out fd.voro_cells = voro_cells + startcell; @@ -1660,7 +1676,7 @@ static FractureData segment_cells(cell *voro_cells, int startcell, int totcells, void BKE_fracture_shard_by_points(FracMesh *fmesh, ShardID id, FracPointCloud *pointcloud, int algorithm, Object *obj, DerivedMesh *dm, short inner_material_index, float mat[4][4], int num_cuts, float fractal, bool smooth, int num_levels, int mode, bool reset, int active_setting, int num_settings, char uv_layer[64], bool threaded, int solver, float thresh, - bool shards_to_islands) + bool shards_to_islands, int override_count) { int n_size = 8; @@ -1743,7 +1759,8 @@ void BKE_fracture_shard_by_points(FracMesh *fmesh, ShardID id, FracPointCloud *p //give each task a segment of the shards... int startcell = i * totcell; FractureData fd = segment_cells(voro_cells, startcell, totcell, fmesh, id, pointcloud, algorithm, obj, dm, inner_material_index, - mat, num_cuts, fractal,smooth, num_levels, mode, reset, active_setting, num_settings, uv_layer, solver, thresh); + mat, num_cuts, fractal,smooth, num_levels, mode, reset, active_setting, num_settings, uv_layer, + solver, thresh, override_count); fdata[i] = fd; } @@ -1754,7 +1771,8 @@ void BKE_fracture_shard_by_points(FracMesh *fmesh, ShardID id, FracPointCloud *p int startcell = remainder_start; printf("REMAINDER %d %d\n", startcell, remainder); fdata[num] = segment_cells(voro_cells, startcell, remainder, fmesh, id, pointcloud, algorithm, obj, dm, inner_material_index, - mat, num_cuts, fractal,smooth, num_levels, mode, reset, active_setting, num_settings, uv_layer, solver, thresh); + mat, num_cuts, fractal,smooth, num_levels, mode, reset, active_setting, num_settings, uv_layer, + solver, thresh, override_count); } for (i = 0; i < num+1; i++) { @@ -1768,7 +1786,7 @@ void BKE_fracture_shard_by_points(FracMesh *fmesh, ShardID id, FracPointCloud *p else { /*Evaluate result*/ parse_cells(voro_cells, pointcloud->totpoints, id, fmesh, algorithm, obj, dm, inner_material_index, mat, - num_cuts, fractal, smooth, num_levels, mode, reset, active_setting, num_settings, uv_layer, false, solver, thresh); + num_cuts, fractal, smooth, num_levels, mode, reset, active_setting, num_settings, uv_layer, false, solver, thresh, override_count); } /*Free structs in C++ area of memory */ diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c index 4e783602347..c6fbd288ddc 100644 --- a/source/blender/blenkernel/intern/rigidbody.c +++ b/source/blender/blenkernel/intern/rigidbody.c @@ -3953,11 +3953,12 @@ static bool do_update_modifier(Scene* scene, Object* ob, RigidBodyWorld *rbw, bo BKE_rigidbody_update_ob_array(rbw, false); } } - else + //else { if (rebuild || is_zero_m4(fmd->passive_parent_mat)) { copy_m4_m4(fmd->passive_parent_mat, ob->obmat); + print_m4("Passivemat: \n", fmd->passive_parent_mat); } //print_m4("Obmat: \n", ob->obmat); @@ -4392,7 +4393,7 @@ static bool do_sync_modifier(ModifierData *md, Object *ob, RigidBodyWorld *rbw, fmd = (FractureModifierData *)md; bool mode = fmd->fracture_mode == MOD_FRACTURE_EXTERNAL; - exploOK = !fmd->explo_shared || (fmd->explo_shared && fmd->frac_mesh && fmd->dm) || mode; + exploOK = !fmd->explo_shared || (fmd->explo_shared && fmd->frac_mesh && fmd->dm) || mode || fmd->is_dynamic_external; if (isModifierActive(fmd) && exploOK) { modFound = true; @@ -4418,6 +4419,13 @@ static bool do_sync_modifier(ModifierData *md, Object *ob, RigidBodyWorld *rbw, } if (ob->rigidbody_object->type == RBO_TYPE_ACTIVE @@ 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