[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [45839] trunk/blender/source/blender/ blenkernel/intern/CCGSubSurf.c: subsurf - avoid 'for' loop finding the edge index in a face multiple times when calling _face_getIFCoEdge .
Campbell Barton
ideasman42 at gmail.com
Sun Apr 22 05:07:27 CEST 2012
Revision: 45839
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=45839
Author: campbellbarton
Date: 2012-04-22 03:07:21 +0000 (Sun, 22 Apr 2012)
Log Message:
-----------
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.
Modified Paths:
--------------
trunk/blender/source/blender/blenkernel/intern/CCGSubSurf.c
Modified: trunk/blender/source/blender/blenkernel/intern/CCGSubSurf.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/CCGSubSurf.c 2012-04-22 02:41:10 UTC (rev 45838)
+++ trunk/blender/source/blender/blenkernel/intern/CCGSubSurf.c 2012-04-22 03:07:21 UTC (rev 45839)
@@ -690,30 +690,36 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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));
More information about the Bf-blender-cvs
mailing list