Skip to content

Commit b1dec42

Browse files
authored
Merge pull request #1 from monfera/64-bit
Conversion to high precision drawing
2 parents fd0eb5b + 9d6cc70 commit b1dec42

File tree

3 files changed

+62
-38
lines changed

3 files changed

+62
-38
lines changed

error2d.js

Lines changed: 47 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -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) {
7980
var proto = GLError2D.prototype
8081

8182
proto.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

231244
proto.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

237251
function 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
}

lib/shaders/vertex.glsl

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,22 @@
1-
precision mediump float;
1+
precision highp float;
22

3-
attribute vec2 position;
3+
attribute vec2 positionHi;
4+
attribute vec2 positionLo;
45
attribute vec2 pixelOffset;
56

6-
uniform mat3 viewTransform;
7-
uniform vec2 pixelScale;
7+
uniform vec2 scaleHi, scaleLo, translateHi, translateLo, pixelScale;
8+
9+
vec2 project(vec2 scHi, vec2 trHi, vec2 scLo, vec2 trLo, vec2 posHi, vec2 posLo) {
10+
return scHi * posHi + trHi
11+
+ scLo * posHi + trLo
12+
+ scHi * posLo
13+
+ scLo * posLo;
14+
}
815

916
void main() {
10-
vec3 scrPosition = viewTransform * vec3(position, 1);
17+
vec3 scrPosition = vec3(
18+
project(scaleHi, translateHi, scaleLo, translateLo, positionHi, positionLo),
19+
1);
1120
gl_Position = vec4(
1221
scrPosition.xy + scrPosition.z * pixelScale * pixelOffset,
1322
0,

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "gl-error2d",
3-
"version": "1.1.2",
3+
"version": "1.2.0",
44
"description": "2D error bars",
55
"main": "error2d.js",
66
"scripts": {

0 commit comments

Comments
 (0)