@@ -30,14 +30,13 @@ var TOO_MANY_POINTS = require('../scattergl/constants').TOO_MANY_POINTS;
30
30
function calc ( gd , trace ) {
31
31
var dimensions = trace . dimensions ;
32
32
var commonLength = trace . _length ;
33
- var stash = { } ;
34
33
var opts = { } ;
35
34
// 'c' for calculated, 'l' for linear,
36
35
// only differ here for log axes, pass ldata to createMatrix as 'data'
37
36
var cdata = opts . cdata = [ ] ;
38
37
var ldata = opts . data = [ ] ;
39
38
// keep track of visible dimensions
40
- var visibleDims = stash . visibleDims = [ ] ;
39
+ var visibleDims = trace . _visibleDims = [ ] ;
41
40
var i , k , dim , xa , ya ;
42
41
43
42
function makeCalcdata ( ax , dim ) {
@@ -107,22 +106,27 @@ function calc(gd, trace) {
107
106
calcAxisExpansion ( gd , trace , xa , ya , cdata [ k ] , cdata [ k ] , ppad ) ;
108
107
}
109
108
110
- var scene = stash . _scene = sceneUpdate ( gd , stash ) ;
109
+ var scene = sceneUpdate ( gd , trace ) ;
111
110
if ( ! scene . matrix ) scene . matrix = true ;
112
111
scene . matrixOptions = opts ;
113
112
114
113
scene . selectedOptions = convertMarkerSelection ( trace , trace . selected ) ;
115
114
scene . unselectedOptions = convertMarkerSelection ( trace , trace . unselected ) ;
116
115
117
- return [ { x : false , y : false , t : stash , trace : trace } ] ;
116
+ return [ { x : false , y : false , t : { } , trace : trace } ] ;
118
117
}
119
118
120
- function sceneUpdate ( gd , stash ) {
121
- var scene = stash . _scene ;
119
+ function sceneUpdate ( gd , trace ) {
120
+ var fullLayout = gd . _fullLayout ;
121
+ var uid = trace . uid ;
122
122
123
- var reset = {
124
- dirty : true
125
- } ;
123
+ // must place ref to 'scene' in fullLayout, so that:
124
+ // - it can be relinked properly on updates
125
+ // - it can be destroyed properly when needed
126
+ var splomScenes = fullLayout . _splomScenes ;
127
+ if ( ! splomScenes ) splomScenes = fullLayout . _splomScenes = { } ;
128
+
129
+ var reset = { dirty : true } ;
126
130
127
131
var first = {
128
132
selectBatch : null ,
@@ -131,8 +135,10 @@ function sceneUpdate(gd, stash) {
131
135
select : null
132
136
} ;
133
137
138
+ var scene = splomScenes [ trace . uid ] ;
139
+
134
140
if ( ! scene ) {
135
- scene = stash . _scene = Lib . extendFlat ( { } , reset , first ) ;
141
+ scene = splomScenes [ uid ] = Lib . extendFlat ( { } , reset , first ) ;
136
142
137
143
scene . draw = function draw ( ) {
138
144
// draw traces in selection mode
@@ -147,13 +153,13 @@ function sceneUpdate(gd, stash) {
147
153
148
154
// remove scene resources
149
155
scene . destroy = function destroy ( ) {
150
- if ( scene . matrix ) scene . matrix . destroy ( ) ;
151
-
156
+ if ( scene . matrix && scene . matrix . destroy ) {
157
+ scene . matrix . destroy ( ) ;
158
+ }
152
159
scene . matrixOptions = null ;
153
160
scene . selectBatch = null ;
154
161
scene . unselectBatch = null ;
155
-
156
- stash . _scene = null ;
162
+ scene = null ;
157
163
} ;
158
164
}
159
165
@@ -178,7 +184,7 @@ function plotOne(gd, cd0) {
178
184
var gs = fullLayout . _size ;
179
185
var trace = cd0 . trace ;
180
186
var stash = cd0 . t ;
181
- var scene = stash . _scene ;
187
+ var scene = fullLayout . _splomScenes [ trace . uid ] ;
182
188
var matrixOpts = scene . matrixOptions ;
183
189
var cdata = matrixOpts . cdata ;
184
190
var regl = fullLayout . _glcanvas . data ( ) [ 0 ] . regl ;
@@ -194,7 +200,7 @@ function plotOne(gd, cd0) {
194
200
matrixOpts . upper = trace . showlowerhalf ;
195
201
matrixOpts . diagonal = trace . diagonal . visible ;
196
202
197
- var visibleDims = stash . visibleDims ;
203
+ var visibleDims = trace . _visibleDims ;
198
204
var visibleLength = cdata . length ;
199
205
var viewOpts = { } ;
200
206
viewOpts . ranges = new Array ( visibleLength ) ;
@@ -305,17 +311,16 @@ function plotOne(gd, cd0) {
305
311
function hoverPoints ( pointData , xval , yval ) {
306
312
var cd = pointData . cd ;
307
313
var trace = cd [ 0 ] . trace ;
308
- var stash = cd [ 0 ] . t ;
309
- var scene = stash . _scene ;
314
+ var scene = pointData . scene ;
310
315
var cdata = scene . matrixOptions . cdata ;
311
316
var xa = pointData . xa ;
312
317
var ya = pointData . ya ;
313
318
var xpx = xa . c2p ( xval ) ;
314
319
var ypx = ya . c2p ( yval ) ;
315
320
var maxDistance = pointData . distance ;
316
321
317
- var xi = getDimIndex ( trace , stash , xa ) ;
318
- var yi = getDimIndex ( trace , stash , ya ) ;
322
+ var xi = getDimIndex ( trace , xa ) ;
323
+ var yi = getDimIndex ( trace , ya ) ;
319
324
if ( xi === false || yi === false ) return [ pointData ] ;
320
325
321
326
var x = cdata [ xi ] ;
@@ -352,7 +357,7 @@ function selectPoints(searchInfo, selectionTester) {
352
357
var cd = searchInfo . cd ;
353
358
var trace = cd [ 0 ] . trace ;
354
359
var stash = cd [ 0 ] . t ;
355
- var scene = stash . _scene ;
360
+ var scene = searchInfo . scene ;
356
361
var cdata = scene . matrixOptions . cdata ;
357
362
var xa = searchInfo . xaxis ;
358
363
var ya = searchInfo . yaxis ;
@@ -364,8 +369,8 @@ function selectPoints(searchInfo, selectionTester) {
364
369
var hasOnlyLines = ( ! subTypes . hasMarkers ( trace ) && ! subTypes . hasText ( trace ) ) ;
365
370
if ( trace . visible !== true || hasOnlyLines ) return selection ;
366
371
367
- var xi = getDimIndex ( trace , stash , xa ) ;
368
- var yi = getDimIndex ( trace , stash , ya ) ;
372
+ var xi = getDimIndex ( trace , xa ) ;
373
+ var yi = getDimIndex ( trace , ya ) ;
369
374
if ( xi === false || yi === false ) return selection ;
370
375
371
376
var xpx = stash . xpx [ xi ] ;
@@ -424,15 +429,15 @@ function style(gd, cds) {
424
429
425
430
var fullLayout = gd . _fullLayout ;
426
431
var cd0 = cds [ 0 ] ;
427
- var scene0 = cd0 [ 0 ] . t . _scene ;
432
+ var scene0 = fullLayout . _splomScenes [ cd0 [ 0 ] . trace . uid ] ;
428
433
scene0 . matrix . regl . clear ( { color : true , depth : true } ) ;
429
434
430
435
if ( fullLayout . _splomGrid ) {
431
436
fullLayout . _splomGrid . draw ( ) ;
432
437
}
433
438
434
439
for ( var i = 0 ; i < cds . length ; i ++ ) {
435
- var scene = cds [ i ] [ 0 ] . t . _scene ;
440
+ var scene = fullLayout . _splomScenes [ cds [ i ] [ 0 ] . trace . uid ] ;
436
441
scene . draw ( ) ;
437
442
}
438
443
@@ -446,11 +451,11 @@ function style(gd, cds) {
446
451
}
447
452
}
448
453
449
- function getDimIndex ( trace , stash , ax ) {
454
+ function getDimIndex ( trace , ax ) {
450
455
var axId = ax . _id ;
451
456
var axLetter = axId . charAt ( 0 ) ;
452
457
var ind = { x : 0 , y : 1 } [ axLetter ] ;
453
- var visibleDims = stash . visibleDims ;
458
+ var visibleDims = trace . _visibleDims ;
454
459
455
460
for ( var k = 0 ; k < visibleDims . length ; k ++ ) {
456
461
var i = visibleDims [ k ] ;
0 commit comments