"use strict" module.exports = surfaceNets var generateContourExtractor = require("ndarray-extract-contour") var triangulateCube = require("triangulate-hypercube") var zeroCrossings = require("zero-crossings") function buildSurfaceNets(order, dtype) { var dimension = order.length var code = ["'use strict';"] var funcName = "surfaceNets" + order.join("_") + "d" + dtype //Contour extraction function code.push( "var contour=genContour({", "order:[", order.join(), "],", "scalarArguments: 3,", "phase:function phaseFunc(p,a,b,c) { return (p > c)|0 },") if(dtype === "generic") { code.push("getters:[0],") } //Generate vertex function var cubeArgs = [] var extraArgs = [] for(var i=0; i>>7){") } for(var i=0; i<1<<(1< 128) { if((i%128)===0) { if(extraFuncs.length > 0) { currentFunc.push("}}") } var efName = "vExtra" + extraFuncs.length code.push("case ", (i>>>7), ":", efName, "(m&0x7f,", extraArgs.join(), ");break;") currentFunc = [ "function ", efName, "(m,", extraArgs.join(), "){switch(m){" ] extraFuncs.push(currentFunc) } } currentFunc.push("case ", (i&0x7f), ":") var crossings = new Array(dimension) var denoms = new Array(dimension) var crossingCount = new Array(dimension) var bias = new Array(dimension) var totalCrossings = 0 for(var j=0; j j) { continue } if(!(i&(1< 0) { cStr = "+" + crossingCount[k] + "*c" } var weight = 0.5 * (crossings[k].length / totalCrossings) var shift = 0.5 + 0.5 * (bias[k] / totalCrossings) vertexStr.push("d" + k + "-" + shift + "-" + weight + "*(" + crossings[k].join("+") + cStr + ")/(" + denoms[k].join("+") + ")") } } currentFunc.push("a.push([", vertexStr.join(), "]);", "break;") } code.push("}},") if(extraFuncs.length > 0) { currentFunc.push("}}") } //Create face function var faceArgs = [] for(var i=0; i<(1<<(dimension-1)); ++i) { faceArgs.push("v" + i) } faceArgs.push("c0", "c1", "p0", "p1", "a", "b", "c") code.push("cell:function cellFunc(", faceArgs.join(), "){") var facets = triangulateCube(dimension-1) code.push("if(p0){b.push(", facets.map(function(f) { return "[" + f.map(function(v) { return "v" + v }) + "]" }).join(), ")}else{b.push(", facets.map(function(f) { var e = f.slice() e.reverse() return "[" + e.map(function(v) { return "v" + v }) + "]" }).join(), ")}}});function ", funcName, "(array,level){var verts=[],cells=[];contour(array,verts,cells,level);return {positions:verts,cells:cells};} return ", funcName, ";") for(var i=0; i