diff options
author | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2019-09-16 11:45:49 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2019-09-19 12:32:35 +0300 |
commit | e7a514369fe700dcc5a1fe433c8f709ed9595ded (patch) | |
tree | 52ccedf52f694bf0be9c2ee10687ece24c58acd8 /source/blender/blenkernel/intern/mesh.c | |
parent | 5516e52fad046d648241409df01730079370e99b (diff) |
Modifiers: every modifier now copies mesh settings, fixing texture space issues
Modifier stack evaluation would copy mesh settings other than mesh topology
automatically, outside of the individual modifier evaluation. This leads to hard
to understand code, and makes it unclear which settings are available in following
modifiers, and which only after the entire stack is evaluated.
Now every modifier is responsible to ensure the mesh it outputs preserves materials,
texture space and other settings, or alters them as needed.
Fixes T64739: incorrect texture space for various modifiers
Differential Revision: https://developer.blender.org/D5808
Diffstat (limited to 'source/blender/blenkernel/intern/mesh.c')
-rw-r--r-- | source/blender/blenkernel/intern/mesh.c | 51 |
1 files changed, 41 insertions, 10 deletions
diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c index c108ff90850..20c221d5e28 100644 --- a/source/blender/blenkernel/intern/mesh.c +++ b/source/blender/blenkernel/intern/mesh.c @@ -659,6 +659,35 @@ Mesh *BKE_mesh_new_nomain( return mesh; } +/* Copy user editable settings that we want to preserve through the modifier stack + * or operations where a mesh with new topology is created based on another mesh. */ +void BKE_mesh_copy_settings(Mesh *me_dst, const Mesh *me_src) +{ + /* Copy general settings. */ + me_dst->editflag = me_src->editflag; + me_dst->flag = me_src->flag; + me_dst->smoothresh = me_src->smoothresh; + me_dst->remesh_voxel_size = me_src->remesh_voxel_size; + me_dst->remesh_mode = me_src->remesh_mode; + + /* Copy texture space. */ + me_dst->texflag = me_src->texflag; + if (me_dst->bb) { + MEM_freeN(me_dst->bb); + } + me_dst->bb = MEM_dupallocN(me_src->bb); + copy_v3_v3(me_dst->loc, me_src->loc); + copy_v3_v3(me_dst->rot, me_src->rot); + copy_v3_v3(me_dst->size, me_src->size); + + /* Copy materials. */ + if (me_dst->mat != NULL) { + MEM_freeN(me_dst->mat); + } + me_dst->mat = MEM_dupallocN(me_src->mat); + me_dst->totcol = me_src->totcol; +} + Mesh *BKE_mesh_new_nomain_from_template_ex(const Mesh *me_src, int verts_len, int edges_len, @@ -672,7 +701,6 @@ Mesh *BKE_mesh_new_nomain_from_template_ex(const Mesh *me_src, Mesh *me_dst = BKE_id_new_nomain(ID_ME, NULL); - me_dst->mat = MEM_dupallocN(me_src->mat); me_dst->mselect = MEM_dupallocN(me_dst->mselect); me_dst->totvert = verts_len; @@ -682,8 +710,7 @@ Mesh *BKE_mesh_new_nomain_from_template_ex(const Mesh *me_src, me_dst->totpoly = polys_len; me_dst->cd_flag = me_src->cd_flag; - me_dst->editflag = me_src->editflag; - me_dst->texflag = me_src->texflag; + BKE_mesh_copy_settings(me_dst, me_src); CustomData_copy(&me_src->vdata, &me_dst->vdata, mask.vmask, CD_CALLOC, verts_len); CustomData_copy(&me_src->edata, &me_dst->edata, mask.emask, CD_CALLOC, edges_len); @@ -772,18 +799,24 @@ BMesh *BKE_mesh_to_bmesh(Mesh *me, }); } -Mesh *BKE_mesh_from_bmesh_nomain(BMesh *bm, const struct BMeshToMeshParams *params) +Mesh *BKE_mesh_from_bmesh_nomain(BMesh *bm, + const struct BMeshToMeshParams *params, + const Mesh *me_settings) { BLI_assert(params->calc_object_remap == false); Mesh *mesh = BKE_id_new_nomain(ID_ME, NULL); BM_mesh_bm_to_me(NULL, bm, mesh, params); + BKE_mesh_copy_settings(mesh, me_settings); return mesh; } -Mesh *BKE_mesh_from_bmesh_for_eval_nomain(BMesh *bm, const CustomData_MeshMasks *cd_mask_extra) +Mesh *BKE_mesh_from_bmesh_for_eval_nomain(BMesh *bm, + const CustomData_MeshMasks *cd_mask_extra, + const Mesh *me_settings) { Mesh *mesh = BKE_id_new_nomain(ID_ME, NULL); BM_mesh_bm_to_me_for_eval(bm, mesh, cd_mask_extra); + BKE_mesh_copy_settings(mesh, me_settings); return mesh; } @@ -792,9 +825,10 @@ Mesh *BKE_mesh_from_bmesh_for_eval_nomain(BMesh *bm, const CustomData_MeshMasks */ Mesh *BKE_mesh_from_editmesh_with_coords_thin_wrap(BMEditMesh *em, const CustomData_MeshMasks *data_mask, - float (*vertexCos)[3]) + float (*vertexCos)[3], + const Mesh *me_settings) { - Mesh *me = BKE_mesh_from_bmesh_for_eval_nomain(em->bm, data_mask); + Mesh *me = BKE_mesh_from_bmesh_for_eval_nomain(em->bm, data_mask, me_settings); /* Use editmesh directly where possible. */ me->runtime.is_original = true; if (vertexCos) { @@ -1949,9 +1983,6 @@ void BKE_mesh_eval_geometry(Depsgraph *depsgraph, Mesh *mesh) { DEG_debug_print_eval(depsgraph, __func__, mesh->id.name, mesh); BKE_mesh_texspace_calc(mesh); - /* Clear autospace flag in evaluated mesh, so that texspace does not get recomputed when bbox is - * (e.g. after modifiers, etc.) */ - mesh->texflag &= ~ME_AUTOSPACE; /* We are here because something did change in the mesh. This means we can not trust the existing * evaluated mesh, and we don't know what parts of the mesh did change. So we simply delete the * evaluated mesh and let objects to re-create it with updated settings. */ |