Mesh Transfer Data
Mesh transfer data (data here being either real CD layers, like e.g. skinning weights, UVs, etc., or 'fake' ones, like e.g. vgroups, shapekeys, but also edge crease, smooth/sharp/seam flags, etc.) is subdivided in several sub-modules:
- Mapping between mesh elements (verts, edges, polys or loops), in BKE's mesh_mapping.
- Mapping between data layers (for non-singleton data types), mostly handled in ED_object and BKE's customdata areas.
- Transfer of single data layer, mostly handled in BKE's customdata area.
Additional possibilities (only relevant for a subset of data types) are barely sketched up currently:
- A way to filter which elements of destination we actually want to affect (currently, all, also the possibility to only affect those below a given threshold - could also add e.g. vgroup-based selection, etc.).
- A way to alter destination elements' data in other ways than mere replace (add/sub/mul/div/etc.).
All this is designed to be both easy to setup (code-wise) for simple types, and yet flexible enough to be usable by complex/weird data types like vgroups and shapekeys. For now, it is only expected to work in Object/modifier contexts, not quite sure whether having this in BMesh would be that much useful?
This patch is by no mean ready for review, it only has a few elements implemented (currently, basic edge sharp/seam flags, and crease values, as well as vgroups, are 'working'), and those who are are not really tested yet, so this is a mere proof of concept. The low-level design of the whole stuff should be rather OK, though.
Mesh Elements Mapping
This part is rather independent. Currently, vertices and edges mappings are implemented (but not really tested yet, think will have to write some gtests for that anyway). Note I'm not sure all proposed mapping modes are useful, and most likely we can imagine others too - but this is easy to add afterwards, so for now only plan to finish basic ampping for polys and loops.
Note mapping supports a distance threshold, to prevent geometry to far away from each other to match.
Data Layers Mapping
This is handled by a struct defined in BKE_customdata, but filled in ED_object code. Each instance of DataTransferLayerMapping contains all data needed to execute the data transfer for each element of the mesh mapping.
object_transfer_data.c handles the generation of those data layers mapping instance for basic types (usual CDLayers, but also bitflags and simple data like edge crease), complex types like vgroups and shapekeys are handled by dedicated helpers in there own files - trying to keep code well ordered.
Transfer of Single Data Layer
This is a low-level simple func in BKE_customdata, that executes the data transfer itself, including weighted interpolation if needed. It expects pre-computed inputs (mesh elements' and data layers' mappings).
High Level
ED_data_transfer is the high-level interface to all this, used by the OBJECT_OT_data_transfer operator. Once again, not all features are implemented yet, by far.