Commit: c8a57a33273adfed6667f9bf6450b1bf4e8b7f6d
Author: Bastien Montagne
Date:   Wed Nov 5 13:26:46 2014 +0100
Branches: mesh-transfer-data
https://developer.blender.org/rBc8a57a33273adfed6667f9bf6450b1bf4e8b7f6d

Basic, incomplete version of data transfer modifier (WIP).

And some cleanup/fixes/refactor/enhancements found/needed while writing 
modifier itself.

===================================================================

M       release/scripts/startup/bl_ui/properties_data_modifier.py
M       source/blender/blenkernel/BKE_data_transfer.h
M       source/blender/blenkernel/BKE_deform.h
M       source/blender/blenkernel/intern/data_transfer.c
M       source/blender/blenkernel/intern/deform.c
M       source/blender/editors/object/object_data_transfer.c
M       source/blender/editors/space_outliner/outliner_draw.c
M       source/blender/makesdna/DNA_modifier_types.h
M       source/blender/makesrna/RNA_enum_types.h
M       source/blender/makesrna/intern/rna_modifier.c
M       source/blender/modifiers/CMakeLists.txt
M       source/blender/modifiers/MOD_modifiertypes.h
A       source/blender/modifiers/intern/MOD_datatransfer.c
M       source/blender/modifiers/intern/MOD_util.c

===================================================================

diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py 
b/release/scripts/startup/bl_ui/properties_data_modifier.py
index efc430d..0039d9a 100644
--- a/release/scripts/startup/bl_ui/properties_data_modifier.py
+++ b/release/scripts/startup/bl_ui/properties_data_modifier.py
@@ -1225,6 +1225,65 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
 
         col.prop(md, "material_offset", text="Material Offset")
 
+    def DATA_TRANSFER(self, layout, ob, md):
+        row = layout.row(align=True)
+        row.prop(md, "ob_source")
+        sub = row.row(align=True)
+        sub.active = bool(md.ob_source)
+        sub.prop(md, "use_object_transform", text="", icon='GROUP')
+
+        layout.separator()
+
+        col = layout.column()
+        split = col.split(0.66)
+        subcol = split.column()
+        subcol.label("Vertex Mapping:")
+        subcol.prop(md, "vert_mapping", text="")
+        subcol = split.column()
+        subcol.prop(md, "data_types_verts")
+
+        layout.separator()
+
+        col = layout.column()
+        split = col.split(0.66)
+        subcol = split.column()
+        subcol.label("Edge Mapping:")
+        subcol.prop(md, "edge_mapping", text="")
+        subcol = split.column()
+        subcol.prop(md, "data_types_edges")
+
+        layout.separator()
+        col = layout.column()
+        split = col.split(0.66)
+        subcol = split.column()
+        subcol.label("Face Corner Mapping:")
+        subcol.prop(md, "loop_mapping", text="")
+        subcol = split.column()
+        subcol.prop(md, "data_types_loops")
+
+        layout.separator()
+        col = layout.column()
+        split = col.split(0.66)
+        subcol = split.column()
+        subcol.label("Face Mapping:")
+        subcol.prop(md, "poly_mapping", text="")
+        subcol = split.column()
+        subcol.prop(md, "data_types_polys")
+
+        layout.separator()
+
+        split = layout.split()
+        col = split.column()
+        col.prop(md, "mix_mode")
+        col.prop(md, "mix_factor")
+        col = split.column()
+        col.prop(md, "use_create")
+        row = col.row(align=True)
+        row.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
+        sub = row.row(align=True)
+        sub.active = bool(md.vertex_group)
+        sub.prop(md, "invert_vertex_group", text="", icon='ARROW_LEFTRIGHT')
+
 
 if __name__ == "__main__":  # only for live edit.
     bpy.utils.register_module(__name__)
diff --git a/source/blender/blenkernel/BKE_data_transfer.h 
b/source/blender/blenkernel/BKE_data_transfer.h
index ad6175e..f7a28e1 100644
--- a/source/blender/blenkernel/BKE_data_transfer.h
+++ b/source/blender/blenkernel/BKE_data_transfer.h
@@ -36,6 +36,8 @@
 extern "C" {
 #endif
 
+#include "BKE_customdata.h"
+
 struct Object;
 struct Scene;
 struct SpaceTransform;
@@ -60,9 +62,11 @@ enum {
        DT_DATA_VCOL                        = 1 << 24,
 };
 
+CustomDataMask BKE_data_transfer_dttypes_to_cdmask(const int dtdata_types);
+bool BKE_data_transfer_get_dttypes_capacity(
+        const int dtdata_types, bool *r_advanced_mixing, bool *r_threshold);
+
 int BKE_data_transfer_dttype_to_cdtype(const int dtdata_type);
-bool BKE_data_transfer_get_dttype_capacity(
-        const int dtdata_type, bool *r_advanced_mixing, bool *r_threshold);
 
 #define DT_DATATYPE_IS_VERT(_dt) ELEM(_dt, DT_DATA_MDEFORMVERT, 
DT_DATA_SHAPEKEY, DT_DATA_SKIN,  \
                                            DT_DATA_BWEIGHT_VERT)
