|
1 | 1 | (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 | + |
2 | 33 | function dimToTexSize(gl, dimensions) { |
3 | 34 | var numTexels = dimensions[0]; |
4 | 35 | for (var i=1; i<dimensions.length; i++) { |
|
258 | 289 | opt.hardcodeConstants ? 'vec2 uTexSize = vec2('+texSize[0]+','+texSize[1]+');' : 'uniform vec2 uTexSize;', |
259 | 290 | 'varying vec2 vTexCoord;', |
260 | 291 | '', |
| 292 | + opt.offsetRangeHack ? '#define OFFSET_HACK' : '', |
| 293 | + '#ifndef OFFSET_HACK', |
261 | 294 | '/* Begin: http://stackoverflow.com/questions/7059962/how-do-i-convert-a-vec4-rgba-value-to-a-float */', |
262 | 295 | 'highp vec4 encode32(highp float f) {', |
263 | 296 | ' highp float e =5.0;', |
|
285 | 318 | ' return result;', |
286 | 319 | '}', |
287 | 320 | '/* 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', |
288 | 348 | '', |
289 | 349 | 'float index;', |
290 | 350 | 'vec3 threadId;', |
|
436 | 496 | paramArray = flatten(paramArray); |
437 | 497 | } |
438 | 498 |
|
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 | + |
440 | 512 | if (opt.safeTextureReadHack) { |
441 | 513 | gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, paramSize[0]+2, paramSize[1]+2, 0, gl.RGBA, gl.UNSIGNED_BYTE, argBuffer); |
442 | 514 | } else { |
|
507 | 579 |
|
508 | 580 | var bytes = new Uint8Array(texSize[0]*texSize[1]*4); |
509 | 581 | 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 | + } |
511 | 596 | result.length = threadDim[0] * threadDim[1] * threadDim[2]; |
512 | 597 |
|
513 | 598 | if (opt.dimensions.length == 1) { |
|
0 commit comments