[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [58897] branches/ soc-2013-meshdata_transfer: Vertex Color transfer Operator: registering the operator with all the options found in the UV transfer operator
Walid Shouman
eng.walidshouman at gmail.com
Sun Aug 4 07:37:26 CEST 2013
Revision: 58897
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58897
Author: walid
Date: 2013-08-04 05:37:25 +0000 (Sun, 04 Aug 2013)
Log Message:
-----------
Vertex Color transfer Operator: registering the operator with all the options found in the UV transfer operator
Modified Paths:
--------------
branches/soc-2013-meshdata_transfer/release/scripts/startup/bl_ui/space_view3d_toolbar.py
branches/soc-2013-meshdata_transfer/source/blender/bmesh/tools/bmesh_data_transfer.c
branches/soc-2013-meshdata_transfer/source/blender/bmesh/tools/bmesh_data_transfer.h
branches/soc-2013-meshdata_transfer/source/blender/editors/mesh/mesh_data.c
branches/soc-2013-meshdata_transfer/source/blender/editors/mesh/mesh_intern.h
branches/soc-2013-meshdata_transfer/source/blender/editors/mesh/mesh_ops.c
Modified: branches/soc-2013-meshdata_transfer/release/scripts/startup/bl_ui/space_view3d_toolbar.py
===================================================================
--- branches/soc-2013-meshdata_transfer/release/scripts/startup/bl_ui/space_view3d_toolbar.py 2013-08-04 04:59:09 UTC (rev 58896)
+++ branches/soc-2013-meshdata_transfer/release/scripts/startup/bl_ui/space_view3d_toolbar.py 2013-08-04 05:37:25 UTC (rev 58897)
@@ -116,6 +116,7 @@
col.operator("object.shape_key_transfer_new", text="Transfer Shapekeys (new)")
col.operator("mesh.uv_transfer_new", text="Transfer UVs (new)")
+ col.operator("mesh.vertex_color_transfer_new", text="Transfer Colors (new)")
class VIEW3D_PT_tools_rigidbody(View3DPanel, Panel):
Modified: branches/soc-2013-meshdata_transfer/source/blender/bmesh/tools/bmesh_data_transfer.c
===================================================================
--- branches/soc-2013-meshdata_transfer/source/blender/bmesh/tools/bmesh_data_transfer.c 2013-08-04 04:59:09 UTC (rev 58896)
+++ branches/soc-2013-meshdata_transfer/source/blender/bmesh/tools/bmesh_data_transfer.c 2013-08-04 05:37:25 UTC (rev 58897)
@@ -1607,7 +1607,6 @@
tmp_weight = MEM_mallocN(sizeof(*tmp_weight) * exp_vert_per_face, "tmp_weight bmesh_data_transfer.c");
if (replace_mode == APPEND_GROUPS) {
- //add 1 to skip the basis
src_lay_start = 0;
src_lay_end = tot_layer_src;
dst_lay_start = tot_layer_dst - tot_layer_src;
@@ -2319,8 +2318,7 @@
return true;
}
-bool BM_mesh_vertex_color_copy(BMesh *bm_src, BMesh* bm_dst,ST_ShapekeyGroupMode replace_mode, int *act_shapekey_lay,
- float tmp_mat[4][4])
+bool BM_mesh_vertex_color_copy(BMesh *bm_src, BMesh* bm_dst, ReplaceGroupMode replace_mode, float tmp_mat[4][4])
{
//-----uv dependent variables
BMLoop *l, *l2; //used for iterating the destination's loops
@@ -2382,27 +2380,25 @@
//its unlikely to have faces with more than a certain number of vertices ...
//we'll later reallocate only if this threshold got exceeded
tmp_weight = MEM_mallocN(sizeof(*tmp_weight) * exp_vert_per_face, "tmp_weight bmesh_data_transfer.c");
- if (replace_mode == ST_APPEND_SHAPEKEY_GROUPS) {
- //add 1 to skip the basis
+ if (replace_mode == APPEND_GROUPS) {
src_lay_start = 0;
src_lay_end = tot_layer_src;
dst_lay_start = tot_layer_dst - tot_layer_src;
dst_lay_end = tot_layer_dst;
}
- else if ((replace_mode == ST_REPLACE_ENOUGH_SHAPEKEY_GROUPS) || (replace_mode == ST_REPLACE_ALL_SHAPEKEY_GROUPS)) {
+ else if ((replace_mode == REPLACE_ENOUGH_GROUPS) || (replace_mode == REPLACE_ALL_GROUPS)) {
src_lay_start = 0;
src_lay_end = tot_layer_src;
dst_lay_start = 0;
dst_lay_end = tot_layer_src;
}
- else if (replace_mode == ST_REPLACE_ACTIVE_SHAPEKEY_GROUP) {
- //passed shapekey reperesents the # of shapekeys (starts from one), however lay_start uses it as an index
- src_lay_start = act_shapekey_lay[0] - 1;
- src_lay_end = act_shapekey_lay[0];
- dst_lay_start = act_shapekey_lay[1] - 1;
- dst_lay_end = act_shapekey_lay[1];
+ else if (replace_mode == REPLACE_ACTIVE_GROUP) {
+ src_lay_start = CustomData_get_active_layer_index(&bm_src->ldata, CD_MLOOPCOL);
+ src_lay_end = src_lay_start + 1; //stopping condition
+ dst_lay_start = CustomData_get_active_layer_index(&bm_dst->ldata, CD_MLOOPCOL);
+ dst_lay_end = dst_lay_start + 1;
}
for (src_lay_iter = src_lay_start, dst_lay_iter = dst_lay_start; src_lay_iter < src_lay_end;
Modified: branches/soc-2013-meshdata_transfer/source/blender/bmesh/tools/bmesh_data_transfer.h
===================================================================
--- branches/soc-2013-meshdata_transfer/source/blender/bmesh/tools/bmesh_data_transfer.h 2013-08-04 04:59:09 UTC (rev 58896)
+++ branches/soc-2013-meshdata_transfer/source/blender/bmesh/tools/bmesh_data_transfer.h 2013-08-04 05:37:25 UTC (rev 58897)
@@ -70,7 +70,7 @@
void BM_mesh_shapekey_copy_index(BMesh *bm_src, BMesh *bm_dst);
bool BM_mesh_vertex_group_copy(BMesh *bm_src, BMesh* bm_dst,ST_ShapekeyGroupMode replace_mode, int *act_shapekey_lay,
float tmp_mat[4][4]);
-bool BM_mesh_vertex_color_copy(BMesh *bm_src, BMesh* bm_dst,ST_ShapekeyGroupMode replace_mode, int *act_shapekey_lay,
- float tmp_mat[4][4]);
+bool BM_mesh_vertex_color_copy(BMesh *bm_src, BMesh* bm_dst, ReplaceGroupMode replace_mode, float tmp_mat[4][4]);
+
#endif /* __BMESH_DATA_TRANSFER_H__ */
Modified: branches/soc-2013-meshdata_transfer/source/blender/editors/mesh/mesh_data.c
===================================================================
--- branches/soc-2013-meshdata_transfer/source/blender/editors/mesh/mesh_data.c 2013-08-04 04:59:09 UTC (rev 58896)
+++ branches/soc-2013-meshdata_transfer/source/blender/editors/mesh/mesh_data.c 2013-08-04 05:37:25 UTC (rev 58897)
@@ -747,7 +747,154 @@
return false;
}
}
+static bool ED_mesh_vertex_color_transfer(Object *ob_dst, Object *ob_src, bContext *UNUSED(C), Scene *UNUSED(scene), wmOperator * op)
+{
+ Mesh *me_dst, *me_src;
+ BMesh *bm_dst, *bm_src;
+ float UNUSED(tolerance) = RNA_float_get(op->ptr, "tolerance");
+ float UNUSED(radius_interp) = RNA_float_get(op->ptr, "interp_radius");
+ int UNUSED(interp_pow) = RNA_int_get(op->ptr, "interp_power");
+ bool UNUSED(interp_normals) = RNA_boolean_get(op->ptr, "interp_normals");
+ int UNUSED(no_pow) = RNA_int_get(op->ptr, "normals_power");
+ ReplaceGroupMode replace_mode = RNA_enum_get(op->ptr, "replace_mode");
+ TransferMode transfer_mode = RNA_enum_get(op->ptr, "transfer_mode");
+
+ int num_src_lay, num_dst_lay;
+
+ int i;
+
+ float tmp_mat[4][4];
+
+ int CD_src;
+ int active_dst, active_src;
+ char *src_name;
+
+ invert_m4_m4(ob_src->imat, ob_src->obmat);
+ mul_m4_m4m4(tmp_mat, ob_src->imat, ob_dst->obmat);
+
+ me_dst = ob_dst->data;
+ me_src = ob_src->data;
+
+ //manipulating the layers first as its interface uses the Mesh structure not the BMesh
+ num_src_lay = CustomData_number_of_layers(&me_src->ldata, CD_MLOOPCOL);
+ num_dst_lay = CustomData_number_of_layers(&me_dst->ldata, CD_MLOOPCOL);
+
+ if (num_src_lay < 1) {
+ //the source should have UV layers
+ BKE_report(op->reports, RPT_ERROR,
+ "Transfer failed no color groups were found (source mesh should have -at least- UV group)");
+
+ return false;
+ }
+
+ if (replace_mode == REPLACE_ENOUGH_GROUPS) {
+
+ //add layers as needed
+ i = num_src_lay - num_dst_lay;
+ while (i > 0) {
+ ED_mesh_uv_texture_add(me_dst, NULL, true);
+ i--;
+ }
+ CD_src = CustomData_get_layer_index(&me_src->ldata, CD_MLOOPCOL);
+ //copy the names
+ for (i = 0; i < num_src_lay; ++i) {
+
+ src_name = me_src->ldata.layers[CD_src + i].name;
+ CustomData_set_layer_name(&me_dst->ldata, CD_MLOOPCOL, i, src_name);
+ }
+ }
+
+ //we'll tell the copy function to start copying from # of source layers from the end of the dst layers
+ else if (replace_mode == APPEND_GROUPS)
+ {
+ CD_src = CustomData_get_layer_index(&me_src->ldata, CD_MLOOPCOL);
+ for (i = 0; i < num_src_lay; ++i) {
+
+ src_name = me_src->ldata.layers[CD_src + i].name;
+ //append uv layer with the src names
+ ED_mesh_uv_texture_add(me_dst, src_name, true);
+ }
+ }
+
+ else if (replace_mode == REPLACE_ALL_GROUPS)
+ {
+ i = num_dst_lay;
+ while (i > 0) {
+ i--;
+ ED_mesh_uv_texture_remove_index(me_dst, i);
+ }
+
+ CD_src = CustomData_get_layer_index(&me_src->ldata, CD_MLOOPCOL);
+ for (i = 0; i < num_src_lay; ++i) {
+ src_name = me_src->ldata.layers[CD_src + i].name;
+ //add uv layer with the src name
+ ED_mesh_uv_texture_add(me_dst, src_name, true);
+ }
+ }
+
+ else if (replace_mode == REPLACE_ACTIVE_GROUP) {
+
+ //find the source active layer
+ active_src = CustomData_get_active_layer_index(&me_src->ldata, CD_MLOOPCOL);
+ active_dst = CustomData_get_active_layer_index(&me_dst->ldata, CD_MLOOPCOL);
+
+ CD_src = CustomData_get_layer_index(&me_src->ldata, CD_MLOOPCOL);
+
+ if (num_src_lay == 0) { //empty destination
+ src_name = me_src->ldata.layers[CD_src + active_src].name;
+
+ //add uv layer with the src name
+ ED_mesh_uv_texture_add(me_dst, src_name, true);
+
+ //make the added layer the active one
+ ///what about the MTEXPOLY
+ CustomData_set_layer_active(&me_dst->ldata, CD_MLOOPCOL, 0);
+ }
+
+ else { //destination has layers (accordingly there's a selected layer)
+
+ src_name = me_src->ldata.layers[CD_src + active_src].name;
+
+ CustomData_set_layer_name(&me_dst->ldata, CD_MLOOPCOL, active_dst, src_name);
+ }
+ }
+
+ //allocate space
+ bm_src = BM_mesh_create(&bm_mesh_allocsize_default);
+ bm_dst = BM_mesh_create(&bm_mesh_allocsize_default);
+
+ BM_mesh_bm_from_me(bm_src, me_src, TRUE, true, 0); //TRUE -> should transfer shapekeys too!!
+ BM_mesh_bm_from_me(bm_dst, me_dst, TRUE, true, 0);
+
+ if (transfer_mode == PROJECTION_TRANSFER) {
+ if (!BM_mesh_vertex_color_copy(bm_src, bm_dst, replace_mode, tmp_mat)) {
+ return false;
+ }
+ }
+ //*******copy based on nearest vertex
+ else if (transfer_mode == SPATIAL_TRANSFER) {
+ BKE_report(op->reports, RPT_ERROR,
+ "Spatial transfer is not supported yet, the projection transfer would be a better choice :D");
+
+/* if (!BM_mesh_vertex_color_copy2(bm_src, bm_dst, tolerance, radius_interp, interp_pow, no_pow, interp_normals)) {
+ return false;
+ }
+*/ }
+
+
+ //transfer the BMesh back to Mesh
+ BM_mesh_bm_to_me(bm_src, me_src, FALSE);
+ BM_mesh_bm_to_me(bm_dst, me_dst, TRUE);
+
+ //free the BMesh
+ BM_mesh_free(bm_src);
+ BM_mesh_free(bm_dst);
+
+ return true;
+
+}
+
/*********************** UV texture operators ************************/
static int layers_poll(bContext *C)
@@ -1043,6 +1190,92 @@
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
+static int vertex_color_transfer_exec(bContext *C, wmOperator * op)
+{
+ Scene *scene = CTX_data_scene(C);
+ Object *ob_act = CTX_data_active_object(C);
+ int fail = 0;
+
+ bool transfer_first_to_act = true;
+
+ FromToActive from_active = RNA_enum_get(op->ptr, "from_to_active");
+
+ /* Macro to loop through selected objects.*/
+ CTX_DATA_BEGIN (C, Object *, ob_slc, selected_editable_objects)
+ {
+ //if the selected isn't the active object
+ if (ob_act != ob_slc) {
+
+ if (from_active == TO_ACTIVE) {
+
+ //if many objects were selected within this mode ... we should copy only from the first
+ //notice that ob_slc priority isn't set by order of selection!
+ if (transfer_first_to_act == true) {
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list