Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@gmail.com>2019-06-10 16:42:15 +0300
committerBrecht Van Lommel <brechtvanlommel@gmail.com>2019-06-13 21:03:06 +0300
commit15dd2899923093db6c070b4520e0678affe49d09 (patch)
tree31957f85dc9f4963f9f4d53b7ed7fe906e26422c /source/blender/blenkernel/intern/modifier.c
parent09cc318fd679c0b4c3100efbd43985572efe5f49 (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.c19
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);
}
}