|
1 | 1 | 'use strict';
|
2 | 2 |
|
3 |
| -var glslify = require('glslify'); |
4 |
| -var vertexShaderSource = glslify('./shaders/vertex.glsl'); |
5 |
| -var fragmentShaderSource = glslify('./shaders/fragment.glsl'); |
| 3 | +var vertexShaderSource = [ |
| 4 | + 'precision highp float;', |
| 5 | + '', |
| 6 | + 'varying vec4 fragColor;', |
| 7 | + '', |
| 8 | + 'attribute vec4 p01_04, p05_08, p09_12, p13_16,', |
| 9 | + ' p17_20, p21_24, p25_28, p29_32,', |
| 10 | + ' p33_36, p37_40, p41_44, p45_48,', |
| 11 | + ' p49_52, p53_56, p57_60, colors;', |
| 12 | + '', |
| 13 | + 'uniform mat4 dim0A, dim1A, dim0B, dim1B, dim0C, dim1C, dim0D, dim1D,', |
| 14 | + ' loA, hiA, loB, hiB, loC, hiC, loD, hiD;', |
| 15 | + '', |
| 16 | + 'uniform vec2 resolution, viewBoxPos, viewBoxSize;', |
| 17 | + 'uniform float maskHeight;', |
| 18 | + 'uniform float drwLayer; // 0: context, 1: focus, 2: pick', |
| 19 | + 'uniform vec4 contextColor;', |
| 20 | + 'uniform sampler2D maskTexture, palette;', |
| 21 | + '', |
| 22 | + 'bool isPick = (drwLayer > 1.5);', |
| 23 | + 'bool isContext = (drwLayer < 0.5);', |
| 24 | + '', |
| 25 | + 'const vec4 ZEROS = vec4(0.0, 0.0, 0.0, 0.0);', |
| 26 | + 'const vec4 UNITS = vec4(1.0, 1.0, 1.0, 1.0);', |
| 27 | + '', |
| 28 | + 'float val(mat4 p, mat4 v) {', |
| 29 | + ' return dot(matrixCompMult(p, v) * UNITS, UNITS);', |
| 30 | + '}', |
| 31 | + '', |
| 32 | + 'float axisY(float ratio, mat4 A, mat4 B, mat4 C, mat4 D) {', |
| 33 | + ' float y1 = val(A, dim0A) + val(B, dim0B) + val(C, dim0C) + val(D, dim0D);', |
| 34 | + ' float y2 = val(A, dim1A) + val(B, dim1B) + val(C, dim1C) + val(D, dim1D);', |
| 35 | + ' return y1 * (1.0 - ratio) + y2 * ratio;', |
| 36 | + '}', |
| 37 | + '', |
| 38 | + 'int iMod(int a, int b) {', |
| 39 | + ' return a - b * (a / b);', |
| 40 | + '}', |
| 41 | + '', |
| 42 | + 'bool fOutside(float p, float lo, float hi) {', |
| 43 | + ' return (lo < hi) && (lo > p || p > hi);', |
| 44 | + '}', |
| 45 | + '', |
| 46 | + 'bool vOutside(vec4 p, vec4 lo, vec4 hi) {', |
| 47 | + ' return (', |
| 48 | + ' fOutside(p[0], lo[0], hi[0]) ||', |
| 49 | + ' fOutside(p[1], lo[1], hi[1]) ||', |
| 50 | + ' fOutside(p[2], lo[2], hi[2]) ||', |
| 51 | + ' fOutside(p[3], lo[3], hi[3])', |
| 52 | + ' );', |
| 53 | + '}', |
| 54 | + '', |
| 55 | + 'bool mOutside(mat4 p, mat4 lo, mat4 hi) {', |
| 56 | + ' return (', |
| 57 | + ' vOutside(p[0], lo[0], hi[0]) ||', |
| 58 | + ' vOutside(p[1], lo[1], hi[1]) ||', |
| 59 | + ' vOutside(p[2], lo[2], hi[2]) ||', |
| 60 | + ' vOutside(p[3], lo[3], hi[3])', |
| 61 | + ' );', |
| 62 | + '}', |
| 63 | + '', |
| 64 | + 'bool outsideBoundingBox(mat4 A, mat4 B, mat4 C, mat4 D) {', |
| 65 | + ' return mOutside(A, loA, hiA) ||', |
| 66 | + ' mOutside(B, loB, hiB) ||', |
| 67 | + ' mOutside(C, loC, hiC) ||', |
| 68 | + ' mOutside(D, loD, hiD);', |
| 69 | + '}', |
| 70 | + '', |
| 71 | + 'bool outsideRasterMask(mat4 A, mat4 B, mat4 C, mat4 D) {', |
| 72 | + ' mat4 pnts[4];', |
| 73 | + ' pnts[0] = A;', |
| 74 | + ' pnts[1] = B;', |
| 75 | + ' pnts[2] = C;', |
| 76 | + ' pnts[3] = D;', |
| 77 | + '', |
| 78 | + ' for(int i = 0; i < 4; ++i) {', |
| 79 | + ' for(int j = 0; j < 4; ++j) {', |
| 80 | + ' for(int k = 0; k < 4; ++k) {', |
| 81 | + ' if(0 == iMod(', |
| 82 | + ' int(255.0 * texture2D(maskTexture,', |
| 83 | + ' vec2(', |
| 84 | + ' (float(i * 2 + j / 2) + 0.5) / 8.0,', |
| 85 | + ' (pnts[i][j][k] * (maskHeight - 1.0) + 1.0) / maskHeight', |
| 86 | + ' ))[3]', |
| 87 | + ' ) / int(pow(2.0, float(iMod(j * 4 + k, 8)))),', |
| 88 | + ' 2', |
| 89 | + ' )) return true;', |
| 90 | + ' }', |
| 91 | + ' }', |
| 92 | + ' }', |
| 93 | + ' return false;', |
| 94 | + '}', |
| 95 | + '', |
| 96 | + 'vec4 position(bool isContext, float v, mat4 A, mat4 B, mat4 C, mat4 D) {', |
| 97 | + ' float x = 0.5 * sign(v) + 0.5;', |
| 98 | + ' float y = axisY(x, A, B, C, D);', |
| 99 | + ' float z = 1.0 - abs(v);', |
| 100 | + '', |
| 101 | + ' z += isContext ? 0.0 : 2.0 * float(', |
| 102 | + ' outsideBoundingBox(A, B, C, D) ||', |
| 103 | + ' outsideRasterMask(A, B, C, D)', |
| 104 | + ' );', |
| 105 | + '', |
| 106 | + ' return vec4(', |
| 107 | + ' 2.0 * (vec2(x, y) * viewBoxSize + viewBoxPos) / resolution - 1.0,', |
| 108 | + ' z,', |
| 109 | + ' 1.0', |
| 110 | + ' );', |
| 111 | + '}', |
| 112 | + '', |
| 113 | + 'void main() {', |
| 114 | + ' mat4 A = mat4(p01_04, p05_08, p09_12, p13_16);', |
| 115 | + ' mat4 B = mat4(p17_20, p21_24, p25_28, p29_32);', |
| 116 | + ' mat4 C = mat4(p33_36, p37_40, p41_44, p45_48);', |
| 117 | + ' mat4 D = mat4(p49_52, p53_56, p57_60, ZEROS);', |
| 118 | + '', |
| 119 | + ' float v = colors[3];', |
| 120 | + '', |
| 121 | + ' gl_Position = position(isContext, v, A, B, C, D);', |
| 122 | + '', |
| 123 | + ' fragColor =', |
| 124 | + ' isContext ? vec4(contextColor) :', |
| 125 | + ' isPick ? vec4(colors.rgb, 1.0) : texture2D(palette, vec2(abs(v), 0.5));', |
| 126 | + '}' |
| 127 | +].join('\n'); |
| 128 | + |
| 129 | +var fragmentShaderSource = [ |
| 130 | + 'precision highp float;', |
| 131 | + '', |
| 132 | + 'varying vec4 fragColor;', |
| 133 | + '', |
| 134 | + 'void main() {', |
| 135 | + ' gl_FragColor = fragColor;', |
| 136 | + '}' |
| 137 | +].join('\n'); |
| 138 | + |
6 | 139 | var maxDim = require('./constants').maxDimensionCount;
|
7 | 140 |
|
8 | 141 | var Lib = require('../../lib');
|
|
0 commit comments