[Bf-blender-cvs] [c96037c] mesh-transfer-data: Dissociate 'high-level' of data types identifiers from 'low-level' one.
Bastien Montagne
noreply at git.blender.org
Tue Nov 4 17:43:19 CET 2014
Commit: c96037c634dfb3560f1235463219ce75af35796a
Author: Bastien Montagne
Date: Tue Nov 4 17:40:10 2014 +0100
Branches: mesh-transfer-data
https://developer.blender.org/rBc96037c634dfb3560f1235463219ce75af35796a
Dissociate 'high-level' of data types identifiers from 'low-level' one.
This allows us to make `ED_data_transfer` & co handle several data types at once
(again, will be useful for modifier version, especially since we cache item mappings
and such), and fix several litle issues in previous code.
===================================================================
M source/blender/editors/include/ED_object.h
M source/blender/editors/object/object_transfer_data.c
===================================================================
diff --git a/source/blender/editors/include/ED_object.h b/source/blender/editors/include/ED_object.h
index a10d5d3..cc30064 100644
--- a/source/blender/editors/include/ED_object.h
+++ b/source/blender/editors/include/ED_object.h
@@ -229,6 +229,28 @@ void ED_object_check_force_modifiers(struct Main *bmain, struct Scene *scene, st
/* Data transfer. */
+/* Warning, those def are stored in files (TransferData modifier), *DO NOT* modify those values. */
+enum {
+ MDT_DATA_MDEFORMVERT = 1 << 0,
+ MDT_DATA_SHAPEKEY = 1 << 1,
+ MDT_DATA_SKIN = 1 << 2,
+ MDT_DATA_BWEIGHT_VERT = 1 << 3,
+
+ MDT_DATA_SHARP_EDGE = 1 << 8,
+ MDT_DATA_SEAM = 1 << 9,
+ MDT_DATA_CREASE = 1 << 10,
+ MDT_DATA_BWEIGHT_EDGE = 1 << 11,
+ MDT_DATA_FREESTYLE_EDGE = 1 << 12,
+
+ MDT_DATA_UV = 1 << 16,
+ MDT_DATA_SHARP_FACE = 1 << 17,
+ MDT_DATA_FREESTYLE_FACE = 1 << 18,
+
+ MDT_DATA_VCOL = 1 << 24,
+};
+
+int ED_data_transfer_mdtdata_to_cdtype(const int mdtdata);
+
/* How to select data layers, for types supporting multi-layers.
* Here too, some options are highly dependent on type of transferred data! */
enum {
@@ -253,14 +275,14 @@ enum {
};
bool ED_data_transfer(
- struct Scene *scene, struct Object *ob_src, struct Object *ob_dst, const int data_type, const bool use_create,
+ struct Scene *scene, struct Object *ob_src, struct Object *ob_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 precision,
const int fromlayers_select, const int tolayers_select,
const int mix_mode, const float mix_factor, const char *vgroup_name);
bool ED_data_transfer_dm(
struct Scene *scene, struct Object *ob_src, struct Object *ob_dst, struct DerivedMesh *dm_dst,
- const int data_type, const bool use_create,
+ 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,
diff --git a/source/blender/editors/object/object_transfer_data.c b/source/blender/editors/object/object_transfer_data.c
index b4dfcd8..ca8597b 100644
--- a/source/blender/editors/object/object_transfer_data.c
+++ b/source/blender/editors/object/object_transfer_data.c
@@ -63,55 +63,94 @@
#include "object_intern.h"
-#define MDT_DATATYPE_IS_VERT(_dt) ELEM(_dt, CD_FAKE_MDEFORMVERT, CD_FAKE_SHAPEKEY, CD_MVERT_SKIN, CD_FAKE_BWEIGHT)
-#define MDT_DATATYPE_IS_EDGE(_dt) ELEM(_dt, CD_FAKE_CREASE, CD_FAKE_SHARP, CD_FAKE_SEAM, CD_FAKE_BWEIGHT, CD_FREESTYLE_EDGE)
-#define MDT_DATATYPE_IS_POLY(_dt) ELEM(_dt, CD_FAKE_UV, CD_FAKE_SHARP, CD_FREESTYLE_FACE)
-#define MDT_DATATYPE_IS_LOOP(_dt) ELEM(_dt, CD_FAKE_UV, CD_MLOOPCOL)
+#define MDT_DATATYPE_IS_VERT(_dt) ELEM(_dt, MDT_DATA_MDEFORMVERT, MDT_DATA_SHAPEKEY, MDT_DATA_SKIN, \
+ MDT_DATA_BWEIGHT_VERT)
+#define MDT_DATATYPE_IS_EDGE(_dt) ELEM(_dt, MDT_DATA_CREASE, MDT_DATA_SHARP_EDGE, MDT_DATA_SEAM, \
+ MDT_DATA_BWEIGHT_EDGE, MDT_DATA_FREESTYLE_EDGE)
+#define MDT_DATATYPE_IS_POLY(_dt) ELEM(_dt, MDT_DATA_UV, MDT_DATA_SHARP_FACE, MDT_DATA_FREESTYLE_FACE)
+#define MDT_DATATYPE_IS_LOOP(_dt) ELEM(_dt, MDT_DATA_UV, MDT_DATA_VCOL)
-#define MDT_DATATYPE_IS_MULTILAYERS(_dt) ELEM(_dt, CD_FAKE_MDEFORMVERT, CD_FAKE_SHAPEKEY, CD_FAKE_UV, CD_MLOOPCOL)
+#define MDT_DATATYPE_IS_MULTILAYERS(_dt) ELEM(_dt, MDT_DATA_MDEFORMVERT, MDT_DATA_SHAPEKEY, MDT_DATA_UV, MDT_DATA_VCOL)
+
+int ED_data_transfer_mdtdata_to_cdtype(const int mdtdata)
+{
+ switch (mdtdata) {
+ case MDT_DATA_MDEFORMVERT:
+ return CD_FAKE_MDEFORMVERT;
+ case MDT_DATA_SHAPEKEY:
+ return CD_FAKE_SHAPEKEY;
+ case MDT_DATA_SKIN:
+ return CD_MVERT_SKIN;
+ case MDT_DATA_BWEIGHT_VERT:
+ return CD_FAKE_BWEIGHT;
+
+ case MDT_DATA_SHARP_EDGE:
+ return CD_FAKE_SHARP;
+ case MDT_DATA_SEAM:
+ return CD_FAKE_SEAM;
+ case MDT_DATA_CREASE:
+ return CD_FAKE_CREASE;
+ case MDT_DATA_BWEIGHT_EDGE:
+ return CD_FAKE_BWEIGHT;
+ case MDT_DATA_FREESTYLE_EDGE:
+ return CD_FREESTYLE_EDGE;
+
+ case MDT_DATA_UV:
+ return CD_FAKE_UV;
+ case MDT_DATA_SHARP_FACE:
+ return CD_FAKE_SHARP;
+ case MDT_DATA_FREESTYLE_FACE:
+ return CD_FREESTYLE_FACE;
+
+ case MDT_DATA_VCOL:
+ return CD_MLOOPCOL;
+
+ default:
+ BLI_assert(0);
+ }
+ 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... */
static bool mdt_get_layertype_capacity(const int type, bool *r_advanced_mixing, bool *r_threshold)
{
*r_advanced_mixing = false;
*r_threshold = false;
- /* Note: for now we are cool and allow non-fake-like types as well. */
switch (type) {
/* Vertex data */
- case CD_MDEFORMVERT:
- case CD_FAKE_MDEFORMVERT:
+ case MDT_DATA_MDEFORMVERT:
*r_advanced_mixing = true;
*r_threshold = true;
return true;
- case CD_MVERT_SKIN:
+ case MDT_DATA_SKIN:
*r_threshold = true;
return true;
- case CD_FAKE_BWEIGHT:
+ case MDT_DATA_BWEIGHT_VERT:
return true;
/* Edge data */
- case CD_FAKE_SHARP:
+ case MDT_DATA_SHARP_EDGE:
*r_threshold = true;
return true;
- case CD_FAKE_SEAM:
+ case MDT_DATA_SEAM:
*r_threshold = true;
return true;
- case CD_FAKE_CREASE:
+ case MDT_DATA_CREASE:
return true;
-#if 0 /* Already handled with vertices data. */
- case CD_FAKE_BWEIGHT:
+ case MDT_DATA_BWEIGHT_EDGE:
+ return true;
+ case MDT_DATA_FREESTYLE_EDGE:
return true;
-#endif
/* Loop/Poly data */
- case CD_FAKE_UV:
+ case MDT_DATA_UV:
return true;
- case CD_MLOOPCOL:
+ case MDT_DATA_VCOL:
*r_advanced_mixing = true;
*r_threshold = true;
return true;
-#if 0 /* Already handled with vertices data. */
- case CD_FAKE_SHARP:
+ case MDT_DATA_SHARP_FACE:
+ return true;
+ case MDT_DATA_FREESTYLE_FACE:
return true;
-#endif
}
return false;
@@ -121,26 +160,26 @@ static bool mdt_get_layertype_capacity(const int type, bool *r_advanced_mixing,
* Note some are 'fake' ones, i.e. they are not hold by real CDLayers. */
static EnumPropertyItem MDT_layer_items[] = {
{0, "", 0, "Vertex Data", ""},
- {CD_FAKE_MDEFORMVERT, "VGROUP_WEIGHTS", 0, "Vertex Group(s)", "Transfer active or all vertex groups"},
+ {MDT_DATA_MDEFORMVERT, "VGROUP_WEIGHTS", 0, "Vertex Group(s)", "Transfer active or all vertex groups"},
#if 0 /* XXX For now, would like to finish/merge work from 2014 gsoc first. */
- {CD_FAKE_SHAPEKEY, "SHAPEKEYS", 0, "Shapekey(s)", "Transfer active or all shape keys"},
+ {MDT_DATA_SHAPEKEY, "SHAPEKEYS", 0, "Shapekey(s)", "Transfer active or all shape keys"},
#endif
#if 0 /* XXX When SkinModifier is enabled, it seems to erase its own CD_MVERT_SKIN layer from final DM :( */
- {CD_MVERT_SKIN, "SKIN", 0, "Skin Weight", "Transfer skin weights"},
+ {MDT_DATA_SKIN, "SKIN", 0, "Skin Weight", "Transfer skin weights"},
#endif
- {CD_FAKE_BWEIGHT, "BEVEL_WEIGHT", 0, "Bevel Weight", "Transfer bevel weights"},
+ {MDT_DATA_BWEIGHT_VERT, "BEVEL_WEIGHT_VERT", 0, "Bevel Weight", "Transfer bevel weights"},
{0, "", 0, "Edge Data", ""},
- {CD_FAKE_SHARP, "SHARP", 0, "Sharp", "Transfer sharp flag"},
- {CD_FAKE_SEAM, "SEAM", 0, "Seam", "Transfer UV seam flag"},
- {CD_FAKE_CREASE, "CREASE", 0, "Subsurf Crease", "Transfer crease values"},
- {CD_FAKE_BWEIGHT, "BEVEL_WEIGHT", 0, "Bevel Weight", "Transfer bevel weights"},
- {CD_FREESTYLE_EDGE, "FREESTYLE_EDGE", 0, "Freestyle Flag", "Transfer Freestyle edge flag"},
+ {MDT_DATA_SHARP_EDGE, "SHARP_EDGE", 0, "Sharp", "Transfer sharp flag"},
+ {MDT_DATA_SEAM, "SEAM", 0, "Seam", "Transfer UV seam flag"},
+ {MDT_DATA_CREASE, "CREASE", 0, "Subsurf Crease", "Transfer crease values"},
+ {MDT_DATA_BWEIGHT_EDGE, "BEVEL_WEIGHT_EDGE", 0, "Bevel Weight", "Transfer bevel weights"},
+ {MDT_DATA_FREESTYLE_EDGE, "FREESTYLE_EDGE", 0, "Freestyle Flag", "Transfer Freestyle edge flag"},
{0, "", 0, "Face Data", ""},
- {CD_FAKE_UV, "UV", 0, "UVs", "Transfer UV layers"},
- {CD_FAKE_SHARP, "SMOOTH", 0, "Smooth", "Transfer flat/smooth flag"},
- {CD_FREESTYLE_FACE, "FREESTYLE_FACE", 0, "Freestyle Flag", "Transfer Freestyle face flag"},
+ {MDT_DATA_UV, "UV", 0, "UVs", "Transfer UV layers"},
+ {MDT_DATA_SHARP_FACE, "SMOOTH", 0, "Smooth", "Transfer flat/smooth flag"},
+ {MDT_DATA_FREESTYLE_FACE, "FREESTYLE_FACE", 0, "Freestyle Flag", "Transfer Freestyle face flag"},
{0, "", 0, "Face Corner Data", ""},
- {CD_MLOOPCOL, "VCol", 0, "VCol", "Vertex (face corners) colors"},
+ {MDT_DATA_VCOL, "VCOL", 0, "VCol", "Vertex (face corners) colors"},
{0, NULL, 0, NULL, NULL}
};
@@ -281,7 +320,7 @@ static EnumPropertyItem *mdt_fromlayers_select_itemf(
RNA_enum_items_add_value(&item, &totitem, MDT_fromlayers_select_items, MDT_FROMLAYERS_ACTIVE);
RNA_enum_items_add_value(&item, &totitem, MDT_fromlayers_select_items, MDT_FROMLAYERS_ALL);
- if (data_type == CD_FAKE_MDEFORMVERT) {
+ if (data_type == MDT_DATA_MDEFORMVERT) {
Object *ob = CTX_data_active_object(C);
if (BKE_object_pose_armature_get(ob)) {
RNA_enum_items_add_value(&item, &totitem, MDT_fromlayers_select_items, MDT_FROMLAYERS_VGROUP_BONE_SELECTED);
@@ -347,9 +386,9 @@ static bool data_transfer_check(bContext *UNUSED(C), wmOperator *op)
/* ********** */
-static loop_island_compute data_transfer_get_loop_islands_generator(const int data_type)
+static loop_island_compute data_transfer_get_loop_islands_generator(const int cddata_type)
{
- switch (data_type) {
+ switch (cddata_type) {
case CD_FAKE_UV:
return BKE_loop_poly_island_compute_uv;
break;
@@ -407,7 +446,7 @@ static void data_transfer_interp_char(const DataTransferLayerMapping *laymap, vo
/* Helpers to match sources and destinations d
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list