|
52 | 52 |
|
53 | 53 | return ret; |
54 | 54 | } |
55 | | - |
56 | | - function flatten(arr, padding) { |
| 55 | + |
| 56 | + function pad(arr, padding) { |
57 | 57 | function zeros(n) { |
58 | 58 | return Array.apply(null, Array(n)).map(Number.prototype.valueOf,0); |
59 | 59 | } |
60 | | - function concatWithPadding(a, b) { |
61 | | - return [].concat(a, zeros(padding), b); |
| 60 | + |
| 61 | + var len = arr.length + padding * 2; |
| 62 | + |
| 63 | + var ret = arr.map(function(x) { |
| 64 | + return [].concat(zeros(padding), x, zeros(padding)); |
| 65 | + }); |
| 66 | + |
| 67 | + for (var i=0; i<padding; i++) { |
| 68 | + ret = [].concat([zeros(len)], ret, [zeros(len)]); |
62 | 69 | } |
63 | 70 |
|
| 71 | + return ret; |
| 72 | + } |
| 73 | + |
| 74 | + function flatten(arr, padding) { |
64 | 75 | if (Array.isArray(arr[0])) { |
65 | | - if (padding) { |
66 | | - return (concatWithPadding.apply([], arr)).concat(zeros(padding)); |
67 | | - } else { |
68 | | - return [].concat.apply([], arr); |
69 | | - } |
| 76 | + return [].concat.apply([], arr); |
70 | 77 | } else { |
71 | 78 | return arr; |
72 | 79 | } |
|
297 | 304 | ' float index = (xyz.z * texDim.x * texDim.y) + (xyz.y * texDim.x) + xyz.x;', |
298 | 305 | ' float t = (floor(index / texSize.x) + 0.5);', |
299 | 306 | ' float s = mod(index, texSize.x);', |
| 307 | + (opt.safeTextureReadHack ? 's += 1.0; t += 1.0;' : ''), |
300 | 308 | ' s = (s < 0.5) ? 0.0 : s + 0.5;', |
| 309 | + (opt.safeTextureReadHack ? 'return decode32(texture2D(tex, vec2(s / (texSize.x + 2.0), t / (texSize.y + 2.0))));' : ''), |
301 | 310 | ' return decode32(texture2D(tex, vec2(s / texSize.x, t / texSize.y)));', |
302 | 311 | '}', |
303 | 312 | '', |
|
416 | 425 | gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); |
417 | 426 | gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); |
418 | 427 |
|
419 | | - |
420 | 428 | var paramArray = flatten(arguments[textureCount]); |
421 | 429 | while (paramArray.length < paramSize[0] * paramSize[1]) { |
422 | 430 | paramArray.push(0); |
423 | 431 | } |
| 432 | + |
| 433 | + if (opt.safeTextureReadHack) { |
| 434 | + paramArray = splitArray(paramArray, paramSize[0]); |
| 435 | + paramArray = pad(paramArray, 1); |
| 436 | + paramArray = flatten(paramArray); |
| 437 | + } |
| 438 | + |
424 | 439 | var argBuffer = new Uint8Array((new Float32Array(paramArray)).buffer); |
425 | | - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, paramSize[0], paramSize[1], 0, gl.RGBA, gl.UNSIGNED_BYTE, argBuffer); |
| 440 | + if (opt.safeTextureReadHack) { |
| 441 | + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, paramSize[0]+2, paramSize[1]+2, 0, gl.RGBA, gl.UNSIGNED_BYTE, argBuffer); |
| 442 | + } else { |
| 443 | + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, paramSize[0], paramSize[1], 0, gl.RGBA, gl.UNSIGNED_BYTE, argBuffer); |
| 444 | + } |
426 | 445 |
|
427 | 446 | textures[textureCount] = texture; |
428 | 447 |
|
|
0 commit comments