@@ -25,7 +25,6 @@ var filterEpsilon = 1e-7;
25
25
// precision of multiselect is the full range divided into this many parts
26
26
var maskHeight = 2048 ;
27
27
28
-
29
28
var gpuDimensionCount = 64 ;
30
29
var sectionVertexCount = 2 ;
31
30
var vec4NumberCount = 4 ;
@@ -37,6 +36,14 @@ var contextColor = [119, 119, 119]; // middle gray to not drawn the focus; looks
37
36
var dummyPixel = new Uint8Array ( 4 ) ;
38
37
var pickPixel = new Uint8Array ( 4 ) ;
39
38
39
+ var paletteTextureConfig = {
40
+ shape : [ 256 , 1 ] ,
41
+ format : 'rgba' ,
42
+ type : 'uint8' ,
43
+ mag : 'nearest' ,
44
+ min : 'nearest'
45
+ } ;
46
+
40
47
function ensureDraw ( regl ) {
41
48
regl . read ( {
42
49
x : 0 ,
@@ -123,7 +130,8 @@ function calcPickColor(j, rgbIndex) {
123
130
return ( j >>> 8 * rgbIndex ) % 256 / 255 ;
124
131
}
125
132
126
- function makePoints ( sampleCount , dimensionCount , dimensions , color ) {
133
+ function makePoints ( sampleCount , dimensions , color ) {
134
+ var dimensionCount = dimensions . length ;
127
135
128
136
var points = [ ] ;
129
137
for ( var j = 0 ; j < sampleCount ; j ++ ) {
@@ -141,8 +149,7 @@ function makePoints(sampleCount, dimensionCount, dimensions, color) {
141
149
return points ;
142
150
}
143
151
144
- function makeVecAttr ( regl , sampleCount , points , vecIndex ) {
145
-
152
+ function makeVecAttr ( sampleCount , points , vecIndex ) {
146
153
var i , j , k ;
147
154
var pointPairs = [ ] ;
148
155
@@ -157,75 +164,53 @@ function makeVecAttr(regl, sampleCount, points, vecIndex) {
157
164
}
158
165
}
159
166
160
- return regl . buffer ( pointPairs ) ;
167
+ return pointPairs ;
161
168
}
162
169
163
- function makeAttributes ( regl , sampleCount , points ) {
170
+ function setAttributes ( attributes , sampleCount , points ) {
171
+ for ( var i = 0 ; i < 16 ; i ++ ) {
172
+ attributes [ 'p' + i . toString ( 16 ) ] ( makeVecAttr ( sampleCount , points , i ) ) ;
173
+ }
174
+ }
164
175
176
+ function emptyAttributes ( regl ) {
165
177
var attributes = { } ;
166
-
167
178
for ( var i = 0 ; i < 16 ; i ++ ) {
168
- attributes [ 'p' + i . toString ( 16 ) ] = makeVecAttr ( regl , sampleCount , points , i ) ;
179
+ attributes [ 'p' + i . toString ( 16 ) ] = regl . buffer ( { usage : 'dynamic' , type : 'float' , data : null } ) ;
169
180
}
170
-
171
181
return attributes ;
172
182
}
173
183
174
184
module . exports = function ( canvasGL , d ) {
175
- var model = d . model ,
176
- vm = d . viewModel ,
177
- domain = model . domain ;
178
-
179
- var lines = model . lines ,
180
- canvasWidth = model . canvasWidth ,
181
- canvasHeight = model . canvasHeight ,
182
- initialDimensions = vm . dimensions ,
183
- initialPanels = vm . panels ,
184
- unitToColor = model . unitToColor ,
185
- context = d . context ,
186
- pick = d . pick ;
185
+ // context & pick describe which canvas we're talking about - won't change with new data
186
+ var context = d . context ;
187
+ var pick = d . pick ;
188
+
189
+ var regl = d . regl ;
187
190
188
191
var renderState = {
189
192
currentRafs : { } ,
190
193
drawCompleted : true ,
191
194
clearOnly : false
192
195
} ;
193
196
194
- var initialDims = initialDimensions . slice ( ) ;
195
-
196
- var dimensionCount = initialDims . length ;
197
- var sampleCount = initialDims [ 0 ] ? initialDims [ 0 ] . values . length : 0 ;
198
-
199
- var focusAlphaBlending = context ;
200
-
201
- var color = pick ? lines . color . map ( function ( _ , i ) { return i / lines . color . length ; } ) : lines . color ;
202
- var contextOpacity = Math . max ( 1 / 255 , Math . pow ( 1 / color . length , 1 / 3 ) ) ;
203
- var overdrag = lines . canvasOverdrag ;
197
+ // state to be set by update and used later
198
+ var model ;
199
+ var vm ;
200
+ var initialDims ;
201
+ var sampleCount ;
202
+ var attributes = emptyAttributes ( regl ) ;
203
+ var maskTexture ;
204
+ var paletteTexture = regl . texture ( paletteTextureConfig ) ;
204
205
205
- var panelCount = initialPanels . length ;
206
-
207
- var regl = d . regl ;
208
-
209
- var points = makePoints ( sampleCount , dimensionCount , initialDims , color ) ;
210
- var attributes = makeAttributes ( regl , sampleCount , points ) ;
211
-
212
- var mask , maskTexture ;
213
-
214
- var paletteTexture = regl . texture ( {
215
- shape : [ 256 , 1 ] ,
216
- format : 'rgba' ,
217
- type : 'uint8' ,
218
- mag : 'nearest' ,
219
- min : 'nearest' ,
220
- data : palette ( unitToColor , context , Math . round ( ( context ? contextOpacity : 1 ) * 255 ) )
221
- } ) ;
206
+ update ( d ) ;
222
207
223
208
var glAes = regl ( {
224
209
225
210
profile : false ,
226
211
227
212
blend : {
228
- enable : focusAlphaBlending ,
213
+ enable : context ,
229
214
func : {
230
215
srcRGB : 'src alpha' ,
231
216
dstRGB : 'one minus src alpha' ,
@@ -240,7 +225,7 @@ module.exports = function(canvasGL, d) {
240
225
} ,
241
226
242
227
depth : {
243
- enable : ! focusAlphaBlending ,
228
+ enable : ! context ,
244
229
mask : true ,
245
230
func : 'less' ,
246
231
range : [ 0 , 1 ]
@@ -307,6 +292,24 @@ module.exports = function(canvasGL, d) {
307
292
count : regl . prop ( 'count' )
308
293
} ) ;
309
294
295
+ function update ( dNew ) {
296
+ model = dNew . model ;
297
+ vm = dNew . viewModel ;
298
+ initialDims = vm . dimensions . slice ( ) ;
299
+ sampleCount = initialDims [ 0 ] ? initialDims [ 0 ] . values . length : 0 ;
300
+
301
+ var lines = model . lines ;
302
+ var color = pick ? lines . color . map ( function ( _ , i ) { return i / lines . color . length ; } ) : lines . color ;
303
+ var contextOpacity = Math . max ( 1 / 255 , Math . pow ( 1 / color . length , 1 / 3 ) ) ;
304
+
305
+ var points = makePoints ( sampleCount , initialDims , color ) ;
306
+ setAttributes ( attributes , sampleCount , points ) ;
307
+
308
+ paletteTexture = regl . texture ( Lib . extendFlat ( {
309
+ data : palette ( model . unitToColor , context , Math . round ( ( context ? contextOpacity : 1 ) * 255 ) )
310
+ } , paletteTextureConfig ) ) ;
311
+ }
312
+
310
313
var colorClamp = [ 0 , 1 ] ;
311
314
312
315
function setColorDomain ( unitDomain ) {
@@ -331,7 +334,12 @@ module.exports = function(canvasGL, d) {
331
334
}
332
335
}
333
336
334
- var vm = Lib . extendFlat ( {
337
+ var overdrag = model . lines . canvasOverdrag ;
338
+ var domain = model . domain ;
339
+ var canvasWidth = model . canvasWidth ;
340
+ var canvasHeight = model . canvasHeight ;
341
+
342
+ var itemModel = Lib . extendFlat ( {
335
343
key : crossfilterDimensionIndex ,
336
344
resolution : [ canvasWidth , canvasHeight ] ,
337
345
viewBoxPosition : [ x + overdrag , y ] ,
@@ -361,7 +369,7 @@ module.exports = function(canvasGL, d) {
361
369
viewportHeight : canvasHeight
362
370
} , constraints ) ;
363
371
364
- return vm ;
372
+ return itemModel ;
365
373
}
366
374
367
375
function makeConstraints ( ) {
@@ -391,10 +399,10 @@ module.exports = function(canvasGL, d) {
391
399
] ;
392
400
}
393
401
394
- mask = Array . apply ( null , new Array ( maskHeight * channelCount ) ) . map ( function ( ) {
402
+ var mask = Array . apply ( null , new Array ( maskHeight * channelCount ) ) . map ( function ( ) {
395
403
return 255 ;
396
404
} ) ;
397
- for ( var dimIndex = 0 ; dimIndex < dimensionCount ; dimIndex ++ ) {
405
+ for ( var dimIndex = 0 ; dimIndex < initialDims . length ; dimIndex ++ ) {
398
406
var bitIndex = dimIndex % bitsPerByte ;
399
407
var byteIndex = ( dimIndex - bitIndex ) / bitsPerByte ;
400
408
var bitMask = Math . pow ( 2 , bitIndex ) ;
@@ -439,7 +447,7 @@ module.exports = function(canvasGL, d) {
439
447
}
440
448
441
449
function renderGLParcoords ( panels , setChanged , clearOnly ) {
442
-
450
+ var panelCount = panels . length ;
443
451
var I ;
444
452
445
453
var leftmost , rightmost , lowestX = Infinity , highestX = - Infinity ;
@@ -457,7 +465,7 @@ module.exports = function(canvasGL, d) {
457
465
458
466
if ( panelCount === 0 ) {
459
467
// clear canvas here, as the panel iteration below will not enter the loop body
460
- clear ( regl , 0 , 0 , canvasWidth , canvasHeight ) ;
468
+ clear ( regl , 0 , 0 , model . canvasWidth , model . canvasHeight ) ;
461
469
}
462
470
var constraints = context ? { } : makeConstraints ( ) ;
463
471
@@ -476,7 +484,7 @@ module.exports = function(canvasGL, d) {
476
484
previousAxisOrder [ i ] = [ x , xTo ] ;
477
485
var item = makeItem ( i , ii , x , y , panelSizeX , panelSizeY , dim1 . crossfilterDimensionIndex , I , leftmost , rightmost , constraints ) ;
478
486
renderState . clearOnly = clearOnly ;
479
- renderBlock ( regl , glAes , renderState , setChanged ? lines . blockLineCount : sampleCount , sampleCount , item ) ;
487
+ renderBlock ( regl , glAes , renderState , setChanged ? model . lines . blockLineCount : sampleCount , sampleCount , item ) ;
480
488
}
481
489
}
482
490
}
@@ -516,6 +524,7 @@ module.exports = function(canvasGL, d) {
516
524
render : renderGLParcoords ,
517
525
readPixel : readPixel ,
518
526
readPixels : readPixels ,
519
- destroy : destroy
527
+ destroy : destroy ,
528
+ update : update
520
529
} ;
521
530
} ;
0 commit comments