[Bf-blender-cvs] [077fa1c] mesh-transfer-data: Fix stupid crash.
Bastien Montagne
noreply at git.blender.org
Mon Nov 17 21:33:41 CET 2014
Commit: 077fa1cab4fccc51a8d3752ae7f78969c1dee07b
Author: Bastien Montagne
Date: Mon Nov 17 21:32:35 2014 +0100
Branches: mesh-transfer-data
https://developer.blender.org/rB077fa1cab4fccc51a8d3752ae7f78969c1dee07b
Fix stupid crash.
Since we now use `CustomData_duplicate_referenced_layer()` when transfering to a DM (modifier case),
we cannot anymore pass '0' as dest number of elements to say 'do not create missing layers'!
===================================================================
M source/blender/blenkernel/intern/data_transfer_intern.h
M source/blender/blenkernel/intern/deform.c
M source/blender/blenkernel/intern/object_data_transfer.c
===================================================================
diff --git a/source/blender/blenkernel/intern/data_transfer_intern.h b/source/blender/blenkernel/intern/data_transfer_intern.h
index 20cda32..54e5e16 100644
--- a/source/blender/blenkernel/intern/data_transfer_intern.h
+++ b/source/blender/blenkernel/intern/data_transfer_intern.h
@@ -53,7 +53,7 @@ void data_transfer_layersmapping_add_item(
bool data_transfer_layersmapping_vgroups(
struct ListBase *r_map, const int mix_mode, const float mix_factor,
- const float *mix_weights, const int num_create,
+ const float *mix_weights, const int num_elem_dst, const bool use_create,
struct Object *ob_src, struct Object *ob_dst, struct CustomData *cd_src, struct CustomData *cd_dst,
const bool dup_dst, const int fromlayers, const int tolayers);
diff --git a/source/blender/blenkernel/intern/deform.c b/source/blender/blenkernel/intern/deform.c
index 42b287e..a49f60d 100644
--- a/source/blender/blenkernel/intern/deform.c
+++ b/source/blender/blenkernel/intern/deform.c
@@ -1111,7 +1111,8 @@ static void vgroups_datatransfer_interp(const CustomDataTransferLayerMap *laymap
}
static bool data_transfer_layersmapping_vgroups_multisrc_to_dst(
- ListBase *r_map, const int mix_mode, const float mix_factor, const float *mix_weights, const int num_create,
+ ListBase *r_map, const int mix_mode, const float mix_factor, const float *mix_weights,
+ const int num_elem_dst, const bool use_create,
Object *ob_src, Object *ob_dst, MDeformVert *data_src, MDeformVert *data_dst, const bool UNUSED(dup_dst),
const int tolayers, bool *use_layers_src, const int num_layers_src)
{
@@ -1130,7 +1131,7 @@ static bool data_transfer_layersmapping_vgroups_multisrc_to_dst(
idx_src++;
if (idx_dst < idx_src) {
- if (!num_create) {
+ if (!use_create) {
return false;
}
/* Create as much vgroups as necessary! */
@@ -1157,7 +1158,7 @@ static bool data_transfer_layersmapping_vgroups_multisrc_to_dst(
}
if ((idx_dst = defgroup_name_index(ob_dst, dg_src->name)) == -1) {
- if (!num_create) {
+ if (!use_create) {
BLI_freelistN(r_map);
return false;
}
@@ -1180,8 +1181,8 @@ static bool data_transfer_layersmapping_vgroups_multisrc_to_dst(
bool data_transfer_layersmapping_vgroups(
ListBase *r_map, const int mix_mode, const float mix_factor, const float *mix_weights,
- const int num_create, Object *ob_src, Object *ob_dst, CustomData *cd_src, CustomData *cd_dst,
- const bool dup_dst, const int fromlayers, const int tolayers)
+ const int num_elem_dst, const bool use_create, Object *ob_src, Object *ob_dst,
+ CustomData *cd_src, CustomData *cd_dst, const bool dup_dst, const int fromlayers, const int tolayers)
{
int idx_src, idx_dst;
MDeformVert *data_src, *data_dst = NULL;
@@ -1193,21 +1194,14 @@ bool data_transfer_layersmapping_vgroups(
}
if (!CustomData_has_layer(cd_dst, CD_MDEFORMVERT)) {
- if (!num_create) {
- return false;
- }
- if (dup_dst) {
- data_dst = CustomData_add_layer(cd_dst, CD_MDEFORMVERT, CD_CALLOC, NULL, num_create);
- }
- else {
- Mesh *me = ob_dst->data;
- data_dst = me->dvert = CustomData_add_layer(&me->vdata, CD_MDEFORMVERT, CD_CALLOC, NULL, me->totvert);
- }
+ /* Note: with vgroups, datalayer is a mere container, we can create it */
+ /* TODO: do not create when not needed (i.e. !use_create and no already existing vgroup), will be done in ongoing refactor. */
+ data_dst = CustomData_add_layer(cd_dst, CD_MDEFORMVERT, CD_CALLOC, NULL, num_elem_dst);
}
else {
/* If dest is a derivedmesh, we do not want to overwrite cdlayers of org mesh! */
if (dup_dst) {
- data_dst = CustomData_duplicate_referenced_layer(cd_dst, CD_MDEFORMVERT, num_create);
+ data_dst = CustomData_duplicate_referenced_layer(cd_dst, CD_MDEFORMVERT, num_elem_dst);
}
else {
data_dst = CustomData_get_layer(cd_dst, CD_MDEFORMVERT);
@@ -1236,7 +1230,7 @@ bool data_transfer_layersmapping_vgroups(
else if (tolayers == DT_LAYERS_ACTIVE_DST) {
if ((idx_dst = ob_dst->actdef - 1) == -1) {
bDeformGroup *dg_src;
- if (!num_create) {
+ if (!use_create) {
return false;
}
dg_src = BLI_findlink(&ob_src->defbase, idx_src);
@@ -1249,7 +1243,7 @@ bool data_transfer_layersmapping_vgroups(
int num = BLI_listbase_count(&ob_src->defbase);
idx_dst = idx_src;
if (num <= idx_dst) {
- if (!num_create) {
+ if (!use_create) {
return false;
}
/* Create as much vgroups as necessary! */
@@ -1262,7 +1256,7 @@ bool data_transfer_layersmapping_vgroups(
else if (tolayers == DT_LAYERS_NAME_DST) {
bDeformGroup *dg_src = BLI_findlink(&ob_src->defbase, idx_src);
if ((idx_dst = defgroup_name_index(ob_dst, dg_src->name)) == -1) {
- if (!num_create) {
+ if (!use_create) {
return false;
}
BKE_defgroup_new(ob_dst, dg_src->name);
@@ -1299,9 +1293,9 @@ bool data_transfer_layersmapping_vgroups(
}
if (use_layers_src) {
- ret = data_transfer_layersmapping_vgroups_multisrc_to_dst(r_map, mix_mode, mix_factor, mix_weights, num_create,
- ob_src, ob_dst, data_src, data_dst, dup_dst,
- tolayers, use_layers_src, num_src);
+ ret = data_transfer_layersmapping_vgroups_multisrc_to_dst(
+ r_map, mix_mode, mix_factor, mix_weights, num_elem_dst, use_create,
+ ob_src, ob_dst, data_src, data_dst, dup_dst,tolayers, use_layers_src, num_src);
}
MEM_SAFE_FREE(use_layers_src);
diff --git a/source/blender/blenkernel/intern/object_data_transfer.c b/source/blender/blenkernel/intern/object_data_transfer.c
index e0d3028..b7c630f 100644
--- a/source/blender/blenkernel/intern/object_data_transfer.c
+++ b/source/blender/blenkernel/intern/object_data_transfer.c
@@ -352,7 +352,7 @@ static void data_transfer_layersmapping_add_item_cd(
static bool data_transfer_layersmapping_cdlayers_multisrc_to_dst(
ListBase *r_map, const int cddata_type, const int mix_mode, const float mix_factor, const float *mix_weights,
- const int num_create, CustomData *cd_src, CustomData *cd_dst, const bool dup_dst,
+ const int num_elem_dst, const bool use_create, CustomData *cd_src, CustomData *cd_dst, const bool dup_dst,
const int tolayers, bool *use_layers_src, const int num_layers_src)
{
void *data_src, *data_dst = NULL;
@@ -369,12 +369,12 @@ static bool data_transfer_layersmapping_cdlayers_multisrc_to_dst(
idx_src++;
if (idx_dst < idx_src) {
- if (!num_create) {
+ if (!use_create) {
return false;
}
/* Create as much data layers as necessary! */
for (; idx_dst < idx_src; idx_dst++) {
- CustomData_add_layer(cd_dst, cddata_type, CD_CALLOC, NULL, num_create);
+ CustomData_add_layer(cd_dst, cddata_type, CD_CALLOC, NULL, num_elem_dst);
}
}
while (idx_src--) {
@@ -383,7 +383,7 @@ static bool data_transfer_layersmapping_cdlayers_multisrc_to_dst(
}
data_src = CustomData_get_layer_n(cd_src, cddata_type, idx_src);
/* If dest is a derivedmesh, we do not want to overwrite cdlayers of org mesh! */
- data_dst = dup_dst ? CustomData_duplicate_referenced_layer_n(cd_dst, cddata_type, idx_src, num_create) :
+ data_dst = dup_dst ? CustomData_duplicate_referenced_layer_n(cd_dst, cddata_type, idx_src, num_elem_dst) :
CustomData_get_layer_n(cd_dst, cddata_type, idx_src);
data_transfer_layersmapping_add_item_cd(r_map, cddata_type, mix_mode, mix_factor, mix_weights, data_src, data_dst);
}
@@ -401,15 +401,15 @@ static bool data_transfer_layersmapping_cdlayers_multisrc_to_dst(
data_src = CustomData_get_layer_n(cd_src, cddata_type, idx_src);
if ((idx_dst = CustomData_get_named_layer(cd_dst, cddata_type, name)) == -1) {
- if (!num_create) {
+ if (!use_create) {
BLI_freelistN(r_map);
return false;
}
- CustomData_add_layer_named(cd_dst, cddata_type, CD_CALLOC, NULL, num_create, name);
+ CustomData_add_layer_named(cd_dst, cddata_type, CD_CALLOC, NULL, num_elem_dst, name);
idx_dst = CustomData_get_named_layer(cd_dst, cddata_type, name);
}
/* If dest is a derivedmesh, we do not want to overwrite cdlayers of org mesh! */
- data_dst = dup_dst ? CustomData_duplicate_referenced_layer_n(cd_dst, cddata_type, idx_dst, num_create) :
+ data_dst = dup_dst ? CustomData_duplicate_referenced_layer_n(cd_dst, cddata_type, idx_dst, num_elem_dst) :
CustomData_get_layer_n(cd_dst, cddata_type, idx_dst);
data_transfer_layersmapping_add_item_cd(r_map, cddata_type, mix_mode, mix_factor, mix_weights, data_src, data_dst);
}
@@ -423,7 +423,7 @@ static bool data_transfer_layersmapping_cdlayers_multisrc_to_dst(
static bool data_transfer_layersmapping_cdlayers(
ListBase *r_map, const int cddata_type, const int mix_mode, const float mix_factor, const float *mix_weights,
- const int num_create, CustomData *cd_src, CustomData *cd_dst, const bool dup_dst,
+ const int num_elem_dst, const bool use_create, CustomData *cd_src, CustomData *cd_dst, const bool dup_dst,
const int fromlayers, const int tolayers)
{
int idx_src, idx_dst;
@@ -434,13 +434,13 @@ static bool data_transfer_layersmapping_cdlayers(
return false;
}
/* If dest is a derivedmesh, we do not want to overwrite cdlayers of org mesh! */
- data_dst = dup_dst ? CustomData_duplicate_referenced_layer(cd_dst, cddata_type, num_create) :
+ data_dst = dup_dst ? CustomData_duplicate_referenced_layer(cd_dst, cddata_type, num_elem_dst) :
CustomData_get_layer(cd_dst, cddata_type);
if (!data_dst) {
- if (!num_create) {
+ if (!use_create) {
return false;
}
- data_dst = CustomData_add_layer(cd_dst, cddata_type, CD_CALLOC, NULL, num_create);
+ data_dst = CustomData_add_layer(cd_dst, cddata_type, CD_CALLOC, NULL, num_elem_dst);
}
data_transfer_layersmapping_add_item_cd(r_map, cddata_type, mix_mode, mix_factor, mix_weights, data_src, data_dst);
@@ -465,15 +465,15 @@ static bool
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list