$(document).ready( regalweb ); function regalweb() { $("body").animate( { backgroundColor: "#444444" }, 200, function() { $.get("/debug/begin", function() { createMainTab(); } ); } ); } function imageLoaded( img ) { var source = $("#" + img + "source")[0]; var canvas = $("#" + img + "canvas")[0]; var parent = source.parentNode; var gl = canvas.gl || ( canvas.gl = canvas.getContext('webgl') || canvas.getContext("experimental-webgl") ); var rd = canvas.renderData || ( canvas.renderData = new Object() ); if( ! rd.tex ) { rd.tex = gl.createTexture(); } gl.bindTexture(gl.TEXTURE_2D, rd.tex); gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true); gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source); if( source.tex && source.tex.GL_TEXTURE_MAG_FILTER == "GL_NEAREST" ) { gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); } else { gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); } gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); 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.bindTexture(gl.TEXTURE_2D, null); if( source.prevWidth != source.width || source.prevHeight != source.height ) { var w = source.width; var h = source.height; var a = w/h; source.prevWidth = w; source.prevHeight = h $(parent).resizable({ aspectRatio: a }); var options = $(parent).resizable("option"); w = Math.max( options.minWidth, Math.min( options.maxWidth, w ) ); if( a < 1 ) { w *= a; } h = w/a; $(parent).animate( { width: w, height: h }, 200 ); renderImage( img, { width: w, height: h } ); } else { renderImage( img ); } $(parent).resizable(); } function restOfContainerWidth( jel, parentWidth ) { var w = 0; jel.siblings().each( function(index, el) { w += $(el).outerWidth(true); }); var pw = parentWidth || jel.parent().width(); var myouter = jel.outerWidth(true) - jel.width(); var resizeMarginRight = jel[0].resizeMarginRight || 0; jel.width( pw - w - myouter - 2 - resizeMarginRight ); } function renderImage( img, size ) { var render = $("#" + img + "render")[0]; var source = $("#" + img + "source")[0]; var canvas = $("#" + img + "canvas")[0]; var slider = $("#" + img + "opacity"); var gl = canvas.gl || ( canvas.gl = canvas.getContext('webgl') || canvas.getContext("experimental-webgl" ) ); var parent = source.parentNode; var w = parent.clientWidth; var h = parent.clientHeight; if( size ) { w = size.width; h = size.height; } if( w <= 0 || h <= 0 ) { return; } var opacity = slider.slider("option", "value") / 100.0; canvas.width = render.width = w; canvas.height = render.height = h; gl.viewport( 0, 0, w, h ); gl.clearColor( 1, 0, 0, 0 ); gl.clear( gl.COLOR_BUFFER_BIT ); var rd = canvas.renderData || ( canvas.renderData = new Object() ); if( ! rd.vb ) { rd.vb = gl.createBuffer(); gl.bindBuffer( gl.ARRAY_BUFFER, rd.vb ); gl.bufferData( gl.ARRAY_BUFFER, new Float32Array( [ -1, -1, 1, -1, 1, 1, -1, -1, 1, 1, -1, 1 ] ), gl.STATIC_DRAW); rd.vs = gl.createShader( gl.VERTEX_SHADER ); gl.shaderSource( rd.vs, "attribute vec2 p;\n" + "varying vec2 tc;\n" + "void main() {\n" + " tc = p * 0.5 + 0.5;\n" + " gl_Position = vec4( p.x, p.y, 0.0, 1.0 );\n" + "}\n" ); gl.compileShader( rd.vs ); if (!gl.getShaderParameter( rd.vs, gl.COMPILE_STATUS) ) { var infoLog = gl.getShaderInfoLog( rd.vs ); alert("Error compiling shader:\n" + infoLog); } rd.fs = gl.createShader( gl.FRAGMENT_SHADER ); gl.shaderSource( rd.fs, "precision highp float;\n" + "uniform sampler2D tex;\n" + "uniform float opacity;\n" + "varying vec2 tc;\n" + "void main() {\n" + " float checker = mod( dot( floor( vec2(gl_FragCoord.x,gl_FragCoord.y) / 8.0 ) , vec2( 1.0, 1.0 ) ) , 2.0 );\n" + " checker = checker * 0.25 + 0.75;\n" + " vec4 c = vec4( checker, checker, checker, 1.0 );\n" + " vec4 t = texture2D( tex, tc );\n" + " t.w = t.w + ( 1.0 - t.w ) * opacity;\n" + " gl_FragColor.xyz = c.xyz * (1.0 - t.w) + t.xyz * t.w;\n" + " gl_FragColor.w = 1.0;\n" + "}\n" ); gl.compileShader( rd.fs ); if (!gl.getShaderParameter( rd.fs, gl.COMPILE_STATUS) ) { var infoLog = gl.getShaderInfoLog( rd.fs ); alert("Error compiling shader:\n" + infoLog); } rd.prog = gl.createProgram(); gl.attachShader( rd.prog, rd.vs ); gl.attachShader( rd.prog, rd.fs ); gl.linkProgram( rd.prog ); gl.bindAttribLocation( rd.prog, 0, "p" ); gl.linkProgram( rd.prog ); gl.useProgram( rd.prog ); gl.uniform1i( gl.getUniformLocation( rd.prog, "tex" ), 0 ); rd.opacityLoc = gl.getUniformLocation( rd.prog, "opacity" ); } if( ! rd.tex ) { return; } gl.activeTexture( gl.TEXTURE0 ); gl.bindTexture( gl.TEXTURE_2D, rd.tex ); gl.bindBuffer( gl.ARRAY_BUFFER, rd.vb ); gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0); gl.enableVertexAttribArray( 0 ); gl.useProgram( rd.prog ); gl.uniform1f( rd.opacityLoc, opacity ); gl.drawArrays( gl.TRIANGLES, 0, 6 ); $(render).attr( "src", canvas.toDataURL() ); restOfContainerWidth( slider, w ); var filler = $("#" + img ).parent().children(".restOfWidth"); filler.css( { height: h } ); restOfContainerWidth( filler ); } function fetch( url, callback ) { $.ajax( { url: url, success: callback, error: function( data ) { console.log( "error!

" + data ); } } ); } function updateLogData() { fetch( "/log/-100", function( logdata ) { $("#log").html( logdata.log.join( "
" ) ); $("#log").scrollTop( 100000 ); } ); } function createDebugButton( id, label ) { var b = $('