[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