////////////////////////////////////////////////////////////////////////////////////////// // // THIS IS THE SUPPORT LIBRARY. YOU PROBABLY DON'T WANT TO CHANGE ANYTHING HERE JUST YET. // ////////////////////////////////////////////////////////////////////////////////////////// let fragmentShaderHeader = ['' // WHATEVER CODE WE WANT TO PREDEFINE FOR FRAGMENT SHADERS , 'precision highp float;', '#define _NDEBUG\n','float noise(vec3 point) { float r = 0.; for (int i=0;i<16;i++) {', ' vec3 D, p = point + mod(vec3(i,i/4,i/8) , vec3(4.0,2.0,2.0)) +', ' 1.7*sin(vec3(i,5*i,8*i)), C=floor(p), P=p-C-.5, A=abs(P);', ' C += mod(C.x+C.y+C.z,2.) * step(max(A.yzx,A.zxy),A) * sign(P);', ' D=34.*sin(987.*float(i)+876.*C+76.*C.yzx+765.*C.zxy);P=p-C-.5;', ' r+=sin(6.3*dot(P,fract(D)-.5))*pow(max(0.,1.-2.*dot(P,P)),4.);', '} return .5 * sin(r); }' ].join('\n'); var ns = 5, cns = 5; fragmentShaderHeader += 'const int ns = ' + ns + ';\n'; var fragmentShaderDefs = 'const int cns = ' + cns + ';\n'; var status = 'Move your character to start!'; let nfsh = fragmentShaderHeader.split('\n').length + 1; // NUMBER OF LINES OF CODE IN fragmentShaderHeader let isFirefox = navigator.userAgent.indexOf('Firefox') > 0; function getBlob(data) { let bytes = new Array(data.length); for (let i = 0; i < data.length; i++) { bytes[i] = data.charCodeAt(i); } return new Blob([new Uint8Array(bytes)]); } let stack = function (){ this.storage = ['Ready.']; this.len = 1; this.pop = ()=>{return this.storage[--this.len-1];} this.push = (o)=>{this.storage[this.len++] = o;} this.update = (o)=>{this.storage[this.len-1] = o;} this.top = () => {return this.storage[this.len - 1];} this.clear = () => this.len = 1; } let status_history = new stack(); function updateStatus(val){ status_history.update(status); status = val; errorMessage.innerHTML = val; } function pushStatus(val){ status_history.push(status); status = val; errorMessage.innerHTML = val; } function restoreStatus(val){ status = status_history.pop(); errorMessage.innerHTML = status; } function resetStatus() { status_history.clear(); updateStatus('Ready.'); } var texture = [], gl, program; let textures = []; let lock = false; function loadTexture(gl, url, i) { const level = 0; const internalFormat = gl.RGBA; const width = 1; const height = 1; const border = 0; const srcFormat = gl.RGBA; const srcType = gl.UNSIGNED_BYTE; if (texture[i] == null) { texture[i] = gl.createTexture(); const pixel = new Uint8Array([0, 0, 255, 255]); // opaque blue gl.activeTexture(gl.TEXTURE0 + i); gl.bindTexture(gl.TEXTURE_2D, texture[i]); gl.texImage2D(gl.TEXTURE_2D, level, internalFormat, width, height, border, srcFormat, srcType, pixel); } const image = new Image(); image.onload = function () { gl.activeTexture(gl.TEXTURE0 + i); gl.bindTexture(gl.TEXTURE_2D, texture[i]); gl.texImage2D(gl.TEXTURE_2D, level, internalFormat, srcFormat, srcType, image); if (isPowerOf2(image.width) && isPowerOf2(image.height)) { gl.generateMipmap(gl.TEXTURE_2D); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR); } else { gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); } }; image.src = url; } function initTextures(gl, program){ for (let i = 0; i < ns; ++i) { loadTexture( gl, './' + (i + 1) + '.jpg', i); //Texture loading. textures[i] = i; } textures[ns] = ns; initVideoTexture(gl, ns + 0); textures[ns + 1] = ns + 1; loadTexture(gl, './RTXon.svg', ns + 1); textures[ns+2] = ns+2; loadTexture(gl, './wwe.svg', ns + 2); textures[ns+3] = ns+3; loadTexture(gl, './win.svg', ns + 3); textures[ns+4] = ns+4; loadTexture(gl, './lose.svg', ns + 4); gl.uniform1iv(gl.getUniformLocation(program, 'uSampler'), textures); } function initVideoTexture(gl, i) { const level = 0; const internalFormat = gl.RGBA; const width = 1; const height = 1; const border = 0; const srcFormat = gl.RGBA; const srcType = gl.UNSIGNED_BYTE; if (texture[i] == null) { texture[i] = gl.createTexture(); const pixel = new Uint8Array([0, 0, 255, 255]); // opaque blue gl.activeTexture(gl.TEXTURE + i); gl.bindTexture(gl.TEXTURE_2D, texture[i]); gl.texImage2D(gl.TEXTURE_2D, level, internalFormat, width, height, border, srcFormat, srcType, pixel); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); } } function updateVideoTexture(gl, v_control, i){ //return; const level = 0; const internalFormat = gl.RGBA; const srcFormat = gl.RGBA; const srcType = gl.UNSIGNED_BYTE; gl.bindTexture(gl.TEXTURE_2D, texture[i]); gl.texImage2D(gl.TEXTURE_2D, level, internalFormat, srcFormat, srcType, v_control); } function isPowerOf2(value) { return (value & (value - 1)) == 0; } function buildShaders(vertexShader, fragmentShader){ let curr_program = canvas1.gl.createProgram(); let compile_shaders = (type, src) => { let shader = gl.createShader(type); gl.shaderSource(shader, src); gl.compileShader(shader); gl.attachShader(curr_program, shader); }; compile_shaders(gl.VERTEX_SHADER, vertexShader); compile_shaders(gl.FRAGMENT_SHADER, fragmentShaderHeader + fragmentShaderDefs + fragmentShader); gl.linkProgram(curr_program); return curr_program; } function gl_start(canvas, vertexShader, fragmentShader) { // START WEBGL RUNNING IN A CANVAS console.log('glstart'); setTimeout(function () { try { canvas.gl = canvas.getContext('experimental-webgl'); // Make sure WebGl is supported. IT WOULD BE GREAT TO USE WEBGL2 INSTEAD. } catch (e) { throw 'Sorry, your browser does not support WebGL.'; } canvas.setShaders = function (vertexShader, fragmentShader) { // Add the vertex and fragment shaders: gl = this.gl; program = gl.createProgram(); // Create the WebGL program. function addshader(type, src) { // Create and attach a WebGL shader. function spacer(color, width, height) { return '