diff options
author | Bastien Montagne <montagne29@wanadoo.fr> | 2015-02-15 20:46:46 +0300 |
---|---|---|
committer | Bastien Montagne <montagne29@wanadoo.fr> | 2015-02-15 21:00:06 +0300 |
commit | a98fc4f8f9bb887b934f999b8988727eb285b6d7 (patch) | |
tree | d08981441a6ec3a82bc68e6bf101d4609e44078c /source/blender/modifiers/intern/MOD_datatransfer.c | |
parent | 1c64543aefd5c78540dc3de5254c0dd54649ca81 (diff) |
Fix T43671: Playing with Mix Factor of Data Transfer Modifier Is Overwritting Data of Base Mesh
The issue was actually affecting all data types that are not regular CDLayer ones, since by default
DerivedMesh references mesh data (verts, edges, etc. - modifying custom normals often implies
modifying edges' sarpness too).
Modfying edge/face sharpness etc. could directly affect the mesh in this case, **bad**!
So we detect whether we are copying data types that may affect non-CDlayers data, and whether
verts array of org dm is same as mesh one - in which case we copy the DM. This avoids
useless copying in most cases.
Note Edit Normals was quite obviously suffering the same issue.
Diffstat (limited to 'source/blender/modifiers/intern/MOD_datatransfer.c')
-rw-r--r-- | source/blender/modifiers/intern/MOD_datatransfer.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/source/blender/modifiers/intern/MOD_datatransfer.c b/source/blender/modifiers/intern/MOD_datatransfer.c index 2dca3218e41..acb58f6b767 100644 --- a/source/blender/modifiers/intern/MOD_datatransfer.c +++ b/source/blender/modifiers/intern/MOD_datatransfer.c @@ -37,6 +37,7 @@ #include "DNA_object_types.h" #include "BKE_customdata.h" +#include "BKE_cdderivedmesh.h" #include "BKE_data_transfer.h" #include "BKE_DerivedMesh.h" #include "BKE_library.h" @@ -152,6 +153,12 @@ static bool isDisabled(ModifierData *md, int UNUSED(useRenderParams)) } #define HIGH_POLY_WARNING 10000 +#define DT_TYPES_AFFECT_MESH ( \ + DT_TYPE_BWEIGHT_VERT | \ + DT_TYPE_BWEIGHT_EDGE | DT_TYPE_CREASE | DT_TYPE_SHARP_EDGE | \ + DT_TYPE_LNOR | \ + DT_TYPE_SHARP_FACE \ +) static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *derivedData, ModifierApplyFlag UNUSED(flag)) @@ -160,6 +167,10 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der DerivedMesh *dm = derivedData; ReportList reports; + /* Only used to check wehther we are operating on org data or not... */ + Mesh *me = ob->data; + MVert *mvert; + const bool invert_vgroup = (dtmd->flags & MOD_DATATRANSFER_INVERT_VGROUP) != 0; const float max_dist = (dtmd->flags & MOD_DATATRANSFER_MAP_MAXDIST) ? dtmd->map_max_distance : FLT_MAX; @@ -171,6 +182,13 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der BLI_SPACE_TRANSFORM_SETUP(space_transform, ob, dtmd->ob_source); } + mvert = dm->getVertArray(dm); + if ((me->mvert == mvert) && (dtmd->data_types & DT_TYPES_AFFECT_MESH)) { + /* We need to duplicate data here, otherwise setting custom normals, edges' shaprness, etc., could + * modify org mesh, see T43671. */ + dm = CDDM_copy(dm); + } + BKE_reports_init(&reports, RPT_STORE); /* Note: no islands precision for now here. */ @@ -190,6 +208,8 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der return dm; } +#undef HIGH_POLY_WARNING +#undef DT_TYPES_AFFECT_MESH ModifierTypeInfo modifierType_DataTransfer = { /* name */ "DataTransfer", |