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-08-09 03:36:12 +0400
committerNicholas Bishop <nicholasbishop@gmail.com>2008-08-09 03:36:12 +0400
commita90e7bd0c249e6ee3cdf895c6869fd148d6015fb (patch)
tree7744211021de08fad859be4946089f7bc7f69ecb /source/blender
parent60a2151b896396b1cc2fe17862937b85e97241cb (diff)
Cleanup and refactoring. Removed some duplicate code.
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/blenkernel/BKE_multires.h2
-rw-r--r--source/blender/blenkernel/intern/cdderivedmesh.c6
-rw-r--r--source/blender/blenkernel/intern/multires.c176
-rw-r--r--source/blender/blenkernel/intern/subsurf_ccg.c42
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);