@@ -36,7 +36,6 @@ function Scatter (regl, options) {
36
36
37
37
// persistent variables
38
38
let gl = regl . _gl ,
39
- drawMarker , drawCircle ,
40
39
sizeBuffer , positionBuffer , positionFractBuffer , colorBuffer ,
41
40
paletteTexture , palette = [ ] , paletteIds = { } ,
42
41
@@ -132,11 +131,11 @@ function Scatter (regl, options) {
132
131
133
132
// create marker textures
134
133
options . clone . markers . forEach ( markers => {
135
- addMarker ( markers )
134
+ this . addMarker ( markers )
136
135
} )
137
136
// clone palette texture
138
- updatePalette ( options . clone . palette )
139
- updateBuffers ( { point : true , color : true , size : true } )
137
+ this . updatePalette ( options . clone . palette )
138
+ this . updateBuffers ( { point : true , color : true , size : true } )
140
139
}
141
140
// full create from options
142
141
else {
@@ -201,15 +200,18 @@ function Scatter (regl, options) {
201
200
buffer : colorBuffer ,
202
201
stride : tooManyColors ? 8 : 4 ,
203
202
offset : 0
204
- } : { constant : tooManyColors ? palette . slice ( prop . color * 4 , prop . color * 4 + 4 ) : [ prop . color ] } ,
203
+ } : {
204
+ constant : tooManyColors ? palette . slice ( prop . color * 4 , prop . color * 4 + 4 ) : [ prop . color ]
205
+ } ,
205
206
borderColorId : ( ctx , prop ) => prop . borderColor . length ? {
206
207
buffer : colorBuffer ,
207
208
stride : tooManyColors ? 8 : 4 ,
208
209
offset : tooManyColors ? 4 : 2
209
- } : { constant : tooManyColors ? palette . slice ( prop . borderColor * 4 , prop . borderColor * 4 + 4 ) : [ prop . borderColor ] }
210
+ } : {
211
+ constant : tooManyColors ? palette . slice ( prop . borderColor * 4 , prop . borderColor * 4 + 4 ) : [ prop . borderColor ]
212
+ }
210
213
} ,
211
214
212
-
213
215
blend : {
214
216
enable : true ,
215
217
color : [ 0 , 0 , 0 , 1 ] ,
@@ -330,7 +332,6 @@ Scatter.prototype.drawItem = function (id, els) {
330
332
whitelist [ els [ i ] ] = true
331
333
}
332
334
}
333
-
334
335
// draw circles
335
336
if ( group . markerIds [ 0 ] ) {
336
337
let opts = this . getMarkerDrawOptions ( group . markerIds [ 0 ] , group , whitelist )
@@ -361,12 +362,12 @@ Scatter.prototype.getMarkerDrawOptions = function(ids, group, whitelist) {
361
362
if ( ! ids . snap ) {
362
363
let elements = whitelist ? filter ( ids . data , whitelist ) : ids . elements ;
363
364
364
- return [ extend ( { } , group , {
365
+ return [ extend ( { } , group , {
365
366
elements : elements ,
366
367
offset : 0 ,
367
368
count : whitelist ? elements . length : ids . length ,
368
369
marker : markerTextures [ ids . id ]
369
- } ) ]
370
+ } ) ]
370
371
}
371
372
372
373
// scales batch
@@ -714,7 +715,7 @@ Scatter.prototype.update = function (...args) {
714
715
715
716
// update buffers data based on existing groups
716
717
Scatter . prototype . updateBuffers = function ( { point, size, color} ) {
717
- let { paletteIds , palette, groups, tooManyColors, colorBuffer, positionBuffer, positionFractBuffer, maxColors, maxSize, sizeBuffer } = this
718
+ let { palette, groups, tooManyColors, colorBuffer, positionBuffer, positionFractBuffer, maxColors, maxSize, sizeBuffer } = this
718
719
719
720
// put point/color data into buffers, if updated any of them
720
721
let len = groups . reduce ( ( acc , group , i ) => {
@@ -733,8 +734,14 @@ Scatter.prototype.updateBuffers = function({point, size, color}) {
733
734
positionFractData . set ( fract32 ( positions ) , offset * 2 )
734
735
} )
735
736
736
- positionBuffer ( positionData )
737
- positionFractBuffer ( positionFractData )
737
+ positionBuffer ( {
738
+ data : positionData ,
739
+ usage : 'dynamic'
740
+ } )
741
+ positionFractBuffer ( {
742
+ data : positionFractData ,
743
+ usage : 'dynamic'
744
+ } )
738
745
}
739
746
740
747
if ( size ) {
@@ -755,7 +762,10 @@ Scatter.prototype.updateBuffers = function({point, size, color}) {
755
762
sizeData . set ( sizes , offset * 2 )
756
763
}
757
764
} )
758
- sizeBuffer ( sizeData )
765
+ sizeBuffer ( {
766
+ data : sizeData ,
767
+ usage : 'dynamic'
768
+ } )
759
769
}
760
770
761
771
if ( color ) {
@@ -794,7 +804,8 @@ Scatter.prototype.updateBuffers = function({point, size, color}) {
794
804
// if limited amount of colors - keep palette color picking
795
805
// that saves significant memory
796
806
else {
797
- colorData = new Uint8Array ( len * 4 )
807
+ // we need slight data increase by 2 due to vec4 borderId in shader
808
+ colorData = new Uint8Array ( len * 4 + 2 )
798
809
799
810
groups . forEach ( ( group , i ) => {
800
811
if ( ! group ) return
@@ -819,8 +830,10 @@ Scatter.prototype.updateBuffers = function({point, size, color}) {
819
830
}
820
831
} )
821
832
}
822
-
823
- colorBuffer ( colorData )
833
+ colorBuffer ( {
834
+ data : colorData ,
835
+ usage : 'dynamic'
836
+ } )
824
837
}
825
838
}
826
839
@@ -948,11 +961,13 @@ Scatter.prototype.updatePalette = function(palette) {
948
961
949
962
// remove unused stuff
950
963
Scatter . prototype . destroy = function ( ) {
951
- groups . length = 0
964
+ this . groups . length = 0
952
965
953
- sizeBuffer . destroy ( )
954
- positionBuffer . destroy ( )
955
- positionFractBuffer . destroy ( )
956
- colorBuffer . destroy ( )
957
- paletteTexture . destroy ( )
966
+ this . sizeBuffer . destroy ( )
967
+ this . positionBuffer . destroy ( )
968
+ this . positionFractBuffer . destroy ( )
969
+ this . colorBuffer . destroy ( )
970
+ this . paletteTexture . destroy ( )
971
+
972
+ return this
958
973
}
0 commit comments