diff options
author | Nicholas Bishop <nicholasbishop@gmail.com> | 2008-08-14 03:31:29 +0400 |
---|---|---|
committer | Nicholas Bishop <nicholasbishop@gmail.com> | 2008-08-14 03:31:29 +0400 |
commit | 5ad9495bfb0f0cf782595a21a9e4fd420f7fc3bc (patch) | |
tree | a6d5d7508b7e7a1b699cac25c6b99417f487f490 /source/blender/blenkernel/intern | |
parent | 877f1518ecda9e7542dfe43264ab69f5655f1cfe (diff) |
For loading old files: no need to generate maps for the last level.
Diffstat (limited to 'source/blender/blenkernel/intern')
-rw-r--r-- | source/blender/blenkernel/intern/multires.c | 69 |
1 files changed, 32 insertions, 37 deletions
diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c index 24a42f7f838..0b0ea3e7870 100644 --- a/source/blender/blenkernel/intern/multires.c +++ b/source/blender/blenkernel/intern/multires.c @@ -1040,13 +1040,13 @@ void multires_load_old(DerivedMesh *dm, Multires *mr) } - /* calculate vert to edge/face maps for each level */ - fmap = MEM_callocN(sizeof(ListBase*) * mr->level_count, "multires fmap"); - emap = MEM_callocN(sizeof(ListBase*) * mr->level_count, "multires emap"); - fmem = MEM_callocN(sizeof(IndexNode*) * mr->level_count, "multires fmem"); - emem = MEM_callocN(sizeof(IndexNode*) * mr->level_count, "multires emem"); + /* calculate vert to edge/face maps for each level (except the last) */ + fmap = MEM_callocN(sizeof(ListBase*) * (mr->level_count-1), "multires fmap"); + emap = MEM_callocN(sizeof(ListBase*) * (mr->level_count-1), "multires emap"); + fmem = MEM_callocN(sizeof(IndexNode*) * (mr->level_count-1), "multires fmem"); + emem = MEM_callocN(sizeof(IndexNode*) * (mr->level_count-1), "multires emem"); lvl = lvl1; - for(i = 0; i < mr->level_count; ++i) { + for(i = 0; i < mr->level_count - 1; ++i) { create_old_vert_face_map(fmap + i, fmem + i, lvl->faces, lvl->totvert, lvl->totface); create_old_vert_edge_map(emap + i, emem + i, lvl->edges, lvl->totvert, lvl->totedge); lvl = lvl->next; @@ -1054,41 +1054,36 @@ void multires_load_old(DerivedMesh *dm, Multires *mr) /* Interior face verts */ lvl = lvl1->next->next; - for(i = 3; i <= 3/*(mr->level_count*/; ++i) { - tottri = totquad = 0; - dst = 0; - for(j = 0; j < lvl1->totface; ++j) { - int sides = lvl1->faces[j].v[3] ? 4 : 3; - int ldst = dst + 1 + sides * (st - 1); - - for(s = 0; s < sides; ++s) { - int st2 = multires_side_tot[totlvl - 2] - 2; - int st3 = multires_side_tot[totlvl - 3] - 2; - int st4 = st3 == 0 ? 1 : (st3 + 1) / 2; - int mid = ldst + st2 * st3 + st3; - int cv = lvl1->faces[j].v[s]; - int nv = lvl1->faces[j].v[s == sides - 1 ? 0 : s + 1]; - int pv = lvl1->faces[j].v[s == 0 ? sides - 1 : s - 1]; - - multires_load_old_faces(fmap, emap, lvl1->next, vvmap, mid, - vvmap[dst], cv, - find_old_edge(emap[0], lvl1->edges, pv, cv)->mid, - find_old_edge(emap[0], lvl1->edges, cv, nv)->mid, - st2, st4); - - ldst += (st - 1) * (st - 1); - } - - - dst = ldst; - if(sides == 4) ++totquad; - else ++tottri; + dst = 0; + for(j = 0; j < lvl1->totface; ++j) { + int sides = lvl1->faces[j].v[3] ? 4 : 3; + int ldst = dst + 1 + sides * (st - 1); + + for(s = 0; s < sides; ++s) { + int st2 = multires_side_tot[totlvl - 2] - 2; + int st3 = multires_side_tot[totlvl - 3] - 2; + int st4 = st3 == 0 ? 1 : (st3 + 1) / 2; + int mid = ldst + st2 * st3 + st3; + int cv = lvl1->faces[j].v[s]; + int nv = lvl1->faces[j].v[s == sides - 1 ? 0 : s + 1]; + int pv = lvl1->faces[j].v[s == 0 ? sides - 1 : s - 1]; + + multires_load_old_faces(fmap, emap, lvl1->next, vvmap, mid, + vvmap[dst], cv, + find_old_edge(emap[0], lvl1->edges, pv, cv)->mid, + find_old_edge(emap[0], lvl1->edges, cv, nv)->mid, + st2, st4); + + ldst += (st - 1) * (st - 1); } - lvl = lvl->next; + + dst = ldst; } - for(i = 0; i < mr->level_count; ++i) { + lvl = lvl->next; + + for(i = 0; i < mr->level_count - 1; ++i) { MEM_freeN(fmap[i]); MEM_freeN(fmem[i]); MEM_freeN(emap[i]); |