diff options
author | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2019-06-10 16:42:15 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2019-06-13 21:03:06 +0300 |
commit | 15dd2899923093db6c070b4520e0678affe49d09 (patch) | |
tree | 31957f85dc9f4963f9f4d53b7ed7fe906e26422c /source/blender/blenkernel/intern/modifier.c | |
parent | 09cc318fd679c0b4c3100efbd43985572efe5f49 (diff) |
Mesh: don't compute CD_ORCO layer when there are no deforming modifiers
This saves memory and evaluation time for simple static meshes with e.g. a
subdivision surface modifier. If no CD_ORCO layer exists then we assume the
actual vertex coordinates are equal to the original undeformed coordinates.
Diffstat (limited to 'source/blender/blenkernel/intern/modifier.c')
-rw-r--r-- | source/blender/blenkernel/intern/modifier.c | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c index 43a5e1d6592..24ba7209619 100644 --- a/source/blender/blenkernel/intern/modifier.c +++ b/source/blender/blenkernel/intern/modifier.c @@ -530,13 +530,14 @@ bool modifier_isEnabled(const struct Scene *scene, ModifierData *md, int require CDMaskLink *modifiers_calcDataMasks(struct Scene *scene, Object *ob, ModifierData *md, - const CustomData_MeshMasks *dataMask, + CustomData_MeshMasks *final_datamask, int required_mode, ModifierData *previewmd, const CustomData_MeshMasks *previewmask) { CDMaskLink *dataMasks = NULL; CDMaskLink *curr, *prev; + bool have_deform_modifier = false; /* build a list of modifier data requirements in reverse order */ for (; md; md = md->next) { @@ -545,6 +546,10 @@ CDMaskLink *modifiers_calcDataMasks(struct Scene *scene, curr = MEM_callocN(sizeof(CDMaskLink), "CDMaskLink"); if (modifier_isEnabled(scene, md, required_mode)) { + if (mti->type == eModifierTypeType_OnlyDeform) { + have_deform_modifier = true; + } + if (mti->requiredDataMask) { mti->requiredDataMask(ob, md, &curr->mask); } @@ -554,11 +559,21 @@ CDMaskLink *modifiers_calcDataMasks(struct Scene *scene, } } + if (!have_deform_modifier) { + /* Don't create orco layer when there is no deformation, we fall + * back to regular vertex coordinates */ + curr->mask.vmask &= ~CD_MASK_ORCO; + } + /* prepend new datamask */ curr->next = dataMasks; dataMasks = curr; } + if (!have_deform_modifier) { + final_datamask->vmask &= ~CD_MASK_ORCO; + } + /* build the list of required data masks - each mask in the list must * include all elements of the masks that follow it * @@ -570,7 +585,7 @@ CDMaskLink *modifiers_calcDataMasks(struct Scene *scene, CustomData_MeshMasks_update(&curr->mask, &prev->mask); } else { - CustomData_MeshMasks_update(&curr->mask, dataMask); + CustomData_MeshMasks_update(&curr->mask, final_datamask); } } |