[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