@@ -67,8 +67,327 @@ function permBitmask(dimension, mask, order) {
67
67
return r
68
68
}
69
69
70
+ var allFns = {
71
+ "false,0,1" : function surfaceProcedure ( vertex , face , phase , mallocUint32 , freeUint32 ) {
72
+ return function extractContour0_1 ( a0 , x0 , x1 , x2 ) {
73
+ var s0 = a0 . shape [ 0 ] | 0 ,
74
+ s1 = a0 . shape [ 1 ] | 0 ,
75
+ d0 = a0 . data ,
76
+ o0 = a0 . offset | 0 ,
77
+ t0_0 = a0 . stride [ 0 ] | 0 ,
78
+ t0_1 = a0 . stride [ 1 ] | 0 ,
79
+ p0 = o0 ,
80
+ c0_0 ,
81
+ d0_1 = - t0_0 | 0 ,
82
+ c0_1 = 0 ,
83
+ d0_2 = - t0_1 | 0 ,
84
+ c0_2 = 0 ,
85
+ d0_3 = ( - t0_0 - t0_1 ) | 0 ,
86
+ c0_3 = 0 ,
87
+ u0_0 = t0_0 | 0 ,
88
+ u0_1 = ( t0_1 - t0_0 * s0 ) | 0 ,
89
+ i0 = 0 ,
90
+ i1 = 0 ,
91
+ N = 0 ,
92
+ Q = ( 2 * s0 ) | 0 ,
93
+ P = mallocUint32 ( Q ) ,
94
+ V = mallocUint32 ( Q ) ,
95
+ X = 0 ,
96
+ b0 = 0 ,
97
+ e1 = - 1 | 0 ,
98
+ y1 = - 1 | 0 ,
99
+ b1 = 0 ,
100
+ e2 = - s0 | 0 ,
101
+ y2 = s0 | 0 ,
102
+ b2 = 0 ,
103
+ e3 = ( - s0 - 1 ) | 0 ,
104
+ y3 = ( s0 - 1 ) | 0 ,
105
+ b3 = 0 ,
106
+ v0 = 0 ,
107
+ T = 0
108
+ for ( i0 = 0 ; i0 < s0 ; ++ i0 ) {
109
+ P [ X ++ ] = phase ( d0 [ p0 ] , x0 , x1 , x2 )
110
+ p0 += u0_0
111
+ }
112
+ p0 += u0_1
113
+ if ( s1 > 0 ) {
114
+ i1 = 1
115
+ P [ X ++ ] = phase ( d0 [ p0 ] , x0 , x1 , x2 )
116
+ p0 += u0_0
117
+ if ( s0 > 0 ) {
118
+ i0 = 1
119
+ c0_0 = d0 [ p0 ]
120
+ b0 = P [ X ] = phase ( c0_0 , x0 , x1 , x2 )
121
+ b1 = P [ X + e1 ]
122
+ b2 = P [ X + e2 ]
123
+ b3 = P [ X + e3 ]
124
+ if ( b0 !== b1 || b0 !== b2 || b0 !== b3 ) {
125
+ c0_1 = d0 [ p0 + d0_1 ]
126
+ c0_2 = d0 [ p0 + d0_2 ]
127
+ c0_3 = d0 [ p0 + d0_3 ]
128
+ vertex ( i0 , i1 , c0_0 , c0_1 , c0_2 , c0_3 , b0 , b1 , b2 , b3 , x0 , x1 , x2 )
129
+ v0 = V [ X ] = N ++
130
+ }
131
+ X += 1
132
+ p0 += u0_0
133
+ for ( i0 = 2 ; i0 < s0 ; ++ i0 ) {
134
+ c0_0 = d0 [ p0 ]
135
+ b0 = P [ X ] = phase ( c0_0 , x0 , x1 , x2 )
136
+ b1 = P [ X + e1 ]
137
+ b2 = P [ X + e2 ]
138
+ b3 = P [ X + e3 ]
139
+ if ( b0 !== b1 || b0 !== b2 || b0 !== b3 ) {
140
+ c0_1 = d0 [ p0 + d0_1 ]
141
+ c0_2 = d0 [ p0 + d0_2 ]
142
+ c0_3 = d0 [ p0 + d0_3 ]
143
+ vertex ( i0 , i1 , c0_0 , c0_1 , c0_2 , c0_3 , b0 , b1 , b2 , b3 , x0 , x1 , x2 )
144
+ v0 = V [ X ] = N ++
145
+ if ( b3 !== b1 ) {
146
+ face ( V [ X + e1 ] , v0 , c0_3 , c0_1 , b3 , b1 , x0 , x1 , x2 )
147
+ }
148
+ }
149
+ X += 1
150
+ p0 += u0_0
151
+ }
152
+ }
153
+ p0 += u0_1
154
+ X = 0
155
+ T = e1
156
+ e1 = y1
157
+ y1 = T
158
+ T = e2
159
+ e2 = y2
160
+ y2 = T
161
+ T = e3
162
+ e3 = y3
163
+ y3 = T
164
+ for ( i1 = 2 ; i1 < s1 ; ++ i1 ) {
165
+ P [ X ++ ] = phase ( d0 [ p0 ] , x0 , x1 , x2 )
166
+ p0 += u0_0
167
+ if ( s0 > 0 ) {
168
+ i0 = 1
169
+ c0_0 = d0 [ p0 ]
170
+ b0 = P [ X ] = phase ( c0_0 , x0 , x1 , x2 )
171
+ b1 = P [ X + e1 ]
172
+ b2 = P [ X + e2 ]
173
+ b3 = P [ X + e3 ]
174
+ if ( b0 !== b1 || b0 !== b2 || b0 !== b3 ) {
175
+ c0_1 = d0 [ p0 + d0_1 ]
176
+ c0_2 = d0 [ p0 + d0_2 ]
177
+ c0_3 = d0 [ p0 + d0_3 ]
178
+ vertex ( i0 , i1 , c0_0 , c0_1 , c0_2 , c0_3 , b0 , b1 , b2 , b3 , x0 , x1 , x2 )
179
+ v0 = V [ X ] = N ++
180
+ if ( b3 !== b2 ) {
181
+ face ( V [ X + e2 ] , v0 , c0_2 , c0_3 , b2 , b3 , x0 , x1 , x2 )
182
+ }
183
+ }
184
+ X += 1
185
+ p0 += u0_0
186
+ for ( i0 = 2 ; i0 < s0 ; ++ i0 ) {
187
+ c0_0 = d0 [ p0 ]
188
+ b0 = P [ X ] = phase ( c0_0 , x0 , x1 , x2 )
189
+ b1 = P [ X + e1 ]
190
+ b2 = P [ X + e2 ]
191
+ b3 = P [ X + e3 ]
192
+ if ( b0 !== b1 || b0 !== b2 || b0 !== b3 ) {
193
+ c0_1 = d0 [ p0 + d0_1 ]
194
+ c0_2 = d0 [ p0 + d0_2 ]
195
+ c0_3 = d0 [ p0 + d0_3 ]
196
+ vertex ( i0 , i1 , c0_0 , c0_1 , c0_2 , c0_3 , b0 , b1 , b2 , b3 , x0 , x1 , x2 )
197
+ v0 = V [ X ] = N ++
198
+ if ( b3 !== b2 ) {
199
+ face ( V [ X + e2 ] , v0 , c0_2 , c0_3 , b2 , b3 , x0 , x1 , x2 )
200
+ }
201
+ if ( b3 !== b1 ) {
202
+ face ( V [ X + e1 ] , v0 , c0_3 , c0_1 , b3 , b1 , x0 , x1 , x2 )
203
+ }
204
+ }
205
+ X += 1
206
+ p0 += u0_0
207
+ }
208
+ }
209
+ if ( i1 & 1 ) {
210
+ X = 0
211
+ }
212
+ T = e1
213
+ e1 = y1
214
+ y1 = T
215
+ T = e2
216
+ e2 = y2
217
+ y2 = T
218
+ T = e3
219
+ e3 = y3
220
+ y3 = T
221
+ p0 += u0_1
222
+ }
223
+ }
224
+ freeUint32 ( V )
225
+ freeUint32 ( P )
226
+ }
227
+ } ,
228
+ "false,1,0" : function anonymous ( vertex , face , phase , mallocUint32 , freeUint32 ) {
229
+ return function extractContour1_0 ( a0 , x0 , x1 , x2 ) {
230
+ var s0 = a0 . shape [ 0 ] | 0 ,
231
+ s1 = a0 . shape [ 1 ] | 0 ,
232
+ d0 = a0 . data ,
233
+ o0 = a0 . offset | 0 ,
234
+ t0_0 = a0 . stride [ 0 ] | 0 ,
235
+ t0_1 = a0 . stride [ 1 ] | 0 ,
236
+ p0 = o0 ,
237
+ c0_0 ,
238
+ d0_1 = - t0_0 | 0 ,
239
+ c0_1 = 0 ,
240
+ d0_2 = - t0_1 | 0 ,
241
+ c0_2 = 0 ,
242
+ d0_3 = ( - t0_0 - t0_1 ) | 0 ,
243
+ c0_3 = 0 ,
244
+ u0_1 = t0_1 | 0 ,
245
+ u0_0 = ( t0_0 - t0_1 * s1 ) | 0 ,
246
+ i0 = 0 ,
247
+ i1 = 0 ,
248
+ N = 0 ,
249
+ Q = ( 2 * s1 ) | 0 ,
250
+ P = mallocUint32 ( Q ) ,
251
+ V = mallocUint32 ( Q ) ,
252
+ X = 0 ,
253
+ b0 = 0 ,
254
+ e2 = - 1 | 0 ,
255
+ y2 = - 1 | 0 ,
256
+ b2 = 0 ,
257
+ e1 = - s1 | 0 ,
258
+ y1 = s1 | 0 ,
259
+ b1 = 0 ,
260
+ e3 = ( - s1 - 1 ) | 0 ,
261
+ y3 = ( s1 - 1 ) | 0 ,
262
+ b3 = 0 ,
263
+ v0 = 0 ,
264
+ T = 0
265
+ for ( i1 = 0 ; i1 < s1 ; ++ i1 ) {
266
+ P [ X ++ ] = phase ( d0 [ p0 ] , x0 , x1 , x2 )
267
+ p0 += u0_1
268
+ }
269
+ p0 += u0_0
270
+ if ( s0 > 0 ) {
271
+ i0 = 1
272
+ P [ X ++ ] = phase ( d0 [ p0 ] , x0 , x1 , x2 )
273
+ p0 += u0_1
274
+ if ( s1 > 0 ) {
275
+ i1 = 1
276
+ c0_0 = d0 [ p0 ]
277
+ b0 = P [ X ] = phase ( c0_0 , x0 , x1 , x2 )
278
+ b1 = P [ X + e1 ]
279
+ b2 = P [ X + e2 ]
280
+ b3 = P [ X + e3 ]
281
+ if ( b0 !== b1 || b0 !== b2 || b0 !== b3 ) {
282
+ c0_1 = d0 [ p0 + d0_1 ]
283
+ c0_2 = d0 [ p0 + d0_2 ]
284
+ c0_3 = d0 [ p0 + d0_3 ]
285
+ vertex ( i0 , i1 , c0_0 , c0_1 , c0_2 , c0_3 , b0 , b1 , b2 , b3 , x0 , x1 , x2 )
286
+ v0 = V [ X ] = N ++
287
+ }
288
+ X += 1
289
+ p0 += u0_1
290
+ for ( i1 = 2 ; i1 < s1 ; ++ i1 ) {
291
+ c0_0 = d0 [ p0 ]
292
+ b0 = P [ X ] = phase ( c0_0 , x0 , x1 , x2 )
293
+ b1 = P [ X + e1 ]
294
+ b2 = P [ X + e2 ]
295
+ b3 = P [ X + e3 ]
296
+ if ( b0 !== b1 || b0 !== b2 || b0 !== b3 ) {
297
+ c0_1 = d0 [ p0 + d0_1 ]
298
+ c0_2 = d0 [ p0 + d0_2 ]
299
+ c0_3 = d0 [ p0 + d0_3 ]
300
+ vertex ( i0 , i1 , c0_0 , c0_1 , c0_2 , c0_3 , b0 , b1 , b2 , b3 , x0 , x1 , x2 )
301
+ v0 = V [ X ] = N ++
302
+ if ( b3 !== b2 ) {
303
+ face ( V [ X + e2 ] , v0 , c0_2 , c0_3 , b2 , b3 , x0 , x1 , x2 )
304
+ }
305
+ }
306
+ X += 1
307
+ p0 += u0_1
308
+ }
309
+ }
310
+ p0 += u0_0
311
+ X = 0
312
+ T = e1
313
+ e1 = y1
314
+ y1 = T
315
+ T = e2
316
+ e2 = y2
317
+ y2 = T
318
+ T = e3
319
+ e3 = y3
320
+ y3 = T
321
+ for ( i0 = 2 ; i0 < s0 ; ++ i0 ) {
322
+ P [ X ++ ] = phase ( d0 [ p0 ] , x0 , x1 , x2 )
323
+ p0 += u0_1
324
+ if ( s1 > 0 ) {
325
+ i1 = 1
326
+ c0_0 = d0 [ p0 ]
327
+ b0 = P [ X ] = phase ( c0_0 , x0 , x1 , x2 )
328
+ b1 = P [ X + e1 ]
329
+ b2 = P [ X + e2 ]
330
+ b3 = P [ X + e3 ]
331
+ if ( b0 !== b1 || b0 !== b2 || b0 !== b3 ) {
332
+ c0_1 = d0 [ p0 + d0_1 ]
333
+ c0_2 = d0 [ p0 + d0_2 ]
334
+ c0_3 = d0 [ p0 + d0_3 ]
335
+ vertex ( i0 , i1 , c0_0 , c0_1 , c0_2 , c0_3 , b0 , b1 , b2 , b3 , x0 , x1 , x2 )
336
+ v0 = V [ X ] = N ++
337
+ if ( b3 !== b1 ) {
338
+ face ( V [ X + e1 ] , v0 , c0_3 , c0_1 , b3 , b1 , x0 , x1 , x2 )
339
+ }
340
+ }
341
+ X += 1
342
+ p0 += u0_1
343
+ for ( i1 = 2 ; i1 < s1 ; ++ i1 ) {
344
+ c0_0 = d0 [ p0 ]
345
+ b0 = P [ X ] = phase ( c0_0 , x0 , x1 , x2 )
346
+ b1 = P [ X + e1 ]
347
+ b2 = P [ X + e2 ]
348
+ b3 = P [ X + e3 ]
349
+ if ( b0 !== b1 || b0 !== b2 || b0 !== b3 ) {
350
+ c0_1 = d0 [ p0 + d0_1 ]
351
+ c0_2 = d0 [ p0 + d0_2 ]
352
+ c0_3 = d0 [ p0 + d0_3 ]
353
+ vertex ( i0 , i1 , c0_0 , c0_1 , c0_2 , c0_3 , b0 , b1 , b2 , b3 , x0 , x1 , x2 )
354
+ v0 = V [ X ] = N ++
355
+ if ( b3 !== b2 ) {
356
+ face ( V [ X + e2 ] , v0 , c0_2 , c0_3 , b2 , b3 , x0 , x1 , x2 )
357
+ }
358
+ if ( b3 !== b1 ) {
359
+ face ( V [ X + e1 ] , v0 , c0_3 , c0_1 , b3 , b1 , x0 , x1 , x2 )
360
+ }
361
+ }
362
+ X += 1
363
+ p0 += u0_1
364
+ }
365
+ }
366
+ if ( i0 & 1 ) {
367
+ X = 0
368
+ }
369
+ T = e1
370
+ e1 = y1
371
+ y1 = T
372
+ T = e2
373
+ e2 = y2
374
+ y2 = T
375
+ T = e3
376
+ e3 = y3
377
+ y3 = T
378
+ p0 += u0_0
379
+ }
380
+ }
381
+ freeUint32 ( V )
382
+ freeUint32 ( P )
383
+ }
384
+ } ,
385
+ }
386
+
70
387
//Generates the surface procedure
71
388
function compileSurfaceProcedure ( vertexFunc , faceFunc , phaseFunc , scalarArgs , order , typesig ) {
389
+ var key = [ typesig , order ] . join ( ',' )
390
+
72
391
var arrayArgs = typesig . length
73
392
var dimension = order . length
74
393
@@ -353,13 +672,19 @@ function compileSurfaceProcedure(vertexFunc, faceFunc, phaseFunc, scalarArgs, or
353
672
"}" ,
354
673
"return " , funcName ] . join ( "" )
355
674
356
- var proc = new Function (
357
- "vertex" ,
358
- "face" ,
359
- "phase" ,
360
- "mallocUint32" ,
361
- "freeUint32" ,
362
- procedureCode )
675
+ var proc = allFns [ key ]
676
+ if ( ! proc ) {
677
+ proc = new Function (
678
+ "vertex" ,
679
+ "face" ,
680
+ "phase" ,
681
+ "mallocUint32" ,
682
+ "freeUint32" ,
683
+ procedureCode )
684
+
685
+ console . log ( key , proc )
686
+ }
687
+
363
688
return proc (
364
689
vertexFunc ,
365
690
faceFunc ,
0 commit comments