[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