[Bf-blender-cvs] [dc5d503] mesh-transfer-data: Add support for using a vgroup as mix factor.
Bastien Montagne
noreply at git.blender.org
Tue Nov 4 15:49:29 CET 2014
Commit: dc5d503f32a323ae84489794e53031fc80c8bdb1
Author: Bastien Montagne
Date: Tue Nov 4 15:45:45 2014 +0100
Branches: mesh-transfer-data
https://developer.blender.org/rBdc5d503f32a323ae84489794e53031fc80c8bdb1
Add support for using a vgroup as mix factor.
Useless for op version, but must-have for modifier one. Not Yet Tested(c).
===================================================================
M source/blender/blenkernel/BKE_customdata.h
M source/blender/blenkernel/intern/customdata.c
M source/blender/editors/include/ED_object.h
M source/blender/editors/object/object_intern.h
M source/blender/editors/object/object_transfer_data.c
M source/blender/editors/object/object_vgroup.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_customdata.h b/source/blender/blenkernel/BKE_customdata.h
index e523411..5443a9c 100644
--- a/source/blender/blenkernel/BKE_customdata.h
+++ b/source/blender/blenkernel/BKE_customdata.h
@@ -376,7 +376,7 @@ struct Mesh2MeshMapping;
typedef struct DataTransferLayerMapping DataTransferLayerMapping;
typedef void (*cd_datatransfer_interp)(const DataTransferLayerMapping *laymap, void *dest,
- void **sources, const float *weights, const int count);
+ void **sources, const float *weights, const int count, const float mix_factor);
/* Fake CD_LAYERS (those are actually 'real' data stored directly into elements' structs, or otherwise not (directly)
* accessible to usual CDLayer system). */
@@ -425,7 +425,7 @@ typedef struct DataTransferLayerMapping {
int data_type;
int mix_mode;
float mix_factor;
- /* TODO: we may want to add more mixing features, eg based on vgroups? */
+ const float *mix_weights; /* If non-NULL, array of weights, one for each dest item, replaces mix_factor. */
void *data_src; /* Data source array (can be regular CD data, vertices/edges/etc., keyblocks...). */
void *data_dst; /* Data dest array (same type as dat_src). */
diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c
index 4edd89e..23a7a85 100644
--- a/source/blender/blenkernel/intern/customdata.c
+++ b/source/blender/blenkernel/intern/customdata.c
@@ -3612,8 +3612,9 @@ static bool check_bit_flag(const size_t data_size, void *data, const uint64_t fl
}
}
-static void customdata_data_transfer_interp_generic(const DataTransferLayerMapping *laymap, void *data_dst,
- void **sources, const float *weights, const int count)
+static void customdata_data_transfer_interp_generic(
+ const DataTransferLayerMapping *laymap, void *data_dst, void **sources, const float *weights, const int count,
+ const float mix_factor)
{
/* Fake interpolation, we actually copy highest weighted source to dest.
* Note we also handle bitflags here, in which case we rather choose to transfer value of elements totalizing
@@ -3623,7 +3624,6 @@ static void customdata_data_transfer_interp_generic(const DataTransferLayerMappi
const int data_type = laymap->data_type;
const int mix_mode = laymap->mix_mode;
- const float mix_factor = laymap->mix_factor;
size_t data_size;
const uint64_t data_flag = laymap->data_flag;
@@ -3762,6 +3762,7 @@ void CustomData_data_transfer(const Mesh2MeshMapping *m2mmap, const DataTransfer
for (i = 0; i < totelem; i++, data_dst = (char *)data_dst + data_step, mapit++) {
const int nbr_sources = mapit->nbr_sources;
+ const float mix_factor = laymap->mix_weights ? laymap->mix_weights[i] : laymap->mix_factor;
int j;
if (!nbr_sources) {
@@ -3779,7 +3780,7 @@ void CustomData_data_transfer(const Mesh2MeshMapping *m2mmap, const DataTransfer
tmp_data_src[j] = (char *)data_src + data_step * src_idx + data_offset;
}
- interp(laymap, (char *)data_dst + data_offset, tmp_data_src, mapit->weights_src, nbr_sources);
+ interp(laymap, (char *)data_dst + data_offset, tmp_data_src, mapit->weights_src, nbr_sources, mix_factor);
}
MEM_freeN(tmp_data_src);
diff --git a/source/blender/editors/include/ED_object.h b/source/blender/editors/include/ED_object.h
index 0d812ce..a10d5d3 100644
--- a/source/blender/editors/include/ED_object.h
+++ b/source/blender/editors/include/ED_object.h
@@ -256,13 +256,15 @@ bool ED_data_transfer(
struct Scene *scene, struct Object *ob_src, struct Object *ob_dst, const int data_type, 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 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 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 int fromlayers_select, const int tolayers_select,
+ const int mix_mode, const float mix_factor, const char *vgroup_name);
diff --git a/source/blender/editors/object/object_intern.h b/source/blender/editors/object/object_intern.h
index 7b32020..24879f2 100644
--- a/source/blender/editors/object/object_intern.h
+++ b/source/blender/editors/object/object_intern.h
@@ -240,9 +240,9 @@ void OBJECT_OT_vertex_weight_normalize_active_vertex(struct wmOperatorType *ot);
void OBJECT_OT_vertex_weight_copy(struct wmOperatorType *ot);
bool data_transfer_layersmapping_vgroups(
- struct ListBase *r_map, const int mix_mode, const float mix_factor, const int num_create,
- struct Object *ob_src, struct Object *ob_dst, const bool dup_dst,
- struct CustomData *cd_src, struct CustomData *cd_dst, const int fromlayers_select, const int tolayers_select);
+ struct ListBase *r_map, const int mix_mode, const float mix_factor, const float *mix_weights, const int num_create,
+ struct Object *ob_src, struct Object *ob_dst, struct CustomData *cd_src, struct CustomData *cd_dst,
+ const bool dup_dst, const int fromlayers_select, const int tolayers_select);
/* object_warp.c */
void OBJECT_OT_vertex_warp(struct wmOperatorType *ot);
@@ -278,10 +278,10 @@ void OBJECT_OT_data_transfer(struct wmOperatorType *ot);
/* Copied from BKE_customdata.h :( */
typedef void (*cd_datatransfer_interp)(const struct DataTransferLayerMapping *laymap, void *dest,
- void **sources, const float *weights, int count);
+ void **sources, const float *weights, const int count, const float mix_factor);
void data_transfer_layersmapping_add_item(
- struct ListBase *r_map, const int data_type, const int mix_mode, const float mix_factor,
+ struct ListBase *r_map, const int data_type, const int mix_mode, const float mix_factor, const float *mix_weights,
void *data_src, void *data_dst, const int data_n_src, const int data_n_dst,
const size_t elem_size, const size_t data_size, const size_t data_offset, const uint64_t data_flag,
cd_datatransfer_interp interp);
diff --git a/source/blender/editors/object/object_transfer_data.c b/source/blender/editors/object/object_transfer_data.c
index 4fd93a0..b4dfcd8 100644
--- a/source/blender/editors/object/object_transfer_data.c
+++ b/source/blender/editors/object/object_transfer_data.c
@@ -43,6 +43,7 @@
#include "BKE_context.h"
#include "BKE_customdata.h"
+#include "BKE_deform.h"
#include "BKE_mesh_mapping.h"
#include "BKE_DerivedMesh.h"
#include "BKE_object.h"
@@ -358,26 +359,55 @@ static loop_island_compute data_transfer_get_loop_islands_generator(const int da
return NULL;
}
-static void data_transfer_interp_char(const DataTransferLayerMapping *UNUSED(laymap), void *dest,
- void **sources, const float *weights, int count)
+static void data_transfer_interp_char(const DataTransferLayerMapping *laymap, void *dest,
+ void **sources, const float *weights, const int count, const float mix_factor)
{
char **data_src = (char **)sources;
char *data_dst = (char *)dest;
- int i;
- float weight_dst = 0.0f;
+ const int mix_mode = laymap->mix_mode;
+ float val_dst = 0.0f;
+ const float val_dst_org = (float)(*data_dst) / 255.0f;
+
+ int i;
for (i = count; i--;) {
- weight_dst += ((float)(*data_src[i]) / 255.0f) * weights[i];
+ val_dst += ((float)(*data_src[i]) / 255.0f) * weights[i];
}
- *data_dst = (char)(weight_dst * 255.0f);
+ if (mix_mode != CDT_MIX_REPLACE_ALL) {
+ if (((mix_mode == CDT_MIX_REPLACE_ABOVE_THRESHOLD && (val_dst_org <= mix_factor)) ||
+ (mix_mode == CDT_MIX_REPLACE_BELOW_THRESHOLD && (val_dst_org >= mix_factor))))
+ {
+ return; /* Do not affect destination. */
+ }
+ else {
+ switch (mix_mode) {
+ case CDT_MIX_MIX:
+ /* Nothing to do, mere interp is enough here. */;
+ break;
+ case CDT_MIX_ADD:
+ val_dst = val_dst_org + val_dst;
+ break;
+ case CDT_MIX_SUB:
+ val_dst = val_dst_org - val_dst;
+ break;
+ case CDT_MIX_MUL:
+ val_dst = val_dst_org * val_dst;
+ break;
+ }
+ interpf(val_dst, val_dst_org, mix_factor);
+ CLAMP(val_dst, 0.0f, 1.0f);
+ }
+ }
+
+ *data_dst = (char)(val_dst * 255.0f);
}
/* Helpers to match sources and destinations data layers (also handles 'conversions' in CD_FAKE cases). */
void data_transfer_layersmapping_add_item(
- ListBase *r_map, const int data_type, const int mix_mode, const float mix_factor,
+ ListBase *r_map, const int data_type, const int mix_mode, const float mix_factor, const float *mix_weights,
void *data_src, void *data_dst, const int data_n_src, const int data_n_dst,
const size_t elem_size, const size_t data_size, const size_t data_offset, const uint64_t data_flag,
cd_datatransfer_interp interp)
@@ -389,6 +419,7 @@ void data_transfer_layersmapping_add_item(
item->data_type = data_type;
item->mix_mode = mix_mode;
item->mix_factor = mix_factor;
+ item->mix_weights = mix_weights;
item->data_src = data_src;
item->data_dst = data_dst;
@@ -405,15 +436,16 @@ void data_transfer_layersmapping_add_item(
BLI_addtail(r_map, item);
}
-static void data_transfer_layersmapping_add_item_cd(ListBase *r_map, const int data_type,
- const int mix_mode, const float mix_factor, void *data_src, void
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list