@@ -63,11 +63,12 @@ var WEIGHTS = [
6363 [ 0 , - 1 , 0 , 1 , - 1 , 0 ]
6464]
6565
66- function GLError2D ( plot , shader , buffer ) {
66+ function GLError2D ( plot , shader , bufferHi , bufferLo ) {
6767 this . plot = plot
6868
6969 this . shader = shader
70- this . buffer = buffer
70+ this . bufferHi = bufferHi
71+ this . bufferLo = bufferLo
7172
7273 this . bounds = [ Infinity , Infinity , - Infinity , - Infinity ]
7374
@@ -79,18 +80,16 @@ function GLError2D (plot, shader, buffer) {
7980var proto = GLError2D . prototype
8081
8182proto . draw = ( function ( ) {
82- var MATRIX = [
83- 1 , 0 , 0 ,
84- 0 , 1 , 0 ,
85- 0 , 0 , 1
86- ]
83+ var SCALE_HI = new Float32Array ( [ 0 , 0 ] )
84+ var SCALE_LO = new Float32Array ( [ 0 , 0 ] )
85+ var TRANSLATE_HI = new Float32Array ( [ 0 , 0 ] )
86+ var TRANSLATE_LO = new Float32Array ( [ 0 , 0 ] )
8787
8888 var PIXEL_SCALE = [ 1 , 1 ]
8989
9090 return function ( ) {
9191 var plot = this . plot
9292 var shader = this . shader
93- var buffer = this . buffer
9493 var bounds = this . bounds
9594 var numPoints = this . numPoints
9695
@@ -108,35 +107,42 @@ proto.draw = (function () {
108107 var dataX = dataBox [ 2 ] - dataBox [ 0 ]
109108 var dataY = dataBox [ 3 ] - dataBox [ 1 ]
110109
111- MATRIX [ 0 ] = 2.0 * boundX / dataX
112- MATRIX [ 4 ] = 2.0 * boundY / dataY
113- MATRIX [ 6 ] = 2.0 * ( bounds [ 0 ] - dataBox [ 0 ] ) / dataX - 1.0
114- MATRIX [ 7 ] = 2.0 * ( bounds [ 1 ] - dataBox [ 1 ] ) / dataY - 1.0
110+ var scaleX = 2 * boundX / dataX
111+ var scaleY = 2 * boundY / dataY
112+ var translateX = 2 * ( bounds [ 0 ] - dataBox [ 0 ] ) / dataX - 1
113+ var translateY = 2 * ( bounds [ 1 ] - dataBox [ 1 ] ) / dataY - 1
114+
115+ SCALE_HI [ 0 ] = scaleX
116+ SCALE_HI [ 1 ] = scaleY
117+ SCALE_LO [ 0 ] = scaleX - SCALE_HI [ 0 ]
118+ SCALE_LO [ 1 ] = scaleY - SCALE_HI [ 1 ]
119+ TRANSLATE_HI [ 0 ] = translateX
120+ TRANSLATE_HI [ 1 ] = translateY
121+ TRANSLATE_LO [ 0 ] = translateX - TRANSLATE_HI [ 0 ]
122+ TRANSLATE_LO [ 1 ] = translateY - TRANSLATE_HI [ 1 ]
115123
116124 var screenX = viewBox [ 2 ] - viewBox [ 0 ]
117125 var screenY = viewBox [ 3 ] - viewBox [ 1 ]
118126
119127 PIXEL_SCALE [ 0 ] = 2.0 * pixelRatio / screenX
120128 PIXEL_SCALE [ 1 ] = 2.0 * pixelRatio / screenY
121129
122- buffer . bind ( )
123130 shader . bind ( )
124131
125- shader . uniforms . viewTransform = MATRIX
132+ shader . uniforms . scaleHi = SCALE_HI
133+ shader . uniforms . scaleLo = SCALE_LO
134+ shader . uniforms . translateHi = TRANSLATE_HI
135+ shader . uniforms . translateLo = TRANSLATE_LO
126136 shader . uniforms . pixelScale = PIXEL_SCALE
127137 shader . uniforms . color = this . color
128138
129- shader . attributes . position . pointer (
130- gl . FLOAT ,
131- false ,
132- 16 ,
133- 0 )
139+ this . bufferLo . bind ( )
140+ shader . attributes . positionLo . pointer ( gl . FLOAT , false , 16 , 0 )
141+
142+ this . bufferHi . bind ( )
143+ shader . attributes . positionHi . pointer ( gl . FLOAT , false , 16 , 0 )
134144
135- shader . attributes . pixelOffset . pointer (
136- gl . FLOAT ,
137- false ,
138- 16 ,
139- 8 )
145+ shader . attributes . pixelOffset . pointer ( gl . FLOAT , false , 16 , 8 )
140146
141147 gl . drawArrays ( gl . TRIANGLES , 0 , numPoints * WEIGHTS . length )
142148 }
@@ -190,7 +196,9 @@ proto.update = function (options) {
190196 var tx = bounds [ 0 ]
191197 var ty = bounds [ 1 ]
192198
193- var bufferData = pool . mallocFloat32 ( numPoints * WEIGHTS . length * 4 )
199+ var bufferData = pool . mallocFloat64 ( numPoints * WEIGHTS . length * 4 )
200+ var bufferDataHi = pool . mallocFloat32 ( numPoints * WEIGHTS . length * 4 )
201+ var bufferDataLo = pool . mallocFloat32 ( numPoints * WEIGHTS . length * 4 )
194202 var ptr = 0
195203 for ( i = 0 ; i < numPoints ; ++ i ) {
196204 x = positions [ 2 * i ]
@@ -224,25 +232,32 @@ proto.update = function (options) {
224232 bufferData [ ptr ++ ] = lineWidth * w [ 3 ] + ( capSize + lineWidth ) * w [ 5 ]
225233 }
226234 }
227- this . buffer . update ( bufferData )
235+ for ( i = 0 ; i < bufferData . length ; i ++ ) {
236+ bufferDataHi [ i ] = bufferData [ i ]
237+ bufferDataLo [ i ] = bufferData [ i ] - bufferDataHi [ i ]
238+ }
239+ this . bufferHi . update ( bufferDataHi )
240+ this . bufferLo . update ( bufferDataLo )
228241 pool . free ( bufferData )
229242}
230243
231244proto . dispose = function ( ) {
232245 this . plot . removeObject ( this )
233246 this . shader . dispose ( )
234- this . buffer . dispose ( )
247+ this . bufferHi . dispose ( )
248+ this . bufferLo . dispose ( )
235249}
236250
237251function createError2D ( plot , options ) {
238252 var shader = createShader ( plot . gl , shaders . vertex , shaders . fragment )
239- var buffer = createBuffer ( plot . gl )
253+ var bufferHi = createBuffer ( plot . gl )
254+ var bufferLo = createBuffer ( plot . gl )
240255
241- var errorbars = new GLError2D ( plot , shader , buffer )
256+ var errorBars = new GLError2D ( plot , shader , bufferHi , bufferLo )
242257
243- errorbars . update ( options )
258+ errorBars . update ( options )
244259
245- plot . addObject ( errorbars )
260+ plot . addObject ( errorBars )
246261
247- return errorbars
262+ return errorBars
248263}
0 commit comments