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:
authorCampbell Barton <ideasman42@gmail.com>2012-04-22 07:07:21 +0400
committerCampbell Barton <ideasman42@gmail.com>2012-04-22 07:07:21 +0400
commitac5058b281b859917efbf4cf028767094fab7144 (patch)
tree84436eadc1aaf61f9c3c699cbcd528b3526cafb8 /source/blender/blenkernel/intern/CCGSubSurf.c
parent3b686116ea8c3878a316979a348987bc038a1f20 (diff)
subsurf - avoid 'for' loop finding the edge index in a face multiple times when calling _face_getIFCoEdge. add asset so passing wrong value errors out in debug mode. gives small speedup to subsurf.
Diffstat (limited to 'source/blender/blenkernel/intern/CCGSubSurf.c')
-rw-r--r--source/blender/blenkernel/intern/CCGSubSurf.c53
1 files changed, 33 insertions, 20 deletions
diff --git a/source/blender/blenkernel/intern/CCGSubSurf.c b/source/blender/blenkernel/intern/CCGSubSurf.c
index 07cedc50bce..c76f1e6d07d 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf.c
+++ b/source/blender/blenkernel/intern/CCGSubSurf.c
@@ -690,30 +690,36 @@ static int _face_getVertIndex(CCGFace *f, CCGVert *v)
return i;
return -1;
}
-static CCG_INLINE void *_face_getIFCoEdge(CCGFace *f, CCGEdge *e, int lvl, int eX, int eY, int levels, int dataSize)
+static int _face_getEdgeIndex(CCGFace *f, CCGEdge *e)
+{
+ int i;
+ for (i = 0; i < f->numVerts; i++)
+ if (FACE_getEdges(f)[i] == e)
+ return i;
+ return -1;
+}
+static CCG_INLINE void *_face_getIFCoEdge(CCGFace *f, CCGEdge *e, int f_ed_idx, int lvl, int eX, int eY, int levels, int dataSize)
{
int maxGridSize = ccg_gridsize(levels);
int spacing = ccg_spacing(levels, lvl);
- int S, x, y, cx, cy;
+ int x, y, cx, cy;
- for (S = 0; S < f->numVerts; S++)
- if (FACE_getEdges(f)[S] == e)
- break;
+ BLI_assert(f_ed_idx == _face_getEdgeIndex(f, e));
eX = eX * spacing;
eY = eY * spacing;
- if (e->v0 != FACE_getVerts(f)[S]) {
+ if (e->v0 != FACE_getVerts(f)[f_ed_idx]) {
eX = (maxGridSize * 2 - 1) - 1 - eX;
}
y = maxGridSize - 1 - eX;
x = maxGridSize - 1 - eY;
if (x < 0) {
- S = (S + f->numVerts - 1) % f->numVerts;
+ f_ed_idx = (f_ed_idx + f->numVerts - 1) % f->numVerts;
cx = y;
cy = -x;
}
else if (y < 0) {
- S = (S + 1) % f->numVerts;
+ f_ed_idx = (f_ed_idx + 1) % f->numVerts;
cx = -y;
cy = x;
}
@@ -721,11 +727,11 @@ static CCG_INLINE void *_face_getIFCoEdge(CCGFace *f, CCGEdge *e, int lvl, int e
cx = x;
cy = y;
}
- return _face_getIFCo(f, levels, S, cx, cy, levels, dataSize);
+ return _face_getIFCo(f, levels, f_ed_idx, cx, cy, levels, dataSize);
}
-static float *_face_getIFNoEdge(CCGFace *f, CCGEdge *e, int lvl, int eX, int eY, int levels, int dataSize, int normalDataOffset)
+static float *_face_getIFNoEdge(CCGFace *f, CCGEdge *e, int f_ed_idx, int lvl, int eX, int eY, int levels, int dataSize, int normalDataOffset)
{
- return (float *) ((byte *) _face_getIFCoEdge(f, e, lvl, eX, eY, levels, dataSize) + normalDataOffset);
+ return (float *) ((byte *) _face_getIFCoEdge(f, e, f_ed_idx, lvl, eX, eY, levels, dataSize) + normalDataOffset);
}
static void _face_calcIFNo(CCGFace *f, int lvl, int S, int x, int y, float *no, int levels, int dataSize)
{
@@ -1457,19 +1463,23 @@ static void ccgSubSurf__calcVertNormals(CCGSubSurf *ss,
for (i = 0; i < e->numFaces - 1; i++) {
CCGFace *f = e->faces[i];
+ const int f_ed_idx = _face_getEdgeIndex(f, e);
+ const int f_ed_idx_last = _face_getEdgeIndex(fLast, e);
for (x = 1; x < edgeSize - 1; x++) {
- NormAdd(_face_getIFNoEdge(fLast, e, lvl, x, 0, subdivLevels, vertDataSize, normalDataOffset),
- _face_getIFNoEdge(f, e, lvl, x, 0, subdivLevels, vertDataSize, normalDataOffset));
+ NormAdd(_face_getIFNoEdge(fLast, e, f_ed_idx_last, lvl, x, 0, subdivLevels, vertDataSize, normalDataOffset),
+ _face_getIFNoEdge(f, e, f_ed_idx, lvl, x, 0, subdivLevels, vertDataSize, normalDataOffset));
}
}
for (i = 0; i < e->numFaces - 1; i++) {
CCGFace *f = e->faces[i];
+ const int f_ed_idx = _face_getEdgeIndex(f, e);
+ const int f_ed_idx_last = _face_getEdgeIndex(fLast, e);
for (x = 1; x < edgeSize - 1; x++) {
- NormCopy(_face_getIFNoEdge(f, e, lvl, x, 0, subdivLevels, vertDataSize, normalDataOffset),
- _face_getIFNoEdge(fLast, e, lvl, x, 0, subdivLevels, vertDataSize, normalDataOffset));
+ NormCopy(_face_getIFNoEdge(f, e, f_ed_idx, lvl, x, 0, subdivLevels, vertDataSize, normalDataOffset),
+ _face_getIFNoEdge(fLast, e, f_ed_idx_last, lvl, x, 0, subdivLevels, vertDataSize, normalDataOffset));
}
}
}
@@ -1518,10 +1528,11 @@ static void ccgSubSurf__calcVertNormals(CCGSubSurf *ss,
if (e->numFaces) {
CCGFace *f = e->faces[0];
int x;
+ const int f_ed_idx = _face_getEdgeIndex(f, e);
for (x = 0; x < edgeSize; x++)
NormCopy(EDGE_getNo(e, lvl, x),
- _face_getIFNoEdge(f, e, lvl, x, 0, subdivLevels, vertDataSize, normalDataOffset));
+ _face_getIFNoEdge(f, e, f_ed_idx, lvl, x, 0, subdivLevels, vertDataSize, normalDataOffset));
}
else {
/* set to zero here otherwise the normals are uninitialized memory
@@ -1666,7 +1677,8 @@ static void ccgSubSurf__calcSubdivLevel(CCGSubSurf *ss,
for (j = 0; j < e->numFaces; j++) {
CCGFace *f = e->faces[j];
- VertDataAdd(q, _face_getIFCoEdge(f, e, nextLvl, fx, 1, subdivLevels, vertDataSize));
+ const int f_ed_idx = _face_getEdgeIndex(f, e);
+ VertDataAdd(q, _face_getIFCoEdge(f, e, f_ed_idx, nextLvl, fx, 1, subdivLevels, vertDataSize));
numFaces++;
}
@@ -1866,10 +1878,11 @@ static void ccgSubSurf__calcSubdivLevel(CCGSubSurf *ss,
VertDataAdd(r, EDGE_getCo(e, curLvl, x + 1));
for (j = 0; j < e->numFaces; j++) {
CCGFace *f = e->faces[j];
- VertDataAdd(q, _face_getIFCoEdge(f, e, nextLvl, fx - 1, 1, subdivLevels, vertDataSize));
- VertDataAdd(q, _face_getIFCoEdge(f, e, nextLvl, fx + 1, 1, subdivLevels, vertDataSize));
+ int f_ed_idx = _face_getEdgeIndex(f, e);
+ VertDataAdd(q, _face_getIFCoEdge(f, e, f_ed_idx, nextLvl, fx - 1, 1, subdivLevels, vertDataSize));
+ VertDataAdd(q, _face_getIFCoEdge(f, e, f_ed_idx, nextLvl, fx + 1, 1, subdivLevels, vertDataSize));
- VertDataAdd(r, _face_getIFCoEdge(f, e, curLvl, x, 1, subdivLevels, vertDataSize));
+ VertDataAdd(r, _face_getIFCoEdge(f, e, f_ed_idx, curLvl, x, 1, subdivLevels, vertDataSize));
numFaces++;
}
VertDataMulN(q, 1.0f / (numFaces * 2.0f));