[Bf-blender-cvs] [6f6b61a] mesh-transfer-data: Add early error reporting about mismatched number of items in case of 'Topology' mapping.

Bastien Montagne noreply at git.blender.org
Wed Nov 12 20:50:41 CET 2014


Commit: 6f6b61a9e0fec96916d999be552418684db75d1c
Author: Bastien Montagne
Date:   Wed Nov 12 17:07:54 2014 +0100
Branches: mesh-transfer-data
https://developer.blender.org/rB6f6b61a9e0fec96916d999be552418684db75d1c

Add early error reporting about mismatched number of items in case of 'Topology' mapping.

Use reports system here...

===================================================================

M	source/blender/blenkernel/BKE_data_transfer.h
M	source/blender/blenkernel/intern/data_transfer.c
M	source/blender/editors/object/object_data_transfer.c
M	source/blender/modifiers/intern/MOD_datatransfer.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_data_transfer.h b/source/blender/blenkernel/BKE_data_transfer.h
index c1e376d..4c1691b 100644
--- a/source/blender/blenkernel/BKE_data_transfer.h
+++ b/source/blender/blenkernel/BKE_data_transfer.h
@@ -41,6 +41,7 @@ extern "C" {
 struct Object;
 struct Scene;
 struct SpaceTransform;
+struct ReportList;
 
 /* Warning, those def are stored in files (TransferData modifier), *DO NOT* modify those values. */
 enum {
@@ -117,14 +118,16 @@ bool BKE_data_transfer_mesh(
         const int map_vert_mode, const int map_edge_mode, const int map_loop_mode, const int map_poly_mode,
         struct SpaceTransform *space_transform, const float max_distance, const float precision,
         const int fromlayers_select[DT_MULTILAYER_IDX_MAX], const int tolayers_select[DT_MULTILAYER_IDX_MAX],
-        const int mix_mode, const float mix_factor, const char *vgroup_name, const bool invert_vgroup);
+        const int mix_mode, const float mix_factor, const char *vgroup_name, const bool invert_vgroup,
+        struct ReportList *reports);
 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_loop_mode, const int map_poly_mode,
         struct SpaceTransform *space_transform, const float max_distance, const float ray_radius,
         const int fromlayers_select[DT_MULTILAYER_IDX_MAX], const int tolayers_select[DT_MULTILAYER_IDX_MAX],
-        const int mix_mode, const float mix_factor, const char *vgroup_name, const bool invert_vgroup);
+        const int mix_mode, const float mix_factor, const char *vgroup_name, const bool invert_vgroup,
+        struct ReportList *reports);
 
 #ifdef __cplusplus
 }
diff --git a/source/blender/blenkernel/intern/data_transfer.c b/source/blender/blenkernel/intern/data_transfer.c
index 8967143d..829f793 100644
--- a/source/blender/blenkernel/intern/data_transfer.c
+++ b/source/blender/blenkernel/intern/data_transfer.c
@@ -50,6 +50,7 @@
 #include "BKE_mesh_mapping.h"
 #include "BKE_object.h"
 #include "BKE_object_deform.h"
+#include "BKE_report.h"
 
 #include "data_transfer_intern.h"
 
