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>2012-02-28 07:54:31 +0400
committerNicholas Bishop <nicholasbishop@gmail.com>2012-02-28 07:54:31 +0400
commitbfc331dd75717a84d56496f60c3399abc516b249 (patch)
tree3f1646a6c4d06e8b10f4a6edea8a52c1442f87d1 /source/blender/blenkernel/intern/multires.c
parentb2a4fca7614ef3ee5527673b6f48c741534d1bd1 (diff)
BMesh: use MPoly rather than MFace in multiresModifier_base_apply
Diffstat (limited to 'source/blender/blenkernel/intern/multires.c')
-rw-r--r--source/blender/blenkernel/intern/multires.c54
1 files changed, 33 insertions, 21 deletions
diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c
index e1c66a6d43e..95f4b465beb 100644
--- a/source/blender/blenkernel/intern/multires.c
+++ b/source/blender/blenkernel/intern/multires.c
@@ -503,7 +503,7 @@ void multiresModifier_base_apply(MultiresModifierData *mmd, Object *ob)
{
DerivedMesh *cddm, *dispdm, *origdm;
Mesh *me;
- ListBase *fmap;
+ ListBase *pmap;
float (*origco)[3];
int i, j, offset, totlvl;
@@ -533,7 +533,7 @@ void multiresModifier_base_apply(MultiresModifierData *mmd, Object *ob)
/* heuristic to produce a better-fitting base mesh */
cddm = CDDM_from_mesh(me, NULL);
- fmap = cddm->getFaceMap(ob, cddm);
+ pmap = cddm->getPolyMap(ob, cddm);
origco = MEM_callocN(sizeof(float)*3*me->totvert, "multires apply base origco");
for (i = 0; i < me->totvert ;++i)
copy_v3_v3(origco[i], me->mvert[i].co);
@@ -544,18 +544,17 @@ void multiresModifier_base_apply(MultiresModifierData *mmd, Object *ob)
float dist;
int tot;
- /* don't adjust verts not used by at least one face */
- if (!fmap[i].first)
+ /* don't adjust verts not used by at least one poly */
+ if (!pmap[i].first)
continue;
/* find center */
- for (n = fmap[i].first, tot = 0; n; n = n->next) {
- MFace *f = &me->mface[n->index];
- int S = f->v4 ? 4 : 3;
+ for (n = pmap[i].first, tot = 0; n; n = n->next) {
+ const MPoly *p = &me->mpoly[n->index];
/* this double counts, not sure if that's bad or good */
- for (j = 0; j < S; ++j) {
- int vndx = (&f->v1)[j];
+ for (j = 0; j < p->totloop; ++j) {
+ int vndx = me->mloop[p->loopstart + j].v;
if (vndx != i) {
add_v3_v3(center, origco[vndx]);
++tot;
@@ -565,23 +564,36 @@ void multiresModifier_base_apply(MultiresModifierData *mmd, Object *ob)
mul_v3_fl(center, 1.0f / tot);
/* find normal */
- for (n = fmap[i].first; n; n = n->next) {
- MFace *f = &me->mface[n->index];
- int S = f->v4 ? 4 : 3;
- float v[4][3], no[3];
+ for (n = pmap[i].first; n; n = n->next) {
+ const MPoly *p = &me->mpoly[n->index];
+ MPoly fake_poly;
+ MLoop *fake_loops;
+ float (*fake_co)[3];
+ float no[3];
+
+ /* set up poly, loops, and coords in order to call
+ mesh_calc_poly_normal_coords() */
+ fake_poly.totloop = p->totloop;
+ fake_poly.loopstart = 0;
+ fake_loops = MEM_mallocN(sizeof(MLoop) * p->totloop, "fake_loops");
+ fake_co = MEM_mallocN(sizeof(float) * 3 * p->totloop, "fake_co");
- for (j = 0; j < S; ++j) {
- int vndx = (&f->v1)[j];
+ for (j = 0; j < p->totloop; ++j) {
+ int vndx = me->mloop[p->loopstart + j].v;
+
+ fake_loops[j].v = j;
+
if (vndx == i)
- copy_v3_v3(v[j], center);
+ copy_v3_v3(fake_co[j], center);
else
- copy_v3_v3(v[j], origco[vndx]);
+ copy_v3_v3(fake_co[j], origco[vndx]);
}
- if (S == 4)
- normal_quad_v3(no, v[0], v[1], v[2], v[3]);
- else
- normal_tri_v3(no, v[0], v[1], v[2]);
+ mesh_calc_poly_normal_coords(&fake_poly, fake_loops,
+ (const float(*)[3])fake_co, no);
+ MEM_freeN(fake_loops);
+ MEM_freeN(fake_co);
+
add_v3_v3(avg_no, no);
}
normalize_v3(avg_no);