@@ -141,13 +141,9 @@ function sceneOptions(gd, subplot, trace, positions) {
141
141
var fullLayout = gd . _fullLayout ;
142
142
var count = positions . length / 2 ;
143
143
var markerOpts = trace . marker ;
144
- var xaxis = AxisIDs . getFromId ( gd , trace . xaxis ) ;
145
- var yaxis = AxisIDs . getFromId ( gd , trace . yaxis ) ;
146
- var ptrX = 0 ;
147
- var ptrY = 0 ;
148
144
var i ;
149
145
150
- var hasLines , hasErrorX , hasErrorY , hasError , hasMarkers , hasFill ;
146
+ var hasLines , hasErrorX , hasErrorY , hasMarkers , hasFill ;
151
147
152
148
if ( trace . visible !== true ) {
153
149
hasLines = false ;
@@ -159,7 +155,6 @@ function sceneOptions(gd, subplot, trace, positions) {
159
155
hasLines = subTypes . hasLines ( trace ) && positions . length > 1 ;
160
156
hasErrorX = trace . error_x && trace . error_x . visible === true ;
161
157
hasErrorY = trace . error_y && trace . error_y . visible === true ;
162
- hasError = hasErrorX || hasErrorY ;
163
158
hasMarkers = subTypes . hasMarkers ( trace ) ;
164
159
hasFill = ! ! trace . fill && trace . fill !== 'none' ;
165
160
}
@@ -169,67 +164,16 @@ function sceneOptions(gd, subplot, trace, positions) {
169
164
var selectedOptions , unselectedOptions ;
170
165
var linePositions ;
171
166
172
- // get error values
173
- var errorVals = hasError ?
174
- Registry . getComponentMethod ( 'errorbars' , 'calcFromTrace' ) ( trace , fullLayout ) :
175
- null ;
176
-
177
- if ( hasErrorX ) {
178
- errorXOptions = { } ;
179
- errorXOptions . positions = positions ;
180
- var errorsX = new Float64Array ( 4 * count ) ;
181
-
182
- if ( xaxis . type === 'log' ) {
183
- for ( i = 0 ; i < count ; ++ i ) {
184
- errorsX [ ptrX ++ ] = positions [ i * 2 ] - xaxis . d2l ( errorVals [ i ] . xs ) || 0 ;
185
- errorsX [ ptrX ++ ] = xaxis . d2l ( errorVals [ i ] . xh ) - positions [ i * 2 ] || 0 ;
186
- errorsX [ ptrX ++ ] = 0 ;
187
- errorsX [ ptrX ++ ] = 0 ;
188
- }
189
- } else {
190
- for ( i = 0 ; i < count ; ++ i ) {
191
- errorsX [ ptrX ++ ] = positions [ i * 2 ] - errorVals [ i ] . xs || 0 ;
192
- errorsX [ ptrX ++ ] = errorVals [ i ] . xh - positions [ i * 2 ] || 0 ;
193
- errorsX [ ptrX ++ ] = 0 ;
194
- errorsX [ ptrX ++ ] = 0 ;
195
- }
196
- }
167
+ if ( hasErrorX || hasErrorY ) {
168
+ var calcFromTrace = Registry . getComponentMethod ( 'errorbars' , 'calcFromTrace' ) ;
169
+ var errorVals = calcFromTrace ( trace , fullLayout ) ;
197
170
198
- if ( trace . error_x . copy_ystyle ) {
199
- trace . error_x = trace . error_y ;
171
+ if ( hasErrorX ) {
172
+ errorXOptions = makeErrorOptions ( 'x' , trace . error_x , errorVals ) ;
200
173
}
201
-
202
- errorXOptions . errors = errorsX ;
203
- errorXOptions . capSize = trace . error_x . width * 2 ;
204
- errorXOptions . lineWidth = trace . error_x . thickness ;
205
- errorXOptions . color = trace . error_x . color ;
206
- }
207
-
208
- if ( hasErrorY ) {
209
- errorYOptions = { } ;
210
- errorYOptions . positions = positions ;
211
- var errorsY = new Float64Array ( 4 * count ) ;
212
-
213
- if ( yaxis . type === 'log' ) {
214
- for ( i = 0 ; i < count ; ++ i ) {
215
- errorsY [ ptrY ++ ] = 0 ;
216
- errorsY [ ptrY ++ ] = 0 ;
217
- errorsY [ ptrY ++ ] = positions [ i * 2 + 1 ] - yaxis . d2l ( errorVals [ i ] . ys ) || 0 ;
218
- errorsY [ ptrY ++ ] = yaxis . d2l ( errorVals [ i ] . yh ) - positions [ i * 2 + 1 ] || 0 ;
219
- }
220
- } else {
221
- for ( i = 0 ; i < count ; ++ i ) {
222
- errorsY [ ptrY ++ ] = 0 ;
223
- errorsY [ ptrY ++ ] = 0 ;
224
- errorsY [ ptrY ++ ] = positions [ i * 2 + 1 ] - errorVals [ i ] . ys || 0 ;
225
- errorsY [ ptrY ++ ] = errorVals [ i ] . yh - positions [ i * 2 + 1 ] || 0 ;
226
- }
174
+ if ( hasErrorY ) {
175
+ errorYOptions = makeErrorOptions ( 'y' , trace . error_y , errorVals ) ;
227
176
}
228
-
229
- errorYOptions . errors = errorsY ;
230
- errorYOptions . capSize = trace . error_y . width * 2 ;
231
- errorYOptions . lineWidth = trace . error_y . thickness ;
232
- errorYOptions . color = trace . error_y . color ;
233
177
}
234
178
235
179
if ( hasLines ) {
@@ -330,6 +274,33 @@ function sceneOptions(gd, subplot, trace, positions) {
330
274
markerOptions . positions = positions ;
331
275
}
332
276
277
+ function makeErrorOptions ( axLetter , errorOpts , vals ) {
278
+ var options = { } ;
279
+ options . positions = positions ;
280
+
281
+ var ax = AxisIDs . getFromId ( gd , trace [ axLetter + 'axis' ] ) ;
282
+ var errors = options . errors = new Float64Array ( 4 * count ) ;
283
+ var pOffset = { x : 0 , y : 1 } [ axLetter ] ;
284
+ var eOffset = { x : [ 0 , 1 , 2 , 3 ] , y : [ 2 , 3 , 0 , 1 ] } [ axLetter ] ;
285
+
286
+ for ( var i = 0 , p = 0 ; i < count ; i ++ , p += 4 ) {
287
+ errors [ p + eOffset [ 0 ] ] = positions [ i * 2 + pOffset ] - ax . d2l ( vals [ i ] [ axLetter + 's' ] ) || 0 ;
288
+ errors [ p + eOffset [ 1 ] ] = ax . d2l ( vals [ i ] [ axLetter + 'h' ] ) - positions [ i * 2 + pOffset ] || 0 ;
289
+ errors [ p + eOffset [ 2 ] ] = 0 ;
290
+ errors [ p + eOffset [ 3 ] ] = 0 ;
291
+ }
292
+
293
+ if ( errorOpts . copy_ystyle ) {
294
+ errorOpts = trace . error_y ;
295
+ }
296
+
297
+ options . capSize = errorOpts . width * 2 ;
298
+ options . lineWidth = errorOpts . thickness ;
299
+ options . color = errorOpts . color ;
300
+
301
+ return options ;
302
+ }
303
+
333
304
function makeSelectedOptions ( selected , markerOpts ) {
334
305
var options = { } ;
335
306
@@ -486,39 +457,42 @@ function sceneUpdate(gd, subplot) {
486
457
var scene = subplot . _scene ;
487
458
var fullLayout = gd . _fullLayout ;
488
459
460
+ var reset = {
461
+ // number of traces in subplot, since scene:subplot → 1:1
462
+ count : 0 ,
463
+ // whether scene requires init hook in plot call (dirty plot call)
464
+ dirty : true ,
465
+ // last used options
466
+ lineOptions : [ ] ,
467
+ fillOptions : [ ] ,
468
+ markerOptions : [ ] ,
469
+ selectedOptions : [ ] ,
470
+ unselectedOptions : [ ] ,
471
+ errorXOptions : [ ] ,
472
+ errorYOptions : [ ]
473
+ } ;
474
+
475
+ var first = {
476
+ selectBatch : null ,
477
+ unselectBatch : null ,
478
+ // regl- component stubs, initialized in dirty plot call
479
+ fill2d : false ,
480
+ scatter2d : false ,
481
+ error2d : false ,
482
+ line2d : false ,
483
+ select2d : null
484
+ } ;
485
+
489
486
if ( ! subplot . _scene ) {
490
- scene = subplot . _scene = {
491
- // number of traces in subplot, since scene:subplot → 1:1
492
- count : 0 ,
493
-
494
- // whether scene requires init hook in plot call (dirty plot call)
495
- dirty : true ,
496
-
497
- // last used options
498
- lineOptions : [ ] ,
499
- fillOptions : [ ] ,
500
- markerOptions : [ ] ,
501
- selectedOptions : [ ] ,
502
- unselectedOptions : [ ] ,
503
- errorXOptions : [ ] ,
504
- errorYOptions : [ ] ,
505
- selectBatch : null ,
506
- unselectBatch : null ,
507
-
508
- // regl- component stubs, initialized in dirty plot call
509
- fill2d : false ,
510
- scatter2d : false ,
511
- error2d : false ,
512
- line2d : false ,
513
- select2d : null
514
- } ;
487
+ scene = subplot . _scene = Lib . extendFlat ( { } , reset , first ) ;
515
488
516
- // apply new option to all regl components
489
+ // apply new option to all regl components (used on drag)
517
490
scene . update = function update ( opt ) {
518
- var opts = Array ( scene . count ) ;
491
+ var opts = new Array ( scene . count ) ;
519
492
for ( var i = 0 ; i < scene . count ; i ++ ) {
520
493
opts [ i ] = opt ;
521
494
}
495
+
522
496
if ( scene . fill2d ) scene . fill2d . update ( opts ) ;
523
497
if ( scene . scatter2d ) scene . scatter2d . update ( opts ) ;
524
498
if ( scene . line2d ) scene . line2d . update ( opts ) ;
@@ -532,21 +506,24 @@ function sceneUpdate(gd, subplot) {
532
506
scene . draw = function draw ( ) {
533
507
var i ;
534
508
for ( i = 0 ; i < scene . count ; i ++ ) {
535
- if ( scene . fill2d ) scene . fill2d . draw ( i ) ;
509
+ if ( scene . fill2d && scene . fillOptions [ i ] ) {
510
+ // must do all fills first
511
+ scene . fill2d . draw ( i ) ;
512
+ }
536
513
}
537
514
for ( i = 0 ; i < scene . count ; i ++ ) {
538
- if ( scene . line2d ) {
515
+ if ( scene . line2d && scene . lineOptions [ i ] ) {
539
516
scene . line2d . draw ( i ) ;
540
517
}
541
- if ( scene . error2d ) {
518
+ if ( scene . error2d && scene . errorXOptions [ i ] ) {
542
519
scene . error2d . draw ( i ) ;
520
+ }
521
+ if ( scene . error2d && scene . errorYOptions [ i ] ) {
543
522
scene . error2d . draw ( i + scene . count ) ;
544
523
}
545
- if ( scene . scatter2d ) {
524
+ if ( scene . scatter2d && scene . markerOptions [ i ] && ( ! scene . selectBatch || ! scene . selectBatch [ i ] ) ) {
546
525
// traces in no-selection mode
547
- if ( ! scene . selectBatch || ! scene . selectBatch [ i ] ) {
548
- scene . scatter2d . draw ( i ) ;
549
- }
526
+ scene . scatter2d . draw ( i ) ;
550
527
}
551
528
}
552
529
@@ -639,15 +616,7 @@ function sceneUpdate(gd, subplot) {
639
616
640
617
// In case if we have scene from the last calc - reset data
641
618
if ( ! scene . dirty ) {
642
- scene . dirty = true ;
643
- scene . count = 0 ;
644
- scene . lineOptions = [ ] ;
645
- scene . fillOptions = [ ] ;
646
- scene . markerOptions = [ ] ;
647
- scene . selectedOptions = [ ] ;
648
- scene . unselectedOptions = [ ] ;
649
- scene . errorXOptions = [ ] ;
650
- scene . errorYOptions = [ ] ;
619
+ Lib . extendFlat ( scene , reset ) ;
651
620
}
652
621
653
622
return scene ;
0 commit comments