[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