Commit: 5f25071d1bda2a1fa619ebae825ac1f384e1cc0e Author: Martin Felke Date: Wed Dec 12 15:40:06 2018 +0100 Branches: temp-fracture-modifier-2.8 https://developer.blender.org/rB5f25071d1bda2a1fa619ebae825ac1f384e1cc0e
added testwise threaded fracture via openmp after more testing this might be converted to task, but works ok already, and added only trivial changes to the code =================================================================== M source/blender/blenkernel/intern/fracture.c =================================================================== diff --git a/source/blender/blenkernel/intern/fracture.c b/source/blender/blenkernel/intern/fracture.c index 9a6df49bfd4..2e808268441 100644 --- a/source/blender/blenkernel/intern/fracture.c +++ b/source/blender/blenkernel/intern/fracture.c @@ -447,6 +447,9 @@ static void process_cells(FractureModifierData* fmd, Shard* mii, Object* ob, Sce Mesh* me = NULL, *mesh = mii->mesh; int count_new = count+1; float frame = BKE_scene_frame_get(scene); + bool is_dependent = (fmd->frac_algorithm == MOD_FRACTURE_BISECT_FAST || + fmd->frac_algorithm == MOD_FRACTURE_BISECT_FAST_FILL || + fmd->frac_algorithm == MOD_FRACTURE_BOOLEAN_FRACTAL); /*global preparations */ islands = MEM_callocN(sizeof(Shard*) * count, "islands"); @@ -461,7 +464,7 @@ static void process_cells(FractureModifierData* fmd, Shard* mii, Object* ob, Sce mii->aves = MEM_reallocN(mii->aves, sizeof(float) * 3 * (mii->endframe - mii->startframe + 1)); /*for each cell...*/ -//#pragma omp parallel for +#pragma omp parallel for ordered schedule(dynamic) for (i = 0; i < count; i++) { /* parse to raw meshisland*/ @@ -476,67 +479,79 @@ static void process_cells(FractureModifierData* fmd, Shard* mii, Object* ob, Sce /* meshB is for "halving" algorithms like fractal and bisectfast/bisectfastfill*/ Mesh *meshA = NULL, *meshB = NULL; - /* process according to algorithm */ - switch (fmd->frac_algorithm) { - case MOD_FRACTURE_BOOLEAN: - prepare_boolean(fmd, ob, &boctx); - meshA = BKE_fracture_mesh_boolean(mesh, mi->mesh, ob, &boctx); - break; + if (!is_dependent) + { + /* process according to algorithm */ + switch (fmd->frac_algorithm) { + case MOD_FRACTURE_BOOLEAN: + prepare_boolean(fmd, ob, &boctx); + meshA = BKE_fracture_mesh_boolean(mesh, mi->mesh, ob, &boctx); + break; + + case MOD_FRACTURE_BISECT: + prepare_bisect(fmd, ob, &bictx); + meshA = BKE_fracture_mesh_bisect(mesh, mi, &bictx); + break; + + case MOD_FRACTURE_BISECT_FILL: + prepare_bisect_fill(fmd, ob, &bictx); + meshA = BKE_fracture_mesh_bisect(mesh, mi, &bictx); + break; + } - case MOD_FRACTURE_BOOLEAN_FRACTAL: - me = get_mesh(temp_meshs, i, mesh); - if (me) { - prepare_boolean_fractal(fmd, ob, me, &boctx); - BKE_fracture_mesh_boolean_fractal(me, &meshA, &meshB, ob, &boctx); - } - break; - - case MOD_FRACTURE_BISECT: - prepare_bisect(fmd, ob, &bictx); - meshA = BKE_fracture_mesh_bisect(mesh, mi, &bictx); - break; - - case MOD_FRACTURE_BISECT_FILL: - prepare_bisect_fill(fmd, ob, &bictx); - meshA = BKE_fracture_mesh_bisect(mesh, mi, &bictx); - break; - - case MOD_FRACTURE_BISECT_FAST: - me = get_mesh(temp_meshs, i, mesh); - prepare_fast_bisect(fmd, ob, me, &bictx); - BKE_fracture_mesh_bisect_fast(me, &meshA, &meshB, &bictx); - break; - - case MOD_FRACTURE_BISECT_FAST_FILL: - me = get_mesh(temp_meshs, i, mesh); - prepare_fast_bisect_fill(fmd, ob, me, &bictx); - BKE_fracture_mesh_bisect_fast(me, &meshA, &meshB, &bictx); - break; - } + if (temp_meshs[i]) { + BKE_fracture_mesh_free(temp_meshs[i]); + temp_meshs[i] = NULL; + } - /* if successful, create processed meshisland in FM */ - if (temp_meshs[i]) { - BKE_fracture_mesh_free(temp_meshs[i]); - temp_meshs[i] = NULL; - } - if (temp_meshs[i+1]) { - BKE_fracture_mesh_free(temp_meshs[i+1]); - temp_meshs[i+1] = NULL; + if (meshA != me) { + temp_meshs[i] = meshA; + } } - if (meshA != me) { - temp_meshs[i] = meshA; - } + if (is_dependent) +#pragma omp ordered + { + switch (fmd->frac_algorithm) { + case MOD_FRACTURE_BISECT_FAST: + me = get_mesh(temp_meshs, i, mesh); + prepare_fast_bisect(fmd, ob, me, &bictx); + BKE_fracture_mesh_bisect_fast(me, &meshA, &meshB, &bictx); + break; + + case MOD_FRACTURE_BISECT_FAST_FILL: + me = get_mesh(temp_meshs, i, mesh); + prepare_fast_bisect_fill(fmd, ob, me, &bictx); + BKE_fracture_mesh_bisect_fast(me, &meshA, &meshB, &bictx); + break; + + case MOD_FRACTURE_BOOLEAN_FRACTAL: + me = get_mesh(temp_meshs, i, mesh); + if (me) { + prepare_boolean_fractal(fmd, ob, me, &boctx); + BKE_fracture_mesh_boolean_fractal(me, &meshA, &meshB, ob, &boctx); + } + break; + } - if (meshB != me) { - temp_meshs[i+1] = meshB; - } + /* if successful, create processed meshisland in FM */ + if (temp_meshs[i]) { + BKE_fracture_mesh_free(temp_meshs[i]); + temp_meshs[i] = NULL; + } + if (temp_meshs[i+1]) { + BKE_fracture_mesh_free(temp_meshs[i+1]); + temp_meshs[i+1] = NULL; + } + + if (meshA != me) { + temp_meshs[i] = meshA; + } + + if (meshB != me) { + temp_meshs[i+1] = meshB; + } - /*sort meshs by size*/ - if(fmd->frac_algorithm == MOD_FRACTURE_BISECT_FAST || - fmd->frac_algorithm == MOD_FRACTURE_BISECT_FAST_FILL || - fmd->frac_algorithm == MOD_FRACTURE_BOOLEAN_FRACTAL) - { BLI_qsort_r(temp_meshs, i+2, sizeof(Mesh *), mesh_sortsize, &i); } } _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs