Modifiers: Bring back custom data referencing logic

Brings dependency graph evaluation time to similar time than 2.79
for file reported in T55228.
This commit is contained in:
Sergey Sharybin
2018-05-30 17:00:05 +02:00
parent 41fac4fa76
commit 7661f8a65b
5 changed files with 21 additions and 35 deletions

View File

@@ -405,13 +405,19 @@ static Mesh *normalEditModifier_do(NormalEditModifierData *enmd, Object *ob, Mes
}
Mesh *result;
BKE_id_copy_ex(
NULL, &mesh->id, (ID **)&result,
LIB_ID_CREATE_NO_MAIN |
LIB_ID_CREATE_NO_USER_REFCOUNT |
LIB_ID_CREATE_NO_DEG_TAG |
LIB_ID_COPY_NO_PREVIEW,
false);
if (mesh->medge == ((Mesh *)ob->data)->medge) {
/* We need to duplicate data here, otherwise setting custom normals (which may also affect sharp edges) could
* modify org mesh, see T43671. */
BKE_id_copy_ex(
NULL, &mesh->id, (ID **)&result,
LIB_ID_CREATE_NO_MAIN |
LIB_ID_CREATE_NO_USER_REFCOUNT |
LIB_ID_CREATE_NO_DEG_TAG |
LIB_ID_COPY_NO_PREVIEW,
false);
} else {
result = mesh;
}
const int num_verts = result->totvert;
const int num_edges = result->totedge;

View File

@@ -311,10 +311,11 @@ Mesh *get_mesh(
* we really need a copy here. Maybe the CoW ob->data can be directly used. */
BKE_id_copy_ex(
NULL, ob->data, (ID **)&mesh,
LIB_ID_CREATE_NO_MAIN |
LIB_ID_CREATE_NO_USER_REFCOUNT |
LIB_ID_CREATE_NO_DEG_TAG |
LIB_ID_COPY_NO_PREVIEW,
(LIB_ID_CREATE_NO_MAIN |
LIB_ID_CREATE_NO_USER_REFCOUNT |
LIB_ID_CREATE_NO_DEG_TAG |
LIB_ID_COPY_NO_PREVIEW |
LIB_ID_COPY_CD_REFERENCE),
false);
mesh->runtime.deformed_only = 1;
}

View File

@@ -202,14 +202,7 @@ static Mesh *applyModifier(
}
}
Mesh *result;
BKE_id_copy_ex(
NULL, &mesh->id, (ID **)&result,
LIB_ID_CREATE_NO_MAIN |
LIB_ID_CREATE_NO_USER_REFCOUNT |
LIB_ID_CREATE_NO_DEG_TAG |
LIB_ID_COPY_NO_PREVIEW,
false);
Mesh *result = mesh;
if (has_mdef) {
dvert = CustomData_duplicate_referenced_layer(&result->vdata, CD_MDEFORMVERT, numVerts);

View File

@@ -243,14 +243,7 @@ static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, Mes
}
}
Mesh *result;
BKE_id_copy_ex(
NULL, &mesh->id, (ID **)&result,
LIB_ID_CREATE_NO_MAIN |
LIB_ID_CREATE_NO_USER_REFCOUNT |
LIB_ID_CREATE_NO_DEG_TAG |
LIB_ID_COPY_NO_PREVIEW,
false);
Mesh *result = mesh;
if (has_mdef) {
dvert = CustomData_duplicate_referenced_layer(&result->vdata, CD_MDEFORMVERT, numVerts);

View File

@@ -421,14 +421,7 @@ static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, Mes
return mesh;
}
Mesh *result;
BKE_id_copy_ex(
NULL, &mesh->id, (ID **)&result,
LIB_ID_CREATE_NO_MAIN |
LIB_ID_CREATE_NO_USER_REFCOUNT |
LIB_ID_CREATE_NO_DEG_TAG |
LIB_ID_COPY_NO_PREVIEW,
false);
Mesh *result = mesh;
if (has_mdef) {
dvert = CustomData_duplicate_referenced_layer(&result->vdata, CD_MDEFORMVERT, numVerts);