[Bf-blender-cvs] [c2231bc4c96] temp-fracture-modifier-2.8: fixes and polishing recently implemented features

Martin Felke noreply at git.blender.org
Thu Aug 23 12:43:03 CEST 2018


Commit: c2231bc4c96f16d8ce9a9c8054616ad05f8fe54e
Author: Martin Felke
Date:   Thu Aug 23 12:42:45 2018 +0200
Branches: temp-fracture-modifier-2.8
https://developer.blender.org/rBc2231bc4c96f16d8ce9a9c8054616ad05f8fe54e

fixes and polishing recently implemented features

===================================================================

M	source/blender/blenkernel/BKE_fracture.h
M	source/blender/blenkernel/BKE_fracture_util.h
M	source/blender/blenkernel/intern/fracture.c
M	source/blender/blenkernel/intern/fracture_automerge.c
M	source/blender/blenkernel/intern/fracture_external.c
M	source/blender/blenkernel/intern/fracture_prefractured.c
M	source/blender/blenkernel/intern/fracture_util.c
M	source/blender/blenkernel/intern/pointcache.c
M	source/blender/makesrna/intern/rna_rigidbody.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_fracture.h b/source/blender/blenkernel/BKE_fracture.h
index 74e8bc04506..eec805c63c0 100644
--- a/source/blender/blenkernel/BKE_fracture.h
+++ b/source/blender/blenkernel/BKE_fracture.h
@@ -34,6 +34,7 @@
 
 #include "BLI_sys_types.h"
 #include "BKE_scene.h"
+#include "BKE_customdata.h"
 
 struct Mesh;
 
@@ -71,6 +72,15 @@ typedef struct FracPointCloud {
 } FracPointCloud;
 
 
+static const CustomDataMask CD_MASK_ISLAND =
+		CD_MASK_MDEFORMVERT |
+		CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR | CD_MASK_MDISPS |
+		CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL |
+		CD_MASK_RECAST | CD_MASK_PAINT_MASK |
+		CD_MASK_GRID_PAINT_MASK | CD_MASK_MVERT_SKIN | CD_MASK_FREESTYLE_EDGE | CD_MASK_FREESTYLE_FACE |
+		CD_MASK_CUSTOMLOOPNORMAL | CD_MASK_FACEMAP;
+
+
 void BKE_fracture_autohide_refresh(struct FractureModifierData* fmd, struct Object *ob, struct Mesh *me_assembled);
 void BKE_fracture_automerge_refresh(struct FractureModifierData* fmd, struct Mesh *me_assembled);
 
@@ -109,8 +119,6 @@ void BKE_fracture_mesh_island_remove_all(struct FractureModifierData *fmd, struc
 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);
 
-int BKE_fracture_update_visual_mesh(struct FractureModifierData *fmd, struct Object *ob, bool do_custom_data);
-
 struct RigidBodyShardCon *BKE_fracture_mesh_constraint_create(struct Scene *scene, struct FractureModifierData *fmd,
                                                      struct MeshIsland *mi1, struct MeshIsland *mi2, short con_type);
 
@@ -135,10 +143,6 @@ void BKE_fracture_mesh_island_free(struct MeshIsland *mi, struct Scene* scene);
 
 short BKE_fracture_collect_materials(struct Main* bmain, struct Object* o, struct Object* ob, int matstart, struct GHash** mat_index_map);
 
-struct Mesh *BKE_fracture_prefractured_do(struct FractureModifierData *fmd, struct Object *ob, struct Mesh *dm,
-                                          struct Mesh *orig_dm, char names [][66], int count, struct Scene* scene,
-										  struct Depsgraph *depsgraph);
-
 struct Mesh* BKE_fracture_mesh_copy(struct Mesh* source, struct Object* ob);
 struct BMesh* BKE_fracture_mesh_to_bmesh(struct Mesh* me);
 struct Mesh* BKE_fracture_bmesh_to_mesh(struct BMesh* bm);