@@ -737,7 +738,8 @@ bool BKE_data_transfer_dm(
         const int map_vert_mode, const int map_edge_mode, const int map_loop_mode, const int map_poly_mode,
         SpaceTransform *space_transform, const float max_distance, const float ray_radius,
         const int fromlayers_select[DT_MULTILAYER_IDX_MAX], const int tolayers_select[DT_MULTILAYER_IDX_MAX],
-        const int mix_mode, const float mix_factor, const char *vgroup_name, const bool invert_vgroup)
+        const int mix_mode, const float mix_factor, const char *vgroup_name, const bool invert_vgroup,
+        ReportList *reports)
 {
 #define VDATA 0
 #define EDATA 1
@@ -808,6 +810,12 @@ bool BKE_data_transfer_dm(
 			const int num_create = use_create ? num_verts_dst : 0;
 
 			if (!geom_map_init[VDATA]) {
+				if ((map_vert_mode == M2MMAP_MODE_TOPOLOGY) && (num_verts_dst != dm_src->getNumVerts(dm_src))) {
+					BKE_report(reports, RPT_ERROR,
+					           "Source and destination meshes do not have the same amount of vertices, "
+					           "'Topology' mapping cannot be used in this case");
+					return changed;
+				}
 				BKE_dm2mesh_mapping_verts_compute(map_vert_mode, space_transform, max_distance, ray_radius,
 				                                  verts_dst, num_verts_dst, dm_src, &geom_map[VDATA]);
 				geom_map_init[VDATA] = true;
@@ -841,6 +849,12 @@ bool BKE_data_transfer_dm(
 			const int num_create = use_create ? num_edges_dst : 0;
 
 			if (!geom_map_init[EDATA]) {
+				if ((map_edge_mode == M2MMAP_MODE_TOPOLOGY) && (num_edges_dst != dm_src->getNumEdges(dm_src))) {
+					BKE_report(reports, RPT_ERROR,
+					           "Source and destination meshes do not have the same amount of edges, "
+					           "'Topology' mapping cannot be used in this case");
+					return changed;
+				}
 				BKE_dm2mesh_mapping_edges_compute(map_edge_mode, space_transform, max_distance, ray_radius,
 				                                  verts_dst, num_verts_dst, edges_dst, num_edges_dst,
 				                                  dm_src, &geom_map[EDATA]);
@@ -884,6 +898,12 @@ bool BKE_data_transfer_dm(
 			loop_island_compute island_callback = data_transfer_get_loop_islands_generator(cddata_type);
 
 			if (!geom_map_init[LDATA]) {
+				if ((map_loop_mode == M2MMAP_MODE_TOPOLOGY) && (num_loops_dst != dm_src->getNumLoops(dm_src))) {
+					BKE_report(reports, RPT_ERROR,
+					           "Source and destination meshes do not have the same amount of face corners, "
+					           "'Topology' mapping cannot be used in this case");
+					return changed;
+				}
 				BKE_dm2mesh_mapping_loops_compute(map_loop_mode, space_transform, max_distance, ray_radius,
 				                                  verts_dst, num_verts_dst, edges_dst, num_edges_dst,
 				                                  loops_dst, num_loops_dst, polys_dst, num_polys_dst,
@@ -924,6 +944,12 @@ bool BKE_data_transfer_dm(
 			const int num_create = use_create ? num_polys_dst : 0;
 
 			if (!geom_map_init[PDATA]) {
+				if ((map_poly_mode == M2MMAP_MODE_TOPOLOGY) && (num_polys_dst != dm_src->getNumPolys(dm_src))) {
+					BKE_report(reports, RPT_ERROR,
+					           "Source and destination meshes do not have the same amount of faces, "
+					           "'Topology' mapping cannot be used in this case");
+					return changed;
+				}
 				BKE_dm2mesh_mapping_polys_compute(map_poly_mode, space_transform, max_distance, ray_radius,
 				                                  verts_dst, num_verts_dst, loops_dst, num_loops_dst,
 				                                  polys_dst, num_polys_dst, pdata_dst, dm_src, &geom_map[PDATA]);
@@ -972,10 +998,11 @@ bool BKE_data_transfer_mesh(
         const int map_vert_mode, const int map_edge_mode, const int map_loop_mode, const int map_poly_mode,
         SpaceTransform *space_transform, const float max_distance, const float ray_radius,
         const int fromlayers_select[DT_MULTILAYER_IDX_MAX], const int tolayers_select[DT_MULTILAYER_IDX_MAX],
-        const int mix_mode, const float mix_factor, const char *vgroup_name, const bool invert_vgroup)
+        const int mix_mode, const float mix_factor, const char *vgroup_name, const bool invert_vgroup,
+        ReportList *reports)
 {
 	return BKE_data_transfer_dm(scene, ob_src, ob_dst, NULL, data_types, use_create,
 	                            map_vert_mode, map_edge_mode, map_loop_mode, map_poly_mode, space_transform,
 	                            max_distance, ray_radius, fromlayers_select, tolayers_select,
-	                            mix_mode, mix_factor, vgroup_name, invert_vgroup);
+	                            mix_mode, mix_factor, vgroup_name, invert_vgroup, reports);
 }
diff --git a/source/blender/editors/object/object_data_transfer.c b/source/blender/editors/object/object_data_transfer.c
index e1ad6d6..4e19653 100644
--- a/source/blender/editors/object/object_data_transfer.c
+++ b/source/blender/editors/object/object_data_transfer.c
@@ -307,7 +307,7 @@ static int data_transfer_exec(bContext *C, wmOperator *op)
 		if (BKE_data_transfer_mesh(scene, ob_src, ob_dst, data_type, use_create,
 		                           map_vert_mode, map_edge_mode, map_loop_mode, map_poly_mode, 
 		                           space_transform, max_distance, ray_radius, fromlayers_select, tolayers_select,
-		                           mix_mode, mix_factor, NULL, false))
+		                           mix_mode, mix_factor, NULL, false, op->reports))
 		{
 			changed = true;
 		}
diff --git a/source/blender/modifiers/intern/MOD_datatransfer.c b/source/blender/modifiers/intern/MOD_datatransfer.c
index 825e59b..00a614e 100644
--- a/source/blender/modifiers/intern/MOD_datatransfer.c
+++ b/source/blender/modifiers/intern/MOD_datatransfer.c
@@ -42,6 +42,7 @@
 #include "BKE_library.h"
 #include "BKE_mesh_mapping.h"
 #include "BKE_modifier.h"
+#include "BKE_report.h"
 
 #include "MEM_guardedalloc.h"
 #include "MOD_util.h"
@@ -133,6 +134,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
 {
 	DataTransferModifierData *dtmd = (DataTransferModifierData *) md;
 	DerivedMesh *dm = derivedData;
+	ReportList reports;
 
 	const bool use_create = (dtmd->flags & MOD_DATATRANSFER_USE_CREATE) != 0;
 	const bool invert_vgroup = (dtmd->flags & MOD_DATATRANSFER_INVERT_VGROUP) != 0;
@@ -146,11 +148,17 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
 		BLI_SPACE_TRANSFORM_SETUP(space_transform, ob, dtmd->ob_source);
 	}
 
+	BKE_reports_init(&reports, RPT_STORE);
+
 	BKE_data_transfer_dm(md->scene, dtmd->ob_source, ob, dm, dtmd->data_types, use_create,
 	                     dtmd->vmap_mode, dtmd->emap_mode, dtmd->lmap_mode, dtmd->pmap_mode,
 	                     space_transform, max_dist, dtmd->map_ray_radius,
 	                     dtmd->fromlayers_selmode, dtmd->tolayers_selmode,
-	                     dtmd->mix_mode, dtmd->mix_factor, dtmd->defgrp_name, invert_vgroup);
+	                     dtmd->mix_mode, dtmd->mix_factor, dtmd->defgrp_name, invert_vgroup, &reports);
+
+	if (BKE_reports_contain(&reports, RPT_ERROR)) {
+		modifier_setError(md, "%s", BKE_reports_string(&reports, RPT_ERROR));
+	}
 
 	return dm;
 }




More information about the Bf-blender-cvs mailing list