[Bf-blender-cvs] [c8a57a3] mesh-transfer-data: Basic, incomplete version of data transfer modifier (WIP).

Bastien Montagne noreply at git.blender.org
Wed Nov 5 20:31:09 CET 2014


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. @@




More information about the Bf-blender-cvs mailing list