@@ -122,16 +122,17 @@ function calc(gd, trace) {
122
122
scene . textOptions . push ( opts . text ) ;
123
123
scene . textSelectedOptions . push ( opts . textSel ) ;
124
124
scene . textUnselectedOptions . push ( opts . textUnsel ) ;
125
- scene . count ++ ;
126
125
127
126
// stash scene ref
128
127
stash . _scene = scene ;
129
- stash . index = scene . count - 1 ;
128
+ stash . index = scene . count ;
130
129
stash . x = x ;
131
130
stash . y = y ;
132
131
stash . positions = positions ;
133
132
stash . count = count ;
134
133
134
+ scene . count ++ ;
135
+
135
136
gd . firstscatter = false ;
136
137
return [ { x : false , y : false , t : stash , trace : trace } ] ;
137
138
}
@@ -230,19 +231,16 @@ function sceneUpdate(gd, subplot) {
230
231
231
232
// apply new option to all regl components (used on drag)
232
233
scene . update = function update ( opt ) {
233
- var i ;
234
- var opts = new Array ( scene . count ) ;
235
- for ( i = 0 ; i < scene . count ; i ++ ) {
236
- opts [ i ] = opt ;
237
- }
234
+ var opts = repeat ( opt , scene . count ) ;
235
+
238
236
if ( scene . fill2d ) scene . fill2d . update ( opts ) ;
239
237
if ( scene . scatter2d ) scene . scatter2d . update ( opts ) ;
240
238
if ( scene . line2d ) scene . line2d . update ( opts ) ;
241
239
if ( scene . error2d ) scene . error2d . update ( opts . concat ( opts ) ) ;
242
240
if ( scene . select2d ) scene . select2d . update ( opts ) ;
243
241
if ( scene . glText ) {
244
- for ( i = 0 ; i < scene . count ; i ++ ) {
245
- scene . glText [ i ] . update ( opts [ i ] ) ;
242
+ for ( var i = 0 ; i < scene . count ; i ++ ) {
243
+ scene . glText [ i ] . update ( opt ) ;
246
244
}
247
245
}
248
246
@@ -290,18 +288,7 @@ function sceneUpdate(gd, subplot) {
290
288
} ;
291
289
292
290
scene . clear = function clear ( ) {
293
- var fullLayout = gd . _fullLayout ;
294
- var vpSize = fullLayout . _size ;
295
- var width = fullLayout . width ;
296
- var height = fullLayout . height ;
297
- var xaxis = subplot . xaxis ;
298
- var yaxis = subplot . yaxis ;
299
- var vp = [
300
- vpSize . l + xaxis . domain [ 0 ] * vpSize . w ,
301
- vpSize . b + yaxis . domain [ 0 ] * vpSize . h ,
302
- ( width - vpSize . r ) - ( 1 - xaxis . domain [ 1 ] ) * vpSize . w ,
303
- ( height - vpSize . t ) - ( 1 - yaxis . domain [ 1 ] ) * vpSize . h
304
- ] ;
291
+ var vp = getViewport ( gd . _fullLayout , subplot . xaxis , subplot . yaxis ) ;
305
292
306
293
if ( scene . select2d ) {
307
294
clearViewport ( scene . select2d , vp ) ;
@@ -352,6 +339,18 @@ function sceneUpdate(gd, subplot) {
352
339
return scene ;
353
340
}
354
341
342
+ function getViewport ( fullLayout , xaxis , yaxis ) {
343
+ var gs = fullLayout . _size ;
344
+ var width = fullLayout . width ;
345
+ var height = fullLayout . height ;
346
+ return [
347
+ gs . l + xaxis . domain [ 0 ] * gs . w ,
348
+ gs . b + yaxis . domain [ 0 ] * gs . h ,
349
+ ( width - gs . r ) - ( 1 - xaxis . domain [ 1 ] ) * gs . w ,
350
+ ( height - gs . t ) - ( 1 - yaxis . domain [ 1 ] ) * gs . h
351
+ ] ;
352
+ }
353
+
355
354
function clearViewport ( comp , vp ) {
356
355
var gl = comp . regl . _gl ;
357
356
gl . enable ( gl . SCISSOR_TEST ) ;
@@ -360,22 +359,26 @@ function clearViewport(comp, vp) {
360
359
gl . clear ( gl . COLOR_BUFFER_BIT ) ;
361
360
}
362
361
362
+ function repeat ( opt , cnt ) {
363
+ var opts = new Array ( cnt ) ;
364
+ for ( var i = 0 ; i < cnt ; i ++ ) {
365
+ opts [ i ] = opt ;
366
+ }
367
+ return opts ;
368
+ }
369
+
363
370
function plot ( gd , subplot , cdata ) {
364
371
if ( ! cdata . length ) return ;
365
372
366
- var i ;
367
-
368
373
var fullLayout = gd . _fullLayout ;
369
- var scene = cdata [ 0 ] [ 0 ] . t . _scene ;
370
- var dragmode = fullLayout . dragmode ;
374
+ var scene = subplot . _scene ;
375
+ var xaxis = subplot . xaxis ;
376
+ var yaxis = subplot . yaxis ;
377
+ var i , j ;
371
378
372
379
// we may have more subplots than initialized data due to Axes.getSubplots method
373
380
if ( ! scene ) return ;
374
381
375
- var vpSize = fullLayout . _size ;
376
- var width = fullLayout . width ;
377
- var height = fullLayout . height ;
378
-
379
382
var success = prepareRegl ( gd , [ 'ANGLE_instanced_arrays' , 'OES_element_index_uint' ] ) ;
380
383
if ( ! success ) {
381
384
scene . init ( ) ;
@@ -516,38 +519,20 @@ function plot(gd, subplot, cdata) {
516
519
}
517
520
}
518
521
519
- var selectMode = dragmode === 'lasso' || dragmode === 'select' ;
522
+ // form batch arrays, and check for selected points
520
523
scene . selectBatch = null ;
521
524
scene . unselectBatch = null ;
525
+ var dragmode = fullLayout . dragmode ;
526
+ var selectMode = dragmode === 'lasso' || dragmode === 'select' ;
522
527
523
- // provide viewport and range
524
- var vpRange = cdata . map ( function ( cdscatter ) {
525
- if ( ! cdscatter || ! cdscatter [ 0 ] || ! cdscatter [ 0 ] . trace ) return ;
526
- var cd = cdscatter [ 0 ] ;
527
- var trace = cd . trace ;
528
- var stash = cd . t ;
529
- var id = stash . index ;
528
+ for ( i = 0 ; i < cdata . length ; i ++ ) {
529
+ var cd0 = cdata [ i ] [ 0 ] ;
530
+ var trace = cd0 . trace ;
531
+ var stash = cd0 . t ;
532
+ var index = stash . index ;
530
533
var x = stash . x ;
531
534
var y = stash . y ;
532
535
533
- var xaxis = subplot . xaxis || AxisIDs . getFromId ( gd , trace . xaxis || 'x' ) ;
534
- var yaxis = subplot . yaxis || AxisIDs . getFromId ( gd , trace . yaxis || 'y' ) ;
535
- var i ;
536
-
537
- var range = [
538
- ( xaxis . _rl || xaxis . range ) [ 0 ] ,
539
- ( yaxis . _rl || yaxis . range ) [ 0 ] ,
540
- ( xaxis . _rl || xaxis . range ) [ 1 ] ,
541
- ( yaxis . _rl || yaxis . range ) [ 1 ]
542
- ] ;
543
-
544
- var viewport = [
545
- vpSize . l + xaxis . domain [ 0 ] * vpSize . w ,
546
- vpSize . b + yaxis . domain [ 0 ] * vpSize . h ,
547
- ( width - vpSize . r ) - ( 1 - xaxis . domain [ 1 ] ) * vpSize . w ,
548
- ( height - vpSize . t ) - ( 1 - yaxis . domain [ 1 ] ) * vpSize . h
549
- ] ;
550
-
551
536
if ( trace . selectedpoints || selectMode ) {
552
537
if ( ! selectMode ) selectMode = true ;
553
538
@@ -558,37 +543,35 @@ function plot(gd, subplot, cdata) {
558
543
559
544
// regenerate scene batch, if traces number changed during selection
560
545
if ( trace . selectedpoints ) {
561
- var selPts = scene . selectBatch [ id ] = Lib . selIndices2selPoints ( trace ) ;
546
+ var selPts = scene . selectBatch [ index ] = Lib . selIndices2selPoints ( trace ) ;
562
547
563
548
var selDict = { } ;
564
- for ( i = 0 ; i < selPts . length ; i ++ ) {
565
- selDict [ selPts [ i ] ] = 1 ;
549
+ for ( j = 0 ; j < selPts . length ; j ++ ) {
550
+ selDict [ selPts [ j ] ] = 1 ;
566
551
}
567
552
var unselPts = [ ] ;
568
- for ( i = 0 ; i < stash . count ; i ++ ) {
569
- if ( ! selDict [ i ] ) unselPts . push ( i ) ;
553
+ for ( j = 0 ; j < stash . count ; j ++ ) {
554
+ if ( ! selDict [ j ] ) unselPts . push ( j ) ;
570
555
}
571
- scene . unselectBatch [ id ] = unselPts ;
556
+ scene . unselectBatch [ index ] = unselPts ;
572
557
}
573
558
574
559
// precalculate px coords since we are not going to pan during select
575
- var xpx = new Array ( stash . count ) ;
576
- var ypx = new Array ( stash . count ) ;
577
- for ( i = 0 ; i < stash . count ; i ++ ) {
578
- xpx [ i ] = xaxis . c2p ( x [ i ] ) ;
579
- ypx [ i ] = yaxis . c2p ( y [ i ] ) ;
560
+ // TODO, could do better here e.g.
561
+ // - spin that in a webworker
562
+ // - compute selection from polygons in data coordinates
563
+ // (maybe just for linear axes)
564
+ var xpx = stash . xpx = new Array ( stash . count ) ;
565
+ var ypx = stash . ypx = new Array ( stash . count ) ;
566
+ for ( j = 0 ; j < stash . count ; j ++ ) {
567
+ xpx [ j ] = xaxis . c2p ( x [ j ] ) ;
568
+ ypx [ j ] = yaxis . c2p ( y [ j ] ) ;
580
569
}
581
- stash . xpx = xpx ;
582
- stash . ypx = ypx ;
583
- }
584
- else {
570
+ } else {
585
571
stash . xpx = stash . ypx = null ;
586
572
}
573
+ }
587
574
588
- return trace . visible ?
589
- { viewport : viewport , range : range } :
590
- null ;
591
- } ) ;
592
575
593
576
if ( selectMode ) {
594
577
// create select2d
@@ -618,6 +601,19 @@ function plot(gd, subplot, cdata) {
618
601
}
619
602
}
620
603
604
+ // provide viewport and range
605
+ var vpRange0 = {
606
+ viewport : getViewport ( fullLayout , xaxis , yaxis ) ,
607
+ // TODO do we need those fallbacks?
608
+ range : [
609
+ ( xaxis . _rl || xaxis . range ) [ 0 ] ,
610
+ ( yaxis . _rl || yaxis . range ) [ 0 ] ,
611
+ ( xaxis . _rl || xaxis . range ) [ 1 ] ,
612
+ ( yaxis . _rl || yaxis . range ) [ 1 ]
613
+ ]
614
+ } ;
615
+ var vpRange = repeat ( vpRange0 , scene . count ) ;
616
+
621
617
// upload viewport/range data to GPU
622
618
if ( scene . fill2d ) {
623
619
scene . fill2d . update ( vpRange ) ;
@@ -635,14 +631,10 @@ function plot(gd, subplot, cdata) {
635
631
scene . select2d . update ( vpRange ) ;
636
632
}
637
633
if ( scene . glText ) {
638
- scene . glText . forEach ( function ( text , i ) {
639
- text . update ( vpRange [ i ] ) ;
640
- } ) ;
634
+ scene . glText . forEach ( function ( text ) { text . update ( vpRange0 ) ; } ) ;
641
635
}
642
636
643
637
scene . draw ( ) ;
644
-
645
- return ;
646
638
}
647
639
648
640
0 commit comments