diff --git a/.gitignore b/.gitignore index ddc9ab3..c7b283a 100644 --- a/.gitignore +++ b/.gitignore @@ -12,5 +12,6 @@ logs results npm-debug.log +package-lock.json node_modules/* *.DS_Store \ No newline at end of file diff --git a/contour.js b/contour.js index 1c4f7a4..24c247b 100644 --- a/contour.js +++ b/contour.js @@ -4,367 +4,333 @@ var pool = require("typedarray-pool") module.exports = createSurfaceExtractor -//Helper macros -function array(i) { - return "a" + i -} -function data(i) { - return "d" + i -} -function cube(i,bitmask) { - return "c" + i + "_" + bitmask -} -function shape(i) { - return "s" + i -} -function stride(i,j) { - return "t" + i + "_" + j -} -function offset(i) { - return "o" + i -} -function scalar(i) { - return "x" + i -} -function pointer(i) { - return "p" + i -} -function delta(i,bitmask) { - return "d" + i + "_" + bitmask -} -function index(i) { - return "i" + i -} -function step(i,j) { - return "u" + i + "_" + j -} -function pcube(bitmask) { - return "b" + bitmask -} -function qcube(bitmask) { - return "y" + bitmask -} -function pdelta(bitmask) { - return "e" + bitmask -} -function vert(i) { - return "v" + i -} -var VERTEX_IDS = "V" -var PHASES = "P" -var VERTEX_COUNT = "N" -var POOL_SIZE = "Q" -var POINTER = "X" -var TEMPORARY = "T" - -function permBitmask(dimension, mask, order) { - var r = 0 - for(var i=0; i 0) { - stepVal.push(stride(i, order[j-1]) + "*" + shape(order[j-1]) ) +var allFns = { + "false,0,1": function surfaceProcedure(vertex, face, phase, mallocUint32, freeUint32) { + return function extractContour0_1(a0, x0, x1, x2) { + var s0 = a0.shape[0] | 0, + s1 = a0.shape[1] | 0, + d0 = a0.data, + o0 = a0.offset | 0, + t0_0 = a0.stride[0] | 0, + t0_1 = a0.stride[1] | 0, + p0 = o0, + c0_0, + d0_1 = -t0_0 | 0, + c0_1 = 0, + d0_2 = -t0_1 | 0, + c0_2 = 0, + d0_3 = (-t0_0 - t0_1) | 0, + c0_3 = 0, + u0_0 = t0_0 | 0, + u0_1 = (t0_1 - t0_0 * s0) | 0, + i0 = 0, + i1 = 0, + N = 0, + Q = (2 * s0) | 0, + P = mallocUint32(Q), + V = mallocUint32(Q), + X = 0, + b0 = 0, + e1 = -1 | 0, + y1 = -1 | 0, + b1 = 0, + e2 = -s0 | 0, + y2 = s0 | 0, + b2 = 0, + e3 = (-s0 - 1) | 0, + y3 = (s0 - 1) | 0, + b3 = 0, + v0 = 0, + T = 0 + for (i0 = 0; i0 < s0; ++i0) { + P[X++] = phase(d0[p0], x0, x1, x2) + p0 += u0_0 } - vars.push(step(i,order[j]) + "=(" + stepVal.join("-") + ")|0") - } - } - //Create index variables - for(var i=0; i=0; --i) { - sizeVariable.push(shape(order[i])) - } - //Previous phases and vertex_ids - vars.push(POOL_SIZE + "=(" + sizeVariable.join("*") + ")|0", - PHASES + "=mallocUint32(" + POOL_SIZE + ")", - VERTEX_IDS + "=mallocUint32(" + POOL_SIZE + ")", - POINTER + "=0") - //Create cube variables for phases - vars.push(pcube(0) + "=0") - for(var j=1; j<(1< 0) { + i1 = 1 + P[X++] = phase(d0[p0], x0, x1, x2) + p0 += u0_0 + if (s0 > 0) { + i0 = 1 + c0_0 = d0[p0] + b0 = P[X] = phase(c0_0, x0, x1, x2) + b1 = P[X + e1] + b2 = P[X + e2] + b3 = P[X + e3] + if (b0 !== b1 || b0 !== b2 || b0 !== b3) { + c0_1 = d0[p0 + d0_1] + c0_2 = d0[p0 + d0_2] + c0_3 = d0[p0 + d0_3] + vertex(i0, i1, c0_0, c0_1, c0_2, c0_3, b0, b1, b2, b3, x0, x1, x2) + v0 = V[X] = N++ + } + X += 1 + p0 += u0_0 + for (i0 = 2; i0 < s0; ++i0) { + c0_0 = d0[p0] + b0 = P[X] = phase(c0_0, x0, x1, x2) + b1 = P[X + e1] + b2 = P[X + e2] + b3 = P[X + e3] + if (b0 !== b1 || b0 !== b2 || b0 !== b3) { + c0_1 = d0[p0 + d0_1] + c0_2 = d0[p0 + d0_2] + c0_3 = d0[p0 + d0_3] + vertex(i0, i1, c0_0, c0_1, c0_2, c0_3, b0, b1, b2, b3, x0, x1, x2) + v0 = V[X] = N++ + if (b3 !== b1) { + face(V[X + e1], v0, c0_3, c0_1, b3, b1, x0, x1, x2) + } + } + X += 1 + p0 += u0_0 + } } - } - cubeStep.push(shape(order[k])) - } - var signFlag = "" - if(cubeDelta[0].indexOf(shape(order[dimension-2])) < 0) { - signFlag = "-" - } - var jperm = permBitmask(dimension, j, order) - vars.push(pdelta(jperm) + "=(-" + cubeDelta.join("-") + ")|0", - qcube(jperm) + "=(" + signFlag + cubeDelta.join("-") + ")|0", - pcube(jperm) + "=0") - } - vars.push(vert(0) + "=0", TEMPORARY + "=0") - - function forLoopBegin(i, start) { - code.push("for(", index(order[i]), "=", start, ";", - index(order[i]), "<", shape(order[i]), ";", - "++", index(order[i]), "){") - } - - function forLoopEnd(i) { - for(var j=0; j=0; --i) { - forLoopBegin(i, 0) - } - var phaseFuncArgs = [] - for(var i=0; i 0) { + i0 = 1 + c0_0 = d0[p0] + b0 = P[X] = phase(c0_0, x0, x1, x2) + b1 = P[X + e1] + b2 = P[X + e2] + b3 = P[X + e3] + if (b0 !== b1 || b0 !== b2 || b0 !== b3) { + c0_1 = d0[p0 + d0_1] + c0_2 = d0[p0 + d0_2] + c0_3 = d0[p0 + d0_3] + vertex(i0, i1, c0_0, c0_1, c0_2, c0_3, b0, b1, b2, b3, x0, x1, x2) + v0 = V[X] = N++ + if (b3 !== b2) { + face(V[X + e2], v0, c0_2, c0_3, b2, b3, x0, x1, x2) + } + } + X += 1 + p0 += u0_0 + for (i0 = 2; i0 < s0; ++i0) { + c0_0 = d0[p0] + b0 = P[X] = phase(c0_0, x0, x1, x2) + b1 = P[X + e1] + b2 = P[X + e2] + b3 = P[X + e3] + if (b0 !== b1 || b0 !== b2 || b0 !== b3) { + c0_1 = d0[p0 + d0_1] + c0_2 = d0[p0 + d0_2] + c0_3 = d0[p0 + d0_3] + vertex(i0, i1, c0_0, c0_1, c0_2, c0_3, b0, b1, b2, b3, x0, x1, x2) + v0 = V[X] = N++ + if (b3 !== b2) { + face(V[X + e2], v0, c0_2, c0_3, b2, b3, x0, x1, x2) + } + if (b3 !== b1) { + face(V[X + e1], v0, c0_3, c0_1, b3, b1, x0, x1, x2) + } + } + X += 1 + p0 += u0_0 + } + } + if (i1 & 1) { + X = 0 + } + T = e1 + e1 = y1 + y1 = T + T = e2 + e2 = y2 + y2 = T + T = e3 + e3 = y3 + y3 = T + p0 += u0_1 } - vertexArgs.push(cube(i,j)) } + freeUint32(V) + freeUint32(P) } - for(var i=0; i<(1<0; k=(k-1)&subset) { - faceArgs.push(VERTEX_IDS + "[" + POINTER + "+" + pdelta(k) + "]") - } - faceArgs.push(vert(0)) - for(var k=0; k 0) { + i0 = 1 + P[X++] = phase(d0[p0], x0, x1, x2) + p0 += u0_1 + if (s1 > 0) { + i1 = 1 + c0_0 = d0[p0] + b0 = P[X] = phase(c0_0, x0, x1, x2) + b1 = P[X + e1] + b2 = P[X + e2] + b3 = P[X + e3] + if (b0 !== b1 || b0 !== b2 || b0 !== b3) { + c0_1 = d0[p0 + d0_1] + c0_2 = d0[p0 + d0_2] + c0_3 = d0[p0 + d0_3] + vertex(i0, i1, c0_0, c0_1, c0_2, c0_3, b0, b1, b2, b3, x0, x1, x2) + v0 = V[X] = N++ + } + X += 1 + p0 += u0_1 + for (i1 = 2; i1 < s1; ++i1) { + c0_0 = d0[p0] + b0 = P[X] = phase(c0_0, x0, x1, x2) + b1 = P[X + e1] + b2 = P[X + e2] + b3 = P[X + e3] + if (b0 !== b1 || b0 !== b2 || b0 !== b3) { + c0_1 = d0[p0 + d0_1] + c0_2 = d0[p0 + d0_2] + c0_3 = d0[p0 + d0_3] + vertex(i0, i1, c0_0, c0_1, c0_2, c0_3, b0, b1, b2, b3, x0, x1, x2) + v0 = V[X] = N++ + if (b3 !== b2) { + face(V[X + e2], v0, c0_2, c0_3, b2, b3, x0, x1, x2) + } + } + X += 1 + p0 += u0_1 } } - if(j&1) { - faceArgs.push(corner, edge) - } else { - faceArgs.push(edge, corner) - } - for(var k=0; k 0) { + i1 = 1 + c0_0 = d0[p0] + b0 = P[X] = phase(c0_0, x0, x1, x2) + b1 = P[X + e1] + b2 = P[X + e2] + b3 = P[X + e3] + if (b0 !== b1 || b0 !== b2 || b0 !== b3) { + c0_1 = d0[p0 + d0_1] + c0_2 = d0[p0 + d0_2] + c0_3 = d0[p0 + d0_3] + vertex(i0, i1, c0_0, c0_1, c0_2, c0_3, b0, b1, b2, b3, x0, x1, x2) + v0 = V[X] = N++ + if (b3 !== b1) { + face(V[X + e1], v0, c0_3, c0_1, b3, b1, x0, x1, x2) + } + } + X += 1 + p0 += u0_1 + for (i1 = 2; i1 < s1; ++i1) { + c0_0 = d0[p0] + b0 = P[X] = phase(c0_0, x0, x1, x2) + b1 = P[X + e1] + b2 = P[X + e2] + b3 = P[X + e3] + if (b0 !== b1 || b0 !== b2 || b0 !== b3) { + c0_1 = d0[p0 + d0_1] + c0_2 = d0[p0 + d0_2] + c0_3 = d0[p0 + d0_3] + vertex(i0, i1, c0_0, c0_1, c0_2, c0_3, b0, b1, b2, b3, x0, x1, x2) + v0 = V[X] = N++ + if (b3 !== b2) { + face(V[X + e2], v0, c0_2, c0_3, b2, b3, x0, x1, x2) + } + if (b3 !== b1) { + face(V[X + e1], v0, c0_3, c0_1, b3, b1, x0, x1, x2) + } + } + X += 1 + p0 += u0_1 + } + } + if (i0 & 1) { + X = 0 + } + T = e1 + e1 = y1 + y1 = T + T = e2 + e2 = y2 + y2 = T + T = e3 + e3 = y3 + y3 = T + p0 += u0_0 } - code.push("if(", corner, "!==", edge, "){", - "face(", faceArgs.join(), ")}") } + freeUint32(V) + freeUint32(P) } - - //Increment pointer, close off if statement - code.push("}", - POINTER, "+=1;") - } - - function flip() { - for(var j=1; j<(1<0){", - index(order[i]), "=1;") - createLoop(i-1, mask|(1<