From 208af4d996b54c236cd5cfbc7e88644149320434 Mon Sep 17 00:00:00 2001 From: archmoj Date: Fri, 6 Aug 2021 14:55:15 -0400 Subject: [PATCH 1/5] ignore lock file --- .gitignore | 1 + 1 file changed, 1 insertion(+) 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 From 7cf9f1f93edbe48df21b3633e2b745f84445b78a Mon Sep 17 00:00:00 2001 From: archmoj Date: Fri, 6 Aug 2021 14:55:49 -0400 Subject: [PATCH 2/5] bump version as a minor --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ead13c4..562ec1a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ndarray-extract-contour", - "version": "1.0.1", + "version": "1.1.0", "description": "Generic contour extraction library for surface nets/dual contouring", "main": "contour.js", "directories": { From b1891ad3a16c36c0757d3180c8dcf4a7770d9695 Mon Sep 17 00:00:00 2001 From: archmoj Date: Fri, 6 Aug 2021 14:57:08 -0400 Subject: [PATCH 3/5] trim spaces --- contour.js | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/contour.js b/contour.js index 1c4f7a4..c68a8bb 100644 --- a/contour.js +++ b/contour.js @@ -83,7 +83,7 @@ function compileSurfaceProcedure(vertexFunc, faceFunc, phaseFunc, scalarArgs, or //Assemble arguments for(var i=0; i=0; --i) { - forLoopBegin(i, 0) + forLoopBegin(i, 0) } var phaseFuncArgs = [] for(var i=0; i Date: Thu, 12 Aug 2021 16:53:14 -0400 Subject: [PATCH 4/5] cache functions for gl-vis --- contour.js | 339 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 332 insertions(+), 7 deletions(-) diff --git a/contour.js b/contour.js index c68a8bb..b0175cb 100644 --- a/contour.js +++ b/contour.js @@ -67,8 +67,327 @@ function permBitmask(dimension, mask, order) { return r } +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 + } + p0 += u0_1 + if (s1 > 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 + } + } + p0 += u0_1 + X = 0 + T = e1 + e1 = y1 + y1 = T + T = e2 + e2 = y2 + y2 = T + T = e3 + e3 = y3 + y3 = T + for (i1 = 2; i1 < s1; ++i1) { + 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++ + 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 + } + } + freeUint32(V) + freeUint32(P) + } + }, + "false,1,0": function anonymous(vertex, face, phase, mallocUint32, freeUint32) { + return function extractContour1_0(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_1 = t0_1 | 0, + u0_0 = (t0_0 - t0_1 * s1) | 0, + i0 = 0, + i1 = 0, + N = 0, + Q = (2 * s1) | 0, + P = mallocUint32(Q), + V = mallocUint32(Q), + X = 0, + b0 = 0, + e2 = -1 | 0, + y2 = -1 | 0, + b2 = 0, + e1 = -s1 | 0, + y1 = s1 | 0, + b1 = 0, + e3 = (-s1 - 1) | 0, + y3 = (s1 - 1) | 0, + b3 = 0, + v0 = 0, + T = 0 + for (i1 = 0; i1 < s1; ++i1) { + P[X++] = phase(d0[p0], x0, x1, x2) + p0 += u0_1 + } + p0 += u0_0 + if (s0 > 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 + } + } + p0 += u0_0 + X = 0 + T = e1 + e1 = y1 + y1 = T + T = e2 + e2 = y2 + y2 = T + T = e3 + e3 = y3 + y3 = T + for (i0 = 2; i0 < s0; ++i0) { + 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++ + 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 + } + } + freeUint32(V) + freeUint32(P) + } + }, +} + //Generates the surface procedure function compileSurfaceProcedure(vertexFunc, faceFunc, phaseFunc, scalarArgs, order, typesig) { + var key = [typesig, order].join(',') + var arrayArgs = typesig.length var dimension = order.length @@ -353,13 +672,19 @@ function compileSurfaceProcedure(vertexFunc, faceFunc, phaseFunc, scalarArgs, or "}", "return ", funcName ].join("") - var proc = new Function( - "vertex", - "face", - "phase", - "mallocUint32", - "freeUint32", - procedureCode) + var proc = allFns[key] + if(!proc) { + proc = new Function( + "vertex", + "face", + "phase", + "mallocUint32", + "freeUint32", + procedureCode) + + console.log(key, proc) + } + return proc( vertexFunc, faceFunc, From 563317603ac0e4ad203f197cfdd989f60da94e39 Mon Sep 17 00:00:00 2001 From: archmoj Date: Thu, 12 Aug 2021 16:54:43 -0400 Subject: [PATCH 5/5] remove function constructors --- contour.js | 359 ----------------------------------------------------- 1 file changed, 359 deletions(-) diff --git a/contour.js b/contour.js index b0175cb..24c247b 100644 --- a/contour.js +++ b/contour.js @@ -4,69 +4,6 @@ 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]) ) - } - 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; --i) { - forLoopBegin(i, 0) - } - var phaseFuncArgs = [] - for(var i=0; i0; k=(k-1)&subset) { - faceArgs.push(VERTEX_IDS + "[" + POINTER + "+" + pdelta(k) + "]") - } - faceArgs.push(vert(0)) - for(var k=0; k0){", - index(order[i]), "=1;") - createLoop(i-1, mask|(1<