Fix for bug #5296: Mesh.update destroys vertex groups. Code wasn't
updated for customdata layers yet.
This commit is contained in:
@@ -2760,13 +2760,25 @@ static void EXPP_unlink_mesh( Mesh * me )
|
|||||||
|
|
||||||
static int unlink_existingMeshData( Mesh * mesh )
|
static int unlink_existingMeshData( Mesh * mesh )
|
||||||
{
|
{
|
||||||
|
MDeformVert *dvert= NULL;
|
||||||
|
|
||||||
EXPP_unlink_mesh( mesh );
|
EXPP_unlink_mesh( mesh );
|
||||||
|
|
||||||
|
if(mesh->dvert) {
|
||||||
|
/* we don't want to remove dvert here, check_dverts still needs it */
|
||||||
|
dvert= mesh->dvert;
|
||||||
|
CustomData_set_layer( &mesh->vdata, CD_MDEFORMVERT, NULL );
|
||||||
|
}
|
||||||
|
|
||||||
CustomData_free( &mesh->vdata, mesh->totvert );
|
CustomData_free( &mesh->vdata, mesh->totvert );
|
||||||
CustomData_free( &mesh->edata, mesh->totedge );
|
CustomData_free( &mesh->edata, mesh->totedge );
|
||||||
CustomData_free( &mesh->fdata, mesh->totface );
|
CustomData_free( &mesh->fdata, mesh->totface );
|
||||||
mesh_update_customdata_pointers( mesh );
|
mesh_update_customdata_pointers( mesh );
|
||||||
|
|
||||||
|
if(dvert)
|
||||||
|
mesh->dvert= CustomData_add_layer( &mesh->vdata, CD_MDEFORMVERT, 0,
|
||||||
|
dvert, mesh->totvert );
|
||||||
|
|
||||||
mesh->totedge = 0;
|
mesh->totedge = 0;
|
||||||
|
|
||||||
if( mesh->mat ) {
|
if( mesh->mat ) {
|
||||||
@@ -2967,25 +2979,17 @@ static void check_dverts(Mesh *me, int old_totvert)
|
|||||||
/* if vert count didn't change or there are no dverts, all is fine */
|
/* if vert count didn't change or there are no dverts, all is fine */
|
||||||
if ((totvert == old_totvert) || (!me->dvert)) return;
|
if ((totvert == old_totvert) || (!me->dvert)) return;
|
||||||
/* if all verts have been deleted, free old dverts */
|
/* if all verts have been deleted, free old dverts */
|
||||||
else if (totvert == 0) free_dverts(me->dvert, old_totvert);
|
else if (totvert == 0) {
|
||||||
/* if verts have been added, expand me->dvert */
|
CustomData_free_layer( &me->vdata, CD_MDEFORMVERT, old_totvert );
|
||||||
else if (totvert > old_totvert) {
|
me->dvert= NULL;
|
||||||
MDeformVert *mdv = me->dvert;
|
|
||||||
me->dvert = NULL;
|
|
||||||
create_dverts( &me->id );
|
|
||||||
copy_dverts(me->dvert, mdv, old_totvert);
|
|
||||||
free_dverts(mdv, old_totvert);
|
|
||||||
}
|
}
|
||||||
/* if verts have been deleted, shrink me->dvert */
|
|
||||||
else {
|
else {
|
||||||
MDeformVert *mdv = me->dvert;
|
/* verts added or removed, make new me->dvert */
|
||||||
me->dvert = NULL;
|
MDeformVert *mdv = MEM_callocN( sizeof(MDeformVert)*totvert, "mdv" );
|
||||||
create_dverts( &me->id );
|
copy_dverts( mdv, me->dvert, MIN2( old_totvert, totvert ) );
|
||||||
copy_dverts(me->dvert, mdv, totvert);
|
free_dverts( me->dvert, old_totvert );
|
||||||
free_dverts(mdv, old_totvert);
|
me->dvert= CustomData_set_layer( &me->vdata, CD_MDEFORMVERT, mdv );
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int convert_NMeshToMesh( Mesh * mesh, BPy_NMesh * nmesh)
|
static int convert_NMeshToMesh( Mesh * mesh, BPy_NMesh * nmesh)
|
||||||
|
|||||||
Reference in New Issue
Block a user