Skip to content

Commit 4c25fb0

Browse files
committed
basic implementation complete
1 parent b082172 commit 4c25fb0

File tree

2 files changed

+75
-21
lines changed

2 files changed

+75
-21
lines changed

contour.js

+74-20
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
var pool = require("typedarray-pool")
44
var beautify = require("js-beautify")
55
var invert = require("invert-permutation")
6+
var gray = require("gray-code")
67

78
module.exports = createSurfaceExtractor
89

@@ -43,6 +44,9 @@ function step(i,j) {
4344
function pcube(bitmask) {
4445
return "b" + bitmask
4546
}
47+
function qcube(bitmask) {
48+
return "y" + bitmask
49+
}
4650
function pdelta(bitmask) {
4751
return "e" + bitmask
4852
}
@@ -54,6 +58,22 @@ var PHASES = "P"
5458
var VERTEX_COUNT = "N"
5559
var POOL_SIZE = "Q"
5660
var POINTER = "X"
61+
var TEMPORARY = "T"
62+
63+
function fixPerm(face, dimension, k) {
64+
var seq = gray(dimension-1).map(function(f) {
65+
return f.reduce(function(p, x, i) {
66+
return p + (x << i)
67+
}, 0)
68+
})
69+
var x = seq.map(function(y) {
70+
return face[y]
71+
})
72+
if(k & 1) {
73+
x.reverse()
74+
}
75+
return x
76+
}
5777

5878
//Generates the surface procedure
5979
function compileSurfaceProcedure(vertexFunc, faceFunc, phaseFunc, scalarArgs, order, typesig) {
@@ -100,7 +120,6 @@ function compileSurfaceProcedure(vertexFunc, faceFunc, phaseFunc, scalarArgs, or
100120
vars.push(cube(i,j))
101121
}
102122
}
103-
104123
//Create step variables
105124
for(var i=0; i<arrayArgs; ++i) {
106125
for(var j=0; j<dimension; ++j) {
@@ -131,19 +150,40 @@ function compileSurfaceProcedure(vertexFunc, faceFunc, phaseFunc, scalarArgs, or
131150
vars.push(pcube(0) + "=0")
132151
for(var j=1; j<(1<<dimension); ++j) {
133152
var cubeDelta = []
134-
var cubeStep = [ "1" ]
153+
var cubeStep = [ ]
135154
for(var k=dimension-1; k>=0; --k) {
136-
if(j & (1<<order[k])) {
137-
cubeDelta.push(cubeStep.join("*"))
155+
if(j & (1<<k)) {
156+
if(cubeStep.length === 0) {
157+
cubeDelta.push("1")
158+
} else {
159+
cubeDelta.push(cubeStep.join("*"))
160+
}
138161
}
139162
cubeStep.push(shape(order[k]))
140163
}
141-
vars.push(pdelta(j) + "=-(" + cubeDelta.join("+") + ")|0",
164+
vars.push(pdelta(j) + "=(-" + cubeDelta.join("-") + ")|0",
142165
pcube(j) + "=0")
143166
}
144-
for(var i=0; i<(1<<dimension)-1; ++i) {
145-
vars.push(vert(i) + "=0")
167+
for(var j=1; j<(1<<dimension); ++j) {
168+
var cubeDelta = []
169+
var cubeStep = [ ]
170+
for(var k=dimension-1; k>=0; --k) {
171+
if(j & (1<<k)) {
172+
if(cubeStep.length === 0) {
173+
cubeDelta.push("1")
174+
} else {
175+
if(k === 0) {
176+
cubeDelta.push("-" + cubeStep.join("*"))
177+
} else {
178+
cubeDelta.push(cubeStep.join("*"))
179+
}
180+
}
181+
}
182+
cubeStep.push(shape(order[k]))
183+
}
184+
vars.push(qcube(j) + "=-(" + cubeDelta.join("+") + ")|0")
146185
}
186+
vars.push(vert(0) + "=0", TEMPORARY)
147187

148188
function forLoopBegin(i, start) {
149189
code.push("for(", index(order[i]), "=", start, ";",
@@ -241,20 +281,20 @@ function compileSurfaceProcedure(vertexFunc, faceFunc, phaseFunc, scalarArgs, or
241281
code.push("vertex(", vertexArgs.join(), ");",
242282
vert(0), "=", VERTEX_IDS, "[", POINTER, "]=", VERTEX_COUNT, "++;")
243283

244-
//TODO: Check face crossing
284+
//Check for face crossings
245285
if(mask < (1<<dimension)-1) {
246-
for(var j=1; j<(1<<dimension); ++j) {
247-
if((j & mask) === 0) {
248-
code.push(vert(j), "=", VERTEX_IDS, "[", POINTER, "+", pcube(j), "];")
249-
}
250-
}
251286
var corner = pcube((1<<dimension)-1)
252287
for(var j=0; j<dimension; ++j) {
253-
if(mask & (1<<j)) {
288+
if(!(mask & (1<<j))) {
254289
//Check face
255-
var edge = pcube(((1<<dimension)-1)^(1<<j))
256-
var faceArgs = []
257-
290+
var subset = ((1<<dimension)-1)^(1<<j)
291+
var edge = pcube(subset)
292+
var faceArgs = [ ]
293+
for(var k=subset; k>0; k=(k-1)&subset) {
294+
faceArgs.push(VERTEX_IDS + "[" + POINTER + "+" + pdelta(k) + "]")
295+
}
296+
faceArgs.push(vert(0))
297+
faceArgs = fixPerm(faceArgs, dimension, j)
258298
faceArgs.push(corner, edge)
259299
code.push("if(", corner, "!==", edge, "){",
260300
"face(", faceArgs.join(), ")}")
@@ -269,6 +309,14 @@ function compileSurfaceProcedure(vertexFunc, faceFunc, phaseFunc, scalarArgs, or
269309
POINTER, "+=1;")
270310
}
271311

312+
function flip() {
313+
for(var j=1; j<(1<<dimension); ++j) {
314+
code.push(TEMPORARY, "=", pcube(j), ";",
315+
pcube(j), "=", qcube(j), ";",
316+
qcube(j), "=", TEMPORARY, ";")
317+
}
318+
}
319+
272320
function createLoop(i, mask) {
273321
if(i < 0) {
274322
processGridCell(mask)
@@ -280,8 +328,17 @@ function compileSurfaceProcedure(vertexFunc, faceFunc, phaseFunc, scalarArgs, or
280328
for(var j=0; j<arrayArgs; ++j) {
281329
code.push(pointer(j), "+=", step(j,i), ";")
282330
}
331+
if(i === dimension-1) {
332+
code.push(POINTER, "=0;")
333+
flip()
334+
}
283335
forLoopBegin(i, 2)
284336
createLoop(i-1, mask)
337+
if(i === dimension-1) {
338+
code.push("if(", index(order[dimension-1]), "&1){",
339+
POINTER, "=0;}")
340+
flip()
341+
}
285342
forLoopEnd(i)
286343
code.push("}")
287344
}
@@ -348,15 +405,12 @@ function createSurfaceExtractor(args) {
348405
}
349406
var getters = args.getters || []
350407
var typesig = new Array(arrays)
351-
console.log(getters)
352408
for(var i=0; i<arrays; ++i) {
353-
console.log("here1")
354409
if(getters.indexOf(i) >= 0) {
355410
typesig[i] = true
356411
} else {
357412
typesig[i] = false
358413
}
359-
console.log("here2")
360414
}
361415
return compileSurfaceProcedure(
362416
args.vertex,

test/test.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ tape("test-vectorize", function(t) {
77

88
var testVectorizer = createExtractor({
99
order: [1, 0],
10-
vertex: function(x, y, p00, p01, p10, p11, s00, s01, s10, s11) {
10+
vertex: function(x, y, z) {
1111
console.log("got vertex:", x, y)
1212
},
1313
phase: function(s) {

0 commit comments

Comments
 (0)