34#include "RNA_prototypes.hh"
54 "Transfer active or all vertex groups"},
64 {
DT_TYPE_SEAM,
"SEAM", 0,
"UV Seam",
"Transfer UV seam mark"},
65 {
DT_TYPE_CREASE,
"CREASE", 0,
"Subdivision Crease",
"Transfer crease values"},
71 "Transfer Freestyle edge mark"},
74 {
DT_TYPE_LNOR,
"CUSTOM_NORMAL", 0,
"Custom Normals",
"Transfer custom normals"},
80 {
DT_TYPE_UV,
"UV", 0,
"UVs",
"Transfer UV layers"},
88 "Transfer Freestyle face mark"},
89 {0,
nullptr, 0,
nullptr,
nullptr},
99 for (
int i = 0;
i < 2;
i++) {
110 for (
int j = 0; j < data_num; j++) {
112 tmp_item.
value = idx++;
134 const int layers_select_dst = reverse_transfer ?
RNA_enum_get(
ptr,
"layers_select_src") :
145 if (ob_src ==
nullptr) {
167 tmp_item.identifier = tmp_item.name = dg->
name;
184 for (
int i = 0;
i < data_num;
i++) {
245 const int layers_select_src = reverse_transfer ?
RNA_enum_get(
ptr,
"layers_select_dst") :
273 if (reverse_transfer) {
278 if (reverse_transfer) {
294 bool support_advanced_mixing, support_threshold;
303 dtdata_type, &support_advanced_mixing, &support_threshold);
305 if (support_threshold) {
312 if (support_advanced_mixing) {
328 const int layers_select_src =
RNA_enum_get(op->
ptr,
"layers_select_src");
347 const bool reverse_transfer)
351 if (reverse_transfer) {
367 "Skipping object '%s', linked or override data '%s' cannot be modified",
382 const bool reverse_transfer)
389 if (reverse_transfer) {
404 "Skipping object '%s', data '%s' has already been processed with a previous object",
418 bool changed =
false;
437 const float islands_precision =
RNA_float_get(op->
ptr,
"islands_precision");
449 SpaceTransform *space_transform = (use_object_transform && !use_auto_transform) ?
450 &space_transform_data :
457 "Operator is frozen, changes to its settings won't take effect until you unfreeze it");
467 if (reverse_transfer) {
468 std::swap(layers_src, layers_dst);
472 layers_select_src[fromto_idx] = layers_src;
473 layers_select_dst[fromto_idx] = layers_dst;
478 int invalid_count = 0;
483 if (reverse_transfer) {
484 std::swap(ob_src, ob_dst);
490 if (space_transform) {
524 if (ob_src != ob_dst) {
529 if (reverse_transfer) {
530 std::swap(ob_src, ob_dst);
539 if (invalid_count > 0) {
541 op->
reports,
RPT_WARNING,
"Failed to transfer mesh data to %d objects", invalid_count);
559 ID *
data =
static_cast<ID *
>((ob) ? ob->
data :
nullptr);
573 bool use_auto_transform =
false;
574 bool use_max_distance =
false;
575 bool use_modifier =
false;
587 if (
STREQ(prop_id,
"modifier")) {
596 if (
STREQ(prop_id,
"use_object_transform")) {
597 if (use_auto_transform) {
601 else if (
STREQ(prop_id,
"max_distance")) {
602 if (!use_max_distance) {
606 else if (
STREQ(prop_id,
"islands_precision")) {
611 else if (
STREQ(prop_id,
"vert_mapping")) {
616 else if (
STREQ(prop_id,
"edge_mapping")) {
621 else if (
STREQ(prop_id,
"loop_mapping")) {
626 else if (
STREQ(prop_id,
"poly_mapping")) {
631 else if (
STR_ELEM(prop_id,
"layers_select_src",
"layers_select_dst")) {
647 if (reverse_transfer) {
649 "Transfer data layer(s) (weights, edge sharp, etc.) from selected meshes to active one");
660 ot->name =
"Transfer Mesh Data";
661 ot->idname =
"OBJECT_OT_data_transfer";
663 "Transfer data layer(s) (weights, edge sharp, etc.) from active to selected meshes";
678 "use_reverse_transfer",
681 "Transfer from selected objects to active one");
688 "Prevent changes to settings to re-run the operator, "
689 "handy to change several things at once with heavy geometry");
693 ot->srna,
"data_type",
DT_layer_items, 0,
"Data Type",
"Which data to transfer");
698 "Add data layers on destination meshes if needed");
706 "Method used to map source vertices to destination ones");
712 "Method used to map source edges to destination ones");
717 "Face Corner Mapping",
718 "Method used to map source faces' corners to destination ones");
724 "Method used to map source faces to destination ones");
729 "use_auto_transform",
732 "Automatically compute transformation to get the best possible match between source and "
733 "destination meshes.\n"
734 "Warning: Results will never be as good as manual matching of objects");
736 "use_object_transform",
739 "Evaluate source and destination meshes in global space");
743 "Only Neighbor Geometry",
744 "Source elements must be closer than given distance from destination one");
752 "Maximum allowed distance between source and destination element, for non-topology mappings",
763 "'Width' of rays (especially useful when raycasting against vertices or edges)",
774 "Factor controlling precision of islands handling (the higher, the better the results)",
784 "Source Layers Selection",
785 "Which layers to transfer, in case of multi-layers types");
793 "Destination Layers Matching",
794 "How to match source and destination layers");
803 "How to affect destination elements with source values");
812 "Factor to use when applying data to destination (exact behavior depends on mix mode)",
843 const bool use_delete =
false;
876 layers_select_src[fromto_idx] = layers_src;
877 layers_select_dst[fromto_idx] = layers_dst;
920 ot->name =
"Transfer Mesh Data Layout";
921 ot->description =
"Transfer layout of data layer(s) from active to selected meshes";
922 ot->idname =
"OBJECT_OT_datalayout_transfer";
938 ot->srna,
"data_type",
DT_layer_items, 0,
"Data Type",
"Which data to transfer");
943 "Also delete some data layers from destination if necessary, so that it matches "
951 "Source Layers Selection",
952 "Which layers to transfer, in case of multi-layers types");
960 "Destination Layers Matching",
961 "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.
eCustomDataMask CD_TYPE_AS_MASK(eCustomDataType type)
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)
int BKE_object_data_transfer_dttype_to_srcdst_index(int dtdata_type)
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])
bool BKE_object_data_transfer_get_dttypes_capacity(int dtdata_types, bool *r_advanced_mixing, bool *r_threshold)
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)
T * DEG_get_evaluated(const Depsgraph *depsgraph, T *id)
#define ID_IS_EDITABLE(_id)
#define ID_IS_OVERRIDE_LIBRARY(_id)
#define CD_MASK_PROP_BYTE_COLOR
#define CD_MASK_PROP_COLOR
@ DT_LAYERS_VGROUP_SRC_BONE_SELECT
@ DT_LAYERS_VGROUP_SRC_BONE_DEFORM
#define DT_DATATYPE_IS_MULTILAYERS(_dt)
@ DT_MULTILAYER_INDEX_MAX
@ DT_MULTILAYER_INDEX_INVALID
#define DT_DATATYPE_IS_LOOP(_dt)
@ MREMAP_MODE_VERT_NEAREST
@ MREMAP_MODE_LOOP_NEAREST_POLYNOR
@ MREMAP_MODE_EDGE_NEAREST
@ MREMAP_MODE_POLY_NEAREST
#define DT_DATATYPE_IS_EDGE(_dt)
#define DT_DATATYPE_IS_FACE(_dt)
@ CDT_MIX_REPLACE_BELOW_THRESHOLD
@ CDT_MIX_REPLACE_ABOVE_THRESHOLD
#define DT_DATATYPE_IS_VERT(_dt)
@ eModifierType_DataTransfer
Object is a sort of wrapper for general info.
#define RNA_ENUM_ITEM_HEADING(name, description)
BMesh const char void * data
BPy_StructRNA * depsgraph
ccl_device_inline float2 mask(const MaskType mask, const float2 a)
static wmOperatorStatus datalayout_transfer_exec(bContext *C, wmOperator *op)
static const EnumPropertyItem * dt_layers_select_src_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *, bool *r_free)
static wmOperatorStatus datalayout_transfer_invoke(bContext *C, wmOperator *op, const wmEvent *event)
bool edit_modifier_invoke_properties(bContext *C, wmOperator *op)
void OBJECT_OT_data_transfer(wmOperatorType *ot)
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)
static wmOperatorStatus data_transfer_exec(bContext *C, wmOperator *op)
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 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)
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_def_property_enum_funcs_runtime(PropertyRNA *prop, EnumPropertyGetFunc getfunc, EnumPropertySetFunc setfunc, EnumPropertyItemFunc itemfunc, EnumPropertyGetTransformFunc get_transform_fn, EnumPropertySetTransformFunc set_transform_fn)
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
struct ReportList * reports
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
wmOperatorStatus WM_menu_invoke(bContext *C, wmOperator *op, const wmEvent *)