[Bf-blender-cvs] [c3c488e475a] fracture_modifier: fix for handling of uvs when packing objects into fracture modifier

Martin Felke noreply at git.blender.org
Tue Jun 13 19:27:45 CEST 2017


Commit: c3c488e475af36b1bb2cf76240ca77198d666cf2
Author: Martin Felke
Date:   Tue Jun 13 19:26:03 2017 +0200
Branches: fracture_modifier
https://developer.blender.org/rBc3c488e475af36b1bb2cf76240ca77198d666cf2

fix for handling of uvs when packing objects into fracture modifier

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

M	source/blender/blenkernel/BKE_customdata.h
M	source/blender/blenkernel/intern/customdata.c
M	source/blender/blenkernel/intern/fracture.c
M	source/blender/modifiers/intern/MOD_fracture.c

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

diff --git a/source/blender/blenkernel/BKE_customdata.h b/source/blender/blenkernel/BKE_customdata.h
index 1792406a1ed..e64cdd51392 100644
--- a/source/blender/blenkernel/BKE_customdata.h
+++ b/source/blender/blenkernel/BKE_customdata.h
@@ -225,6 +225,12 @@ void CustomData_bmesh_copy_data(const struct CustomData *source,
                                 struct CustomData *dest, void *src_block, 
                                 void **dest_block);
 
+/* need this function exposed to deal with customdata in Fracture Modifier properly */
+void CustomData_copy_data_layer(
+        const CustomData *source, CustomData *dest,
+        int src_i, int dst_i,
+        int src_index, int dst_index, int count);
+
 /* frees data in a CustomData object
  * return 1 on success, 0 on failure
  */
diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c
index 12c718a76a7..c3c5e9cb85a 100644
--- a/source/blender/blenkernel/intern/customdata.c
+++ b/source/blender/blenkernel/intern/customdata.c
@@ -2172,7 +2172,7 @@ void CustomData_copy_elements(int type, void *src_data_ofs, void *dst_data_ofs,
 		memcpy(dst_data_ofs, src_data_ofs, (size_t)count * typeInfo->size);
 }
 
