34#include "RNA_prototypes.hh"
54 "Transfer active or all vertex groups"},
56 {
DT_TYPE_SHAPEKEY,
"SHAPEKEYS", 0,
"Shapekey(s)",
"Transfer active or all shape keys"},
61 {
DT_TYPE_SKIN,
"SKIN", 0,
"Skin Weight",
"Transfer skin weights"},
72 {
DT_TYPE_SEAM,
"SEAM", 0,
"UV Seam",
"Transfer UV seam mark"},
73 {
DT_TYPE_CREASE,
"CREASE", 0,
"Subdivision Crease",
"Transfer crease values"},
79 "Transfer Freestyle edge mark"},
82 {
DT_TYPE_LNOR,
"CUSTOM_NORMAL", 0,
"Custom Normals",
"Transfer custom normals"},
88 {
DT_TYPE_UV,
"UV", 0,
"UVs",
"Transfer UV layers"},
96 "Transfer Freestyle face mark"},
97 {0,
nullptr, 0,
nullptr,
nullptr},
101 eCustomDataMask mask,
107 for (
int i = 0; i < 2; i++) {
118 for (
int j = 0; j < data_num; j++) {
120 tmp_item.
value = idx++;
142 const int layers_select_dst = reverse_transfer ?
RNA_enum_get(
ptr,
"layers_select_src") :
153 if (ob_src ==
nullptr) {
175 tmp_item.identifier = tmp_item.name = dg->
name;
195 for (
int i = 0; i < data_num; i++) {
256 const int layers_select_src = reverse_transfer ?
RNA_enum_get(
ptr,
"layers_select_dst") :
284 if (reverse_transfer) {
289 if (reverse_transfer) {
305 bool support_advanced_mixing, support_threshold;
314 dtdata_type, &support_advanced_mixing, &support_threshold);
316 if (support_threshold) {
323 if (support_advanced_mixing) {
339 const int layers_select_src =
RNA_enum_get(op->
ptr,
"layers_select_src");
358 const bool reverse_transfer)
362 if (reverse_transfer) {
373 mesh =
static_cast<Mesh *
>(ob->
data);
378 "Skipping object '%s', linked or override data '%s' cannot be modified",
381 mesh->id.tag &= ~ID_TAG_DOIT;
393 const bool reverse_transfer)
400 if (reverse_transfer) {
404 mesh =
static_cast<Mesh *
>(ob_dst->
data);
406 mesh->
id.
tag &= ~ID_TAG_DOIT;
415 "Skipping object '%s', data '%s' has already been processed with a previous object",
429 bool changed =
false;
448 const float islands_precision =
RNA_float_get(op->
ptr,
"islands_precision");
460 SpaceTransform *space_transform = (use_object_transform && !use_auto_transform) ?
461 &space_transform_data :
468 "Operator is frozen, changes to its settings won't take effect until you unfreeze it");
478 if (reverse_transfer) {
479 std::swap(layers_src, layers_dst);
483 layers_select_src[fromto_idx] = layers_src;
484 layers_select_dst[fromto_idx] = layers_dst;
492 if (reverse_transfer) {
493 std::swap(ob_src, ob_dst);
499 if (space_transform) {
531 if (reverse_transfer) {
532 std::swap(ob_src, ob_dst);
555 ID *data =
static_cast<ID *
>((ob) ? ob->
data :
nullptr);
556 return (ob !=
nullptr && ob->
type ==
OB_MESH && data !=
nullptr);
569 bool use_auto_transform =
false;
570 bool use_max_distance =
false;
571 bool use_modifier =
false;
583 if (
STREQ(prop_id,
"modifier")) {
592 if (
STREQ(prop_id,
"use_object_transform")) {
593 if (use_auto_transform) {
597 else if (
STREQ(prop_id,
"max_distance")) {
598 if (!use_max_distance) {
602 else if (
STREQ(prop_id,
"islands_precision")) {
607 else if (
STREQ(prop_id,
"vert_mapping")) {
612 else if (
STREQ(prop_id,
"edge_mapping")) {
617 else if (
STREQ(prop_id,
"loop_mapping")) {
622 else if (
STREQ(prop_id,
"poly_mapping")) {
627 else if (
STR_ELEM(prop_id,
"layers_select_src",
"layers_select_dst")) {
643 if (reverse_transfer) {
645 "Transfer data layer(s) (weights, edge sharp, etc.) from selected meshes to active one");
656 ot->
name =
"Transfer Mesh Data";
657 ot->
idname =
"OBJECT_OT_data_transfer";
659 "Transfer data layer(s) (weights, edge sharp, etc.) from active to selected meshes";
674 "use_reverse_transfer",
677 "Transfer from selected objects to active one");
684 "Prevent changes to settings to re-run the operator, "
685 "handy to change several things at once with heavy geometry");
694 "Add data layers on destination meshes if needed");
702 "Method used to map source vertices to destination ones");
708 "Method used to map source edges to destination ones");
713 "Face Corner Mapping",
714 "Method used to map source faces' corners to destination ones");
720 "Method used to map source faces to destination ones");
725 "use_auto_transform",
728 "Automatically compute transformation to get the best possible match between source and "
729 "destination meshes.\n"
730 "Warning: Results will never be as good as manual matching of objects");
732 "use_object_transform",
735 "Evaluate source and destination meshes in global space");
739 "Only Neighbor Geometry",
740 "Source elements must be closer than given distance from destination one");
748 "Maximum allowed distance between source and destination element, for non-topology mappings",
759 "'Width' of rays (especially useful when raycasting against vertices or edges)",
770 "Factor controlling precision of islands handling (the higher, the better the results)",
780 "Source Layers Selection",
781 "Which layers to transfer, in case of multi-layers types");
788 "Destination Layers Matching",
789 "How to match source and destination layers");
797 "How to affect destination elements with source values");
806 "Factor to use when applying data to destination (exact behavior depends on mix mode)",
837 const bool use_delete =
false;
870 layers_select_src[fromto_idx] = layers_src;
871 layers_select_dst[fromto_idx] = layers_dst;
912 ot->
name =
"Transfer Mesh Data Layout";
913 ot->
description =
"Transfer layout of data layer(s) from active to selected meshes";
914 ot->
idname =
"OBJECT_OT_datalayout_transfer";
935 "Also delete some data layers from destination if necessary, so that it matches "
943 "Source Layers Selection",
944 "Which layers to transfer, in case of multi-layers types");
951 "Destination Layers Matching",
952 "How to match source and destination layers");
Depsgraph * CTX_data_ensure_evaluated_depsgraph(const bContext *C)
Main * CTX_data_main(const bContext *C)
bool CTX_data_selected_editable_objects(const bContext *C, blender::Vector< PointerRNA > *list)
CustomData interface, see also DNA_customdata_types.h.
@ CDT_MIX_REPLACE_BELOW_THRESHOLD
@ CDT_MIX_REPLACE_ABOVE_THRESHOLD
const char * CustomData_get_layer_name(const CustomData *data, eCustomDataType type, int n)
const CustomData_MeshMasks CD_MASK_BAREMESH
int CustomData_number_of_layers(const CustomData *data, eCustomDataType type)
#define CD_TYPE_AS_MASK(_type)
int BKE_object_data_transfer_dttype_to_srcdst_index(int dtdata_type)
#define DT_DATATYPE_IS_MULTILAYERS(_dt)
bool BKE_object_data_transfer_mesh(struct Depsgraph *depsgraph, struct Object *ob_src, struct Object *ob_dst, int data_types, bool use_create, int map_vert_mode, int map_edge_mode, int map_loop_mode, int map_face_mode, struct SpaceTransform *space_transform, bool auto_transform, float max_distance, float ray_radius, float islands_handling_precision, const int fromlayers_select[DT_MULTILAYER_INDEX_MAX], const int tolayers_select[DT_MULTILAYER_INDEX_MAX], int mix_mode, float mix_factor, const char *vgroup_name, bool invert_vgroup, struct ReportList *reports)
void BKE_object_data_transfer_layout(struct Depsgraph *depsgraph, struct Object *ob_src, struct Object *ob_dst, int data_types, bool use_delete, const int fromlayers_select[DT_MULTILAYER_INDEX_MAX], const int tolayers_select[DT_MULTILAYER_INDEX_MAX])
#define DT_DATATYPE_IS_LOOP(_dt)
@ DT_LAYERS_VGROUP_SRC_BONE_SELECT
@ DT_LAYERS_VGROUP_SRC_BONE_DEFORM
#define DT_DATATYPE_IS_EDGE(_dt)
bool BKE_object_data_transfer_get_dttypes_capacity(int dtdata_types, bool *r_advanced_mixing, bool *r_threshold)
@ DT_MULTILAYER_INDEX_MAX
@ DT_MULTILAYER_INDEX_INVALID
#define DT_DATATYPE_IS_FACE(_dt)
#define DT_DATATYPE_IS_VERT(_dt)
@ MREMAP_MODE_VERT_NEAREST
@ MREMAP_MODE_LOOP_NEAREST_POLYNOR
@ MREMAP_MODE_EDGE_NEAREST
@ MREMAP_MODE_POLY_NEAREST
General operations, lookup, etc. for blender objects.
Mesh * BKE_object_get_evaluated_mesh_no_subsurf(const Object *object_eval)
Object * BKE_object_pose_armature_get(Object *ob)
void BKE_reportf(ReportList *reports, eReportType type, const char *format,...) ATTR_PRINTF_FORMAT(3
void BKE_report(ReportList *reports, eReportType type, const char *message)
#define BLI_SPACE_TRANSFORM_SETUP(data, local, target)
void DEG_id_tag_update(ID *id, unsigned int flags)
void DEG_relations_tag_update(Main *bmain)
Object * DEG_get_evaluated_object(const Depsgraph *depsgraph, Object *object)
#define ID_IS_EDITABLE(_id)
#define ID_IS_OVERRIDE_LIBRARY(_id)
#define CD_MASK_PROP_BYTE_COLOR
#define CD_MASK_PROP_COLOR
@ eModifierType_DataTransfer
Object is a sort of wrapper for general info.
#define RNA_ENUM_ITEM_HEADING(name, description)
const Depsgraph * depsgraph
static const EnumPropertyItem * dt_layers_select_src_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *, bool *r_free)
static int data_transfer_exec(bContext *C, wmOperator *op)
bool edit_modifier_invoke_properties(bContext *C, wmOperator *op)
void OBJECT_OT_data_transfer(wmOperatorType *ot)
static int datalayout_transfer_exec(bContext *C, wmOperator *op)
void OBJECT_OT_datalayout_transfer(wmOperatorType *ot)
static std::string data_transfer_get_description(bContext *, wmOperatorType *, PointerRNA *ptr)
bool edit_modifier_poll_generic(bContext *C, StructRNA *rna_type, int obtype_flag, bool is_editmode_allowed, bool is_liboverride_allowed)
ModifierData * edit_modifier_property_get(wmOperator *op, Object *ob, int type)
Object * context_active_object(const bContext *C)
static const EnumPropertyItem * dt_layers_select_dst_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *, bool *r_free)
static bool data_transfer_poll(bContext *C)
static const EnumPropertyItem DT_layer_items[]
static bool data_transfer_exec_is_object_valid(wmOperator *op, Object *ob_src, Object *ob_dst, const bool reverse_transfer)
static void dt_add_vcol_layers(const CustomData *cdata, eCustomDataMask mask, EnumPropertyItem **r_item, int *r_totitem)
static const EnumPropertyItem * dt_layers_select_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *prop, bool *r_free)
static void data_transfer_exec_preprocess_objects(bContext *C, wmOperator *op, Object *ob_src, Vector< PointerRNA > *ctx_objects, const bool reverse_transfer)
static bool datalayout_transfer_poll(bContext *C)
static bool data_transfer_check(bContext *, wmOperator *op)
static const EnumPropertyItem * dt_mix_mode_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *, bool *r_free)
static int datalayout_transfer_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static bool data_transfer_poll_property(const bContext *, wmOperator *op, const PropertyRNA *prop)
void edit_modifier_properties(wmOperatorType *ot)
PropertyRNA * RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
bool RNA_property_is_set(PointerRNA *ptr, PropertyRNA *prop)
void RNA_property_enum_set(PointerRNA *ptr, PropertyRNA *prop, int value)
bool RNA_property_boolean_get(PointerRNA *ptr, PropertyRNA *prop)
float RNA_float_get(PointerRNA *ptr, const char *name)
int RNA_property_enum_get(PointerRNA *ptr, PropertyRNA *prop)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
int RNA_enum_get(PointerRNA *ptr, const char *name)
const char * RNA_property_identifier(const PropertyRNA *prop)
PropertyRNA * RNA_def_float(StructOrFunctionRNA *cont_, const char *identifier, const float default_value, const float hardmin, const float hardmax, const char *ui_name, const char *ui_description, const float softmin, const float softmax)
void RNA_def_property_enum_funcs_runtime(PropertyRNA *prop, EnumPropertyGetFunc getfunc, EnumPropertySetFunc setfunc, EnumPropertyItemFunc itemfunc)
PropertyRNA * RNA_def_enum(StructOrFunctionRNA *cont_, const char *identifier, const EnumPropertyItem *items, const int default_value, const char *ui_name, const char *ui_description)
void RNA_enum_item_end(EnumPropertyItem **items, int *totitem)
void RNA_enum_item_add(EnumPropertyItem **items, int *totitem, const EnumPropertyItem *item)
PropertyRNA * RNA_def_boolean(StructOrFunctionRNA *cont_, const char *identifier, const bool default_value, const char *ui_name, const char *ui_description)
void RNA_def_property_flag(PropertyRNA *prop, PropertyFlag flag)
void RNA_enum_item_add_separator(EnumPropertyItem **items, int *totitem)
void RNA_def_property_subtype(PropertyRNA *prop, PropertySubType subtype)
void RNA_enum_items_add_value(EnumPropertyItem **items, int *totitem, const EnumPropertyItem *item, int value)
const EnumPropertyItem rna_enum_dt_method_loop_items[]
const EnumPropertyItem rna_enum_dt_method_edge_items[]
const EnumPropertyItem rna_enum_dt_method_poly_items[]
const EnumPropertyItem rna_enum_dt_mix_mode_items[]
const EnumPropertyItem rna_enum_dt_layers_select_src_items[]
const EnumPropertyItem rna_enum_dt_method_vertex_items[]
const EnumPropertyItem rna_enum_dt_layers_select_dst_items[]
struct Object * ob_source
bool(* poll_property)(const bContext *C, wmOperator *op, const PropertyRNA *prop) ATTR_WARN_UNUSED_RESULT
bool(* poll)(bContext *C) ATTR_WARN_UNUSED_RESULT
std::string(* get_description)(bContext *C, wmOperatorType *ot, PointerRNA *ptr)
bool(* check)(bContext *C, wmOperator *op)
int(* invoke)(bContext *C, wmOperator *op, const wmEvent *event) ATTR_WARN_UNUSED_RESULT
int(* exec)(bContext *C, wmOperator *op) ATTR_WARN_UNUSED_RESULT
struct ReportList * reports
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
int WM_menu_invoke(bContext *C, wmOperator *op, const wmEvent *)