From 4823cac212328fa73dc966f5ffccf7de48a48501 Mon Sep 17 00:00:00 2001 From: Nicholas Bishop Date: Sat, 2 Dec 2006 07:58:53 +0000 Subject: [PATCH] Fix for bug #5319, multiresolution mesh - inconsistent hide behavior Multires operations now pay attention to vertex flags, so both selection and hiding are propagated up and down the levels. Note: only the lowest level of detail for vertex flags is retained when switching levels. E.g., after selecting vertices at the highest level, then switching to the lowest level, then back to the highest level, the vertex selection will have changed. (This is a potentially fixable issue.) --- source/blender/src/multires.c | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/source/blender/src/multires.c b/source/blender/src/multires.c index 45806e1efd4..f7c01b3485e 100644 --- a/source/blender/src/multires.c +++ b/source/blender/src/multires.c @@ -773,7 +773,7 @@ void multires_add_level(void *ob, void *me_v) lvl->verts= MEM_callocN(sizeof(MVert)*lvl->totvert,"multires verts"); /* Copy previous level's verts */ for(i=0; iprev->totvert; ++i) - VecCopyf(lvl->verts[i].co,lvl->prev->verts[i].co); + lvl->verts[i]= lvl->prev->verts[i]; /* Create new edge verts */ for(i=0; iprev->totedge; ++i) { VecMidf(lvl->verts[lvl->prev->totvert + i].co, @@ -995,10 +995,12 @@ void multires_level_to_mesh(Object *ob, Mesh *me) me->mface[i].v3= lvl->faces[i].v[2]; me->mface[i].v4= lvl->faces[i].v[3]; me->mface[i].flag= lvl->faces[i].flag; + me->mface[i].flag &= ~ME_HIDE; } for(i=0; itotedge; ++i) { me->medge[i].v1= lvl->edges[i].v[0]; me->medge[i].v2= lvl->edges[i].v[1]; + me->medge[i].flag &= ~ME_HIDE; } /* Vertex groups */ @@ -1202,7 +1204,7 @@ void multires_update_levels(Mesh *me) /* Update current level -- copy current mesh into current level */ for(i=0; itotvert; ++i) - VecCopyf(cr_lvl->verts[i].co,me->mvert[i].co); + cr_lvl->verts[i]= me->mvert[i]; for(i=0; itotface; ++i) cr_lvl->faces[i].flag= me->mface[i].flag; @@ -1230,6 +1232,14 @@ void multires_update_levels(Mesh *me) VecAddf(cr_lvl->verts[f->mid].co, cr_lvl->verts[f->mid].co, &cr_deltas[f->mid].x); + + cr_lvl->verts[f->mid].flag= 0; + for(j=0; j<(data.quad?4:3); ++j) { + if(pr_lvl->verts[f->v[j]].flag & 1) + cr_lvl->verts[f->mid].flag |= 1; + if(pr_lvl->verts[f->v[j]].flag & ME_HIDE) + cr_lvl->verts[f->mid].flag |= ME_HIDE; + } } for(i=0; itotedge; ++i) { @@ -1240,6 +1250,14 @@ void multires_update_levels(Mesh *me) data.endpoint2= &pr_deltas[e->v[1]].x; multi_apply(&cr_deltas[e->mid].x, &data, 3, catmullclark_smooth_edge); MEM_freeN(data.edge_face_neighbor_midpoints_accum); + + cr_lvl->verts[e->mid].flag= 0; + for(j=0; j<2; ++j) { + if(pr_lvl->verts[e->v[j]].flag & 1) + cr_lvl->verts[e->mid].flag |= 1; + if(pr_lvl->verts[e->v[j]].flag & ME_HIDE) + cr_lvl->verts[e->mid].flag |= ME_HIDE; + } } for(i=0; itotedge; ++i) { const unsigned ndx= pr_lvl->edges[i].mid; @@ -1265,6 +1283,9 @@ void multires_update_levels(Mesh *me) MEM_freeN(data.vert_face_neighbor_midpoints_average); MEM_freeN(data.vert_edge_neighbor_midpoints_average); } + cr_lvl->verts[i].flag= 0; + if(pr_lvl->verts[i].flag & 1) cr_lvl->verts[i].flag |= 1; + if(pr_lvl->verts[i].flag & ME_HIDE) cr_lvl->verts[i].flag |= ME_HIDE; } for(i=0; itotvert; ++i) { VecAddf(cr_lvl->verts[i].co,