Skip to content

Commit 7b77b0d

Browse files
committed
offsetRangeHack test
1 parent a8a59a8 commit 7b77b0d

1 file changed

Lines changed: 87 additions & 2 deletions

File tree

src/backend/mode_gpu.js

Lines changed: 87 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,35 @@
11
(function(GPU) {
2+
function dot4(vector4A,vector4B) {
3+
return vector4A[0]*vector4B[0] + vector4A[1]*vector4B[1] + vector4A[2]*vector4B[2] + vector4A[3]*vector4B[3];
4+
}
5+
6+
function offset(v, off) { return (v+off)/(off*2.0); }
7+
8+
function unoffset(v, off) { return v * (off*2.0) - off; }
9+
10+
function fract(x) {
11+
return x - Math.floor(x);
12+
}
13+
14+
function pack(v) {
15+
var bias = [1.0 / 255.0, 1.0 / 255.0, 1.0 / 255.0, 0.0];
16+
17+
var r = v;
18+
var g = fract(r * 255.0);
19+
var b = fract(g * 255.0);
20+
var a = fract(b * 255.0);
21+
var colour = [r, g, b, a];
22+
23+
var dd = [colour[1]*bias[0],colour[2]*bias[1],colour[3]*bias[2],colour[3]*bias[3]];
24+
25+
return [colour[0]-dd[0],colour[1]-dd[1],colour[2]-dd[2],colour[3]-dd[3] ];
26+
}
27+
28+
function unpack(colour) {
29+
var bitShifts = [1.0, 1.0/255.0, 1.0/(255.0*255.0), 1.0/(255.0*255.0*255.0)];
30+
return dot4(colour, bitShifts);
31+
};
32+
233
function dimToTexSize(gl, dimensions) {
334
var numTexels = dimensions[0];
435
for (var i=1; i<dimensions.length; i++) {
@@ -258,6 +289,8 @@
258289
opt.hardcodeConstants ? 'vec2 uTexSize = vec2('+texSize[0]+','+texSize[1]+');' : 'uniform vec2 uTexSize;',
259290
'varying vec2 vTexCoord;',
260291
'',
292+
opt.offsetRangeHack ? '#define OFFSET_HACK' : '',
293+
'#ifndef OFFSET_HACK',
261294
'/* Begin: http://stackoverflow.com/questions/7059962/how-do-i-convert-a-vec4-rgba-value-to-a-float */',
262295
'highp vec4 encode32(highp float f) {',
263296
' highp float e =5.0;',
@@ -285,6 +318,33 @@
285318
' return result;',
286319
'}',
287320
'/* End: http://stackoverflow.com/questions/7059962/how-do-i-convert-a-vec4-rgba-value-to-a-float */',
321+
'#else',
322+
(opt.offsetRangeHack ? 'float offset = ' + parseInt(opt.offsetRangeHack) + '.0;' : ''),
323+
'',
324+
'float offsetFloat(float v, float off) {',
325+
' return (v+off)/(off*2.0);',
326+
'}',
327+
'float unoffsetFloat(float v, float off) {',
328+
' return v * (off*2.0) - off;',
329+
'}',
330+
'',
331+
'highp vec4 encode32(highp float f) {',
332+
' f = offsetFloat(f, offset);',
333+
' const vec4 bias = vec4(vec3(1.0 / 255.0), 0.0);',
334+
' float r = f;',
335+
' float g = fract(r * 255.0);',
336+
' float b = fract(g * 255.0);',
337+
' float a = fract(b * 255.0);',
338+
' vec4 rgba = vec4(r, g, b, a);',
339+
' return rgba;',
340+
'}',
341+
'highp float decode32(highp vec4 rgba) {',
342+
' const vec4 bitShifts = vec4(1.0, 1.0 / 255.0, 1.0 / (255.0 * 255.0), 1.0 / (255.0 * 255.0 * 255.0));',
343+
' float f = dot(rgba, bitShifts);',
344+
' f = unoffsetFloat(f, offset);',
345+
' return f;',
346+
'}',
347+
'#endif',
288348
'',
289349
'float index;',
290350
'vec3 threadId;',
@@ -436,7 +496,19 @@
436496
paramArray = flatten(paramArray);
437497
}
438498

439-
var argBuffer = new Uint8Array((new Float32Array(paramArray)).buffer);
499+
var argBuffer;
500+
501+
if (opt.offsetRangeHack) {
502+
argBuffer = new Uint8Array([].concat.apply([], paramArray.map(function(x) {
503+
return pack(offset(x, opt.offsetRangeHack)).map(function(x) {
504+
return x * 255;
505+
});
506+
})));
507+
console.log(argBuffer);
508+
} else {
509+
argBuffer = new Uint8Array((new Float32Array(paramArray)).buffer);
510+
}
511+
440512
if (opt.safeTextureReadHack) {
441513
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, paramSize[0]+2, paramSize[1]+2, 0, gl.RGBA, gl.UNSIGNED_BYTE, argBuffer);
442514
} else {
@@ -507,7 +579,20 @@
507579

508580
var bytes = new Uint8Array(texSize[0]*texSize[1]*4);
509581
gl.readPixels(0, 0, texSize[0], texSize[1], gl.RGBA, gl.UNSIGNED_BYTE, bytes);
510-
var result = Array.prototype.slice.call(new Float32Array(bytes.buffer));
582+
var result;
583+
if (opt.offsetRangeHack) {
584+
bytes = Array.prototype.slice.call(bytes);
585+
bytes = bytes.map(function(x) {
586+
return x / 255.0;
587+
});
588+
var colors = splitArray(bytes, 4);
589+
console.log(colors);
590+
result = splitArray(bytes, 4).map(function(color) {
591+
return unoffset(unpack(color), opt.offsetRangeHack);
592+
});
593+
} else {
594+
result = Array.prototype.slice.call(new Float32Array(bytes.buffer));
595+
}
511596
result.length = threadDim[0] * threadDim[1] * threadDim[2];
512597

513598
if (opt.dimensions.length == 1) {

0 commit comments

Comments
 (0)