[Bf-blender-cvs] [5f25071d1bd] temp-fracture-modifier-2.8: added testwise threaded fracture via openmp
Martin Felke
noreply at git.blender.org
Wed Dec 12 15:40:34 CET 2018
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);
}
}
More information about the Bf-blender-cvs
mailing list