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;
 }

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to