@@ -165,5 +169,9 @@ void BKE_fracture_meshislands_pack(struct FractureModifierData *fmd, struct Obje
 
 void BKE_fracture_postprocess_meshisland(struct FractureModifierData *fmd, struct Object* ob, struct MeshIsland*mi,
                                          struct Mesh** temp_meshs, int count, struct Main* bmain, struct Scene* scene, int frame);
+void BKE_fracture_meshisland_normals_fix(struct FractureModifierData *fmd, struct MeshIsland* mi, struct Mesh* orig_me);
+
+void BKE_fracture_copy_customdata(struct CustomData* src, struct CustomData* dst, CustomDataMask mask, int src_ofs, int dst_ofs,
+                              int copyelem, int totelem);
 
 #endif /* BKE_FRACTURE_H */
diff --git a/source/blender/blenkernel/BKE_fracture_util.h b/source/blender/blenkernel/BKE_fracture_util.h
index 123f7834651..672af68da86 100644
--- a/source/blender/blenkernel/BKE_fracture_util.h
+++ b/source/blender/blenkernel/BKE_fracture_util.h
@@ -40,6 +40,7 @@ typedef struct BisectContext {
 	bool clear_outer;
 	bool use_fill;
 	bool do_fast_bisect;
+	bool use_smooth_inner;
 
 	char uv_layer[64];
 	float normal[3];
diff --git a/source/blender/blenkernel/intern/fracture.c b/source/blender/blenkernel/intern/fracture.c
index a444f32e023..b67adaf9fe4 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -96,7 +96,7 @@ 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 fracture_meshisland_custom(FractureModifierData *fmd, Object *obj, MeshIsland* mii, Main* bmain, Scene* scene, int frame);
+static void fracture_meshisland_custom(FractureModifierData *fmd, Object *obj, MeshIsland* mii, Main* bmain, Scene* scene, int frame, Depsgraph *depsgraph);
 void BKE_fracture_postprocess_meshisland(FractureModifierData *fmd, Object* ob, MeshIsland*mi, Mesh** temp_meshs, int count,
                             Main* bmain, Scene* scene, int frame);
 
@@ -420,6 +420,7 @@ static void prepare_bisect(FractureModifierData *fmd, Object* ob, BisectContext*
 	ctx->do_fast_bisect = false;
 	ctx->geometry_limitation_tree = fmd->shared->last_island_tree;
 	ctx->inner_material_index = BKE_object_material_slot_find_index(ob, fmd->inner_material) - 1;
+	ctx->use_smooth_inner = fmd->use_smooth;
 
 	/*if no inner material has been found, just pick the first one */
 	if (ctx->inner_material_index < 0)
@@ -568,86 +569,6 @@ static void process_cells(FractureModifierData* fmd, MeshIsland* mi, Main* bmain
 	}
 
 	BKE_fracture_postprocess_meshisland(fmd, ob, mi, temp_meshs, count, bmain, scene, frame);
-#if 0
-	if (fmd->split_islands)
-	{
-		int diff = 1;
-		for (i = 0; i < count+1; i++)
-		{
-			if (temp_meshs[i]) {
-				BKE_fracture_split_islands(fmd, ob, temp_meshs[i], &temp_meshs, &count_new );
-				BKE_fracture_mesh_free(temp_meshs[i]);
-				temp_meshs[i] = NULL;
-			}
-
-			diff = count_new - (count+1);
-
-			if (diff > 1) {
-				if (temp_meshs[i+diff-1]) {
-					BKE_fracture_split_islands(fmd, ob, temp_meshs[i+diff-1], &temp_meshs, &count_new );
-					BKE_fracture_mesh_free(temp_meshs[i+diff-1]);
-					temp_meshs[i+diff-1] = NULL;
-				}
-			}
-		}
-	}
-
-	mat4_to_size(size, ob->obmat);
-
-	for (i = 0; i < count_new; i++)
-	{
-		if (temp_meshs[i])
-		{
-			if (temp_meshs[i]->totvert > 0)
-			{	/* skip invalid cells, e.g. those which are eliminated by bisect */
-				float loc[3], rot[4], qrot[4], centr[3];
-				MeshIsland *result = BKE_fracture_mesh_island_create(temp_meshs[i], bmain, scene, ob, frame);
-				fracture_meshisland_add(fmd, result);
-				result->id = mi->id + j;
-
-				/* process vertexgroups, if any */
-				BKE_fracture_meshisland_vertexgroups_do(fmd, ob, result);
-				if (result->passive_weight > 0.01f) {
-					/*dont make passive, but kinematic / triggered */
-					/*so triggers can affect it */
-					result->rigidbody->flag |= RBO_FLAG_KINEMATIC;
-					result->rigidbody->flag |= RBO_FLAG_IS_TRIGGERED;
-				}
-
-				/*match transform and speed of rigidbody, for dynamic*/
-				copy_v3_v3(loc, mi->rigidbody->pos);
-				copy_qt_qt(rot, mi->rigidbody->orn);
-
-				//handle initial rot ?
-				invert_qt_qt(qrot, result->rot);
-				mul_qt_qtqt(qrot, rot, qrot);
-
-				copy_v3_v3(centr, result->centroid);
-				sub_v3_v3(centr, mi->centroid);
-				mul_qt_v3(qrot, centr);
-				add_v3_v3(centr, loc);
-
-				//init rigidbody properly ?
-				copy_v3_v3(result->rigidbody->pos, centr);
-				copy_qt_qt(result->rigidbody->orn, qrot);
-
-				copy_v3_v3(result->rigidbody->lin_vel, mi->rigidbody->lin_vel);
-				copy_v3_v3(result->rigidbody->ang_vel, mi->rigidbody->ang_vel);
-
-				//validate already here at once... dynamic somehow doesnt get updated else
-				BKE_rigidbody_shard_validate(scene->rigidbody_world, result, ob, fmd, true,
-											 true, size, frame);
-
-				result->constraint_index = result->id;
-
-				j++;
-			}
-			else {
-				BKE_fracture_mesh_free(temp_meshs[i]);
-			}
-		}
-	}
-#endif
 
 	BLI_kdtree_balance(tree);
 
@@ -961,16 +882,20 @@ void intersect_mesh_by_mesh(FractureModifierData* fmd, Object* ob, Mesh* meA, Me
 
 	if (ELEM(fmd->keep_cutter_shards, MOD_FRACTURE_KEEP_BOTH, MOD_FRACTURE_KEEP_DIFFERENCE)) {
 		boctx.operation = 2;
-		outB = BKE_fracture_mesh_boolean(meA, meB, ob, &boctx);
+		outB = BKE_fracture_mesh_boolean(meB, meA, ob, &boctx);
 	}
 
 	if (outA && (outA != meA)) {
 		(*temp_meshs)[i] = outA;
 		i++;
 	}
+	else {
+		(*temp_meshs)[i] = NULL;
+		i++;
+	}
 
-	if (outB && (outB != meB)) {
-		(*temp_meshs)[i] = outA;
+	if (outB /*&& (outB != meB)*/) {
+		(*temp_meshs)[i] = outB;
 		i++;
 	}
 }
@@ -1025,6 +950,7 @@ void BKE_fracture_postprocess_meshisland(FractureModifierData *fmd, Object* ob,
 					/*so triggers can affect it */
 					result->rigidbody->flag |= RBO_FLAG_KINEMATIC;
 					result->rigidbody->flag |= RBO_FLAG_IS_TRIGGERED;
+					//result->rigidbody->type = RBO_TYPE_PASSIVE;
 				}
 
 				/*match transform and speed of rigidbody, for dynamic*/
@@ -1053,6 +979,10 @@ void BKE_fracture_postprocess_meshisland(FractureModifierData *fmd, Object* ob,
 
 				result->constraint_index = result->id;
 
+				if (fmd->fix_normals) {
+					BKE_fracture_meshisland_normals_fix(fmd, result, mi->mesh);
+				}
+
 				j++;
 			}
 			else {
@@ -1062,13 +992,52 @@ void BKE_fracture_postprocess_meshisland(FractureModifierData *fmd, Object* ob,
 	}
 }
 
-static void fracture_meshisland_custom(FractureModifierData *fmd, Object *obj, MeshIsland* mii, Main* bmain, Scene* scene, int frame)
+static MeshIsland* fracture_cutter_process(FractureModifierData* fmd, Object *obA, Mesh* meA, Object* obB,
+                                    MeshIsland *miB, Main* bmain, Scene* scene, int frame)
 {
-	if (fmd->cutter_group != NULL && obj->type == OB_MESH)
+	MVert* mv = NULL;
+	Mesh **temp_meshs = MEM_callocN(sizeof(Mesh*) * 2, "temp_meshs");
+	Mesh* meB = miB->mesh;
+	int v = 0;
+	float imatA[4][4], imatB[4][4];
+
+	invert_m4_m4(imatA, obA->obmat);
+	invert_m4_m4(imatB, obB->obmat);
+
+	//Transforms...
+	for (mv = meA->mvert, v = 0; v < meA->totvert; v++, mv++)
 	{
-		//float imat[4][4];
-		//invert_m4_m4(imat, obj->obmat);
+		mul_m4_v3(obA->obmat, mv->co);
+		mul_m4_v3(imatB, mv->co);
+	}
+
+	intersect_mesh_by_mesh(fmd, obB, meA, meB, &temp_meshs);
+
+	if (temp_meshs[0] && !temp_meshs[1]) {
+		/* only intersects, throw away whole object */
+		//miB->endframe = frame;
+	}
 
+	//exchange difference against original mesh
+	if (temp_meshs[1]) {
+		BLI_remlink(&fmd->shared->mesh_islands, miB);
+		BKE_fracture_mesh_island_free(miB, scene);
+		miB = BKE_fracture_mesh_island_create(temp_meshs[1], bmain, scene, obB, frame);

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list