@@ -102,14 +106,14 @@ bool BKE_data_transfer_mesh(
         const int map_vert_mode, const int map_edge_mode, const int 
map_poly_mode, const int map_loop_mode,
         struct SpaceTransform *space_transform, const float max_distance, 
const float precision,
         const int fromlayers_select, const int tolayers_select,
-        const int mix_mode, const float mix_factor, const char *vgroup_name);
+        const int mix_mode, const float mix_factor, const char *vgroup_name, 
const bool invert_vgroup);
 bool BKE_data_transfer_dm(
         struct Scene *scene, struct Object *ob_src, struct Object *ob_dst, 
struct DerivedMesh *dm_dst,
         const int data_types, const bool use_create,
         const int map_vert_mode, const int map_edge_mode, const int 
map_poly_mode, const int map_loop_mode,
         struct SpaceTransform *space_transform, const float max_distance, 
const float ray_radius,
         const int fromlayers_select, const int tolayers_select,
-        const int mix_mode, const float mix_factor, const char *vgroup_name);
+        const int mix_mode, const float mix_factor, const char *vgroup_name, 
const bool invert_vgroup);
 
 #ifdef __cplusplus
 }
diff --git a/source/blender/blenkernel/BKE_deform.h 
b/source/blender/blenkernel/BKE_deform.h
index f34e443..0831203 100644
--- a/source/blender/blenkernel/BKE_deform.h
+++ b/source/blender/blenkernel/BKE_deform.h
@@ -91,16 +91,16 @@ void defvert_normalize_lock_map(struct MDeformVert *dvert,
 
 /* Utilities to 'extract' a given vgroup into a simple float array, for verts, 
but also edges/polys/loops. */
 void BKE_defvert_extract_vgroup_to_vertweights(
-        struct MDeformVert *dvert, const int defgroup, const int num_verts, 
float *r_weights);
+        struct MDeformVert *dvert, const int defgroup, const int num_verts, 
float *r_weights, const bool invert_vgroup);
 void BKE_defvert_extract_vgroup_to_edgeweights(
         struct MDeformVert *dvert, const int defgroup, const int num_verts, 
struct MEdge *edges, const int num_edges,
-        float *r_weights);
+        float *r_weights, const bool invert_vgroup);
 void BKE_defvert_extract_vgroup_to_loopweights(
         struct MDeformVert *dvert, const int defgroup, const int num_verts, 
struct MLoop *loops, const int num_loops,
-        float *r_weights);
+        float *r_weights, const bool invert_vgroup);
 void BKE_defvert_extract_vgroup_to_polyweights(
         struct MDeformVert *dvert, const int defgroup, const int num_verts, 
struct MLoop *loops, const int num_loops,
-        struct MPoly *polys, const int num_polys, float *r_weights);
+        struct MPoly *polys, const int num_polys, float *r_weights, const bool 
invert_vgroup);
 
 /* utility function, note that MAX_VGROUP_NAME chars is the maximum string 
length since its only
  * used with defgroups currently */
diff --git a/source/blender/blenkernel/intern/data_transfer.c 
b/source/blender/blenkernel/intern/data_transfer.c
index 5525046..9e98c2c 100644
--- a/source/blender/blenkernel/intern/data_transfer.c
+++ b/source/blender/blenkernel/intern/data_transfer.c
@@ -31,6 +31,7 @@
 
 #include "MEM_guardedalloc.h"
 
+#include "DNA_customdata_types.h"
 #include "DNA_meshdata_types.h"
 #include "DNA_mesh_types.h"
 #include "DNA_object_types.h"
@@ -53,6 +54,104 @@
 #include "data_transfer_intern.h"
 
 
