diff options
author | Nicholas Bishop <nicholasbishop@gmail.com> | 2008-08-09 03:36:12 +0400 |
---|---|---|
committer | Nicholas Bishop <nicholasbishop@gmail.com> | 2008-08-09 03:36:12 +0400 |
commit | a90e7bd0c249e6ee3cdf895c6869fd148d6015fb (patch) | |
tree | 7744211021de08fad859be4946089f7bc7f69ecb /source/blender | |
parent | 60a2151b896396b1cc2fe17862937b85e97241cb (diff) |
Cleanup and refactoring. Removed some duplicate code.
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/blenkernel/BKE_multires.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/cdderivedmesh.c | 6 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/multires.c | 176 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/subsurf_ccg.c | 42 |
4 files changed, 104 insertions, 122 deletions
diff --git a/source/blender/blenkernel/BKE_multires.h b/source/blender/blenkernel/BKE_multires.h index 0332d4f7a17..429b3fba4cf 100644 --- a/source/blender/blenkernel/BKE_multires.h +++ b/source/blender/blenkernel/BKE_multires.h @@ -90,7 +90,7 @@ struct Mesh *MultiresDM_get_mesh(struct DerivedMesh *dm); struct DerivedMesh *MultiresDM_new(struct MultiresSubsurf *, struct DerivedMesh*, int, int, int); void *MultiresDM_get_vertnorm(struct DerivedMesh *); void *MultiresDM_get_orco(struct DerivedMesh *); -void *MultiresDM_get_subco(struct DerivedMesh *); +struct MVert *MultiresDM_get_subco(struct DerivedMesh *); struct ListBase *MultiresDM_get_vert_face_map(struct DerivedMesh *); int MultiresDM_get_totlvl(struct DerivedMesh *); int MultiresDM_get_lvl(struct DerivedMesh *); diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c index c7d37610254..30f0a95374c 100644 --- a/source/blender/blenkernel/intern/cdderivedmesh.c +++ b/source/blender/blenkernel/intern/cdderivedmesh.c @@ -1157,7 +1157,7 @@ typedef struct MultiresDM { int lvl, totlvl; float (*orco)[3]; - float (*subco)[3]; + MVert *subco; float (*norm)[3]; @@ -1260,7 +1260,7 @@ DerivedMesh *MultiresDM_new(MultiresSubsurf *ms, DerivedMesh *orig, int numVerts mrdm->lvl = ms->lvl; mrdm->totlvl = ms->totlvl; - mrdm->subco = MEM_callocN(sizeof(float)*3*numVerts, "multires subdivided coords"); + mrdm->subco = MEM_callocN(sizeof(MVert)*numVerts, "multires subdivided verts"); mrdm->block_update = 0; dm->release = MultiresDM_release; @@ -1289,7 +1289,7 @@ void *MultiresDM_get_orco(DerivedMesh *dm) } -void *MultiresDM_get_subco(DerivedMesh *dm) +MVert *MultiresDM_get_subco(DerivedMesh *dm) { return ((MultiresDM*)dm)->subco; } diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c index 66ec96c6f9a..976b71e252c 100644 --- a/source/blender/blenkernel/intern/multires.c +++ b/source/blender/blenkernel/intern/multires.c @@ -1417,14 +1417,12 @@ void multires_displace(MultiresDisplacer *d, float co[3]) VecCopyf(disp, data); { + float norm[3]; float mat[3][3], inv[3][3]; - float n1[3], n2[3], norm[3]; - float l1 = d->y / (1.0 * d->sidetot); - float l2 = d->x / (1.0 * d->sidetot); - VecLerpf(n1, d->mat_norms[d->face->v1], d->mat_norms[d->face->v4], l1); - VecLerpf(n2, d->mat_norms[d->face->v2], d->mat_norms[d->face->v3], l1); - VecLerpf(norm, n1, n2, l2); + norm[0] = d->subco->no[0] / 32767.0f; + norm[1] = d->subco->no[1] / 32767.0f; + norm[2] = d->subco->no[2] / 32767.0f; calc_ts_mat(mat, d->mat_center, d->mat_target, norm); if(d->invert) { @@ -1432,7 +1430,6 @@ void multires_displace(MultiresDisplacer *d, float co[3]) Mat3CpyMat3(mat, inv); } - Mat3MulVecfl(mat, disp); } @@ -1490,6 +1487,95 @@ int multiresModifier_reshape(MultiresModifierData *mmd, Object *dst, Object *src return 1; } +static void multiresModifier_disp_run(DerivedMesh *dm, MVert *subco, int invert) +{ + const int lvl = MultiresDM_get_lvl(dm); + const int gridFaces = multires_side_tot[lvl - 2] - 1; + const int edgeSize = multires_side_tot[lvl - 1] - 1; + MVert *mvert = CDDM_get_verts(dm); + MEdge *medge = MultiresDM_get_mesh(dm)->medge; + MFace *mface = MultiresDM_get_mesh(dm)->mface; + ListBase *map = MultiresDM_get_vert_face_map(dm); + MultiresDisplacer d; + int i, S, x, y; + + if(subco) + d.subco = subco; + + for(i = 0; i < MultiresDM_get_mesh(dm)->totface; ++i) { + const int numVerts = mface[i].v4 ? 4 : 3; + + multires_displacer_init(&d, dm, i, invert); + 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; + } + } + + 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; + int numFaces = 0; + 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) + ++numFaces; + } + } + multires_displacer_weight(&d, 1.0f / numFaces); + /* 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, invert); + 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; + multires_displacer_weight(&d, 1.0f / BLI_countlist(&map[i])); + for(n = map[i].first; n; n = n->next) { + multires_displacer_init(&d, dm, n->index, invert); + multires_displacer_anchor_vert(&d, i); + multires_displace(&d, mvert->co); + } + ++mvert; + ++d.subco; + } + + if(!invert) + CDDM_calc_normals(dm); +} + static void multiresModifier_update(DerivedMesh *dm) { MDisps *mdisps; @@ -1503,16 +1589,11 @@ static void multiresModifier_update(DerivedMesh *dm) mdisps = dm->getFaceDataArray(dm, CD_MDISPS); 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; @@ -1533,7 +1614,6 @@ static void multiresModifier_update(DerivedMesh *dm) 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; /* Subtract the original vertex cos from the new vertex cos */ verts_new = CDDM_get_verts(dm); @@ -1550,70 +1630,8 @@ static void multiresModifier_update(DerivedMesh *dm) 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; - } - } - - 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; - } + multiresModifier_disp_run(dm, CDDM_get_verts(subco_dm), 1); } orig->release(orig); @@ -1641,6 +1659,12 @@ struct DerivedMesh *multires_dm_create_from_derived(MultiresModifierData *mmd, D smd.levels = smd.renderLevels = mmd->lvl - 1; result = subsurf_make_derived_from_derived_with_multires(dm, &smd, &ms, useRenderParams, NULL, isFinalCalc, 0); + /* TODO */ + int i; + for(i = 0; i < result->getNumVerts(result); ++i) { + MultiresDM_get_subco(result)[i] = CDDM_get_verts(result)[i]; + } + multiresModifier_disp_run(result, MultiresDM_get_subco(result), 0); MultiresDM_set_update(result, multiresModifier_update); return result; diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c index 5271b034f2b..2e8e0f864be 100644 --- a/source/blender/blenkernel/intern/subsurf_ccg.c +++ b/source/blender/blenkernel/intern/subsurf_ccg.c @@ -492,7 +492,6 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh, MFace *mf; int *origIndex; FaceVertWeight *qweight, *tweight; - MultiresDisplacer d; calc_ss_weights(gridFaces, &qweight, &tweight); @@ -562,11 +561,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) { - multires_displacer_init(&d, result, index, 0); - multires_displacer_anchor(&d, 1, 0); - multires_displace(&d, mvert->co); - } *origIndex = ORIGINDEX_NONE; ++mvert; ++origIndex; @@ -577,7 +571,6 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh, int nextS = (S + 1) % numVerts; int otherS = (numVerts == 4) ? (S + 2) % numVerts : 3; - if(ms) multires_displacer_anchor(&d, 2, S); for(x = 1; x < gridFaces; x++) { float w[4]; w[prevS] = weight[x][0][0]; @@ -587,8 +580,6 @@ 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) - multires_displace(&d, mvert->co); *origIndex = ORIGINDEX_NONE; ++mvert; @@ -602,7 +593,6 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh, int nextS = (S + 1) % numVerts; int otherS = (numVerts == 4) ? (S + 2) % numVerts : 3; - if(ms) multires_displacer_anchor(&d, 3, S); for(y = 1; y < gridFaces; y++) { for(x = 1; x < gridFaces; x++) { float w[4]; @@ -613,15 +603,11 @@ 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) - multires_displace(&d, mvert->co); - *origIndex = ORIGINDEX_NONE; ++mvert; ++origIndex; i++; } - if(ms) multires_displacer_jump(&d); } } @@ -647,21 +633,6 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh, w[0] = 1 - w[1]; DM_interp_vert_data(dm, result, vertIdx, w, 2, i); VecCopyf(mvert->co, ccgSubSurf_getEdgeData(ss, e, x)); - if(ms) { - int numFaces = ccgSubSurf_getEdgeNumFaces(ss, e); - int edgeface; - - 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) { - CCGFace *f = ccgSubSurf_getEdgeFace(ss, e, edgeface); - int faceIdx = GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(ss, f)); - multires_displacer_init(&d, result, faceIdx, 0); - multires_displacer_anchor_edge(&d, vertIdx[0], vertIdx[1], x); - multires_displace(&d, mvert->co); - } - - } *origIndex = ORIGINDEX_NONE; ++mvert; ++origIndex; @@ -681,19 +652,6 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh, DM_copy_vert_data(dm, result, vertIdx, i, 1); VecCopyf(mvert->co, ccgSubSurf_getVertData(ss, v)); - if(ms) { - int numFaces = ccgSubSurf_getVertNumFaces(ss, v); - int vertface; - - multires_displacer_weight(&d, 1.0f / numFaces); - for(vertface = 0; vertface < numFaces; ++vertface) { - CCGFace *f = ccgSubSurf_getVertFace(ss, v, vertface); - int faceIdx = GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(ss, f)); - multires_displacer_init(&d, result, faceIdx, 0); - multires_displacer_anchor_vert(&d, vertIdx); - multires_displace(&d, mvert->co); - } - } *((int*)ccgSubSurf_getVertUserData(ss, v)) = i; *origIndex = ccgDM_getVertMapIndex(NULL, ss, v); |