@@ -110,8 +110,7 @@ function sceneUpdate(gd, stash) {
110
110
var scene = stash . _scene ;
111
111
112
112
var reset = {
113
- dirty : true ,
114
- opts : null
113
+ dirty : true
115
114
} ;
116
115
117
116
var first = {
@@ -137,21 +136,6 @@ function sceneUpdate(gd, stash) {
137
136
scene . dirty = false ;
138
137
} ;
139
138
140
- // make sure canvas is clear
141
- scene . clear = function clear ( ) {
142
- // TODO
143
- } ;
144
-
145
- // remove selection
146
- scene . clearSelect = function clearSelect ( ) {
147
- if ( ! scene . selectBatch ) return ;
148
- scene . selectBatch = null ;
149
- scene . unselectBatch = null ;
150
- scene . matrix . update ( scene . matrixOptions ) ;
151
- scene . clear ( ) ;
152
- scene . draw ( ) ;
153
- } ;
154
-
155
139
// remove scene resources
156
140
scene . destroy = function destroy ( ) {
157
141
if ( scene . matrix ) scene . matrix . destroy ( ) ;
@@ -189,22 +173,25 @@ function plotOne(gd, cd0) {
189
173
var matrixData = scene . matrixOptions . data ;
190
174
var regl = fullLayout . _glcanvas . data ( ) [ 0 ] . regl ;
191
175
var dragmode = fullLayout . dragmode ;
176
+ var xa , ya ;
192
177
193
178
if ( matrixData . length === 0 ) return ;
194
179
180
+
195
181
var k = 0 , i ;
196
182
var activeLength = trace . _activeLength ;
197
183
var visibleLength = matrixData . length ;
184
+ var dataLength = matrixData [ 0 ] . length ;
198
185
var viewOpts = {
199
186
ranges : new Array ( visibleLength ) ,
200
187
domains : new Array ( visibleLength )
201
188
} ;
202
189
203
- for ( var i = 0 ; i < activeLength ; i ++ ) {
190
+ for ( i = 0 ; i < activeLength ; i ++ ) {
204
191
if ( ! trace . dimensions [ i ] . visible ) continue ;
205
192
206
- var xa = AxisIDs . getFromId ( gd , trace . xaxes [ i ] ) ;
207
- var ya = AxisIDs . getFromId ( gd , trace . yaxes [ i ] ) ;
193
+ xa = AxisIDs . getFromId ( gd , trace . xaxes [ i ] ) ;
194
+ ya = AxisIDs . getFromId ( gd , trace . yaxes [ i ] ) ;
208
195
viewOpts . ranges [ k ] = [ xa . range [ 0 ] , ya . range [ 0 ] , xa . range [ 1 ] , ya . range [ 1 ] ] ;
209
196
viewOpts . domains [ k ] = [ xa . domain [ 0 ] , ya . domain [ 0 ] , xa . domain [ 1 ] , ya . domain [ 1 ] ] ;
210
197
k ++ ;
@@ -236,21 +223,32 @@ function plotOne(gd, cd0) {
236
223
selDict [ selPts [ i ] ] = true ;
237
224
}
238
225
var unselPts = [ ] ;
239
- for ( i = 0 ; i < matrixData [ 0 ] . length ; i ++ ) {
226
+ for ( i = 0 ; i < dataLength ; i ++ ) {
240
227
if ( ! selDict [ i ] ) unselPts . push ( i ) ;
241
228
}
242
229
scene . unselectBatch = unselPts ;
243
230
}
244
231
245
232
// precalculate px coords since we are not going to pan during select
246
- // var xpx = new Array(stash.count);
247
- // var ypx = new Array(stash.count);
248
- // for(i = 0; i < stash.count; i++) {
249
- // xpx[i] = xaxis.c2p(x[i]);
250
- // ypx[i] = yaxis.c2p(y[i]);
251
- // }
252
- // stash.xpx = xpx;
253
- // stash.ypx = ypx;
233
+ var xpx = new Array ( visibleLength ) ;
234
+ var ypx = new Array ( visibleLength ) ;
235
+ var data ;
236
+ for ( k = 0 ; k < visibleLength ; k ++ ) {
237
+ xa = AxisIDs . getFromId ( gd , trace . xaxes [ k ] ) ;
238
+ ya = AxisIDs . getFromId ( gd , trace . yaxes [ k ] ) ;
239
+
240
+ xpx [ k ] = new Array ( dataLength ) ;
241
+ ypx [ k ] = new Array ( dataLength ) ;
242
+
243
+ data = matrixData [ k ] ;
244
+
245
+ for ( i = 0 ; i < dataLength ; i ++ ) {
246
+ xpx [ k ] [ i ] = xa . c2p ( data [ i ] ) ;
247
+ ypx [ k ] [ i ] = ya . c2p ( data [ i ] ) ;
248
+ }
249
+ }
250
+ stash . xpx = xpx ;
251
+ stash . ypx = ypx ;
254
252
255
253
256
254
if ( scene . selectBatch ) {
@@ -325,24 +323,35 @@ function selectPoints(searchInfo, polygon) {
325
323
var selection = [ ] ;
326
324
var trace = cd [ 0 ] . trace ;
327
325
var stash = cd [ 0 ] . t ;
328
- var x = stash . x ;
329
- var y = stash . y ;
330
326
var scene = stash . _scene ;
327
+ var xa = searchInfo . xaxis ;
328
+ var ya = searchInfo . yaxis ;
329
+ var matrixData = scene . matrixOptions . data ;
331
330
332
331
if ( ! scene ) return selection ;
333
332
334
333
var hasOnlyLines = ( ! subTypes . hasMarkers ( trace ) && ! subTypes . hasText ( trace ) ) ;
335
334
if ( trace . visible !== true || hasOnlyLines ) return selection ;
336
335
336
+ var xi , yi , i ;
337
+ for ( i = 0 ; i < trace . dimensions . length ; i ++ ) {
338
+ if ( trace . xaxes [ i ] === xa . _id ) xi = i ;
339
+ if ( trace . yaxes [ i ] === ya . _id ) yi = i ;
340
+ }
341
+
342
+ var xpx = stash . xpx [ xi ] ;
343
+ var ypx = stash . ypx [ yi ] ;
344
+ var x = matrixData [ xi ] ;
345
+ var y = matrixData [ yi ] ;
346
+
337
347
// degenerate polygon does not enable selection
338
348
// filter out points by visible scatter ones
339
349
var els = null ;
340
350
var unels = null ;
341
- var i ;
342
351
if ( polygon !== false && ! polygon . degenerate ) {
343
352
els = [ ] , unels = [ ] ;
344
- for ( i = 0 ; i < stash . count ; i ++ ) {
345
- if ( polygon . contains ( [ stash . xpx [ i ] , stash . ypx [ i ] ] ) ) {
353
+ for ( i = 0 ; i < x . length ; i ++ ) {
354
+ if ( polygon . contains ( [ xpx [ i ] , ypx [ i ] ] ) ) {
346
355
els . push ( i ) ;
347
356
selection . push ( {
348
357
pointNumber : i ,
@@ -371,20 +380,21 @@ function selectPoints(searchInfo, polygon) {
371
380
scene . unselectBatch = [ ] ;
372
381
}
373
382
// we should turn scatter2d into unselected once we have any points selected
374
- scene . matrix . update ( scene . unselectedOptions ) ;
383
+ scene . matrix . update ( scene . unselectedOptions , scene . selectedOptions ) ;
375
384
}
376
385
377
386
scene . selectBatch = els ;
378
387
scene . unselectBatch = unels ;
379
388
389
+ scene . matrix . regl . clear ( { color : true } ) ;
390
+
380
391
return selection ;
381
392
}
382
393
383
394
function style ( gd , cd ) {
384
395
if ( cd ) {
385
396
var stash = cd [ 0 ] . t ;
386
397
var scene = stash . _scene ;
387
- scene . clear ( ) ;
388
398
scene . draw ( ) ;
389
399
}
390
400
}
0 commit comments