Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Bishop <nicholasbishop@gmail.com>2008-07-25 07:13:16 +0400
committerNicholas Bishop <nicholasbishop@gmail.com>2008-07-25 07:13:16 +0400
commitd21d59ebb4dc9c50c244057ac9021d9d42777dec (patch)
tree5ade9139b51859c7ef1914332ee83c46a25f43f6 /source/blender/blenkernel/intern
parent87bc9117ae4fba63ee270a4e5c20df26e1930486 (diff)
Reduced the multires memory usage a bit during level creation and level update.
Diffstat (limited to 'source/blender/blenkernel/intern')
-rw-r--r--source/blender/blenkernel/intern/multires.c139
-rw-r--r--source/blender/blenkernel/intern/subsurf_ccg.c21
2 files changed, 75 insertions, 85 deletions
diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c
index 1f208260752..49c93d8aca5 100644
--- a/source/blender/blenkernel/intern/multires.c
+++ b/source/blender/blenkernel/intern/multires.c
@@ -1375,7 +1375,7 @@ void multires_displace(MultiresDisplacer *d, float co[3])
data = d->grid->disps[d->y * d->sidetot + d->x];
if(d->invert)
- VecSubf(disp, co, *d->subco);
+ VecSubf(disp, co, d->subco->co);
else
VecCopyf(disp, data);
@@ -1467,25 +1467,36 @@ static void multiresModifier_update(DerivedMesh *dm)
if(mdisps) {
MultiresDisplacer d;
+ SubsurfModifierData smd;
const int lvl = MultiresDM_get_lvl(dm);
const int totlvl = MultiresDM_get_totlvl(dm);
const int gridFaces = multires_side_tot[lvl - 2] - 1;
const int edgeSize = multires_side_tot[lvl - 1] - 1;
ListBase *map = MultiresDM_get_vert_face_map(dm);
Mesh *me = MultiresDM_get_mesh(dm);
+ DerivedMesh *orig, *subco_dm;
int S, x, y;
mvert = CDDM_get_verts(dm);
medge = MultiresDM_get_mesh(dm)->medge;
mface = MultiresDM_get_mesh(dm)->mface;
- d.subco = MultiresDM_get_subco(dm);
+ orig = CDDM_from_mesh(me, NULL);
if(lvl < totlvl) {
/* Propagate disps upwards */
- DerivedMesh *orig = CDDM_from_mesh(me, NULL), *orig_mrdm, *final, *orig_top_mrdm;
+ DerivedMesh *final, *orig_top_mrdm;
+ MVert *verts_new, *orig_top_verts;
MultiresModifierData mmd;
- MVert *verts_orig, *verts_new, *orig_top_verts;
+ MVert *cur_lvl_orig_verts = NULL;
+
+ /* Regenerate the current level's vertex coordinates without sculpting */
+ mmd.totlvl = totlvl;
+ mmd.lvl = lvl;
+ subco_dm = multires_dm_create_from_derived(&mmd, orig, me, 0, 0);
+ MultiresDM_block_update(subco_dm);
+ cur_lvl_orig_verts = CDDM_get_verts(subco_dm);
+ d.subco = cur_lvl_orig_verts;
/* Regenerate the vertex coords at the top level using the unmodified disps */
mmd.totlvl = totlvl;
@@ -1494,96 +1505,90 @@ static void multiresModifier_update(DerivedMesh *dm)
MultiresDM_block_update(orig_top_mrdm);
orig_top_verts = CDDM_get_verts(orig_top_mrdm);
- /* Regenerate the current level as a MultiresDM using the unmodified disps */
- mmd.totlvl = totlvl;
- mmd.lvl = lvl;
- orig_mrdm = multires_dm_create_from_derived(&mmd, orig, me, 0, 0);
- MultiresDM_block_update(orig_mrdm);
-
/* Subtract the original vertex cos from the new vertex cos */
- verts_orig = CDDM_get_verts(orig_mrdm);
verts_new = CDDM_get_verts(dm);
for(i = 0; i < dm->getNumVerts(dm); ++i)
- VecSubf(verts_new[i].co, verts_new[i].co, verts_orig[i].co);
-
- orig_mrdm->release(orig_mrdm);
+ VecSubf(verts_new[i].co, verts_new[i].co, cur_lvl_orig_verts[i].co);
final = multires_subdisp_pre(dm, totlvl - lvl);
- // ?
- orig->release(orig);
- orig = CDDM_from_mesh(me, NULL);
-
multires_subdisp(orig, me, final, lvl, totlvl, dm->getNumVerts(dm), dm->getNumEdges(dm),
dm->getNumFaces(dm), orig_top_verts);
- orig->release(orig);
orig_top_mrdm->release(orig_top_mrdm);
-
- return;
}
-
- /* Update the current level */
- for(i = 0; i < MultiresDM_get_mesh(dm)->totface; ++i) {
- const int numVerts = mface[i].v4 ? 4 : 3;
+ else {
+ /* Regenerate the current level's vertex coordinates without displacements */
+ memset(&smd, 0, sizeof(SubsurfModifierData));
+ smd.levels = lvl - 1;
+ subco_dm = subsurf_make_derived_from_derived_with_multires(orig, &smd, NULL, 0, NULL, 0, 0);
+ d.subco = CDDM_get_verts(subco_dm);
+
+ /* Update the current level */
+ for(i = 0; i < MultiresDM_get_mesh(dm)->totface; ++i) {
+ const int numVerts = mface[i].v4 ? 4 : 3;
- // convert from mvert->co to disps
- multires_displacer_init(&d, dm, i, 1);
- multires_displacer_anchor(&d, 1, 0);
- multires_displace(&d, mvert->co);
- ++mvert;
- ++d.subco;
-
- for(S = 0; S < numVerts; ++S) {
- multires_displacer_anchor(&d, 2, S);
- for(x = 1; x < gridFaces; ++x) {
- multires_displace(&d, mvert->co);
- ++mvert;
- ++d.subco;
- }
- }
+ // convert from mvert->co to disps
+ multires_displacer_init(&d, dm, i, 1);
+ multires_displacer_anchor(&d, 1, 0);
+ multires_displace(&d, mvert->co);
+ ++mvert;
+ ++d.subco;
- for(S = 0; S < numVerts; S++) {
- multires_displacer_anchor(&d, 3, S);
- for(y = 1; y < gridFaces; y++) {
- for(x = 1; x < gridFaces; x++) {
+ for(S = 0; S < numVerts; ++S) {
+ multires_displacer_anchor(&d, 2, S);
+ for(x = 1; x < gridFaces; ++x) {
multires_displace(&d, mvert->co);
++mvert;
++d.subco;
}
- multires_displacer_jump(&d);
}
- }
- }
- for(i = 0; i < MultiresDM_get_mesh(dm)->totedge; ++i) {
- const MEdge *e = &medge[i];
- for(x = 1; x < edgeSize; ++x) {
- IndexNode *n1, *n2;
- /* TODO: Better to have these loops outside the x loop */
- for(n1 = map[e->v1].first; n1; n1 = n1->next) {
- for(n2 = map[e->v2].first; n2; n2 = n2->next) {
- if(n1->index == n2->index) {
- multires_displacer_init(&d, dm, n1->index, 1);
- multires_displacer_anchor_edge(&d, e->v1, e->v2, x);
+ for(S = 0; S < numVerts; S++) {
+ multires_displacer_anchor(&d, 3, S);
+ for(y = 1; y < gridFaces; y++) {
+ for(x = 1; x < gridFaces; x++) {
multires_displace(&d, mvert->co);
+ ++mvert;
+ ++d.subco;
}
+ multires_displacer_jump(&d);
}
}
+ }
+
+ for(i = 0; i < MultiresDM_get_mesh(dm)->totedge; ++i) {
+ const MEdge *e = &medge[i];
+ for(x = 1; x < edgeSize; ++x) {
+ IndexNode *n1, *n2;
+ /* TODO: Better to have these loops outside the x loop */
+ for(n1 = map[e->v1].first; n1; n1 = n1->next) {
+ for(n2 = map[e->v2].first; n2; n2 = n2->next) {
+ if(n1->index == n2->index) {
+ multires_displacer_init(&d, dm, n1->index, 1);
+ multires_displacer_anchor_edge(&d, e->v1, e->v2, x);
+ multires_displace(&d, mvert->co);
+ }
+ }
+ }
+ ++mvert;
+ ++d.subco;
+ }
+ }
+
+ for(i = 0; i < MultiresDM_get_mesh(dm)->totvert; ++i) {
+ IndexNode *n;
+ for(n = map[i].first; n; n = n->next) {
+ multires_displacer_init(&d, dm, n->index, 1);
+ multires_displacer_anchor_vert(&d, i);
+ multires_displace(&d, mvert->co);
+ }
++mvert;
++d.subco;
}
}
- for(i = 0; i < MultiresDM_get_mesh(dm)->totvert; ++i) {
- IndexNode *n;
- for(n = map[i].first; n; n = n->next) {
- multires_displacer_init(&d, dm, n->index, 1);
- multires_displacer_anchor_vert(&d, i);
- multires_displace(&d, mvert->co);
- }
- ++mvert;
- ++d.subco;
- }
+ orig->release(orig);
+ subco_dm->release(subco_dm);
}
}
diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c
index 8a9c6038f08..5271b034f2b 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -493,7 +493,6 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
int *origIndex;
FaceVertWeight *qweight, *tweight;
MultiresDisplacer d;
- float *mr_orig;
calc_ss_weights(gridFaces, &qweight, &tweight);
@@ -531,7 +530,6 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
result = MultiresDM_new(ms, dm, ccgSubSurf_getNumFinalVerts(ss),
ccgSubSurf_getNumFinalEdges(ss),
ccgSubSurf_getNumFinalFaces(ss));
- mr_orig = MultiresDM_get_subco(result);
}
else {
if(dm) {
@@ -565,8 +563,6 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
DM_interp_vert_data(dm, result, vertIdx, weight[0][0], numVerts, i);
VecCopyf(mvert->co, ccgSubSurf_getFaceCenterData(ss, f));
if(ms) {
- VecCopyf(mr_orig, mvert->co);
- mr_orig += 3;
multires_displacer_init(&d, result, index, 0);
multires_displacer_anchor(&d, 1, 0);
multires_displace(&d, mvert->co);
@@ -591,11 +587,9 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
DM_interp_vert_data(dm, result, vertIdx, w, numVerts, i);
VecCopyf(mvert->co,
ccgSubSurf_getFaceGridEdgeData(ss, f, S, x));
- if(ms) {
- VecCopyf(mr_orig, mvert->co);
- mr_orig += 3;
+ if(ms)
multires_displace(&d, mvert->co);
- }
+
*origIndex = ORIGINDEX_NONE;
++mvert;
++origIndex;
@@ -619,11 +613,8 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
DM_interp_vert_data(dm, result, vertIdx, w, numVerts, i);
VecCopyf(mvert->co,
ccgSubSurf_getFaceGridData(ss, f, S, x, y));
- if(ms) {
- VecCopyf(mr_orig, mvert->co);
- mr_orig += 3;
+ if(ms)
multires_displace(&d, mvert->co);
- }
*origIndex = ORIGINDEX_NONE;
++mvert;
@@ -660,9 +651,6 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
int numFaces = ccgSubSurf_getEdgeNumFaces(ss, e);
int edgeface;
- VecCopyf(mr_orig, mvert->co);
- mr_orig += 3;
-
multires_displacer_weight(&d, 1.0f / numFaces);
/* Could be made more efficient by moving this outside the x loop */
for(edgeface = 0; edgeface < numFaces; ++edgeface) {
@@ -697,9 +685,6 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
int numFaces = ccgSubSurf_getVertNumFaces(ss, v);
int vertface;
- VecCopyf(mr_orig, mvert->co);
- mr_orig += 3;
-
multires_displacer_weight(&d, 1.0f / numFaces);
for(vertface = 0; vertface < numFaces; ++vertface) {
CCGFace *f = ccgSubSurf_getVertFace(ss, v, vertface);