+CustomDataMask BKE_data_transfer_dttypes_to_cdmask(const int dtdata_types)
+{
+       CustomDataMask cddata_mask = 0;
+       int i;
+
+       for (i = 0; i < 32; i++) {
+               const int dtdata_type = 1 << i;
+               int cddata_type;
+
+               if (!(dtdata_types & dtdata_type)) {
+                       continue;
+               }
+
+               cddata_type = BKE_data_transfer_dttype_to_cdtype(dtdata_type);
+               if (!(cddata_type & CD_FAKE)) {
+                       cddata_mask |= 1LL << cddata_type;
+               }
+               else if (cddata_type == CD_FAKE_MDEFORMVERT) {
+                       cddata_mask |= CD_MASK_MDEFORMVERT;  /* Exception for 
vgroups :/ */
+               }
+               else if (cddata_type == CD_FAKE_UV) {
+                       cddata_mask |= CD_MASK_MTEXPOLY | CD_MASK_MLOOPUV;
+               }
+       }
+
+       return cddata_mask;
+}
+
+/* Check what can do each layer type (if it is actually handled by 
transferdata, if it supports advanced mixing... */
+bool BKE_data_transfer_get_dttypes_capacity(
+        const int dtdata_types, bool *r_advanced_mixing, bool *r_threshold)
+{
+       int i;
+       bool ret = false;
+
+       *r_advanced_mixing = false;
+       *r_threshold = false;
+
+       for (i = 0; (i < 32) && !(ret && *r_advanced_mixing && *r_threshold); 
i++) {
+               const int dtdata_type = 1 << i;
+
+               if (!(dtdata_types & dtdata_type)) {
+                       continue;
+               }
+
+               switch (dtdata_type) {
+               /* Vertex data */
+                       case DT_DATA_MDEFORMVERT:
+                               *r_advanced_mixing = true;
+                               *r_threshold = true;
+                               ret = true;
+                               break;
+                       case DT_DATA_SKIN:
+                               *r_threshold = true;
+                               ret = true;
+                               break;
+                       case DT_DATA_BWEIGHT_VERT:
+                               ret = true;
+                               break;
+               /* Edge data */
+                       case DT_DATA_SHARP_EDGE:
+                               *r_threshold = true;
+                               ret = true;
+                               break;
+                       case DT_DATA_SEAM:
+                               *r_threshold = true;
+                               ret = true;
+                               break;
+                       case DT_DATA_CREASE:
+                               ret = true;
+                               break;
+                       case DT_DATA_BWEIGHT_EDGE:
+                               ret = true;
+                               break;
+                       case DT_DATA_FREESTYLE_EDGE:
+                               ret = true;
+                               break;
+               /* Loop/Poly data */
+                       case DT_DATA_UV:
+                               ret = true;
+                               break;
+                       case DT_DATA_VCOL:
+                               *r_advanced_mixing = true;
+                               *r_threshold = true;
+                               ret = true;
+                               break;
+                       case DT_DATA_SHARP_FACE:
+                               ret = true;
+                               break;
+                       case DT_DATA_FREESTYLE_FACE:
+                               ret = true;
+                               break;
+               }
+       }
+
+       return ret;
+}
+
 int BKE_data_transfer_dttype_to_cdtype(const int dtdata_type)
 {
        switch (dtdata_type) {
@@ -92,52 +191,6 @@ int BKE_data_transfer_dttype_to_cdtype(const int 
dtdata_type)
        return 0;  /* Should never be reached! */
 }
 
-/* Check what can do each layer type (if it is actually handled by 
transferdata, if it supports advanced mixing... */
-bool BKE_data_transfer_get_dttype_capacity(
-        const int dtdata_type, bool *r_advanced_mixing, bool *r_threshold)
-{
-       *r_advanced_mixing = false;
-       *r_threshold = false;
-       switch (dtdata_type) {
-       /* Vertex data */
-               case DT_DATA_MDEFORMVERT:
-                       *r_advanced_mixing = true;
-                       *r_threshold = true;
-                       return true;
-               case DT_DATA_SKIN:
-                       *r_threshold = true;
-                       return true;
-               case DT_DATA_BWEIGHT_VERT:
-                       return true;
-       /* Edge data */
-               case DT_DATA_SHARP_EDGE:
-                       *r_threshold = true;
-                       return true;
-               case DT_DATA_SEAM:
-                       *r_threshold = true;
-                       return true;
-               case DT_DATA_CREASE:
-                       return true;
-               case DT_DATA_BWEIGHT_EDGE:
-                       return true;
-               case DT_DATA_FREESTYLE_EDGE:
-                       return true;
-       /* Loop/Poly data */
-               case DT_DATA_UV:
-                       return true;
-               case DT_DATA_VCOL:
-                       *r_advanced_mixing = true;
-                       *r_threshold = true;
-                       return true;
-               case DT_DATA_SHARP_FACE:
-                       return tr

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to