diff options
author | Campbell Barton <ideasman42@gmail.com> | 2018-03-06 01:57:41 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2018-03-06 01:57:41 +0300 |
commit | d9d3ed16a8c61bb1c780d81a2cf398be92cd16c1 (patch) | |
tree | 90d340013de712b868905d8d751977a8fe76e7de /source/blender/modifiers | |
parent | df267bd4c48a3b73ad959951419161ae8f9ed126 (diff) |
Fix T53206: Array modifier doesn't merge vgroups
Vertex group remapping utility function,
now shared between object join and array modifier cap-ends.
Weights which don't exist are removed.
D3092 by @Foaly
Diffstat (limited to 'source/blender/modifiers')
-rw-r--r-- | source/blender/modifiers/intern/MOD_array.c | 32 |
1 files changed, 29 insertions, 3 deletions
diff --git a/source/blender/modifiers/intern/MOD_array.c b/source/blender/modifiers/intern/MOD_array.c index 053957d89e2..b781c47ac56 100644 --- a/source/blender/modifiers/intern/MOD_array.c +++ b/source/blender/modifiers/intern/MOD_array.c @@ -51,6 +51,7 @@ #include "BKE_library_query.h" #include "BKE_modifier.h" #include "BKE_mesh.h" +#include "BKE_object_deform.h" #include "MOD_util.h" @@ -312,7 +313,7 @@ static void dm_mvert_map_doubles( static void dm_merge_transform( DerivedMesh *result, DerivedMesh *cap_dm, float cap_offset[4][4], unsigned int cap_verts_index, unsigned int cap_edges_index, int cap_loops_index, int cap_polys_index, - int cap_nverts, int cap_nedges, int cap_nloops, int cap_npolys) + int cap_nverts, int cap_nedges, int cap_nloops, int cap_npolys, int *remap, int remap_len) { int *index_orig; int i; @@ -320,6 +321,7 @@ static void dm_merge_transform( MEdge *me; MLoop *ml; MPoly *mp; + MDeformVert *dvert; /* needed for subsurf so arrays are allocated */ cap_dm->getVertArray(cap_dm); @@ -340,6 +342,12 @@ static void dm_merge_transform( mv->flag = mv->bweight = 0; } + /* remap the vertex groups if necessary */ + dvert = DM_get_vert_data(result, cap_verts_index, CD_MDEFORMVERT); + if (dvert != NULL) { + BKE_object_defgroup_index_map_apply(dvert, cap_nverts, remap, remap_len); + } + /* adjust cap edge vertex indices */ me = CDDM_get_edges(result) + cap_edges_index; for (i = 0; i < cap_nedges; i++, me++) { @@ -417,6 +425,11 @@ static DerivedMesh *arrayModifier_doArray( DerivedMesh *result, *start_cap_dm = NULL, *end_cap_dm = NULL; + int *vgroup_start_cap_remap = NULL; + int vgroup_start_cap_remap_len = 0; + int *vgroup_end_cap_remap = NULL; + int vgroup_end_cap_remap_len = 0; + chunk_nverts = dm->getNumVerts(dm); chunk_nedges = dm->getNumEdges(dm); chunk_nloops = dm->getNumLoops(dm); @@ -425,6 +438,8 @@ static DerivedMesh *arrayModifier_doArray( count = amd->count; if (amd->start_cap && amd->start_cap != ob && amd->start_cap->type == OB_MESH) { + vgroup_start_cap_remap = BKE_object_defgroup_index_map_create(amd->start_cap, ob, &vgroup_start_cap_remap_len); + start_cap_dm = get_dm_for_modifier(amd->start_cap, flag); if (start_cap_dm) { start_cap_nverts = start_cap_dm->getNumVerts(start_cap_dm); @@ -434,6 +449,8 @@ static DerivedMesh *arrayModifier_doArray( } } if (amd->end_cap && amd->end_cap != ob && amd->end_cap->type == OB_MESH) { + vgroup_end_cap_remap = BKE_object_defgroup_index_map_create(amd->end_cap, ob, &vgroup_end_cap_remap_len); + end_cap_dm = get_dm_for_modifier(amd->end_cap, flag); if (end_cap_dm) { end_cap_nverts = end_cap_dm->getNumVerts(end_cap_dm); @@ -696,7 +713,8 @@ static DerivedMesh *arrayModifier_doArray( result_nedges - start_cap_nedges - end_cap_nedges, result_nloops - start_cap_nloops - end_cap_nloops, result_npolys - start_cap_npolys - end_cap_npolys, - start_cap_nverts, start_cap_nedges, start_cap_nloops, start_cap_npolys); + start_cap_nverts, start_cap_nedges, start_cap_nloops, start_cap_npolys, + vgroup_start_cap_remap, vgroup_start_cap_remap_len); /* Identify doubles with first chunk */ if (use_merge) { dm_mvert_map_doubles( @@ -720,7 +738,8 @@ static DerivedMesh *arrayModifier_doArray( result_nedges - end_cap_nedges, result_nloops - end_cap_nloops, result_npolys - end_cap_npolys, - end_cap_nverts, end_cap_nedges, end_cap_nloops, end_cap_npolys); + end_cap_nverts, end_cap_nedges, end_cap_nloops, end_cap_npolys, + vgroup_end_cap_remap, vgroup_end_cap_remap_len); /* Identify doubles with last chunk */ if (use_merge) { dm_mvert_map_doubles( @@ -768,6 +787,13 @@ static DerivedMesh *arrayModifier_doArray( result->dirty |= DM_DIRTY_NORMALS; } + if (vgroup_start_cap_remap) { + MEM_freeN(vgroup_start_cap_remap); + } + if (vgroup_end_cap_remap) { + MEM_freeN(vgroup_end_cap_remap); + } + return result; } |