inline int borderHealth(short *board, int n, int d, int r, int c, short *newHealth) {
int i, j, k;
int neighborDepth, neighborRow, neighborColumn;
short surroundingHealth = 0;
for (i = -1; i <= 1; i++) {
for (j = -1; j <= 1; j++) {
for (k = -1; k <= 1; k++) {
if (i == 0 && j == 0 && k == 0) continue;
if (d + i == -1) neighborDepth = n - 1;
else if (d + i == n) neighborDepth = 0;
else neighborDepth = (d + i);
if (r + j == -1) neighborRow = n - 1;
else if (r + j == n) neighborRow = 0;
else neighborRow = (r + j);
if (c + k == -1) neighborColumn = n - 1;
else if (c + k == n) neighborColumn = 0;
else neighborColumn = (c + k);
surroundingHealth += INDEX3D(board, n, neighborDepth, neighborRow,
neighborColumn);
}
}
}
return newHealth[surroundingHealth];
}
void optIterate3DLife(int n, short *prev, short *next, short *newHealth) {
int d, r, c, nm1 = n-1, n2 = n*n;
short *dp, *rp, *cp;
for (d = 1, dp = next + n2; d < nm1; d++, dp += n2) {
for (r = 1, rp = dp + n; r < nm1; r++, rp += n) {
short *p, left = 0, mid = 0, right = 0, self;
c = 1; cp = rp + 1;
p = prev + ((d-1) * n2) + ((r-1) * n) + c;
left += *(p - 1);
mid += *p;
right += *(p + 1);
p += n;
left += *(p - 1);
mid += *p;
right += *(p + 1);
p += n;
left += *(p - 1);
mid += *p;
right += *(p + 1);
p += n2 - (n << 1);
left += *(p - 1);
mid += *p;
right += *(p + 1);
p += n;
left += *(p - 1);
mid += *p; self = *p;
right += *(p + 1);
p += n;
left += *(p - 1);
mid += *p;
right += *(p + 1);
p += n2 - (n << 1);
left += *(p - 1);
mid += *p;
right += *(p + 1);
p += n;
left += *(p - 1);
mid += *p;
right += *(p + 1);
p += n;
left += *(p - 1);
mid += *p;
right += *(p + 1);
*cp = newHealth[left + mid + right - self];
for (c = 2, cp = rp + 2; c < nm1; c++, cp++) {
left = mid;
mid = right;
right = 0;
p = prev + ((d-1) * n2) + ((r-1) * n) + c;
right += *(p + 1);
p += n;
right += *(p + 1);
p += n;
right += *(p + 1);
p += n2 - (n << 1);
right += *(p + 1);
p += n;
self = *p;
right += *(p + 1);
p += n;
right += *(p + 1);
p += n2 - (n << 1);
right += *(p + 1);
p += n;
right += *(p + 1);
p += n;
right += *(p + 1);
*cp = newHealth[left + mid + right - self];
}
}
}
d = 0;
for (r = 0; r < n; r++) {
for (c = 0; c < n; c++) {
INDEX3D(next, n, d, r, c) = borderHealth(prev, n, d, r, c, newHealth);
}
}
r = 0;
for (d = 0; d < n; d++) {
for (c = 0; c < n; c++) {
INDEX3D(next, n, d, r, c) = borderHealth(prev, n, d, r, c, newHealth);
}
}
c = 0;
for (d = 0; d < n; d++) {
for (r = 0; r < n; r++) {
INDEX3D(next, n, d, r, c) = borderHealth(prev, n, d, r, c, newHealth);
}
}
d = nm1;
for (r = 0; r < n; r++) {
for (c = 0; c < n; c++) {
INDEX3D(next, n, d, r, c) = borderHealth(prev, n, d, r, c, newHealth);
}
}
r = nm1;
for (d = 0; d < n; d++) {
for (c = 0; c < n; c++) {
INDEX3D(next, n, d, r, c) = borderHealth(prev, n, d, r, c, newHealth);
}
}
c = nm1;
for (d = 0; d < n; d++) {
for (r = 0; r < n; r++) {
INDEX3D(next, n, d, r, c) = borderHealth(prev, n, d, r, c, newHealth);
}
}
}