Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2019-04-17 07:17:24 +0300
committerCampbell Barton <ideasman42@gmail.com>2019-04-17 07:21:24 +0300
commite12c08e8d170b7ca40f204a5b0423c23a9fbc2c1 (patch)
tree8cf3453d12edb177a218ef8009357518ec6cab6a /source/blender/editors/object/object_data_transfer.c
parentb3dabc200a4b0399ec6b81f2ff2730d07b44fcaa (diff)
ClangFormat: apply to source, most of intern
Apply clang format as proposed in T53211. For details on usage and instructions for migrating branches without conflicts, see: https://wiki.blender.org/wiki/Tools/ClangFormat
Diffstat (limited to 'source/blender/editors/object/object_data_transfer.c')
-rw-r--r--source/blender/editors/object/object_data_transfer.c1340
1 files changed, 754 insertions, 586 deletions
diff --git a/source/blender/editors/object/object_data_transfer.c b/source/blender/editors/object/object_data_transfer.c
index 52b60793585..57c7ff1535d 100644
--- a/source/blender/editors/object/object_data_transfer.c
+++ b/source/blender/editors/object/object_data_transfer.c
@@ -58,402 +58,463 @@
* Note some are 'fake' ones, i.e. they are not hold by real CDLayers. */
/* Not shared with modifier, since we use a usual enum here, not a multi-choice one. */
static const EnumPropertyItem DT_layer_items[] = {
- {0, "", 0, "Vertex Data", ""},
- {DT_TYPE_MDEFORMVERT, "VGROUP_WEIGHTS", 0, "Vertex Group(s)", "Transfer active or all vertex groups"},
-#if 0 /* XXX For now, would like to finish/merge work from 2014 gsoc first. */
- {DT_TYPE_SHAPEKEY, "SHAPEKEYS", 0, "Shapekey(s)", "Transfer active or all shape keys"},
+ {0, "", 0, "Vertex Data", ""},
+ {DT_TYPE_MDEFORMVERT,
+ "VGROUP_WEIGHTS",
+ 0,
+ "Vertex Group(s)",
+ "Transfer active or all vertex groups"},
+#if 0 /* XXX For now, would like to finish/merge work from 2014 gsoc first. */
+ {DT_TYPE_SHAPEKEY, "SHAPEKEYS", 0, "Shapekey(s)", "Transfer active or all shape keys"},
#endif
-#if 0 /* XXX When SkinModifier is enabled,
+#if 0 /* XXX When SkinModifier is enabled,
* it seems to erase its own CD_MVERT_SKIN layer from final DM :( */
- {DT_TYPE_SKIN, "SKIN", 0, "Skin Weight", "Transfer skin weights"},
+ {DT_TYPE_SKIN, "SKIN", 0, "Skin Weight", "Transfer skin weights"},
#endif
- {DT_TYPE_BWEIGHT_VERT, "BEVEL_WEIGHT_VERT", 0, "Bevel Weight", "Transfer bevel weights"},
- {0, "", 0, "Edge Data", ""},
- {DT_TYPE_SHARP_EDGE, "SHARP_EDGE", 0, "Sharp", "Transfer sharp mark"},
- {DT_TYPE_SEAM, "SEAM", 0, "UV Seam", "Transfer UV seam mark"},
- {DT_TYPE_CREASE, "CREASE", 0, "Subsurf Crease", "Transfer crease values"},
- {DT_TYPE_BWEIGHT_EDGE, "BEVEL_WEIGHT_EDGE", 0, "Bevel Weight", "Transfer bevel weights"},
- {DT_TYPE_FREESTYLE_EDGE, "FREESTYLE_EDGE", 0, "Freestyle Mark", "Transfer Freestyle edge mark"},
- {0, "", 0, "Face Corner Data", ""},
- {DT_TYPE_LNOR, "CUSTOM_NORMAL", 0, "Custom Normals", "Transfer custom normals"},
- {DT_TYPE_VCOL, "VCOL", 0, "VCol", "Vertex (face corners) colors"},
- {DT_TYPE_UV, "UV", 0, "UVs", "Transfer UV layers"},
- {0, "", 0, "Face Data", ""},
- {DT_TYPE_SHARP_FACE, "SMOOTH", 0, "Smooth", "Transfer flat/smooth mark"},
- {DT_TYPE_FREESTYLE_FACE, "FREESTYLE_FACE", 0, "Freestyle Mark", "Transfer Freestyle face mark"},
- {0, NULL, 0, NULL, NULL},
+ {DT_TYPE_BWEIGHT_VERT, "BEVEL_WEIGHT_VERT", 0, "Bevel Weight", "Transfer bevel weights"},
+ {0, "", 0, "Edge Data", ""},
+ {DT_TYPE_SHARP_EDGE, "SHARP_EDGE", 0, "Sharp", "Transfer sharp mark"},
+ {DT_TYPE_SEAM, "SEAM", 0, "UV Seam", "Transfer UV seam mark"},
+ {DT_TYPE_CREASE, "CREASE", 0, "Subsurf Crease", "Transfer crease values"},
+ {DT_TYPE_BWEIGHT_EDGE, "BEVEL_WEIGHT_EDGE", 0, "Bevel Weight", "Transfer bevel weights"},
+ {DT_TYPE_FREESTYLE_EDGE,
+ "FREESTYLE_EDGE",
+ 0,
+ "Freestyle Mark",
+ "Transfer Freestyle edge mark"},
+ {0, "", 0, "Face Corner Data", ""},
+ {DT_TYPE_LNOR, "CUSTOM_NORMAL", 0, "Custom Normals", "Transfer custom normals"},
+ {DT_TYPE_VCOL, "VCOL", 0, "VCol", "Vertex (face corners) colors"},
+ {DT_TYPE_UV, "UV", 0, "UVs", "Transfer UV layers"},
+ {0, "", 0, "Face Data", ""},
+ {DT_TYPE_SHARP_FACE, "SMOOTH", 0, "Smooth", "Transfer flat/smooth mark"},
+ {DT_TYPE_FREESTYLE_FACE,
+ "FREESTYLE_FACE",
+ 0,
+ "Freestyle Mark",
+ "Transfer Freestyle face mark"},
+ {0, NULL, 0, NULL, NULL},
};
/* Note: rna_enum_dt_layers_select_src_items enum is from rna_modifier.c */
-static const EnumPropertyItem *dt_layers_select_src_itemf(
- bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), bool *r_free)
+static const EnumPropertyItem *dt_layers_select_src_itemf(bContext *C,
+ PointerRNA *ptr,
+ PropertyRNA *UNUSED(prop),
+ bool *r_free)
{
- if (!C) { /* needed for docs and i18n tools */
- return rna_enum_dt_layers_select_src_items;
- }
-
- EnumPropertyItem *item = NULL, tmp_item = {0};
- int totitem = 0;
- const int data_type = RNA_enum_get(ptr, "data_type");
-
- Depsgraph *depsgraph = CTX_data_depsgraph(C);
-
- PropertyRNA *prop = RNA_struct_find_property(ptr, "use_reverse_transfer");
- const bool reverse_transfer = prop != NULL && RNA_property_boolean_get(ptr, prop);
- const int layers_select_dst = reverse_transfer ? RNA_enum_get(ptr, "layers_select_src") :
- RNA_enum_get(ptr, "layers_select_dst");
-
- if (!reverse_transfer || layers_select_dst == DT_LAYERS_ACTIVE_DST || layers_select_dst >= 0) {
- RNA_enum_items_add_value(&item, &totitem, rna_enum_dt_layers_select_src_items, DT_LAYERS_ACTIVE_SRC);
- }
- RNA_enum_items_add_value(&item, &totitem, rna_enum_dt_layers_select_src_items, DT_LAYERS_ALL_SRC);
-
-
-
- if (data_type == DT_TYPE_MDEFORMVERT) {
- Object *ob_src = CTX_data_active_object(C);
-
- if (BKE_object_pose_armature_get(ob_src)) {
- RNA_enum_items_add_value(&item, &totitem, rna_enum_dt_layers_select_src_items, DT_LAYERS_VGROUP_SRC_BONE_SELECT);
- RNA_enum_items_add_value(&item, &totitem, rna_enum_dt_layers_select_src_items, DT_LAYERS_VGROUP_SRC_BONE_DEFORM);
- }
-
- if (ob_src) {
- bDeformGroup *dg;
- int i;
-
- RNA_enum_item_add_separator(&item, &totitem);
-
- for (i = 0, dg = ob_src->defbase.first; dg; i++, dg = dg->next) {
- tmp_item.value = i;
- tmp_item.identifier = tmp_item.name = dg->name;
- RNA_enum_item_add(&item, &totitem, &tmp_item);
- }
- }
- }
- else if (data_type == DT_TYPE_SHAPEKEY) {
- /* TODO */
- }
- else if (data_type == DT_TYPE_UV) {
- Object *ob_src = CTX_data_active_object(C);
-
- if (ob_src) {
- Mesh *me_eval;
- int num_data, i;
-
- Scene *scene_eval = DEG_get_evaluated_scene(depsgraph);
- Object *ob_src_eval = DEG_get_evaluated_object(depsgraph, ob_src);
-
- CustomData_MeshMasks cddata_masks = CD_MASK_BAREMESH;
- cddata_masks.lmask |= CD_MASK_MLOOPUV;
- me_eval = mesh_get_eval_final(depsgraph, scene_eval, ob_src_eval, &cddata_masks);
- num_data = CustomData_number_of_layers(&me_eval->ldata, CD_MLOOPUV);
-
- RNA_enum_item_add_separator(&item, &totitem);
-
- for (i = 0; i < num_data; i++) {
- tmp_item.value = i;
- tmp_item.identifier = tmp_item.name = CustomData_get_layer_name(&me_eval->ldata, CD_MLOOPUV, i);
- RNA_enum_item_add(&item, &totitem, &tmp_item);
- }
- }
- }
- else if (data_type == DT_TYPE_VCOL) {
- Object *ob_src = CTX_data_active_object(C);
-
- if (ob_src) {
- Mesh *me_eval;
- int num_data, i;
-
- Scene *scene_eval = DEG_get_evaluated_scene(depsgraph);
- Object *ob_src_eval = DEG_get_evaluated_object(depsgraph, ob_src);
-
- CustomData_MeshMasks cddata_masks = CD_MASK_BAREMESH;
- cddata_masks.lmask |= CD_MASK_MLOOPCOL;
- me_eval = mesh_get_eval_final(depsgraph, scene_eval, ob_src_eval, &cddata_masks);
- num_data = CustomData_number_of_layers(&me_eval->ldata, CD_MLOOPCOL);
-
- RNA_enum_item_add_separator(&item, &totitem);
-
- for (i = 0; i < num_data; i++) {
- tmp_item.value = i;
- tmp_item.identifier = tmp_item.name = CustomData_get_layer_name(&me_eval->ldata, CD_MLOOPCOL, i);
- RNA_enum_item_add(&item, &totitem, &tmp_item);
- }
- }
- }
-
- RNA_enum_item_end(&item, &totitem);
- *r_free = true;
-
- return item;
+ if (!C) { /* needed for docs and i18n tools */
+ return rna_enum_dt_layers_select_src_items;
+ }
+
+ EnumPropertyItem *item = NULL, tmp_item = {0};
+ int totitem = 0;
+ const int data_type = RNA_enum_get(ptr, "data_type");
+
+ Depsgraph *depsgraph = CTX_data_depsgraph(C);
+
+ PropertyRNA *prop = RNA_struct_find_property(ptr, "use_reverse_transfer");
+ const bool reverse_transfer = prop != NULL && RNA_property_boolean_get(ptr, prop);
+ const int layers_select_dst = reverse_transfer ? RNA_enum_get(ptr, "layers_select_src") :
+ RNA_enum_get(ptr, "layers_select_dst");
+
+ if (!reverse_transfer || layers_select_dst == DT_LAYERS_ACTIVE_DST || layers_select_dst >= 0) {
+ RNA_enum_items_add_value(
+ &item, &totitem, rna_enum_dt_layers_select_src_items, DT_LAYERS_ACTIVE_SRC);
+ }
+ RNA_enum_items_add_value(
+ &item, &totitem, rna_enum_dt_layers_select_src_items, DT_LAYERS_ALL_SRC);
+
+ if (data_type == DT_TYPE_MDEFORMVERT) {
+ Object *ob_src = CTX_data_active_object(C);
+
+ if (BKE_object_pose_armature_get(ob_src)) {
+ RNA_enum_items_add_value(
+ &item, &totitem, rna_enum_dt_layers_select_src_items, DT_LAYERS_VGROUP_SRC_BONE_SELECT);
+ RNA_enum_items_add_value(
+ &item, &totitem, rna_enum_dt_layers_select_src_items, DT_LAYERS_VGROUP_SRC_BONE_DEFORM);
+ }
+
+ if (ob_src) {
+ bDeformGroup *dg;
+ int i;
+
+ RNA_enum_item_add_separator(&item, &totitem);
+
+ for (i = 0, dg = ob_src->defbase.first; dg; i++, dg = dg->next) {
+ tmp_item.value = i;
+ tmp_item.identifier = tmp_item.name = dg->name;
+ RNA_enum_item_add(&item, &totitem, &tmp_item);
+ }
+ }
+ }
+ else if (data_type == DT_TYPE_SHAPEKEY) {
+ /* TODO */
+ }
+ else if (data_type == DT_TYPE_UV) {
+ Object *ob_src = CTX_data_active_object(C);
+
+ if (ob_src) {
+ Mesh *me_eval;
+ int num_data, i;
+
+ Scene *scene_eval = DEG_get_evaluated_scene(depsgraph);
+ Object *ob_src_eval = DEG_get_evaluated_object(depsgraph, ob_src);
+
+ CustomData_MeshMasks cddata_masks = CD_MASK_BAREMESH;
+ cddata_masks.lmask |= CD_MASK_MLOOPUV;
+ me_eval = mesh_get_eval_final(depsgraph, scene_eval, ob_src_eval, &cddata_masks);
+ num_data = CustomData_number_of_layers(&me_eval->ldata, CD_MLOOPUV);
+
+ RNA_enum_item_add_separator(&item, &totitem);
+
+ for (i = 0; i < num_data; i++) {
+ tmp_item.value = i;
+ tmp_item.identifier = tmp_item.name = CustomData_get_layer_name(
+ &me_eval->ldata, CD_MLOOPUV, i);
+ RNA_enum_item_add(&item, &totitem, &tmp_item);
+ }
+ }
+ }
+ else if (data_type == DT_TYPE_VCOL) {
+ Object *ob_src = CTX_data_active_object(C);
+
+ if (ob_src) {
+ Mesh *me_eval;
+ int num_data, i;
+
+ Scene *scene_eval = DEG_get_evaluated_scene(depsgraph);
+ Object *ob_src_eval = DEG_get_evaluated_object(depsgraph, ob_src);
+
+ CustomData_MeshMasks cddata_masks = CD_MASK_BAREMESH;
+ cddata_masks.lmask |= CD_MASK_MLOOPCOL;
+ me_eval = mesh_get_eval_final(depsgraph, scene_eval, ob_src_eval, &cddata_masks);
+ num_data = CustomData_number_of_layers(&me_eval->ldata, CD_MLOOPCOL);
+
+ RNA_enum_item_add_separator(&item, &totitem);
+
+ for (i = 0; i < num_data; i++) {
+ tmp_item.value = i;
+ tmp_item.identifier = tmp_item.name = CustomData_get_layer_name(
+ &me_eval->ldata, CD_MLOOPCOL, i);
+ RNA_enum_item_add(&item, &totitem, &tmp_item);
+ }
+ }
+ }
+
+ RNA_enum_item_end(&item, &totitem);
+ *r_free = true;
+
+ return item;
}
/* Note: rna_enum_dt_layers_select_dst_items enum is from rna_modifier.c */
-static const EnumPropertyItem *dt_layers_select_dst_itemf(
- bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), bool *r_free)
+static const EnumPropertyItem *dt_layers_select_dst_itemf(bContext *C,
+ PointerRNA *ptr,
+ PropertyRNA *UNUSED(prop),
+ bool *r_free)
{
- if (!C) { /* needed for docs and i18n tools */
- return rna_enum_dt_layers_select_dst_items;
- }
+ if (!C) { /* needed for docs and i18n tools */
+ return rna_enum_dt_layers_select_dst_items;
+ }
- EnumPropertyItem *item = NULL;
- int totitem = 0;
+ EnumPropertyItem *item = NULL;
+ int totitem = 0;
- PropertyRNA *prop = RNA_struct_find_property(ptr, "use_reverse_transfer");
- const bool reverse_transfer = prop != NULL && RNA_property_boolean_get(ptr, prop);
- const int layers_select_src = reverse_transfer ? RNA_enum_get(ptr, "layers_select_dst") :
- RNA_enum_get(ptr, "layers_select_src");
+ PropertyRNA *prop = RNA_struct_find_property(ptr, "use_reverse_transfer");
+ const bool reverse_transfer = prop != NULL && RNA_property_boolean_get(ptr, prop);
+ const int layers_select_src = reverse_transfer ? RNA_enum_get(ptr, "layers_select_dst") :
+ RNA_enum_get(ptr, "layers_select_src");
- if (reverse_transfer || layers_select_src == DT_LAYERS_ACTIVE_SRC || layers_select_src >= 0) {
- RNA_enum_items_add_value(&item, &totitem, rna_enum_dt_layers_select_dst_items, DT_LAYERS_ACTIVE_DST);
- }
- RNA_enum_items_add_value(&item, &totitem, rna_enum_dt_layers_select_dst_items, DT_LAYERS_NAME_DST);
- RNA_enum_items_add_value(&item, &totitem, rna_enum_dt_layers_select_dst_items, DT_LAYERS_INDEX_DST);
+ if (reverse_transfer || layers_select_src == DT_LAYERS_ACTIVE_SRC || layers_select_src >= 0) {
+ RNA_enum_items_add_value(
+ &item, &totitem, rna_enum_dt_layers_select_dst_items, DT_LAYERS_ACTIVE_DST);
+ }
+ RNA_enum_items_add_value(
+ &item, &totitem, rna_enum_dt_layers_select_dst_items, DT_LAYERS_NAME_DST);
+ RNA_enum_items_add_value(
+ &item, &totitem, rna_enum_dt_layers_select_dst_items, DT_LAYERS_INDEX_DST);
- /* No 'specific' to-layers here, since we may transfer to several objects at once! */
+ /* No 'specific' to-layers here, since we may transfer to several objects at once! */
- RNA_enum_item_end(&item, &totitem);
- *r_free = true;
+ RNA_enum_item_end(&item, &totitem);
+ *r_free = true;
- return item;
+ return item;
}
-static const EnumPropertyItem *dt_layers_select_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *prop, bool *r_free)
+static const EnumPropertyItem *dt_layers_select_itemf(bContext *C,
+ PointerRNA *ptr,
+ PropertyRNA *prop,
+ bool *r_free)
{
- const bool reverse_transfer = RNA_boolean_get(ptr, "use_reverse_transfer");
-
- if (STREQ(RNA_property_identifier(prop), "layers_select_dst")) {
- if (reverse_transfer) {
- return dt_layers_select_src_itemf(C, ptr, prop, r_free);
- }
- else {
- return dt_layers_select_dst_itemf(C, ptr, prop, r_free);
- }
- }
- else if (reverse_transfer) {
- return dt_layers_select_dst_itemf(C, ptr, prop, r_free);
- }
- else {
- return dt_layers_select_src_itemf(C, ptr, prop, r_free);
- }
+ const bool reverse_transfer = RNA_boolean_get(ptr, "use_reverse_transfer");
+
+ if (STREQ(RNA_property_identifier(prop), "layers_select_dst")) {
+ if (reverse_transfer) {
+ return dt_layers_select_src_itemf(C, ptr, prop, r_free);
+ }
+ else {
+ return dt_layers_select_dst_itemf(C, ptr, prop, r_free);
+ }
+ }
+ else if (reverse_transfer) {
+ return dt_layers_select_dst_itemf(C, ptr, prop, r_free);
+ }
+ else {
+ return dt_layers_select_src_itemf(C, ptr, prop, r_free);
+ }
}
/* Note: rna_enum_dt_mix_mode_items enum is from rna_modifier.c */
-static const EnumPropertyItem *dt_mix_mode_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), bool *r_free)
+static const EnumPropertyItem *dt_mix_mode_itemf(bContext *C,
+ PointerRNA *ptr,
+ PropertyRNA *UNUSED(prop),
+ bool *r_free)
{
- EnumPropertyItem *item = NULL;
- int totitem = 0;
+ EnumPropertyItem *item = NULL;
+ int totitem = 0;
- const int dtdata_type = RNA_enum_get(ptr, "data_type");
- bool support_advanced_mixing, support_threshold;
+ const int dtdata_type = RNA_enum_get(ptr, "data_type");
+ bool support_advanced_mixing, support_threshold;
- if (!C) { /* needed for docs and i18n tools */
- return rna_enum_dt_mix_mode_items;
- }
+ if (!C) { /* needed for docs and i18n tools */
+ return rna_enum_dt_mix_mode_items;
+ }
- RNA_enum_items_add_value(&item, &totitem, rna_enum_dt_mix_mode_items, CDT_MIX_TRANSFER);
+ RNA_enum_items_add_value(&item, &totitem, rna_enum_dt_mix_mode_items, CDT_MIX_TRANSFER);
- BKE_object_data_transfer_get_dttypes_capacity(dtdata_type, &support_advanced_mixing, &support_threshold);
+ BKE_object_data_transfer_get_dttypes_capacity(
+ dtdata_type, &support_advanced_mixing, &support_threshold);
- if (support_threshold) {
- RNA_enum_items_add_value(&item, &totitem, rna_enum_dt_mix_mode_items, CDT_MIX_REPLACE_ABOVE_THRESHOLD);
- RNA_enum_items_add_value(&item, &totitem, rna_enum_dt_mix_mode_items, CDT_MIX_REPLACE_BELOW_THRESHOLD);
- }
+ if (support_threshold) {
+ RNA_enum_items_add_value(
+ &item, &totitem, rna_enum_dt_mix_mode_items, CDT_MIX_REPLACE_ABOVE_THRESHOLD);
+ RNA_enum_items_add_value(
+ &item, &totitem, rna_enum_dt_mix_mode_items, CDT_MIX_REPLACE_BELOW_THRESHOLD);
+ }
- if (support_advanced_mixing) {
- RNA_enum_item_add_separator(&item, &totitem);
- RNA_enum_items_add_value(&item, &totitem, rna_enum_dt_mix_mode_items, CDT_MIX_MIX);
- RNA_enum_items_add_value(&item, &totitem, rna_enum_dt_mix_mode_items, CDT_MIX_ADD);
- RNA_enum_items_add_value(&item, &totitem, rna_enum_dt_mix_mode_items, CDT_MIX_SUB);
- RNA_enum_items_add_value(&item, &totitem, rna_enum_dt_mix_mode_items, CDT_MIX_MUL);
- }
+ if (support_advanced_mixing) {
+ RNA_enum_item_add_separator(&item, &totitem);
+ RNA_enum_items_add_value(&item, &totitem, rna_enum_dt_mix_mode_items, CDT_MIX_MIX);
+ RNA_enum_items_add_value(&item, &totitem, rna_enum_dt_mix_mode_items, CDT_MIX_ADD);
+ RNA_enum_items_add_value(&item, &totitem, rna_enum_dt_mix_mode_items, CDT_MIX_SUB);
+ RNA_enum_items_add_value(&item, &totitem, rna_enum_dt_mix_mode_items, CDT_MIX_MUL);
+ }
- RNA_enum_item_end(&item, &totitem);
- *r_free = true;
+ RNA_enum_item_end(&item, &totitem);
+ *r_free = true;
- return item;
+ return item;
}
static bool data_transfer_check(bContext *UNUSED(C), wmOperator *op)
{
- const int layers_select_src = RNA_enum_get(op->ptr, "layers_select_src");
- PropertyRNA *prop = RNA_struct_find_property(op->ptr, "layers_select_dst");
- const int layers_select_dst = RNA_property_enum_get(op->ptr, prop);
+ const int layers_select_src = RNA_enum_get(op->ptr, "layers_select_src");
+ PropertyRNA *prop = RNA_struct_find_property(op->ptr, "layers_select_dst");
+ const int layers_select_dst = RNA_property_enum_get(op->ptr, prop);
- /* TODO: check for invalid layers_src select modes too! */
+ /* TODO: check for invalid layers_src select modes too! */
- if ((layers_select_src != DT_LAYERS_ACTIVE_SRC) && (layers_select_dst == DT_LAYERS_ACTIVE_DST)) {
- RNA_property_enum_set(op->ptr, prop, DT_LAYERS_NAME_DST);
- return true;
- }
+ if ((layers_select_src != DT_LAYERS_ACTIVE_SRC) && (layers_select_dst == DT_LAYERS_ACTIVE_DST)) {
+ RNA_property_enum_set(op->ptr, prop, DT_LAYERS_NAME_DST);
+ return true;
+ }
- return false;
+ return false;
}
/* Helper, used by both data_transfer_exec and datalayout_transfer_exec. */
-static void data_transfer_exec_preprocess_objects(
- bContext *C, wmOperator *op, Object *ob_src, ListBase *ctx_objects, const bool reverse_transfer)
+static void data_transfer_exec_preprocess_objects(bContext *C,
+ wmOperator *op,
+ Object *ob_src,
+ ListBase *ctx_objects,
+ const bool reverse_transfer)
{
- CollectionPointerLink *ctx_ob;
- CTX_data_selected_editable_objects(C, ctx_objects);
-
- if (reverse_transfer) {
- return; /* Nothing else to do in this case... */
- }
-
- for (ctx_ob = ctx_objects->first; ctx_ob; ctx_ob = ctx_ob->next) {
- Object *ob = ctx_ob->ptr.data;
- Mesh *me;
- if ((ob == ob_src) || (ob->type != OB_MESH)) {
- continue;
- }
-
- me = ob->data;
- if (ID_IS_LINKED(me)) {
- /* Do not transfer to linked data, not supported. */
- BKE_reportf(op->reports, RPT_WARNING, "Skipping object '%s', linked data '%s' cannot be modified",
- ob->id.name + 2, me->id.name + 2);
- me->id.tag &= ~LIB_TAG_DOIT;
- continue;
- }
-
- me->id.tag |= LIB_TAG_DOIT;
- }
+ CollectionPointerLink *ctx_ob;
+ CTX_data_selected_editable_objects(C, ctx_objects);
+
+ if (reverse_transfer) {
+ return; /* Nothing else to do in this case... */
+ }
+
+ for (ctx_ob = ctx_objects->first; ctx_ob; ctx_ob = ctx_ob->next) {
+ Object *ob = ctx_ob->ptr.data;
+ Mesh *me;
+ if ((ob == ob_src) || (ob->type != OB_MESH)) {
+ continue;
+ }
+
+ me = ob->data;
+ if (ID_IS_LINKED(me)) {
+ /* Do not transfer to linked data, not supported. */
+ BKE_reportf(op->reports,
+ RPT_WARNING,
+ "Skipping object '%s', linked data '%s' cannot be modified",
+ ob->id.name + 2,
+ me->id.name + 2);
+ me->id.tag &= ~LIB_TAG_DOIT;
+ continue;
+ }
+
+ me->id.tag |= LIB_TAG_DOIT;
+ }
}
/* Helper, used by both data_transfer_exec and datalayout_transfer_exec. */
-static bool data_transfer_exec_is_object_valid(
- wmOperator *op, Object *ob_src, Object *ob_dst, const bool reverse_transfer)
+static bool data_transfer_exec_is_object_valid(wmOperator *op,
+ Object *ob_src,
+ Object *ob_dst,
+ const bool reverse_transfer)
{
- Mesh *me;
- if ((ob_dst == ob_src) || (ob_src->type != OB_MESH) || (ob_dst->type != OB_MESH)) {
- return false;
- }
-
- if (reverse_transfer) {
- return true;
- }
-
- me = ob_dst->data;
- if (me->id.tag & LIB_TAG_DOIT) {
- me->id.tag &= ~LIB_TAG_DOIT;
- return true;
- }
- else if (!ID_IS_LINKED(me)) {
- /* Do not apply transfer operation more than once. */
- /* XXX This is not nice regarding vgroups, which are half-Object data... :/ */
- BKE_reportf(op->reports, RPT_WARNING,
- "Skipping object '%s', data '%s' has already been processed with a previous object",
- ob_dst->id.name + 2, me->id.name + 2);
- }
- return false;
+ Mesh *me;
+ if ((ob_dst == ob_src) || (ob_src->type != OB_MESH) || (ob_dst->type != OB_MESH)) {
+ return false;
+ }
+
+ if (reverse_transfer) {
+ return true;
+ }
+
+ me = ob_dst->data;
+ if (me->id.tag & LIB_TAG_DOIT) {
+ me->id.tag &= ~LIB_TAG_DOIT;
+ return true;
+ }
+ else if (!ID_IS_LINKED(me)) {
+ /* Do not apply transfer operation more than once. */
+ /* XXX This is not nice regarding vgroups, which are half-Object data... :/ */
+ BKE_reportf(
+ op->reports,
+ RPT_WARNING,
+ "Skipping object '%s', data '%s' has already been processed with a previous object",
+ ob_dst->id.name + 2,
+ me->id.name + 2);
+ }
+ return false;
}
static int data_transfer_exec(bContext *C, wmOperator *op)
{
- Object *ob_src = ED_object_active_context(C);
- Depsgraph *depsgraph = CTX_data_depsgraph(C);
- Scene *scene_eval = DEG_get_evaluated_scene(depsgraph);
-
- ListBase ctx_objects;
- CollectionPointerLink *ctx_ob_dst;
-
- bool changed = false;
-
- const bool is_frozen = RNA_boolean_get(op->ptr, "use_freeze");
-
- const bool reverse_transfer = RNA_boolean_get(op->ptr, "use_reverse_transfer");
-
- const int data_type = RNA_enum_get(op->ptr, "data_type");
- const bool use_create = RNA_boolean_get(op->ptr, "use_create");
-
- const int map_vert_mode = RNA_enum_get(op->ptr, "vert_mapping");
- const int map_edge_mode = RNA_enum_get(op->ptr, "edge_mapping");
- const int map_loop_mode = RNA_enum_get(op->ptr, "loop_mapping");
- const int map_poly_mode = RNA_enum_get(op->ptr, "poly_mapping");
-
- const bool use_auto_transform = RNA_boolean_get(op->ptr, "use_auto_transform");
- const bool use_object_transform = RNA_boolean_get(op->ptr, "use_object_transform");
- const bool use_max_distance = RNA_boolean_get(op->ptr, "use_max_distance");
- const float max_distance = use_max_distance ? RNA_float_get(op->ptr, "max_distance") : FLT_MAX;
- const float ray_radius = RNA_float_get(op->ptr, "ray_radius");
- const float islands_precision = RNA_float_get(op->ptr, "islands_precision");
-
- const int layers_src = RNA_enum_get(op->ptr, "layers_select_src");
- const int layers_dst = RNA_enum_get(op->ptr, "layers_select_dst");
- int layers_select_src[DT_MULTILAYER_INDEX_MAX] = {0};
- int layers_select_dst[DT_MULTILAYER_INDEX_MAX] = {0};
- const int fromto_idx = BKE_object_data_transfer_dttype_to_srcdst_index(data_type);
-
- const int mix_mode = RNA_enum_get(op->ptr, "mix_mode");
- const float mix_factor = RNA_float_get(op->ptr, "mix_factor");
-
- SpaceTransform space_transform_data;
- SpaceTransform *space_transform = (use_object_transform && !use_auto_transform) ? &space_transform_data : NULL;
-
- if (is_frozen) {
- BKE_report(op->reports, RPT_INFO,
- "Operator is frozen, changes to its settings won't take effect until you unfreeze it");
- return OPERATOR_FINISHED;
- }
-
- if (reverse_transfer && ID_IS_LINKED(ob_src->data)) {
- /* Do not transfer to linked data, not supported. */
- return OPERATOR_CANCELLED;
- }
-
- if (fromto_idx != DT_MULTILAYER_INDEX_INVALID) {
- layers_select_src[fromto_idx] = layers_src;
- layers_select_dst[fromto_idx] = layers_dst;
- }
-
- data_transfer_exec_preprocess_objects(C, op, ob_src, &ctx_objects, reverse_transfer);
-
- for (ctx_ob_dst = ctx_objects.first; ctx_ob_dst; ctx_ob_dst = ctx_ob_dst->next) {
- Object *ob_dst = ctx_ob_dst->ptr.data;
-
- if (reverse_transfer) {
- SWAP(Object *, ob_src, ob_dst);
- }
-
- if (data_transfer_exec_is_object_valid(op, ob_src, ob_dst, reverse_transfer)) {
- Object *ob_src_eval = DEG_get_evaluated_object(depsgraph, ob_src);
-
- if (space_transform) {
- Object *ob_dst_eval = DEG_get_evaluated_object(depsgraph, ob_dst);
- BLI_SPACE_TRANSFORM_SETUP(space_transform, ob_dst_eval, ob_src_eval);
- }
-
- if (BKE_object_data_transfer_mesh(
- depsgraph, scene_eval, ob_src_eval, ob_dst, data_type, use_create,
- map_vert_mode, map_edge_mode, map_loop_mode, map_poly_mode,
- space_transform, use_auto_transform,
- max_distance, ray_radius, islands_precision,
- layers_select_src, layers_select_dst,
- mix_mode, mix_factor, NULL, false, op->reports))
- {
- changed = true;
- }
- }
-
- DEG_id_tag_update(&ob_dst->id, ID_RECALC_GEOMETRY);
-
- if (reverse_transfer) {
- SWAP(Object *, ob_src, ob_dst);
- }
- }
-
- BLI_freelistN(&ctx_objects);
-
- WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, NULL);
-
-#if 0 /* TODO */
- /* Note: issue with that is that if canceled, operator cannot be redone... Nasty in our case. */
- return changed ? OPERATOR_FINISHED : OPERATOR_CANCELLED;
+ Object *ob_src = ED_object_active_context(C);
+ Depsgraph *depsgraph = CTX_data_depsgraph(C);
+ Scene *scene_eval = DEG_get_evaluated_scene(depsgraph);
+
+ ListBase ctx_objects;
+ CollectionPointerLink *ctx_ob_dst;
+
+ bool changed = false;
+
+ const bool is_frozen = RNA_boolean_get(op->ptr, "use_freeze");
+
+ const bool reverse_transfer = RNA_boolean_get(op->ptr, "use_reverse_transfer");
+
+ const int data_type = RNA_enum_get(op->ptr, "data_type");
+ const bool use_create = RNA_boolean_get(op->ptr, "use_create");
+
+ const int map_vert_mode = RNA_enum_get(op->ptr, "vert_mapping");
+ const int map_edge_mode = RNA_enum_get(op->ptr, "edge_mapping");
+ const int map_loop_mode = RNA_enum_get(op->ptr, "loop_mapping");
+ const int map_poly_mode = RNA_enum_get(op->ptr, "poly_mapping");
+
+ const bool use_auto_transform = RNA_boolean_get(op->ptr, "use_auto_transform");
+ const bool use_object_transform = RNA_boolean_get(op->ptr, "use_object_transform");
+ const bool use_max_distance = RNA_boolean_get(op->ptr, "use_max_distance");
+ const float max_distance = use_max_distance ? RNA_float_get(op->ptr, "max_distance") : FLT_MAX;
+ const float ray_radius = RNA_float_get(op->ptr, "ray_radius");
+ const float islands_precision = RNA_float_get(op->ptr, "islands_precision");
+
+ const int layers_src = RNA_enum_get(op->ptr, "layers_select_src");
+ const int layers_dst = RNA_enum_get(op->ptr, "layers_select_dst");
+ int layers_select_src[DT_MULTILAYER_INDEX_MAX] = {0};
+ int layers_select_dst[DT_MULTILAYER_INDEX_MAX] = {0};
+ const int fromto_idx = BKE_object_data_transfer_dttype_to_srcdst_index(data_type);
+
+ const int mix_mode = RNA_enum_get(op->ptr, "mix_mode");
+ const float mix_factor = RNA_float_get(op->ptr, "mix_factor");
+
+ SpaceTransform space_transform_data;
+ SpaceTransform *space_transform = (use_object_transform && !use_auto_transform) ?
+ &space_transform_data :
+ NULL;
+
+ if (is_frozen) {
+ BKE_report(
+ op->reports,
+ RPT_INFO,
+ "Operator is frozen, changes to its settings won't take effect until you unfreeze it");
+ return OPERATOR_FINISHED;
+ }
+
+ if (reverse_transfer && ID_IS_LINKED(ob_src->data)) {
+ /* Do not transfer to linked data, not supported. */
+ return OPERATOR_CANCELLED;
+ }
+
+ if (fromto_idx != DT_MULTILAYER_INDEX_INVALID) {
+ layers_select_src[fromto_idx] = layers_src;
+ layers_select_dst[fromto_idx] = layers_dst;
+ }
+
+ data_transfer_exec_preprocess_objects(C, op, ob_src, &ctx_objects, reverse_transfer);
+
+ for (ctx_ob_dst = ctx_objects.first; ctx_ob_dst; ctx_ob_dst = ctx_ob_dst->next) {
+ Object *ob_dst = ctx_ob_dst->ptr.data;
+
+ if (reverse_transfer) {
+ SWAP(Object *, ob_src, ob_dst);
+ }
+
+ if (data_transfer_exec_is_object_valid(op, ob_src, ob_dst, reverse_transfer)) {
+ Object *ob_src_eval = DEG_get_evaluated_object(depsgraph, ob_src);
+
+ if (space_transform) {
+ Object *ob_dst_eval = DEG_get_evaluated_object(depsgraph, ob_dst);
+ BLI_SPACE_TRANSFORM_SETUP(space_transform, ob_dst_eval, ob_src_eval);
+ }
+
+ if (BKE_object_data_transfer_mesh(depsgraph,
+ scene_eval,
+ ob_src_eval,
+ ob_dst,
+ data_type,
+ use_create,
+ map_vert_mode,
+ map_edge_mode,
+ map_loop_mode,
+ map_poly_mode,
+ space_transform,
+ use_auto_transform,
+ max_distance,
+ ray_radius,
+ islands_precision,
+ layers_select_src,
+ layers_select_dst,
+ mix_mode,
+ mix_factor,
+ NULL,
+ false,
+ op->reports)) {
+ changed = true;
+ }
+ }
+
+ DEG_id_tag_update(&ob_dst->id, ID_RECALC_GEOMETRY);
+
+ if (reverse_transfer) {
+ SWAP(Object *, ob_src, ob_dst);
+ }
+ }
+
+ BLI_freelistN(&ctx_objects);
+
+ WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, NULL);
+
+#if 0 /* TODO */
+ /* Note: issue with that is that if canceled, operator cannot be redone... Nasty in our case. */
+ return changed ? OPERATOR_FINISHED : OPERATOR_CANCELLED;
#else
- (void)changed;
- return OPERATOR_FINISHED;
+ (void)changed;
+ return OPERATOR_FINISHED;
#endif
}
@@ -461,153 +522,233 @@ static int data_transfer_exec(bContext *C, wmOperator *op)
/* Note this context poll is only really partial, it cannot check for all possible invalid cases. */
static bool data_transfer_poll(bContext *C)
{
- Object *ob = ED_object_active_context(C);
- ID *data = (ob) ? ob->data : NULL;
- return (ob && ob->type == OB_MESH && data);
+ Object *ob = ED_object_active_context(C);
+ ID *data = (ob) ? ob->data : NULL;
+ return (ob && ob->type == OB_MESH && data);
}
/* Used by both OBJECT_OT_data_transfer and OBJECT_OT_datalayout_transfer */
-static bool data_transfer_poll_property(const bContext *UNUSED(C), wmOperator *op, const PropertyRNA *prop)
+static bool data_transfer_poll_property(const bContext *UNUSED(C),
+ wmOperator *op,
+ const PropertyRNA *prop)
{
- PointerRNA *ptr = op->ptr;
- PropertyRNA *prop_other;
-
- const char *prop_id = RNA_property_identifier(prop);
- const int data_type = RNA_enum_get(ptr, "data_type");
- bool use_auto_transform = false;
- bool use_max_distance = false;
- bool use_modifier = false;
-
- if ((prop_other = RNA_struct_find_property(ptr, "use_auto_transform"))) {
- use_auto_transform = RNA_property_boolean_get(ptr, prop_other);
- }
- if ((prop_other = RNA_struct_find_property(ptr, "use_max_distance"))) {
- use_max_distance = RNA_property_boolean_get(ptr, prop_other);
- }
- if ((prop_other = RNA_struct_find_property(ptr, "modifier"))) {
- use_modifier = RNA_property_is_set(ptr, prop_other);
- }
-
- if (STREQ(prop_id, "modifier")) {
- return use_modifier;
- }
-
- if (use_modifier) {
- /* Hide everything but 'modifier' property, if set. */
- return false;
- }
-
- if (STREQ(prop_id, "use_object_transform") && use_auto_transform) {
- return false;
- }
- if (STREQ(prop_id, "max_distance") && !use_max_distance) {
- return false;
- }
- if (STREQ(prop_id, "islands_precision") && !DT_DATATYPE_IS_LOOP(data_type)) {
- return false;
- }
-
- if (STREQ(prop_id, "vert_mapping") && !DT_DATATYPE_IS_VERT(data_type)) {
- return false;
- }
- if (STREQ(prop_id, "edge_mapping") && !DT_DATATYPE_IS_EDGE(data_type)) {
- return false;
- }
- if (STREQ(prop_id, "loop_mapping") && !DT_DATATYPE_IS_LOOP(data_type)) {
- return false;
- }
- if (STREQ(prop_id, "poly_mapping") && !DT_DATATYPE_IS_POLY(data_type)) {
- return false;
- }
-
- if ((STREQ(prop_id, "layers_select_src") || STREQ(prop_id, "layers_select_dst")) &&
- !DT_DATATYPE_IS_MULTILAYERS(data_type))
- {
- return false;
- }
-
- /* Else, show it! */
- return true;
+ PointerRNA *ptr = op->ptr;
+ PropertyRNA *prop_other;
+
+ const char *prop_id = RNA_property_identifier(prop);
+ const int data_type = RNA_enum_get(ptr, "data_type");
+ bool use_auto_transform = false;
+ bool use_max_distance = false;
+ bool use_modifier = false;
+
+ if ((prop_other = RNA_struct_find_property(ptr, "use_auto_transform"))) {
+ use_auto_transform = RNA_property_boolean_get(ptr, prop_other);
+ }
+ if ((prop_other = RNA_struct_find_property(ptr, "use_max_distance"))) {
+ use_max_distance = RNA_property_boolean_get(ptr, prop_other);
+ }
+ if ((prop_other = RNA_struct_find_property(ptr, "modifier"))) {
+ use_modifier = RNA_property_is_set(ptr, prop_other);
+ }
+
+ if (STREQ(prop_id, "modifier")) {
+ return use_modifier;
+ }
+
+ if (use_modifier) {
+ /* Hide everything but 'modifier' property, if set. */
+ return false;
+ }
+
+ if (STREQ(prop_id, "use_object_transform") && use_auto_transform) {
+ return false;
+ }
+ if (STREQ(prop_id, "max_distance") && !use_max_distance) {
+ return false;
+ }
+ if (STREQ(prop_id, "islands_precision") && !DT_DATATYPE_IS_LOOP(data_type)) {
+ return false;
+ }
+
+ if (STREQ(prop_id, "vert_mapping") && !DT_DATATYPE_IS_VERT(data_type)) {
+ return false;
+ }
+ if (STREQ(prop_id, "edge_mapping") && !DT_DATATYPE_IS_EDGE(data_type)) {
+ return false;
+ }
+ if (STREQ(prop_id, "loop_mapping") && !DT_DATATYPE_IS_LOOP(data_type)) {
+ return false;
+ }
+ if (STREQ(prop_id, "poly_mapping") && !DT_DATATYPE_IS_POLY(data_type)) {
+ return false;
+ }
+
+ if ((STREQ(prop_id, "layers_select_src") || STREQ(prop_id, "layers_select_dst")) &&
+ !DT_DATATYPE_IS_MULTILAYERS(data_type)) {
+ return false;
+ }
+
+ /* Else, show it! */
+ return true;
}
/* Transfer mesh data from active to selected objects. */
void OBJECT_OT_data_transfer(wmOperatorType *ot)
{
- PropertyRNA *prop;
-
- /* Identifiers.*/
- ot->name = "Transfer Mesh Data";
- ot->idname = "OBJECT_OT_data_transfer";
- ot->description = "Transfer data layer(s) (weights, edge sharp, ...) from active to selected meshes";
-
- /* API callbacks.*/
- ot->poll = data_transfer_poll;
- ot->poll_property = data_transfer_poll_property;
- ot->invoke = WM_menu_invoke;
- ot->exec = data_transfer_exec;
- ot->check = data_transfer_check;
-
- /* Flags.*/
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_USE_EVAL_DATA;
-
- /* Properties.*/
- prop = RNA_def_boolean(ot->srna, "use_reverse_transfer", false, "Reverse Transfer",
- "Transfer from selected objects to active one");
- RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
-
- RNA_def_boolean(ot->srna, "use_freeze", false, "Freeze Operator",
- "Prevent changes to settings to re-run the operator, "
- "handy to change several things at once with heavy geometry");
-
- /* Data type to transfer. */
- ot->prop = RNA_def_enum(ot->srna, "data_type", DT_layer_items, 0, "Data Type", "Which data to transfer");
- RNA_def_boolean(ot->srna, "use_create", true, "Create Data", "Add data layers on destination meshes if needed");
-
- /* Mapping methods. */
- RNA_def_enum(ot->srna, "vert_mapping", rna_enum_dt_method_vertex_items, MREMAP_MODE_VERT_NEAREST, "Vertex Mapping",
- "Method used to map source vertices to destination ones");
- RNA_def_enum(ot->srna, "edge_mapping", rna_enum_dt_method_edge_items, MREMAP_MODE_EDGE_NEAREST, "Edge Mapping",
- "Method used to map source edges to destination ones");
- RNA_def_enum(ot->srna, "loop_mapping", rna_enum_dt_method_loop_items, MREMAP_MODE_LOOP_NEAREST_POLYNOR,
- "Face Corner Mapping", "Method used to map source faces' corners to destination ones");
- RNA_def_enum(ot->srna, "poly_mapping", rna_enum_dt_method_poly_items, MREMAP_MODE_POLY_NEAREST, "Face Mapping",
- "Method used to map source faces to destination ones");
-
- /* Mapping options and filtering. */
- RNA_def_boolean(ot->srna, "use_auto_transform", false, "Auto Transform",
- "Automatically compute transformation to get the best possible match between source and "
- "destination meshes (WARNING: results will never be as good as manual matching of objects)");
- RNA_def_boolean(ot->srna, "use_object_transform", true, "Object Transform",
- "Evaluate source and destination meshes in global space");
- RNA_def_boolean(ot->srna, "use_max_distance", false, "Only Neighbor Geometry",
- "Source elements must be closer than given distance from destination one");
- prop = RNA_def_float(ot->srna, "max_distance", 1.0f, 0.0f, FLT_MAX, "Max Distance",
- "Maximum allowed distance between source and destination element, for non-topology mappings",
- 0.0f, 100.0f);
- RNA_def_property_subtype(prop, PROP_DISTANCE);
- prop = RNA_def_float(ot->srna, "ray_radius", 0.0f, 0.0f, FLT_MAX, "Ray Radius",
- "'Width' of rays (especially useful when raycasting against vertices or edges)",
- 0.0f, 10.0f);
- RNA_def_property_subtype(prop, PROP_DISTANCE);
- prop = RNA_def_float(ot->srna, "islands_precision", 0.1f, 0.0f, 10.0f, "Islands Precision",
- "Factor controlling precision of islands handling (the higher, the better the results)",
- 0.0f, 1.0f);
- RNA_def_property_subtype(prop, PROP_FACTOR);
-
- /* How to handle multi-layers types of data. */
- prop = RNA_def_enum(ot->srna, "layers_select_src", rna_enum_dt_layers_select_src_items, DT_LAYERS_ACTIVE_SRC,
- "Source Layers Selection", "Which layers to transfer, in case of multi-layers types");
- RNA_def_property_enum_funcs_runtime(prop, NULL, NULL, dt_layers_select_itemf);
-
- prop = RNA_def_enum(ot->srna, "layers_select_dst", rna_enum_dt_layers_select_dst_items, DT_LAYERS_ACTIVE_DST,
- "Destination Layers Matching", "How to match source and destination layers");
- RNA_def_property_enum_funcs_runtime(prop, NULL, NULL, dt_layers_select_itemf);
-
- prop = RNA_def_enum(ot->srna, "mix_mode", rna_enum_dt_mix_mode_items, CDT_MIX_TRANSFER, "Mix Mode",
- "How to affect destination elements with source values");
- RNA_def_property_enum_funcs_runtime(prop, NULL, NULL, dt_mix_mode_itemf);
- RNA_def_float(ot->srna, "mix_factor", 1.0f, 0.0f, 1.0f, "Mix Factor",
- "Factor to use when applying data to destination (exact behavior depends on mix mode)", 0.0f, 1.0f);
+ PropertyRNA *prop;
+
+ /* Identifiers.*/
+ ot->name = "Transfer Mesh Data";
+ ot->idname = "OBJECT_OT_data_transfer";
+ ot->description =
+ "Transfer data layer(s) (weights, edge sharp, ...) from active to selected meshes";
+
+ /* API callbacks.*/
+ ot->poll = data_transfer_poll;
+ ot->poll_property = data_transfer_poll_property;
+ ot->invoke = WM_menu_invoke;
+ ot->exec = data_transfer_exec;
+ ot->check = data_transfer_check;
+
+ /* Flags.*/
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_USE_EVAL_DATA;
+
+ /* Properties.*/
+ prop = RNA_def_boolean(ot->srna,
+ "use_reverse_transfer",
+ false,
+ "Reverse Transfer",
+ "Transfer from selected objects to active one");
+ RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
+
+ RNA_def_boolean(ot->srna,
+ "use_freeze",
+ false,
+ "Freeze Operator",
+ "Prevent changes to settings to re-run the operator, "
+ "handy to change several things at once with heavy geometry");
+
+ /* Data type to transfer. */
+ ot->prop = RNA_def_enum(
+ ot->srna, "data_type", DT_layer_items, 0, "Data Type", "Which data to transfer");
+ RNA_def_boolean(ot->srna,
+ "use_create",
+ true,
+ "Create Data",
+ "Add data layers on destination meshes if needed");
+
+ /* Mapping methods. */
+ RNA_def_enum(ot->srna,
+ "vert_mapping",
+ rna_enum_dt_method_vertex_items,
+ MREMAP_MODE_VERT_NEAREST,
+ "Vertex Mapping",
+ "Method used to map source vertices to destination ones");
+ RNA_def_enum(ot->srna,
+ "edge_mapping",
+ rna_enum_dt_method_edge_items,
+ MREMAP_MODE_EDGE_NEAREST,
+ "Edge Mapping",
+ "Method used to map source edges to destination ones");
+ RNA_def_enum(ot->srna,
+ "loop_mapping",
+ rna_enum_dt_method_loop_items,
+ MREMAP_MODE_LOOP_NEAREST_POLYNOR,
+ "Face Corner Mapping",
+ "Method used to map source faces' corners to destination ones");
+ RNA_def_enum(ot->srna,
+ "poly_mapping",
+ rna_enum_dt_method_poly_items,
+ MREMAP_MODE_POLY_NEAREST,
+ "Face Mapping",
+ "Method used to map source faces to destination ones");
+
+ /* Mapping options and filtering. */
+ RNA_def_boolean(
+ ot->srna,
+ "use_auto_transform",
+ false,
+ "Auto Transform",
+ "Automatically compute transformation to get the best possible match between source and "
+ "destination meshes (WARNING: results will never be as good as manual matching of objects)");
+ RNA_def_boolean(ot->srna,
+ "use_object_transform",
+ true,
+ "Object Transform",
+ "Evaluate source and destination meshes in global space");
+ RNA_def_boolean(ot->srna,
+ "use_max_distance",
+ false,
+ "Only Neighbor Geometry",
+ "Source elements must be closer than given distance from destination one");
+ prop = RNA_def_float(
+ ot->srna,
+ "max_distance",
+ 1.0f,
+ 0.0f,
+ FLT_MAX,
+ "Max Distance",
+ "Maximum allowed distance between source and destination element, for non-topology mappings",
+ 0.0f,
+ 100.0f);
+ RNA_def_property_subtype(prop, PROP_DISTANCE);
+ prop = RNA_def_float(
+ ot->srna,
+ "ray_radius",
+ 0.0f,
+ 0.0f,
+ FLT_MAX,
+ "Ray Radius",
+ "'Width' of rays (especially useful when raycasting against vertices or edges)",
+ 0.0f,
+ 10.0f);
+ RNA_def_property_subtype(prop, PROP_DISTANCE);
+ prop = RNA_def_float(
+ ot->srna,
+ "islands_precision",
+ 0.1f,
+ 0.0f,
+ 10.0f,
+ "Islands Precision",
+ "Factor controlling precision of islands handling (the higher, the better the results)",
+ 0.0f,
+ 1.0f);
+ RNA_def_property_subtype(prop, PROP_FACTOR);
+
+ /* How to handle multi-layers types of data. */
+ prop = RNA_def_enum(ot->srna,
+ "layers_select_src",
+ rna_enum_dt_layers_select_src_items,
+ DT_LAYERS_ACTIVE_SRC,
+ "Source Layers Selection",
+ "Which layers to transfer, in case of multi-layers types");
+ RNA_def_property_enum_funcs_runtime(prop, NULL, NULL, dt_layers_select_itemf);
+
+ prop = RNA_def_enum(ot->srna,
+ "layers_select_dst",
+ rna_enum_dt_layers_select_dst_items,
+ DT_LAYERS_ACTIVE_DST,
+ "Destination Layers Matching",
+ "How to match source and destination layers");
+ RNA_def_property_enum_funcs_runtime(prop, NULL, NULL, dt_layers_select_itemf);
+
+ prop = RNA_def_enum(ot->srna,
+ "mix_mode",
+ rna_enum_dt_mix_mode_items,
+ CDT_MIX_TRANSFER,
+ "Mix Mode",
+ "How to affect destination elements with source values");
+ RNA_def_property_enum_funcs_runtime(prop, NULL, NULL, dt_mix_mode_itemf);
+ RNA_def_float(
+ ot->srna,
+ "mix_factor",
+ 1.0f,
+ 0.0f,
+ 1.0f,
+ "Mix Factor",
+ "Factor to use when applying data to destination (exact behavior depends on mix mode)",
+ 0.0f,
+ 1.0f);
}
/******************************************************************************/
@@ -617,120 +758,147 @@ void OBJECT_OT_data_transfer(wmOperatorType *ot)
static bool datalayout_transfer_poll(bContext *C)
{
- return (edit_modifier_poll_generic(C, &RNA_DataTransferModifier, (1 << OB_MESH)) || data_transfer_poll(C));
+ return (edit_modifier_poll_generic(C, &RNA_DataTransferModifier, (1 << OB_MESH)) ||
+ data_transfer_poll(C));
}
static int datalayout_transfer_exec(bContext *C, wmOperator *op)
{
- Object *ob_act = ED_object_active_context(C);
- Depsgraph *depsgraph = CTX_data_depsgraph(C);
- Scene *scene_eval = DEG_get_evaluated_scene(depsgraph);
- DataTransferModifierData *dtmd;
-
- dtmd = (DataTransferModifierData *)edit_modifier_property_get(op, ob_act, eModifierType_DataTransfer);
-
- /* If we have a modifier, we transfer data layout from this modifier's source object to active one.
- * Else, we transfer data layout from active object to all selected ones. */
- if (dtmd) {
- Object *ob_src = dtmd->ob_source;
- Object *ob_dst = ob_act;
-
- const bool use_delete = false; /* Never when used from modifier, for now. */
-
- if (!ob_src) {
- return OPERATOR_CANCELLED;
- }
-
- Object *ob_src_eval = DEG_get_evaluated_object(depsgraph, ob_src);
-
- BKE_object_data_transfer_layout(depsgraph, scene_eval, ob_src_eval, ob_dst, dtmd->data_types, use_delete,
- dtmd->layers_select_src, dtmd->layers_select_dst);
-
- DEG_id_tag_update(&ob_dst->id, ID_RECALC_GEOMETRY);
- }
- else {
- Object *ob_src = ob_act;
-
- ListBase ctx_objects;
- CollectionPointerLink *ctx_ob_dst;
-
- const int data_type = RNA_enum_get(op->ptr, "data_type");
- const bool use_delete = RNA_boolean_get(op->ptr, "use_delete");
-
- const int layers_src = RNA_enum_get(op->ptr, "layers_select_src");
- const int layers_dst = RNA_enum_get(op->ptr, "layers_select_dst");
- int layers_select_src[DT_MULTILAYER_INDEX_MAX] = {0};
- int layers_select_dst[DT_MULTILAYER_INDEX_MAX] = {0};
- const int fromto_idx = BKE_object_data_transfer_dttype_to_srcdst_index(data_type);
-
- if (fromto_idx != DT_MULTILAYER_INDEX_INVALID) {
- layers_select_src[fromto_idx] = layers_src;
- layers_select_dst[fromto_idx] = layers_dst;
- }
-
- Object *ob_src_eval = DEG_get_evaluated_object(depsgraph, ob_src);
-
- data_transfer_exec_preprocess_objects(C, op, ob_src, &ctx_objects, false);
-
- for (ctx_ob_dst = ctx_objects.first; ctx_ob_dst; ctx_ob_dst = ctx_ob_dst->next) {
- Object *ob_dst = ctx_ob_dst->ptr.data;
- if (data_transfer_exec_is_object_valid(op, ob_src, ob_dst, false)) {
- BKE_object_data_transfer_layout(depsgraph, scene_eval, ob_src_eval, ob_dst, data_type, use_delete,
- layers_select_src, layers_select_dst);
- }
-
- DEG_id_tag_update(&ob_dst->id, ID_RECALC_GEOMETRY);
- }
-
- BLI_freelistN(&ctx_objects);
- }
-
- WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, NULL);
-
- return OPERATOR_FINISHED;
+ Object *ob_act = ED_object_active_context(C);
+ Depsgraph *depsgraph = CTX_data_depsgraph(C);
+ Scene *scene_eval = DEG_get_evaluated_scene(depsgraph);
+ DataTransferModifierData *dtmd;
+
+ dtmd = (DataTransferModifierData *)edit_modifier_property_get(
+ op, ob_act, eModifierType_DataTransfer);
+
+ /* If we have a modifier, we transfer data layout from this modifier's source object to active one.
+ * Else, we transfer data layout from active object to all selected ones. */
+ if (dtmd) {
+ Object *ob_src = dtmd->ob_source;
+ Object *ob_dst = ob_act;
+
+ const bool use_delete = false; /* Never when used from modifier, for now. */
+
+ if (!ob_src) {
+ return OPERATOR_CANCELLED;
+ }
+
+ Object *ob_src_eval = DEG_get_evaluated_object(depsgraph, ob_src);
+
+ BKE_object_data_transfer_layout(depsgraph,
+ scene_eval,
+ ob_src_eval,
+ ob_dst,
+ dtmd->data_types,
+ use_delete,
+ dtmd->layers_select_src,
+ dtmd->layers_select_dst);
+
+ DEG_id_tag_update(&ob_dst->id, ID_RECALC_GEOMETRY);
+ }
+ else {
+ Object *ob_src = ob_act;
+
+ ListBase ctx_objects;
+ CollectionPointerLink *ctx_ob_dst;
+
+ const int data_type = RNA_enum_get(op->ptr, "data_type");
+ const bool use_delete = RNA_boolean_get(op->ptr, "use_delete");
+
+ const int layers_src = RNA_enum_get(op->ptr, "layers_select_src");
+ const int layers_dst = RNA_enum_get(op->ptr, "layers_select_dst");
+ int layers_select_src[DT_MULTILAYER_INDEX_MAX] = {0};
+ int layers_select_dst[DT_MULTILAYER_INDEX_MAX] = {0};
+ const int fromto_idx = BKE_object_data_transfer_dttype_to_srcdst_index(data_type);
+
+ if (fromto_idx != DT_MULTILAYER_INDEX_INVALID) {
+ layers_select_src[fromto_idx] = layers_src;
+ layers_select_dst[fromto_idx] = layers_dst;
+ }
+
+ Object *ob_src_eval = DEG_get_evaluated_object(depsgraph, ob_src);
+
+ data_transfer_exec_preprocess_objects(C, op, ob_src, &ctx_objects, false);
+
+ for (ctx_ob_dst = ctx_objects.first; ctx_ob_dst; ctx_ob_dst = ctx_ob_dst->next) {
+ Object *ob_dst = ctx_ob_dst->ptr.data;
+ if (data_transfer_exec_is_object_valid(op, ob_src, ob_dst, false)) {
+ BKE_object_data_transfer_layout(depsgraph,
+ scene_eval,
+ ob_src_eval,
+ ob_dst,
+ data_type,
+ use_delete,
+ layers_select_src,
+ layers_select_dst);
+ }
+
+ DEG_id_tag_update(&ob_dst->id, ID_RECALC_GEOMETRY);
+ }
+
+ BLI_freelistN(&ctx_objects);
+ }
+
+ WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, NULL);
+
+ return OPERATOR_FINISHED;
}
static int datalayout_transfer_invoke(bContext *C, wmOperator *op, const wmEvent *event)
{
- if (edit_modifier_invoke_properties(C, op)) {
- return datalayout_transfer_exec(C, op);
- }
- else {
- return WM_menu_invoke(C, op, event);
- }
+ if (edit_modifier_invoke_properties(C, op)) {
+ return datalayout_transfer_exec(C, op);
+ }
+ else {
+ return WM_menu_invoke(C, op, event);
+ }
}
void OBJECT_OT_datalayout_transfer(wmOperatorType *ot)
{
- PropertyRNA *prop;
-
- ot->name = "Transfer Mesh Data Layout";
- ot->description = "Transfer layout of data layer(s) from active to selected meshes";
- ot->idname = "OBJECT_OT_datalayout_transfer";
-
- ot->poll = datalayout_transfer_poll;
- ot->poll_property = data_transfer_poll_property;
- ot->invoke = datalayout_transfer_invoke;
- ot->exec = datalayout_transfer_exec;
- ot->check = data_transfer_check;
-
- /* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_USE_EVAL_DATA;
-
- /* Properties.*/
- edit_modifier_properties(ot);
-
- /* Data type to transfer. */
- ot->prop = RNA_def_enum(ot->srna, "data_type", DT_layer_items, 0, "Data Type", "Which data to transfer");
- RNA_def_boolean(ot->srna, "use_delete", false, "Exact Match",
- "Also delete some data layers from destination if necessary, so that it matches exactly source");
-
- /* How to handle multi-layers types of data. */
- prop = RNA_def_enum(ot->srna, "layers_select_src", rna_enum_dt_layers_select_src_items, DT_LAYERS_ACTIVE_SRC,
- "Source Layers Selection", "Which layers to transfer, in case of multi-layers types");
- RNA_def_property_enum_funcs_runtime(prop, NULL, NULL, dt_layers_select_src_itemf);
-
- prop = RNA_def_enum(ot->srna, "layers_select_dst", rna_enum_dt_layers_select_dst_items, DT_LAYERS_ACTIVE_DST,
- "Destination Layers Matching", "How to match source and destination layers");
- RNA_def_property_enum_funcs_runtime(prop, NULL, NULL, dt_layers_select_dst_itemf);
+ PropertyRNA *prop;
+
+ ot->name = "Transfer Mesh Data Layout";
+ ot->description = "Transfer layout of data layer(s) from active to selected meshes";
+ ot->idname = "OBJECT_OT_datalayout_transfer";
+
+ ot->poll = datalayout_transfer_poll;
+ ot->poll_property = data_transfer_poll_property;
+ ot->invoke = datalayout_transfer_invoke;
+ ot->exec = datalayout_transfer_exec;
+ ot->check = data_transfer_check;
+
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_USE_EVAL_DATA;
+
+ /* Properties.*/
+ edit_modifier_properties(ot);
+
+ /* Data type to transfer. */
+ ot->prop = RNA_def_enum(
+ ot->srna, "data_type", DT_layer_items, 0, "Data Type", "Which data to transfer");
+ RNA_def_boolean(ot->srna,
+ "use_delete",
+ false,
+ "Exact Match",
+ "Also delete some data layers from destination if necessary, so that it matches "
+ "exactly source");
+
+ /* How to handle multi-layers types of data. */
+ prop = RNA_def_enum(ot->srna,
+ "layers_select_src",
+ rna_enum_dt_layers_select_src_items,
+ DT_LAYERS_ACTIVE_SRC,
+ "Source Layers Selection",
+ "Which layers to transfer, in case of multi-layers types");
+ RNA_def_property_enum_funcs_runtime(prop, NULL, NULL, dt_layers_select_src_itemf);
+
+ prop = RNA_def_enum(ot->srna,
+ "layers_select_dst",
+ rna_enum_dt_layers_select_dst_items,
+ DT_LAYERS_ACTIVE_DST,
+ "Destination Layers Matching",
+ "How to match source and destination layers");
+ RNA_def_property_enum_funcs_runtime(prop, NULL, NULL, dt_layers_select_dst_itemf);
}