Cleanup: Use dedicated function to copy mesh during evaluation process

It is rather fully annoying to have same sets of obscure flags all over.
This commit is contained in:
Sergey Sharybin 2018-08-16 14:20:36 +02:00
parent 50cb9b52bb
commit e19439a169
4 changed files with 21 additions and 35 deletions

View File

@ -117,6 +117,9 @@ struct Mesh *BKE_mesh_new_nomain_from_template(
int verts_len, int edges_len, int tessface_len,
int loops_len, int polys_len);
/* Performs copy for use during evaluation. */
struct Mesh *BKE_mesh_copy_for_eval(struct Mesh *source);
/* These functions construct a new Mesh, contrary to BKE_mesh_from_nurbs which modifies ob itself. */
struct Mesh *BKE_mesh_new_nomain_from_curve(struct Object *ob);
struct Mesh *BKE_mesh_new_nomain_from_curve_displist(struct Object *ob, struct ListBase *dispbase);

View File

@ -1287,13 +1287,7 @@ static Mesh *create_orco_mesh(Object *ob, Mesh *me, BMEditMesh *em, int layer)
mesh = BKE_bmesh_to_mesh_nomain(em->bm, &(struct BMeshToMeshParams){0});
}
else {
BKE_id_copy_ex(
NULL, &me->id, (ID **)&mesh,
(LIB_ID_CREATE_NO_MAIN |
LIB_ID_CREATE_NO_USER_REFCOUNT |
LIB_ID_CREATE_NO_DEG_TAG |
LIB_ID_COPY_CD_REFERENCE),
false);
mesh = BKE_mesh_copy_for_eval(me);
}
orco = get_orco_coords_dm(ob, em, layer, &free);
@ -2088,13 +2082,7 @@ static void mesh_calc_modifiers(
* coordinates (vpaint, etc.)
*/
if (r_deform_mesh) {
BKE_id_copy_ex(
NULL, &me->id, (ID **)r_deform_mesh,
(LIB_ID_CREATE_NO_MAIN |
LIB_ID_CREATE_NO_USER_REFCOUNT |
LIB_ID_CREATE_NO_DEG_TAG |
LIB_ID_COPY_CD_REFERENCE),
false);
*r_deform_mesh = BKE_mesh_copy_for_eval(me);
/* XXX: Is build_shapekey_layers ever even true? This should have crashed long ago... */
BLI_assert(!build_shapekey_layers);
@ -2234,13 +2222,7 @@ static void mesh_calc_modifiers(
}
}
else {
BKE_id_copy_ex(
NULL, &me->id, (ID **)&mesh,
(LIB_ID_CREATE_NO_MAIN |
LIB_ID_CREATE_NO_USER_REFCOUNT |
LIB_ID_CREATE_NO_DEG_TAG |
LIB_ID_COPY_CD_REFERENCE),
false);
mesh = BKE_mesh_copy_for_eval(me);
ASSERT_IS_VALID_MESH(mesh);
// XXX: port to Mesh if build_shapekey_layers can ever be true
@ -2409,13 +2391,7 @@ static void mesh_calc_modifiers(
#endif
}
else {
BKE_id_copy_ex(
NULL, &me->id, (ID **)&final_mesh,
(LIB_ID_CREATE_NO_MAIN |
LIB_ID_CREATE_NO_USER_REFCOUNT |
LIB_ID_CREATE_NO_DEG_TAG |
LIB_ID_COPY_CD_REFERENCE),
false);
final_mesh = BKE_mesh_copy_for_eval(me);
//if (build_shapekey_layers) {
// add_shapekey_layers(final_mesh, me, ob);

View File

@ -695,6 +695,19 @@ Mesh * BKE_mesh_new_nomain_from_template(
CD_MASK_EVERYTHING);
}
Mesh *BKE_mesh_copy_for_eval(struct Mesh *source)
{
Mesh *result;
BKE_id_copy_ex(
NULL, &source->id, (ID **)&result,
(LIB_ID_CREATE_NO_MAIN |
LIB_ID_CREATE_NO_USER_REFCOUNT |
LIB_ID_CREATE_NO_DEG_TAG |
LIB_ID_COPY_CD_REFERENCE),
false);
return result;
}
Mesh *BKE_mesh_copy(Main *bmain, const Mesh *me)
{
Mesh *me_copy;

View File

@ -307,13 +307,7 @@ Mesh *get_multires_mesh(
.flag = MOD_APPLY_USECACHE | MOD_APPLY_IGNORE_SIMPLIFY};
Mesh *result = modifier_applyModifier(&mmd->modifier, &modifier_ctx, deformed_mesh);
if (result == deformed_mesh) {
/* TODO(sergey): De-duplicate with copy in modifier stack. */
BKE_id_copy_ex(NULL, &deformed_mesh->id, (ID **)&result,
(LIB_ID_CREATE_NO_MAIN |
LIB_ID_CREATE_NO_USER_REFCOUNT |
LIB_ID_CREATE_NO_DEG_TAG |
LIB_ID_COPY_CD_REFERENCE),
false);
result = BKE_mesh_copy_for_eval(deformed_mesh);
}
return result;
}