-static void CustomData_copy_data_layer(
+void CustomData_copy_data_layer(
         const CustomData *source, CustomData *dest,
         int src_i, int dst_i,
         int src_index, int dst_index, int count)
diff --git a/source/blender/blenkernel/intern/fracture.c b/source/blender/blenkernel/intern/fracture.c
index d0c0a69fbbe..876405c2889 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -92,6 +92,7 @@ static void parse_cell_verts(cell c, MVert *mvert, int totvert);
 static void parse_cell_polys(cell c, MPoly *mpoly, int totpoly, int *r_totloop);
 static void parse_cell_loops(cell c, MLoop *mloop, int totloop, MPoly *mpoly, int totpoly);
 static void parse_cell_neighbors(cell c, int *neighbors, int totpoly);
+static void fracture_collect_layers(Shard *shard, DerivedMesh *result, int vertstart, int polystart, int loopstart, int edgestart);
 
 static void add_shard(FracMesh *fm, Shard *s, float mat[4][4])
 {
@@ -2001,8 +2002,11 @@ static DerivedMesh* do_create(FractureModifierData *fmd, int num_verts, int num_
 		medges = CDDM_get_edges(result);
 	}
 
+#if 0
 	if (doCustomData && shard_count > 0) {
+
 		Shard *s;
+
 		if (fmd->shards_to_islands) {
 			s = (Shard *)fmd->islandShards.first;
 		}
@@ -2010,7 +2014,7 @@ static DerivedMesh* do_create(FractureModifierData *fmd, int num_verts, int num_
 			s = (Shard *)fmd->frac_mesh->shard_map.first;
 		}
 
-		if (fmd->fracture_mode == MOD_FRACTURE_PREFRACTURED || fmd->fracture_mode == MOD_FRACTURE_DYNAMIC)
+		//if (fmd->fracture_mode == MOD_FRACTURE_PREFRACTURED || fmd->fracture_mode == MOD_FRACTURE_DYNAMIC)
 		{
 			/*keep old behavior for now for older modes */
 			CustomData_merge(&s->vertData, &result->vertData, CD_MASK_MDEFORMVERT, CD_CALLOC, num_verts);
@@ -2028,6 +2032,7 @@ static DerivedMesh* do_create(FractureModifierData *fmd, int num_verts, int num_
 			CustomData_add_layer(&result->edgeData, CD_BWEIGHT, CD_CALLOC, NULL, num_edges);
 		}
 	}
+#endif
 
 	vertstart = polystart = loopstart = edgestart = 0;
 	if (use_packed)
@@ -2051,18 +2056,6 @@ static DerivedMesh* do_create(FractureModifierData *fmd, int num_verts, int num_
 		memcpy(mverts + vertstart, shard->mvert, shard->totvert * sizeof(MVert));
 		memcpy(mpolys + polystart, shard->mpoly, shard->totpoly * sizeof(MPoly));
 
-#if 0
-		if (fmd->fracture_mode == MOD_FRACTURE_EXTERNAL)
-		{
-			for (i = 0, mv = mverts + vertstart; i < shard->totvert; i++, mv++)
-			{
-				sub_v3_v3(mv->co, shard->centroid);
-				mul_v3_v3(mv->co, shard->raw_centroid);
-				add_v3_v3(mv->co, shard->centroid);
-			}
-		}
-#endif
-
 		for (i = 0, mp = mpolys + polystart; i < shard->totpoly; ++i, ++mp) {
 			/* adjust loopstart index */
 			mp->loopstart += loopstart;
@@ -2086,7 +2079,9 @@ static DerivedMesh* do_create(FractureModifierData *fmd, int num_verts, int num_
 			}
 		}
 
+#if 0
 		if (doCustomData) {
+
 			if (shard->totvert > 1) {
 				CustomData_copy_data(&shard->vertData, &result->vertData, 0, vertstart, shard->totvert);
 			}
@@ -2099,6 +2094,11 @@ static DerivedMesh* do_create(FractureModifierData *fmd, int num_verts, int num_
 				CustomData_copy_data(&shard->polyData, &result->polyData, 0, polystart, shard->totpoly);
 			}
 		}
+#endif
+
+		if (doCustomData) {
+			fracture_collect_layers(shard, result, vertstart, polystart, loopstart, edgestart);
+		}
 
 		vertstart += shard->totvert;
 		polystart += shard->totpoly;
@@ -2223,7 +2223,7 @@ DerivedMesh *BKE_shard_create_dm(Shard *s, bool doCustomData)
 	CDDM_calc_normals_mapping(dm);
 
 	if (doCustomData) {
-		if (s->totvert > 0) {
+		/*if (s->totvert > 0) {
 			BKE_copy_customdata_layers(&dm->vertData, &s->vertData, CD_MDEFORMVERT, s->totvert);
 		}
 		if (s->totloop > 0) {
@@ -2231,7 +2231,9 @@ DerivedMesh *BKE_shard_create_dm(Shard *s, bool doCustomData)
 		}
 		if (s->totpoly > 0) {
 			BKE_copy_customdata_layers(&dm->polyData, &s->polyData, CD_MTEXPOLY, s->totpoly);
-		}
+		}*/
+
+		fracture_collect_layers(s, dm, 0, 0, 0, 0);
 	}
 
 	return dm;
@@ -2782,11 +2784,12 @@ int BKE_fracture_update_visual_mesh(FractureModifierData *fmd, Object *ob, bool
 {
 	MeshIsland *mi;
 	DerivedMesh *dm = fmd->visible_mesh_cached;
-	int vertstart = 0, totvert = 0, totpoly = 0, polystart = 0, matstart = 1, defstart = 0;
+	int vertstart = 0, totvert = 0, totpoly = 0, polystart = 0, matstart = 1, defstart = 0, loopstart = 0;
 	MVert *mv = NULL;
 	MPoly *mp = NULL, *mpoly = NULL, *ppoly = NULL, *pp = NULL, *spoly = NULL, *sp = NULL, *tpoly = NULL, *tp = NULL;
 	int i = 0, j = 0;
 	MDeformVert *dvert = NULL;
+	Mesh *me = (Mesh*)ob->data;
 
 	if (dm)
 	{
@@ -2807,6 +2810,9 @@ int BKE_fracture_update_visual_mesh(FractureModifierData *fmd, Object *ob, bool
 	mpoly = dm->getPolyArray(dm);
 	dvert = CustomData_get_layer(&dm->vertData, CD_MDEFORMVERT);
 
+	CustomData_merge(&dm->loopData, &me->ldata, CD_MASK_MLOOPUV, CD_CALLOC, dm->getNumLoops(dm));
+	CustomData_merge(&dm->polyData, &me->pdata, CD_MASK_MTEXPOLY, CD_CALLOC, dm->getNumPolys(dm));
+
 	//update existing island's vert refs, if any...should have used indexes instead :S
 	for (mi = fmd->meshIslands.first; mi; mi = mi->next)
 	{
@@ -2818,6 +2824,9 @@ int BKE_fracture_update_visual_mesh(FractureModifierData *fmd, Object *ob, bool
 		if (!s)
 			continue;
 
+		//CustomData_copy_data(&dm->loopData, &me->ldata, loopstart, loopstart, s->totloop);
+		//CustomData_copy_data(&dm->polyData, &me->pdata, polystart, polystart, s->totpoly);
+
 		inv_size[0] = 1.0f / s->impact_size[0];
 		inv_size[1] = 1.0f / s->impact_size[1];
 		inv_size[2] = 1.0f / s->impact_size[2];
@@ -2929,12 +2938,13 @@ int BKE_fracture_update_visual_mesh(FractureModifierData *fmd, Object *ob, bool
 		/* fortunately we know how many faces "belong" to this meshisland, too */
 		polystart += totpoly;
 		matstart += mi->totcol;
+		loopstart += s->totloop;
 	}
 
 	return vertstart;
 }
 
-short fracture_collect_defgrp(Object* o, Object* ob, short defstart, GHash** def_index_map)
+int fracture_collect_defgrp(Object* o, Object* ob, int defstart, GHash** def_index_map)
 {
 	bDeformGroup *vgroup, *ngroup;
 	int k = 0;
@@ -2998,14 +3008,51 @@ void pack_storage_add(FractureModifierData *fmd, Shard* s)
 	BLI_addtail(&fmd->pack_storage, t);
 }
 
+void fracture_collect_layer(CustomData* src, CustomData *dst, int totelem, int cd_type, int dst_offset, int count)
+{
+	int totlayer = CustomData_number_of_layers(src, cd_type);
+	int j;
+
+	for (j = 0; j < totlayer; j++)
+	{
+		char *name = CustomData_get_layer_name(src, cd_type, j);
+
+		//find index of named layer in dst mesh
+		int index = CustomData_get_named_layer_index(dst, cd_type, name);
+		if (index == -1)
+		{
+			//add layer if not there
+			//void *layer = CustomData_get_layer_named(src, cd_type, name);
+			CustomData_add_layer_named(dst, cd_type, CD_CALLOC, NULL, totelem, name);
+		}
+
+		index = CustomData_get_named_layer_index(dst, cd_type, name);
+		CustomData_copy_data_layer(src, dst, j, index, 0, dst_offset, count);
+	}
+}
+
+void fracture_collect_layers(Shard* s, DerivedMesh *dm, int vertstart, int polystart, int loopstart, int edgestart)
+{
+	int totloop = dm->getNumLoops(dm);
+	int totvert = dm->getNumVerts(dm);
+	int totpoly = dm->getNumPolys(dm);
+	int totedge = dm->getNumEdges(dm);
+
+	fracture_collect_layer(&s->vertData, &dm->vertData, totvert, CD_MDEFORMVERT, vertstart, s->totvert);
+	fracture_collect_layer(&s->loopData, &dm->loopData, totloop, CD_MLOOPUV, loopstart, s->totloop);
+	fracture_collect_layer(&s->polyData, &dm->polyData, totpoly, CD_MTEXPOLY, polystart, s->totpoly);
+	fracture_collect_layer(&s->edgeData, &dm->edgeData, totedge, CD_CREASE, edgestart, s->totedge);
+	fracture_collect_layer(&s->edgeData, &dm->edgeData, totedge, CD_BWEIGHT, edgestart, s->totedge);
+	//fracture_collect_layer(&s->edgeData, &dm->edgeData, totedge, CD_MEDGE, edgestart, s->totedge);
+}
+
 MeshIsland* BKE_fracture_mesh_island_add(FractureModifierData *fmd, Object* own, Object *target)
 {
 	MeshIsland *mi;
 	Shard *s;
-	int vertstart = 0, totpoly = 0, i = 0;
+	int vertstart = 0;
 	short totcol = 0, totdef = 0;
 	float loc[3], quat[4];
-	MPoly *mpoly, *mp;
 
 	if (fmd->fracture_mode != MOD_FRACTURE_EXTERNAL || own->type != OB_MESH || !own->data)
 		return NULL;
@@ -3067,6 +3114,7 @@ MeshIsland* BKE_fracture_mesh_island_add(FractureModifierData *fmd, Object* own,
 	mi->totdef = totdef;
 
 	//XXX TODO handle UVs, shapekeys and more ?
+//	fracture_collect_uv_tex(target, own);
 
 	//add shard to pack storage
 	pack_storage_add(fmd, s);
diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index a00340fa774..61b5bf1847b 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -5044,7 +5044,17 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
 	}
 	else if (fmd->fracture_mode == MOD_FRACTURE_EXTERNAL)
 	{
-		DerivedMesh *dm_final = NULL;
+		if (ob->type != OB_MESH)
+		{	//sanity check
+	

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list