diff options
author | Joseph Eagar <joeedh@gmail.com> | 2011-03-03 10:10:42 +0300 |
---|---|---|
committer | Joseph Eagar <joeedh@gmail.com> | 2011-03-03 10:10:42 +0300 |
commit | a147a91899f97adccb7049965a4cd4dfd5693eb6 (patch) | |
tree | bf2734c1e5a82d9e1726d64ad33061f7ea1156eb /source/blender/blenkernel/intern/multires.c | |
parent | 065a7f4e2f4509c99cef33af6a4446292224699f (diff) |
=bmesh=
Fixed view selected code. Made MDisps->disps use the
special allocation library I wrote as a
temporary fix to MDeformGroup->dw problems.
Why was the vgroup solution reused? It's really slow,
and its hard to tie in something like mempool or memarena.
The hackish allocator I wrote really needs to go, eventually,
or be folded into guardedalloc.
Also fixed a customdata bug with modifiers.
Diffstat (limited to 'source/blender/blenkernel/intern/multires.c')
-rw-r--r-- | source/blender/blenkernel/intern/multires.c | 27 |
1 files changed, 14 insertions, 13 deletions
diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c index f2c5a9cbf37..a3d74e95309 100644 --- a/source/blender/blenkernel/intern/multires.c +++ b/source/blender/blenkernel/intern/multires.c @@ -39,6 +39,7 @@ #include "BLI_pbvh.h" #include "BLI_editVert.h" #include "BLI_utildefines.h" +#include "BLI_cellalloc.h" #include "BKE_cdderivedmesh.h" #include "BKE_mesh.h" @@ -320,10 +321,10 @@ static void multires_reallocate_mdisps(Mesh *me, MDisps *mdisps, int lvl) /* reallocate displacements to be filled in */ for(i = 0; i < me->totloop; ++i) { int totdisp = multires_grid_tot[lvl]; - float (*disps)[3] = MEM_callocN(sizeof(float) * 3 * totdisp, "multires disps"); + float (*disps)[3] = BLI_cellalloc_calloc(sizeof(float) * 3 * totdisp, "multires disps"); if(mdisps[i].disps) - MEM_freeN(mdisps[i].disps); + BLI_cellalloc_free(mdisps[i].disps); mdisps[i].disps = disps; mdisps[i].totdisp = totdisp; @@ -402,7 +403,7 @@ static void multires_del_higher(MultiresModifierData *mmd, Object *ob, int lvl) float (*disps)[3], (*ndisps)[3], (*hdisps)[3]; int totdisp = multires_grid_tot[lvl]; - disps = MEM_callocN(sizeof(float) * 3 * totdisp, "multires disps"); + disps = BLI_cellalloc_calloc(sizeof(float) * 3 * totdisp, "multires disps"); ndisps = disps; hdisps = mdisp->disps; @@ -412,7 +413,7 @@ static void multires_del_higher(MultiresModifierData *mmd, Object *ob, int lvl) ndisps += nsize*nsize; hdisps += hsize*hsize; - MEM_freeN(mdisp->disps); + BLI_cellalloc_free(mdisp->disps); mdisp->disps = disps; mdisp->totdisp = totdisp; } @@ -737,7 +738,7 @@ static void multiresModifier_disp_run(DerivedMesh *dm, Mesh *me, int invert, int int S, x, y, gIndex = gridOffset[i]; for(S = 0; S < numVerts; ++S, ++gIndex, ++k) { - MDisps *mdisp = &mdisps[k]; + MDisps *mdisp = &mdisps[mpoly[i].loopstart+S]; DMGridData *grid = gridData[gIndex]; DMGridData *subgrid = subGridData[gIndex]; float (*dispgrid)[3] = NULL; @@ -1033,7 +1034,7 @@ static void old_mdisps_convert(MFace *mface, MDisps *mdisp) int x, y, S; float (*disps)[3], (*out)[3], u, v; - disps = MEM_callocN(sizeof(float) * 3 * newtotdisp, "multires disps"); + disps = BLI_cellalloc_calloc(sizeof(float) * 3 * newtotdisp, "multires disps"); out = disps; for(S = 0; S < nvert; S++) { @@ -1050,7 +1051,7 @@ static void old_mdisps_convert(MFace *mface, MDisps *mdisp) } } - MEM_freeN(mdisp->disps); + BLI_cellalloc_free(mdisp->disps); mdisp->totdisp= newtotdisp; mdisp->disps= disps; @@ -1079,7 +1080,7 @@ void multires_load_old_250(Mesh *me) int totdisp = mdisps[i].totdisp / nvert; for (j=0; j < mf->v4 ? 4 : 3; j++, k++) { - mdisps2[k].disps = MEM_callocN(sizeof(float)*3*totdisp, "multires disp in conversion"); + mdisps2[k].disps = BLI_cellalloc_calloc(sizeof(float)*3*totdisp, "multires disp in conversion"); mdisps2[k].totdisp = totdisp; memcpy(mdisps2[k].disps, mdisps[i].disps + totdisp*j, totdisp); } @@ -1781,7 +1782,7 @@ void multires_topology_changed(Scene *scene, Object *ob) if(!mdisp->totdisp) { if(grid) { mdisp->totdisp= nvert*grid; - mdisp->disps= MEM_callocN(mdisp->totdisp*sizeof(float)*3, "mdisp topology"); + mdisp->disps= BLI_cellalloc_calloc(mdisp->totdisp*sizeof(float)*3, "mdisp topology"); } continue; @@ -1793,9 +1794,9 @@ void multires_topology_changed(Scene *scene, Object *ob) mdisp->totdisp= (mdisp->totdisp/corners)*nvert; if(mdisp->disps) - MEM_freeN(mdisp->disps); + BLI_cellalloc_free(mdisp->disps); - mdisp->disps= MEM_callocN(mdisp->totdisp*sizeof(float)*3, "mdisp topology"); + mdisp->disps= BLI_cellalloc_calloc(mdisp->totdisp*sizeof(float)*3, "mdisp topology"); } } } @@ -2150,13 +2151,13 @@ void mdisp_join_tris(MDisps *dst, MDisps *tri1, MDisps *tri2) MDisps *src; if(dst->disps) - MEM_freeN(dst->disps); + BLI_cellalloc_free(dst->disps); side = sqrt(tri1->totdisp / 3); st = (side<<1)-1; dst->totdisp = 4 * side * side; - out = dst->disps = MEM_callocN(3*dst->totdisp*sizeof(float), "join disps"); + out = dst->disps = BLI_cellalloc_calloc(3*dst->totdisp*sizeof(float), "join disps"); for(S = 0; S < 4; S++) for(y = 0; y < side; ++y) |