made with requirebin
Created
April 19, 2016 03:17
-
-
Save guybrush/027395068fd61379b3b7b4dd225a0fd6 to your computer and use it in GitHub Desktop.
requirebin sketch
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// This example is a simple demonstration of how to use regl. | |
// The default method exposed by the module wraps a canvas element | |
var regl = require('regl')() | |
// This clears the color buffer to black and the depth buffer to 1 | |
regl.clear({ | |
color: [0, 0, 0, 1], | |
depth: 1 | |
}) | |
// In regl, draw operations are specified declaratively using. Each JSON | |
// command is a complete description of all state. This removes the need to | |
// .bind() things like buffers or shaders. All the boilerplate of setting up | |
// and tearing down state is automated. | |
regl({ | |
// In a draw call, we can pass the shader source code to regl | |
frag: [ | |
'precision mediump float;', | |
'uniform vec4 color;', | |
'void main() {', | |
' gl_FragColor = color;', | |
'}' | |
].join('\n'), | |
vert: [ | |
'precision mediump float;', | |
'attribute vec2 position;', | |
'void main() {', | |
' gl_Position = vec4(position, 0, 1);', | |
'}' | |
].join('\n'), | |
attributes: { | |
position: regl.buffer([ | |
-1, 0, | |
0, -1, | |
1, 1]) | |
}, | |
uniforms: { | |
color: [1, 0, 0, 1] | |
}, | |
count: 3 | |
})() | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
setTimeout(function(){require=function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}({1:[function(require,module,exports){var glTypes=require("./constants/dtypes.json");var GL_FLOAT=5126;function AttributeRecord(){this.pointer=false;this.x=0;this.y=0;this.z=0;this.w=0;this.buffer=null;this.size=0;this.normalized=false;this.type=GL_FLOAT;this.offset=0;this.stride=0;this.divisor=0}Object.assign(AttributeRecord.prototype,{equals:function(other,size){if(this.pointer){return other.pointer&&this.x===other.x&&this.y===other.y&&this.z===other.z&&this.w===other.w}else{return!other.pointer&&this.buffer===other.buffer&&this.size===size&&this.normalized===other.normalized&&this.type===other.type&&this.offset===other.offset&&this.stride===other.stride&&this.divisor===other.divisor}},set:function(other,size){var pointer=this.pointer=other.pointer;if(pointer){this.buffer=other.buffer;this.size=size;this.normalized=other.normalized;this.type=other.type;this.offset=other.offset;this.stride=other.stride;this.divisor=other.divisor}else{this.x=other.x;this.y=other.y;this.z=other.z;this.w=other.w}}});module.exports=function wrapAttributeState(gl,extensionState,bufferState){var extensions=extensionState.extensions;var attributeState={};var NUM_ATTRIBUTES=gl.getParameter(gl.MAX_VERTEX_ATTRIBS);var attributeBindings=new Array(NUM_ATTRIBUTES);for(var i=0;i<NUM_ATTRIBUTES;++i){attributeBindings[i]=new AttributeRecord}function AttributeStack(){var records=new Array(16);for(var i=0;i<16;++i){records[i]=new AttributeRecord}this.records=records;this.top=0}function pushAttributeStack(stack){var records=stack.records;var top=stack.top;while(records.length-1<=top){records.push(new AttributeRecord)}return records[++stack.top]}Object.assign(AttributeStack.prototype,{pushVec:function(x,y,z,w){var head=pushAttributeStack(this);head.pointer=false;head.x=x;head.y=y;head.z=z;head.w=w},pushPtr:function(buffer,size,offset,stride,divisor,normalized,type){var head=pushAttributeStack(this);head.pointer=true;head.buffer=buffer;head.size=size;head.offset=offset;head.stride=stride;head.divisor=divisor;head.normalized=normalized;head.type=type},pushDyn:function(data){if(typeof data==="number"){this.pushVec(data,0,0,0)}else if(Array.isArray(data)){this.pushVec(data[0],data[1],data[2],data[3])}else{var buffer=bufferState.getBuffer(data);var size=0;var stride=0;var offset=0;var divisor=0;var normalized=false;var type=GL_FLOAT;if(!buffer){buffer=bufferState.getBuffer(data.buffer);size=data.size||0;stride=data.stride||0;offset=data.offset||0;divisor=data.divisor||0;normalized=data.normalized||false;type=buffer.dtype;if("type"in data){type=glTypes[data.type]}}else{type=buffer.dtype}this.pushPtr(buffer,size,offset,stride,divisor,normalized,type)}},pop:function(){this.top-=1}});function bindAttribute(index,current,next,size){size=next.size||size;if(current.equals(next,size)){return}if(!next.pointer){if(current.pointer){gl.disableVertexAttribArray(index)}gl.vertexAttrib4f(index,next.x,next.y,next.z,next.w)}else{if(!current.pointer){gl.enableVertexAttribArray(index)}if(current.buffer!==next.buffer){next.buffer.bind()}gl.vertexAttribPointer(index,size,next.type,next.normalized,next.stride,next.offset);var extInstancing=extensions.angle_instanced_arrays;if(extInstancing){extInstancing.vertexAttribDivisorANGLE(index,next.divisor)}}current.set(next,size)}function defAttribute(name){if(name in attributeState){return}attributeState[name]=new AttributeStack}return{bindings:attributeBindings,attributes:attributeState,bind:bindAttribute,def:defAttribute}}},{"./constants/dtypes.json":11}],2:[function(require,module,exports){var check=require("./check");var isTypedArray=require("./is-typed-array");var usageTypes=require("./constants/usage.json");var arrayTypes=require("./constants/arraytypes.json");var GL_UNSIGNED_BYTE=5121;var GL_STATIC_DRAW=35044;var GL_FLOAT=5126;function flatten(data,dimension){var result=new Float32Array(data.length*dimension);var ptr=0;for(var i=0;i<data.length;++i){var v=data[i];for(var j=0;j<dimension;++j){result[ptr++]=v[j]}}return result}module.exports=function wrapBufferState(gl){var bufferCount=0;var bufferSet={};function REGLBuffer(buffer,type){this.id=bufferCount++;this.buffer=buffer;this.type=type;this.usage=GL_STATIC_DRAW;this.byteLength=0;this.dimension=1;this.data=null;this.dtype=GL_UNSIGNED_BYTE}Object.assign(REGLBuffer.prototype,{bind:function(){gl.bindBuffer(this.type,this.buffer)},update:function(options){if(Array.isArray(options)||isTypedArray(options)){options={data:options}}else if(typeof options==="number"){options={length:options|0}}else if(options===null||options===void 0){options={}}check.type(options,"object","buffer arguments must be an object, a number or an array");if("usage"in options){var usage=options.usage;check.parameter(usage,usageTypes,"buffer usage");this.usage=usageTypes[options.usage]}var dimension=options.dimension|0||1;if("data"in options){var data=options.data;if(data===null){this.byteLength=options.length|0;this.dtype=GL_UNSIGNED_BYTE}else{if(Array.isArray(data)){if(data.length>0&&Array.isArray(data[0])){dimension=data[0].length;data=flatten(data,dimension);this.dtype=GL_FLOAT}else{data=new Float32Array(data);this.dtype=GL_FLOAT}}else{check.isTypedArray(data,"invalid data type buffer data");this.dtype=arrayTypes[Object.prototype.toString.call(data)]}this.dimension=dimension;this.byteLength=data.byteLength}this.data=data}else if("length"in options){var byteLength=options.length;check.nni(byteLength,"buffer length must be a nonnegative integer");this.data=null;this.byteLength=options.length|0;this.dtype=GL_UNSIGNED_BYTE}this.bind();gl.bufferData(this.type,this.data||this.byteLength,this.usage)},refresh:function(){if(!gl.isBuffer(this.buffer)){this.buffer=gl.createBuffer()}this.update({})},destroy:function(){check(this.buffer,"buffer must not be deleted already");gl.deleteBuffer(this.buffer);this.buffer=null;delete bufferSet[this.id]}});function createBuffer(options,type){options=options||{};var handle=gl.createBuffer();var buffer=new REGLBuffer(handle,type);buffer.update(options);bufferSet[buffer.id]=buffer;function updateBuffer(options){buffer.update(options||{});return updateBuffer}updateBuffer._reglType="buffer";updateBuffer._buffer=buffer;updateBuffer.destroy=function(){buffer.destroy()};return updateBuffer}return{create:createBuffer,clear:function(){Object.keys(bufferSet).forEach(function(bufferId){bufferSet[bufferId].destroy()})},refresh:function(){Object.keys(bufferSet).forEach(function(bufferId){bufferSet[bufferId].refresh()})},getBuffer:function(wrapper){if(wrapper&&wrapper._buffer instanceof REGLBuffer){return wrapper._buffer}return null}}}},{"./check":3,"./constants/arraytypes.json":7,"./constants/usage.json":14,"./is-typed-array":21}],3:[function(require,module,exports){var isTypedArray=require("./is-typed-array");function raise(message){console.error(message);throw new Error(message)}function check(pred,message){if(!pred){raise(message)}}function encolon(message){if(message){return": "+message}return""}function checkParameter(param,possibilities,message){check(param in possibilities,"unknown parameter ("+param+")"+encolon(message)+". possible values: "+Object.keys(possibilities).join())}function checkIsTypedArray(data,message){check(isTypedArray(data),"invalid parameter type"+encolon(message)+". must be a typed array")}function checkTypeOf(value,type,message){check(typeof value===type,"invalid parameter type"+encolon(message)+". expected "+type+", got "+typeof value)}function checkNonNegativeInt(value,message){check(value>=0&&(value|0)===value,"invalid parameter type, ("+value+")"+encolon(message)+". must be a nonnegative integer")}function checkOneOf(value,list,message){check(list.indexOf(value)>=0,"invalid value"+encolon(message)+". must be one of: "+list)}module.exports=Object.assign(check,{raise:raise,parameter:checkParameter,type:checkTypeOf,isTypedArray:checkIsTypedArray,nni:checkNonNegativeInt,oneOf:checkOneOf})},{"./is-typed-array":21}],4:[function(require,module,exports){module.exports=typeof performance!=="undefined"&&performance.now?function(){return performance.now()}:function(){return+new Date}},{}],5:[function(require,module,exports){function slice(x){return Array.prototype.slice.call(x)}module.exports=function createEnvironment(){var varCounter=0;var linkedNames=[];var linkedValues=[];function link(value){var name="g"+varCounter++;linkedNames.push(name);linkedValues.push(value);return name}function block(){var code=[];function push(){code.push.apply(code,slice(arguments))}var vars=[];function def(){var name="v"+varCounter++;vars.push(name);if(arguments.length>0){code.push(name,"=");code.push.apply(code,slice(arguments));code.push(";")}return name}return Object.assign(push,{def:def,toString:function(){return[vars.length>0?"var "+vars+";":"",code.join("")].join("")}})}var procedures={};function proc(name){var args=[];function arg(){var name="a"+varCounter++;args.push(name);return name}var body=block();var bodyToString=body.toString;var result=procedures[name]=Object.assign(body,{arg:arg,toString:function(){return["function(",args.join(),"){",bodyToString(),"}"].join("")}});return result}function compile(){var code=['"use strict";return {'];Object.keys(procedures).forEach(function(name){code.push('"',name,'":',procedures[name].toString(),",")});code.push("}");var proc=Function.apply(null,linkedNames.concat([code.join("")]));return proc.apply(null,linkedValues)}return{link:link,block:block,proc:proc,compile:compile}}},{}],6:[function(require,module,exports){var check=require("./check");var createEnvironment=require("./codegen");var primTypes=require("./constants/primitives.json");var glTypes=require("./constants/dtypes.json");var compareFuncs=require("./constants/comparefuncs.json");var blendFuncs=require("./constants/blendFuncs.json");var blendEquations=require("./constants/blendEquations.json");var stencilOps=require("./constants/stencil-ops.json");var GL_ELEMENT_ARRAY_BUFFER=34963;var GL_FLOAT=5126;var GL_FLOAT_VEC2=35664;var GL_FLOAT_VEC3=35665;var GL_FLOAT_VEC4=35666;var GL_INT=5124;var GL_INT_VEC2=35667;var GL_INT_VEC3=35668;var GL_INT_VEC4=35669;var GL_BOOL=35670;var GL_BOOL_VEC2=35671;var GL_BOOL_VEC3=35672;var GL_BOOL_VEC4=35673;var GL_FLOAT_MAT2=35674;var GL_FLOAT_MAT3=35675;var GL_FLOAT_MAT4=35676;var GL_TRIANGLES=4;var GL_CULL_FACE=2884;var GL_BLEND=3042;var GL_DITHER=3024;var GL_STENCIL_TEST=2960;var GL_DEPTH_TEST=2929;var GL_SCISSOR_TEST=3089;var GL_POLYGON_OFFSET_FILL=32823;var GL_SAMPLE_ALPHA_TO_COVERAGE=32926;var GL_SAMPLE_COVERAGE=32928;var GL_FRONT=1028;var GL_BACK=1029;var GL_CW=2304;var GL_CCW=2305;function typeLength(x){switch(x){case GL_FLOAT_VEC2:case GL_INT_VEC2:case GL_BOOL_VEC2:return 2;case GL_FLOAT_VEC3:case GL_INT_VEC3:case GL_BOOL_VEC3:return 3;case GL_FLOAT_VEC4:case GL_INT_VEC4:case GL_BOOL_VEC4:return 4;default:return 1}}function setUniformString(gl,type,location,value){var infix;var separator=",";switch(type){case GL_FLOAT:infix="1f";break;case GL_FLOAT_VEC2:infix="2fv";break;case GL_FLOAT_VEC3:infix="3fv";break;case GL_FLOAT_VEC4:infix="4fv";break;case GL_BOOL:case GL_INT:infix="1i";break;case GL_BOOL_VEC2:case GL_INT_VEC2:infix="2iv";break;case GL_BOOL_VEC3:case GL_INT_VEC3:infix="3iv";break;case GL_BOOL_VEC4:case GL_INT_VEC4:infix="4iv";break;case GL_FLOAT_MAT2:infix="Matrix2fv";separator=",false,";break;case GL_FLOAT_MAT3:infix="Matrix3fv";separator=",false,";break;case GL_FLOAT_MAT4:infix="Matrix4fv";separator=",false,";break;default:check.raise("unsupported uniform type")}return gl+".uniform"+infix+"("+location+separator+value+");"}function stackTop(x){return x+"["+x+".length-1]"}module.exports=function reglCompiler(gl,extensionState,bufferState,elementState,textureState,fboState,glState,uniformState,attributeState,shaderState,drawState,frameState){var extensions=extensionState.extensions;var contextState=glState.contextState;var drawCallCounter=0;function compileShaderDraw(program){var env=createEnvironment();var link=env.link;var draw=env.proc("draw");var def=draw.def;var GL=link(gl);var PROGRAM=link(program.program);var BIND_ATTRIBUTE=link(attributeState.bind);var DRAW_STATE={count:link(drawState.count),offset:link(drawState.offset),instances:link(drawState.instances),primitive:link(drawState.primitive)};var ELEMENT_STATE=link(elementState.elements);draw(GL,".useProgram(",PROGRAM,");");program.attributes.forEach(function(attribute){var STACK=link(attributeState.attributes[attribute.name]);draw(BIND_ATTRIBUTE,"(",attribute.location,",",link(attributeState.bindings[attribute.location]),",",STACK,".records[",STACK,".top]",",",typeLength(attribute.info.type),");")});program.uniforms.forEach(function(uniform){var LOCATION=link(uniform.location);var STACK=link(uniformState.uniforms[uniform.name]);var TOP=STACK+"["+STACK+".length-1]";draw(setUniformString(GL,uniform.info.type,LOCATION,TOP))});var CUR_PRIMITIVE=def(stackTop(DRAW_STATE.primitive));var CUR_COUNT=def(stackTop(DRAW_STATE.count));var CUR_OFFSET=def(stackTop(DRAW_STATE.offset));var CUR_ELEMENTS=def(stackTop(ELEMENT_STATE));draw("if(",CUR_COUNT,"){");var instancing=extensions.angle_instanced_arrays;if(instancing){var CUR_INSTANCES=def(stackTop(DRAW_STATE.instances));var INSTANCE_EXT=link(instancing);draw("if(",CUR_ELEMENTS,"){",CUR_ELEMENTS,".bind();","if(",CUR_INSTANCES,">0){",INSTANCE_EXT,".drawElementsInstancedANGLE(",CUR_PRIMITIVE,",",CUR_COUNT,",",CUR_ELEMENTS,".type,",CUR_OFFSET,",",CUR_INSTANCES,");}else{",GL,".drawElements(",CUR_PRIMITIVE,",",CUR_COUNT,",",CUR_ELEMENTS,".type,",CUR_OFFSET,");}","}else if(",CUR_INSTANCES,">0){",INSTANCE_EXT,".drawArraysInstancedANGLE(",CUR_PRIMITIVE,",",CUR_OFFSET,",",CUR_COUNT,",",CUR_INSTANCES,");}else{",GL,".drawArrays(",CUR_PRIMITIVE,",",CUR_OFFSET,",",CUR_COUNT,");}}")}else{draw("if(",CUR_ELEMENTS,"){",GL,".drawElements(",CUR_PRIMITIVE,",",CUR_COUNT,",",CUR_ELEMENTS,".type,",CUR_OFFSET,");}","}else{",GL,".drawArrays(",CUR_PRIMITIVE,",",CUR_OFFSET,",",CUR_COUNT,");}")}return env.compile().draw}function compileBatch(program,options,uniforms,attributes,staticOptions){var env=createEnvironment();var link=env.link;var batch=env.proc("batch");var exit=env.block();var def=batch.def;var arg=batch.arg;var GL=link(gl);var PROGRAM=link(program.program);var BIND_ATTRIBUTE=link(attributeState.bind);var FRAME_STATE=link(frameState);var DRAW_STATE={count:link(drawState.count),offset:link(drawState.offset),instances:link(drawState.instances),primitive:link(drawState.primitive)};var ELEMENTS=link(elementState.elements);var CUR_COUNT=def(stackTop(DRAW_STATE.count));var CUR_OFFSET=def(stackTop(DRAW_STATE.offset));var CUR_PRIMITIVE=def(stackTop(DRAW_STATE.primitive));var CUR_ELEMENTS=def(stackTop(ELEMENTS));var CUR_INSTANCES;var INSTANCE_EXT;var instancing=extensions.angle_instanced_arrays;if(instancing){CUR_INSTANCES=def(stackTop(DRAW_STATE.instances));INSTANCE_EXT=link(instancing)}var hasDynamicElements="elements"in options;var NUM_ARGS=arg();var ARGS=arg();var ARG=def();var BATCH_ID=def();var dynamicVars={};function dyn(x){var id=x.id;var result=dynamicVars[id];if(result){return result}if(x.func){result=batch.def(link(x.data),"(",ARG,",",BATCH_ID,",",FRAME_STATE,")")}else{result=batch.def(ARG,".",x.data)}dynamicVars[id]=result;return result}function findInfo(list,name){return list.find(function(item){return item.name===name})}batch(GL,".useProgram(",PROGRAM,");");program.uniforms.forEach(function(uniform){if(uniform.name in uniforms){return}var LOCATION=link(uniform.location);var STACK=link(uniformState.uniforms[uniform.name]);var TOP=STACK+"["+STACK+".length-1]";batch(setUniformString(GL,uniform.info.type,LOCATION,TOP))});program.attributes.forEach(function(attribute){if(attributes.name in attributes){return}var STACK=link(attributeState.attributes[attribute.name]);batch(BIND_ATTRIBUTE,"(",attribute.location,",",link(attributeState.bindings[attribute.location]),",",STACK,".records[",STACK,".top]",",",typeLength(attribute.info.type),");")});if(!hasDynamicElements){batch("if(",CUR_ELEMENTS,"){",GL,".bindBuffer(",GL_ELEMENT_ARRAY_BUFFER,",",CUR_ELEMENTS,".buffer._buffer.buffer);","}else{",GL,".bindBuffer(",GL_ELEMENT_ARRAY_BUFFER,",null);","}")}batch("for(",BATCH_ID,"=0;",BATCH_ID,"<",NUM_ARGS,";++",BATCH_ID,"){",ARG,"=",ARGS,"[",BATCH_ID,"];");Object.keys(options).forEach(function(option){var VALUE=dyn(options[option]);function setCap(flag){batch("if(",VALUE,"){",GL,".enable(",flag,");}else{",GL,".disable(",flag,");}")}switch(option){case"cull.enable":setCap(GL_CULL_FACE);break;case"blend.enable":setCap(GL_BLEND);break;case"dither":setCap(GL_DITHER);break;case"stencil.enable":setCap(GL_STENCIL_TEST);break;case"depth.enable":setCap(GL_DEPTH_TEST);break;case"scissor.enable":setCap(GL_SCISSOR_TEST);break;case"polygonOffset.enable":setCap(GL_POLYGON_OFFSET_FILL);break;case"sample.alpha":setCap(GL_SAMPLE_ALPHA_TO_COVERAGE);break;case"sample.enable":setCap(GL_SAMPLE_COVERAGE);break;case"depth.mask":batch(GL,".depthMask(",VALUE,");");break;case"depth.func":var DEPTH_FUNCS=link(compareFuncs);batch(GL,".depthFunc(",DEPTH_FUNCS,"[",VALUE,"]);");break;case"depth.range":batch(GL,".depthRange(",VALUE,"[0],",VALUE,"[1]);");break;case"blend.color":batch(GL,".blendColor(",VALUE,"[0],",VALUE,"[1],",VALUE,"[2],",VALUE,"[3]);");break;case"blend.equation":var BLEND_EQUATIONS=link(blendEquations);batch("if(typeof ",VALUE,'==="string"){',GL,".blendEquation(",BLEND_EQUATIONS,"[",VALUE,"]);","}else{",GL,".blendEquationSeparate(",BLEND_EQUATIONS,"[",VALUE,".rgb],",BLEND_EQUATIONS,"[",VALUE,".alpha]);","}");break;case"blend.func":var BLEND_FUNCS=link(blendFuncs);batch(GL,".blendFuncSeparate(",BLEND_FUNCS,'["srcRGB" in ',VALUE,"?",VALUE,".srcRGB:",VALUE,".src],",BLEND_FUNCS,'["dstRGB" in ',VALUE,"?",VALUE,".dstRGB:",VALUE,".dst],",BLEND_FUNCS,'["srcAlpha" in ',VALUE,"?",VALUE,".srcAlpha:",VALUE,".src],",BLEND_FUNCS,'["dstAlpha" in ',VALUE,"?",VALUE,".dstAlpha:",VALUE,".dst]);");break;case"stencil.mask":batch(GL,".stencilMask(",VALUE,");");break;case"stencil.func":var STENCIL_FUNCS=link(compareFuncs);batch(GL,".stencilFunc(",STENCIL_FUNCS,"[",VALUE,'.cmp||"always"],',VALUE,".ref|0,",'"mask" in ',VALUE,"?",VALUE,".mask:-1);");break;case"stencil.opFront":case"stencil.opBack":var STENCIL_OPS=link(stencilOps);batch(GL,".stencilOpSeparate(",option==="stencil.opFront"?GL_FRONT:GL_BACK,",",STENCIL_OPS,"[",VALUE,'.fail||"keep"],',STENCIL_OPS,"[",VALUE,'.zfail||"keep"],',STENCIL_OPS,"[",VALUE,'.pass||"keep"]);');break;case"polygonOffset.offset":batch(GL,".polygonOffset(",VALUE,".factor||0,",VALUE,".units||0);");break;case"cull.face":batch(GL,".cullFace(",VALUE,'==="front"?',GL_FRONT,":",GL_BACK,");");break;case"lineWidth":batch(GL,".lineWidth(",VALUE,");");break;case"frontFace":batch(GL,".frontFace(",VALUE,'==="cw"?',GL_CW,":",GL_CCW,");");break;case"colorMask":batch(GL,".colorMask(",VALUE,"[0],",VALUE,"[1],",VALUE,"[2],",VALUE,"[3]);");break;case"sample.coverage":batch(GL,".sampleCoverage(",VALUE,".value,",VALUE,".invert);");break;case"scissor.box":var SCISSOR_X=batch.def(VALUE+".x||0");var SCISSOR_Y=batch.def(VALUE+".y||0");batch(GL,".scissor(",SCISSOR_X,",",SCISSOR_Y,",",'"w" in ',VALUE,"?",VALUE,".w:",GL,".drawingBufferWidth-",SCISSOR_X,",",'"h" in ',VALUE,"?",VALUE,".h:",GL,".drawingBufferHeight-",SCISSOR_Y,");");break;case"viewport":var VIEWPORT_X=batch.def(VALUE+".x||0");var VIEWPORT_Y=batch.def(VALUE+".y||0");batch(GL,".viewport(",VIEWPORT_X,",",VIEWPORT_Y,",",'"w" in ',VALUE,"?",VALUE,".w:",GL,".drawingBufferWidth-",VIEWPORT_X,",",'"h" in ',VALUE,"?",VALUE,".h:",GL,".drawingBufferHeight-",VIEWPORT_Y,");");break;case"primitives":case"offset":case"count":case"elements":break;default:check.raise("unsupported option for batch",option)}});var programUniforms=program.uniforms;Object.keys(uniforms).forEach(function(uniform){var data=findInfo(programUniforms,uniform);if(!data){return}var TYPE=data.info.type;var LOCATION=link(data.location);var VALUE=dyn(uniforms[uniform]);batch(setUniformString(GL,TYPE,LOCATION,VALUE))});var programAttributes=program.attributes;Object.keys(attributes).forEach(function(attribute){var data=findInfo(programAttributes,attribute);if(!data){return}batch(BIND_ATTRIBUTE,"(",data.location,",",link(attribute.bindings[data.location]),",",dyn(attributes[attribute]),",",typeLength(data.info.type),");")});if(options.count){batch(CUR_COUNT,"=",dyn(options.count),";")}else if(!useElementOption("count")){batch("if(",CUR_COUNT,"){")}if(options.offset){batch(CUR_OFFSET,"=",dyn(options.offset),";")}if(options.primitive){var PRIM_TYPES=link(primTypes);batch(CUR_PRIMITIVE,"=",PRIM_TYPES,"[",dyn(options.primitive),"];")}function useElementOption(x){return hasDynamicElements&&!(x in options||x in staticOptions)}if(hasDynamicElements){var dynElements=dyn(options.elements);batch(CUR_ELEMENTS,"=",dynElements,"?",dynElements,"._elements:null;")}if(useElementOption("offset")){batch(CUR_OFFSET,"=0;")}batch("if(",CUR_ELEMENTS,"){");if(useElementOption("count")){batch(CUR_COUNT,"=",CUR_ELEMENTS,".vertCount;","if(",CUR_COUNT,">0){")}if(useElementOption("primitive")){batch(CUR_PRIMITIVE,"=",CUR_ELEMENTS,".primType;")}if(hasDynamicElements){batch(GL,".bindBuffer(",GL_ELEMENT_ARRAY_BUFFER,",",CUR_ELEMENTS,".buffer._buffer.buffer);")}if(instancing){if(options.instances){batch(CUR_INSTANCES,"=",dyn(options.instances),";")}batch("if(",CUR_INSTANCES,">0){",INSTANCE_EXT,".drawElementsInstancedANGLE(",CUR_PRIMITIVE,",",CUR_COUNT,",",CUR_ELEMENTS,".type,",CUR_OFFSET,",",CUR_INSTANCES,");}else{")}batch(GL,".drawElements(",CUR_PRIMITIVE,",",CUR_COUNT,",",CUR_ELEMENTS,".type,",CUR_OFFSET,");");if(instancing){batch("}")}if(useElementOption("count")){batch("}")}batch("}else{");if(!useElementOption("count")){if(useElementOption("primitive")){batch(CUR_PRIMITIVE,"=",GL_TRIANGLES,";")}if(instancing){batch("if(",CUR_INSTANCES,">0){",INSTANCE_EXT,".drawArraysInstancedANGLE(",CUR_PRIMITIVE,",",CUR_OFFSET,",",CUR_COUNT,",",CUR_INSTANCES,");}else{")}batch(GL,".drawArrays(",CUR_PRIMITIVE,",",CUR_OFFSET,",",CUR_COUNT,");}");if(instancing){batch("}")}}batch("}}",exit);return env.compile().batch}function compileCommand(staticOptions,staticUniforms,staticAttributes,dynamicOptions,dynamicUniforms,dynamicAttributes,hasDynamic){var env=createEnvironment();var link=env.link;var block=env.block;var proc=env.proc;var callId=drawCallCounter++;var GL_POLL=link(glState.poll);var FRAG_SHADER_STATE=link(shaderState.fragShaders);var VERT_SHADER_STATE=link(shaderState.vertShaders);var PROGRAM_STATE=link(shaderState.programs);var DRAW_STATE={count:link(drawState.count),offset:link(drawState.offset),instances:link(drawState.instances),primitive:link(drawState.primitive)};var ELEMENT_STATE=link(elementState.elements);var PRIM_TYPES=link(primTypes);var COMPARE_FUNCS=link(compareFuncs);var STENCIL_OPS=link(stencilOps);var CONTEXT_STATE={};function linkContext(x){var result=CONTEXT_STATE[x];if(result){return result}result=CONTEXT_STATE[x]=link(contextState[x]);return result}var entry=block();var exit=block();function handleStaticOption(param,value){var STATE_STACK=linkContext(param);entry(STATE_STACK,".push(",value,");");exit(STATE_STACK,".pop();")}var hasShader=false;Object.keys(staticOptions).forEach(function(param){var value=staticOptions[param];switch(param){case"frag":hasShader=true;entry(FRAG_SHADER_STATE,".push(",link(value),");");exit(FRAG_SHADER_STATE,".pop();");break;case"vert":hasShader=true;entry(VERT_SHADER_STATE,".push(",link(value),");");exit(VERT_SHADER_STATE,".pop();");break;case"count":case"offset":case"instances":check.nni(value,param);entry(DRAW_STATE[param],".push(",value,");");exit(DRAW_STATE[param],".pop();");break;case"primitive":check.parameter(value,primTypes,"not a valid drawing primitive");var primType=primTypes[value];entry(DRAW_STATE.primitive,".push(",primType,");");exit(DRAW_STATE.primitive,".pop();");break;case"elements":var elements=elementState.getElements(value);var hasPrimitive=!("primitive"in staticOptions);var hasCount=!("count"in staticOptions);if(elements){var ELEMENTS=link(elements);entry(ELEMENT_STATE,".push(",ELEMENTS,");");if(hasPrimitive){entry(DRAW_STATE.primitive,".push(",ELEMENTS,".primType);")}if(hasCount){entry(DRAW_STATE.count,".push(",ELEMENTS,".vertCount);")}}else{entry(ELEMENT_STATE,".push(null);");if(hasPrimitive){entry(DRAW_STATE.primitive,".push(",GL_TRIANGLES,");")}if(hasCount){entry(DRAW_STATE.count,".push(0);")}}if(hasPrimitive){exit(DRAW_STATE.primitive,".pop();")}if(hasCount){exit(DRAW_STATE.count,".pop();")}if(!("offset"in staticOptions)){entry(DRAW_STATE.offset,".push(0);");exit(DRAW_STATE.offset,".pop();")}exit(ELEMENT_STATE,".pop();");break;case"cull.enable":case"blend.enable":case"dither":case"stencil.enable":case"depth.enable":case"scissor.enable":case"polygonOffset.enable":case"sample.alpha":case"sample.enable":case"depth.mask":check.type(value,"boolean",param);handleStaticOption(param,value);break;case"depth.func":check.parameter(value,compareFuncs,param);handleStaticOption(param,compareFuncs[value]);break;case"depth.range":check(Array.isArray(value)&&value.length===2&&value[0]<=value[1],"depth range is 2d array");var DEPTH_RANGE_STACK=linkContext(param);entry(DEPTH_RANGE_STACK,".push(",value[0],",",value[1],");");exit(DEPTH_RANGE_STACK,".pop();");break;case"blend.func":var BLEND_FUNC_STACK=linkContext(param);check.type(value,"object","blend func must be an object");var srcRGB="srcRGB"in value?value.srcRGB:value.src;var srcAlpha="srcAlpha"in value?value.srcAlpha:value.src;var dstRGB="dstRGB"in value?value.dstRGB:value.dst;var dstAlpha="dstAlpha"in value?value.dstAlpha:value.dst;check.parameter(srcRGB,blendFuncs);check.parameter(srcAlpha,blendFuncs);check.parameter(dstRGB,blendFuncs);check.parameter(dstAlpha,blendFuncs);entry(BLEND_FUNC_STACK,".push(",blendFuncs[srcRGB],",",blendFuncs[dstRGB],",",blendFuncs[srcAlpha],",",blendFuncs[dstAlpha],");");exit(BLEND_FUNC_STACK,".pop();");break;case"blend.equation":var BLEND_EQUATION_STACK=linkContext(param);if(typeof value==="string"){check.parameter(value,blendEquations,"invalid blend equation");entry(BLEND_EQUATION_STACK,".push(",blendEquations[value],",",blendEquations[value],");")}else if(typeof value==="object"){check.parameter(value.rgb,blendEquations,"invalid blend equation rgb");check.parameter(value.alpha,blendEquations,"invalid blend equation alpha");entry(BLEND_EQUATION_STACK,".push(",blendEquations[value.rgb],",",blendEquations[value.alpha],");")}else{check.raise("invalid blend equation")}exit(BLEND_EQUATION_STACK,".pop();");break;case"blend.color":check(Array.isArray(value)&&value.length===4,"blend color is a 4d array");var BLEND_COLOR_STACK=linkContext(param);entry(BLEND_COLOR_STACK,".push(",value[0],",",value[1],",",value[2],",",value[3],");");exit(BLEND_COLOR_STACK,".pop();");break;case"stencil.mask":check.type(value,"number","stencil mask must be an integer");var STENCIL_MASK_STACK=linkContext(param);entry(STENCIL_MASK_STACK,".push(",value,");");exit(STENCIL_MASK_STACK,".pop();");break;case"stencil.func":check.type(value,"object","stencil func must be an object");var cmp=value.cmp||"keep";var ref=value.ref||0;var mask="mask"in value?value.mask:-1;check.parameter(cmp,compareFuncs,"invalid stencil func cmp");check.type(ref,"number","stencil func ref");check.type(mask,"number","stencil func mask");var STENCIL_FUNC_STACK=linkContext(param);entry(STENCIL_FUNC_STACK,".push(",compareFuncs[cmp],",",ref,",",mask,");");exit(STENCIL_FUNC_STACK,".pop();");break;case"stencil.opFront":case"stencil.opBack":check.type(value,"object",param);var fail=value.fail||"keep";var zfail=value.zfail||"keep";var pass=value.pass||"keep";check.parameter(fail,stencilOps,param);check.parameter(zfail,stencilOps,param);check.parameter(pass,stencilOps,param);var STENCIL_OP_STACK=linkContext(param);entry(STENCIL_OP_STACK,".push(",stencilOps[fail],",",stencilOps[zfail],",",stencilOps[pass],");");exit(STENCIL_OP_STACK,".pop();");break;case"polygonOffset.offset":check.type(value,"object",param);var factor=value.factor||0;var units=value.units||0;check.type(factor,"number","offset.factor");check.type(units,"number","offset.units");var POLYGON_OFFSET_STACK=linkContext(param);entry(POLYGON_OFFSET_STACK,".push(",factor,",",units,");");exit(POLYGON_OFFSET_STACK,".pop();");break;case"cull.face":var face=0;if(value==="front"){face=GL_FRONT}else if(value==="back"){face=GL_BACK}check(!!face,"cull.face");var CULL_FACE_STACK=linkContext(param);entry(CULL_FACE_STACK,".push(",face,");");exit(CULL_FACE_STACK,".pop();");break;case"lineWidth":check(value>0&&typeof value==="number",param);handleStaticOption(param,value);break;case"frontFace":var orientation=0;if(value==="cw"){orientation=GL_CW}else if(value==="ccw"){orientation=GL_CCW}check(!!orientation,"frontFace");var FRONT_FACE_STACK=linkContext(param);entry(FRONT_FACE_STACK,".push(",orientation,");");exit(FRONT_FACE_STACK,".pop();");break;case"colorMask":check(Array.isArray(value)&&value.length===4,"color mask must be length 4 array");var COLOR_MASK_STACK=linkContext(param);entry(COLOR_MASK_STACK,".push(",value.map(function(v){return!!v}).join(),");");exit(COLOR_MASK_STACK,".pop();");break;case"sample.coverage":check.type(value,"object",param);var sampleValue="value"in value?value.value:1;var sampleInvert=!!value.invert;check(typeof sampleValue==="number"&&sampleValue>=0&&sampleValue<=1,"sample value");var SAMPLE_COVERAGE_STACK=linkContext(param);entry(SAMPLE_COVERAGE_STACK,".push(",sampleValue,",",sampleInvert,");");exit(SAMPLE_COVERAGE_STACK,".pop();");break;case"viewport":case"scissor.box":check(typeof value==="object"&&value,param+" is an object");var X=value.x||0;var Y=value.y||0;var W=-1;var H=-1;check(typeof X==="number"&&X>=0,param+".x must be a positive int");check(typeof Y==="number"&&Y>=0,param+".y must be a positive int");if("w"in value){W=value.w;check(typeof W==="number"&&W>=0,param+".w must be a positive int")}if("h"in value){H=value.h;check(typeof H==="number"&&H>=0,param+".h must be a positive int")}var BOX_STACK=linkContext(param);entry(BOX_STACK,".push(",X,",",Y,",",W,",",H,");");exit(BOX_STACK,".pop();");break;default:check.raise("unsupported parameter "+param);break}});if(hasShader){if(staticOptions.frag&&staticOptions.vert){var fragSrc=staticOptions.frag;var vertSrc=staticOptions.vert;entry(PROGRAM_STATE,".push(",link(shaderState.create(vertSrc,fragSrc)),");")}else{var FRAG_SRC=entry.def(FRAG_SHADER_STATE,"[",FRAG_SHADER_STATE,".length-1]");var VERT_SRC=entry.def(VERT_SHADER_STATE,"[",VERT_SHADER_STATE,".length-1]");var LINK_PROG=link(shaderState.create);entry(PROGRAM_STATE,".push(",LINK_PROG,"(",FRAG_SRC,",",VERT_SRC,"));")}exit(PROGRAM_STATE,".pop();")}Object.keys(staticUniforms).forEach(function(uniform){uniformState.def(uniform);var STACK=link(uniformState.uniforms[uniform]);var VALUE;var value=staticUniforms[uniform];if(Array.isArray(value)){VALUE=link(value.slice())}else{VALUE=+value}entry(STACK,".push(",VALUE,");");exit(STACK,".pop();")});Object.keys(staticAttributes).forEach(function(attribute){attributeState.def(attribute);var ATTRIBUTE=link(attributeState.attributes[attribute]);var data=staticAttributes[attribute];if(typeof data==="number"){entry(ATTRIBUTE,".pushVec(",+data,",0,0,0);")}else{check(!!data,"invalid attribute: "+attribute);if(Array.isArray(data)){entry(ATTRIBUTE,".pushVec(",[data[0]||0,data[1]||0,data[2]||0,data[3]||0],");")}else{var buffer=bufferState.getBuffer(data);var size=0;var stride=0;var offset=0;var divisor=0;var normalized=false;var type=GL_FLOAT;if(!buffer){check.type(data,"object",'invalid attribute "'+attribute+'"');buffer=bufferState.getBuffer(data.buffer);size=data.size||0; | |
stride=data.stride||0;offset=data.offset||0;divisor=data.divisor||0;normalized=data.normalized||false;check(!!buffer,"invalid attribute "+attribute+".buffer");type=buffer.dtype;if("type"in data){check.parameter(data.type,glTypes,"attribute type");type=glTypes[data.type]}}else{type=buffer.dtype}check(!!buffer,"invalid attribute "+attribute+".buffer");check.nni(stride,attribute+".stride");check.nni(offset,attribute+".offset");check.nni(divisor,attribute+".divisor");check.type(normalized,"boolean",attribute+".normalized");check.oneOf(size,[0,1,2,3,4],attribute+".size");entry(ATTRIBUTE,".pushPtr(",[link(buffer),size,offset,stride,divisor,normalized,type].join(),");")}}exit(ATTRIBUTE,".pop();")});var dynamicEntry=env.block();var dynamicExit=env.block();var FRAMESTATE;var DYNARGS;if(hasDynamic){FRAMESTATE=link(frameState);DYNARGS=entry.def()}var dynamicVars={};function dyn(x){var id=x.id;var result=dynamicVars[id];if(result){return result}if(x.func){result=dynamicEntry.def(link(x.data),"(",DYNARGS,",0,",FRAMESTATE,")")}else{result=dynamicEntry.def(DYNARGS,".",x.data)}dynamicVars[id]=result;return result}Object.keys(dynamicOptions).forEach(function(param){var variable=dyn(dynamicOptions[param]);switch(param){case"cull.enable":case"blend.enable":case"dither":case"stencil.enable":case"depth.enable":case"scissor.enable":case"polygonOffset.enable":case"sample.alpha":case"sample.enable":case"lineWidth":case"depth.mask":var STATE_STACK=linkContext(param);dynamicEntry(STATE_STACK,".push(",variable,");");dynamicExit(STATE_STACK,".pop();");break;case"count":case"offset":case"instances":var DRAW_STACK=DRAW_STATE[param];dynamicEntry(DRAW_STACK,".push(",variable,");");dynamicExit(DRAW_STACK,".pop();");break;case"primitive":var PRIM_STACK=DRAW_STATE.primitive;dynamicEntry(PRIM_STACK,".push(",PRIM_TYPES,"[",variable,"]);");dynamicExit(PRIM_STACK,".pop();");break;case"depth.func":var DEPTH_FUNC_STACK=linkContext(param);dynamicEntry(DEPTH_FUNC_STACK,".push(",COMPARE_FUNCS,"[",variable,"]);");dynamicExit(DEPTH_FUNC_STACK,".pop();");break;case"blend.func":var BLEND_FUNC_STACK=linkContext(param);var BLEND_FUNCS=link(blendFuncs);dynamicEntry(BLEND_FUNC_STACK,".push(",BLEND_FUNCS,'["srcRGB" in ',variable,"?",variable,".srcRGB:",variable,".src],",BLEND_FUNCS,'["dstRGB" in ',variable,"?",variable,".dstRGB:",variable,".dst],",BLEND_FUNCS,'["srcAlpha" in ',variable,"?",variable,".srcAlpha:",variable,".src],",BLEND_FUNCS,'["dstAlpha" in ',variable,"?",variable,".dstAlpha:",variable,".dst]);");dynamicExit(BLEND_FUNC_STACK,".pop();");break;case"blend.equation":var BLEND_EQUATION_STACK=linkContext(param);var BLEND_EQUATIONS=link(blendEquations);dynamicEntry("if(typeof ",variable,'==="string"){',BLEND_EQUATION_STACK,".push(",BLEND_EQUATIONS,"[",variable,"],",BLEND_EQUATIONS,"[",variable,"]);","}else{",BLEND_EQUATION_STACK,".push(",BLEND_EQUATIONS,"[",variable,".rgb],",BLEND_EQUATIONS,"[",variable,".alpha]);","}");dynamicExit(BLEND_EQUATION_STACK,".pop();");break;case"blend.color":var BLEND_COLOR_STACK=linkContext(param);dynamicEntry(BLEND_COLOR_STACK,".push(",variable,"[0],",variable,"[1],",variable,"[2],",variable,"[3]);");dynamicExit(BLEND_COLOR_STACK,".pop();");break;case"stencil.mask":var STENCIL_MASK_STACK=linkContext(param);dynamicEntry(STENCIL_MASK_STACK,".push(",variable,");");dynamicExit(STENCIL_MASK_STACK,".pop();");break;case"stencil.func":var STENCIL_FUNC_STACK=linkContext(param);dynamicEntry(STENCIL_FUNC_STACK,".push(",COMPARE_FUNCS,"[",variable,".cmp],",variable,".ref|0,",'"mask" in ',variable,"?",variable,".mask:-1);");dynamicExit(STENCIL_FUNC_STACK,".pop();");break;case"stencil.opFront":case"stencil.opBack":var STENCIL_OP_STACK=linkContext(param);dynamicEntry(STENCIL_OP_STACK,".push(",STENCIL_OPS,"[",variable,'.fail||"keep"],',STENCIL_OPS,"[",variable,'.zfail||"keep"],',STENCIL_OPS,"[",variable,'.pass||"keep"]);');dynamicExit(STENCIL_OP_STACK,".pop();");break;case"polygonOffset.offset":var POLYGON_OFFSET_STACK=linkContext(param);dynamicEntry(POLYGON_OFFSET_STACK,".push(",variable,".factor||0,",variable,".units||0);");dynamicExit(POLYGON_OFFSET_STACK,".pop();");break;case"cull.face":var CULL_FACE_STACK=linkContext(param);dynamicEntry(CULL_FACE_STACK,".push(",variable,'==="front"?',GL_FRONT,":",GL_BACK,");");dynamicExit(CULL_FACE_STACK,".pop();");break;case"frontFace":var FRONT_FACE_STACK=linkContext(param);dynamicEntry(FRONT_FACE_STACK,".push(",variable,'==="cw"?',GL_CW,":",GL_CCW,");");dynamicExit(FRONT_FACE_STACK,".pop();");break;case"colorMask":var COLOR_MASK_STACK=linkContext(param);dynamicEntry(COLOR_MASK_STACK,".push(",variable,"[0],",variable,"[1],",variable,"[2],",variable,"[3]);");dynamicExit(COLOR_MASK_STACK,".pop();");break;case"sample.coverage":var SAMPLE_COVERAGE_STACK=linkContext(param);dynamicEntry(SAMPLE_COVERAGE_STACK,".push(",variable,".value,",variable,".invert);");dynamicExit(SAMPLE_COVERAGE_STACK,".pop();");break;case"scissor.box":case"viewport":var BOX_STACK=linkContext(param);dynamicEntry(BOX_STACK,".push(",variable,".x||0,",variable,".y||0,",'"w" in ',variable,"?",variable,".w:-1,",'"h" in ',variable,"?",variable,".h:-1);");dynamicExit(BOX_STACK,".pop();");break;case"elements":var hasPrimitive=!("primitive"in dynamicOptions)&&!("primitive"in staticOptions);var hasCount=!("count"in dynamicOptions)&&!("count"in staticOptions);var hasOffset=!("offset"in dynamicOptions)&&!("offset"in staticOptions);var ELEMENTS=dynamicEntry.def();dynamicEntry("if(",variable,"){",ELEMENTS,"=",variable,"._elements;",ELEMENT_STATE,".push(",ELEMENTS,");",!hasPrimitive?"":DRAW_STATE.primitive+".push("+ELEMENTS+".primType);",!hasCount?"":DRAW_STATE.count+".push("+ELEMENTS+".vertCount);",!hasOffset?"":DRAW_STATE.offset+".push("+ELEMENTS+".offset);","}else{",ELEMENT_STATE,".push(null);","}");dynamicExit(ELEMENT_STATE,".pop();","if(",variable,"){",hasPrimitive?DRAW_STATE.primitive+".pop();":"",hasCount?DRAW_STATE.count+".pop();":"",hasOffset?DRAW_STATE.offset+".pop();":"","}");break;default:check.raise("unsupported dynamic option: "+param)}});Object.keys(dynamicUniforms).forEach(function(uniform){uniformState.def(uniform);var STACK=link(uniformState.uniforms[uniform]);var VALUE=dyn(dynamicUniforms[uniform]);dynamicEntry(STACK,".push(",VALUE,");");dynamicExit(STACK,".pop();")});Object.keys(dynamicAttributes).forEach(function(attribute){attributeState.def(attribute);var ATTRIBUTE=link(attributeState.attributes[attribute]);var VALUE=dyn(dynamicAttributes[attribute]);dynamicEntry(ATTRIBUTE,".pushDyn(",VALUE,");");dynamicExit(ATTRIBUTE,".pop();")});var scope=proc("scope");var SCOPE_ARGS=scope.arg();var SCOPE_BODY=scope.arg();scope(entry);if(hasDynamic){scope(DYNARGS,"=",SCOPE_ARGS,";",dynamicEntry)}scope(SCOPE_BODY,"();",hasDynamic?dynamicExit:"",exit);var draw=proc("draw");draw(entry);if(hasDynamic){draw(DYNARGS,"=",draw.arg(),";",dynamicEntry)}var CURRENT_SHADER=stackTop(PROGRAM_STATE);draw(GL_POLL,"();","if(",CURRENT_SHADER,")",CURRENT_SHADER,".draw(",hasDynamic?DYNARGS:"",");",hasDynamic?dynamicExit:"",exit);var batch=proc("batch");batch(entry);var CUR_SHADER=batch.def(stackTop(PROGRAM_STATE));var EXEC_BATCH=link(function(program,count,args){var proc=program.batchCache[callId];if(!proc){proc=program.batchCache[callId]=compileBatch(program,dynamicOptions,dynamicUniforms,dynamicAttributes,staticOptions)}return proc(count,args)});batch("if(",CUR_SHADER,"){",GL_POLL,"();",EXEC_BATCH,"(",CUR_SHADER,",",batch.arg(),",",batch.arg(),");");Object.keys(dynamicOptions).forEach(function(option){var STATE=CONTEXT_STATE[option];if(STATE){batch(STATE,".setDirty();")}});batch("}",exit);return env.compile()}return{draw:compileShaderDraw,command:compileCommand}}},{"./check":3,"./codegen":5,"./constants/blendEquations.json":8,"./constants/blendFuncs.json":9,"./constants/comparefuncs.json":10,"./constants/dtypes.json":11,"./constants/primitives.json":12,"./constants/stencil-ops.json":13}],7:[function(require,module,exports){module.exports={"[object Int8Array]":5120,"[object Int16Array]":5122,"[object Int32Array]":5124,"[object Uint8Array]":5121,"[object Uint8ClampedArray]":5121,"[object Uint16Array]":5123,"[object Uint32Array]":5125,"[object Float32Array]":5126,"[object Float64Array]":5121,"[object ArrayBuffer]":5121}},{}],8:[function(require,module,exports){module.exports={add:32774,subtract:32778,"reverse subtract":32779}},{}],9:[function(require,module,exports){module.exports={0:0,1:1,zero:0,one:1,"src color":768,"one minus src color":769,"src alpha":770,"one minus src alpha":771,"dst color":774,"one minus dst color":775,"dst alpha":772,"one minus dst alpha":773,"constant color":32769,"one minus constant color":32770,"constant alpha":32771,"one minus constant alpha":32772,"src alpha saturate":776}},{}],10:[function(require,module,exports){module.exports={never:512,less:513,"<":513,equal:514,"=":514,"==":514,"===":514,lequal:515,"<=":515,greater:516,">":516,notequal:517,"!=":517,"!==":517,gequal:518,">=":518,always:519}},{}],11:[function(require,module,exports){module.exports={int8:5120,int16:5122,int32:5124,uint8:5121,uint16:5123,uint32:5125,"float":5126}},{}],12:[function(require,module,exports){module.exports={points:0,lines:1,"line loop":2,"line strip":3,triangles:4,"triangle strip":5,"triangle fan":6}},{}],13:[function(require,module,exports){module.exports={0:0,zero:0,keep:7680,replace:7681,increment:7682,decrement:7683,"increment wrap":34055,"decrement wrap":34056,invert:5386}},{}],14:[function(require,module,exports){module.exports={"static":35044,dynamic:35048,stream:35040}},{}],15:[function(require,module,exports){var check=require("./check");function createCanvas(element,options){var canvas=document.createElement("canvas");var args=getContext(canvas,options);Object.assign(canvas.style,{border:0,margin:0,padding:0,top:0,left:0});element.appendChild(canvas);if(element===document.body){canvas.style.position="absolute";Object.assign(element.style,{margin:0,padding:0})}var scale=+window.devicePixelRatio;function resize(){var w=window.innerWidth;var h=window.innerHeight;if(element!==document.body){var bounds=element.getBoundingClientRect();w=bounds.right-bounds.left;h=bounds.top-bounds.bottom}canvas.width=scale*w;canvas.height=scale*h;Object.assign(canvas.style,{width:w+"px",height:h+"px"})}window.addEventListener("resize",resize,false);var prevDestroy=args.options.onDestroy;args.options=Object.assign({},args.options,{onDestroy:function(){window.removeEventListener("resize",resize);element.removeChild(canvas);prevDestroy&&prevDestroy()}});resize();return args}function getContext(canvas,options){var glOptions=options.glOptions;function get(name){try{return canvas.getContext(name,glOptions)}catch(e){return null}}var gl=get("webgl")||get("experimental-webgl")||get("webgl-experimental");check(gl,"webgl not supported");return{gl:gl,options:options}}module.exports=function parseArgs(args){if(typeof document==="undefined"||typeof HTMLElement==="undefined"){return{gl:args[0],options:args[1]||{}}}var element=document.body;var options=args[1]||{};if(typeof args[0]==="string"){element=document.querySelector(args[0])||document.body}else if(typeof args[0]==="object"){if(args[0]instanceof HTMLElement){element=args[0]}else if(args[0]instanceof WebGLRenderingContext){return{gl:args[0],options:options}}else{options=args[0]}}if(element.nodeName&&element.nodeName.toUpperCase()==="CANVAS"){return getContext(element,options)}else{return createCanvas(element,options)}}},{"./check":3}],16:[function(require,module,exports){var GL_TRIANGLES=4;module.exports=function wrapDrawState(gl){var primitive=[GL_TRIANGLES];var count=[0];var offset=[0];var instances=[0];return{primitive:primitive,count:count,offset:offset,instances:instances}}},{}],17:[function(require,module,exports){var VARIABLE_COUNTER=0;function DynamicVariable(isFunc,data){this.id=VARIABLE_COUNTER++;this.func=isFunc;this.data=data}function defineDynamic(data,path){switch(typeof data){case"boolean":case"number":case"string":return new DynamicVariable(false,data);case"function":return new DynamicVariable(true,data);default:return defineDynamic}}function isDynamic(x){return typeof x==="function"&&!x._reglType||x instanceof DynamicVariable}function unbox(x,path){if(x instanceof DynamicVariable){return x}else if(typeof x==="function"&&x!==defineDynamic){return new DynamicVariable(true,x)}return new DynamicVariable(false,path)}module.exports={define:defineDynamic,isDynamic:isDynamic,unbox:unbox}},{}],18:[function(require,module,exports){var check=require("./check");var isTypedArray=require("./is-typed-array");var primTypes=require("./constants/primitives.json");var GL_POINTS=0;var GL_LINES=1;var GL_TRIANGLES=4;var GL_UNSIGNED_BYTE=5121;var GL_UNSIGNED_SHORT=5123;var GL_UNSIGNED_INT=5125;var GL_ELEMENT_ARRAY_BUFFER=34963;module.exports=function wrapElementsState(gl,extensionState,bufferState){var extensions=extensionState.extensions;var elements=[null];function REGLElementBuffer(){this.buffer=null;this.primType=GL_TRIANGLES;this.vertCount=0;this.type=0}function parseOptions(elements,options){var result={type:"elements"};var ext32bit=extensions.oes_element_index_uint;elements.primType=GL_TRIANGLES;elements.vertCount=0;elements.type=0;var data=null;if(!options){return result}if(typeof options==="number"){result.length=options}else{check.type(options,"object","argument to element buffer must be object");data=options.data||options}if(Array.isArray(data)){if(options.length===0){data=null}else if(Array.isArray(data[0])){var dim=data[0].length;if(dim===1)elements.primType=GL_POINTS;if(dim===2)elements.primType=GL_LINES;if(dim===3)elements.primType=GL_TRIANGLES;var i;var count=0;for(i=0;i<data.length;++i){count+=data[i].length}var flattened=ext32bit?new Uint32Array(count):new Uint16Array(count);var ptr=0;for(i=0;i<data.length;++i){var x=data[i];for(var j=0;j<x.length;++j){flattened[ptr++]=x[j]}}data=flattened}else if(ext32bit){data=new Uint32Array(data)}else{data=new Uint16Array(data)}}if(isTypedArray(data)){if(data instanceof Uint8Array||data instanceof Uint8ClampedArray){elements.type=GL_UNSIGNED_BYTE}else if(data instanceof Uint16Array){elements.type=GL_UNSIGNED_SHORT}else if(data instanceof Uint32Array){check(ext32bit,"32-bit element buffers not supported");elements.type=GL_UNSIGNED_INT}else{check.raise("invalid typed array for element buffer")}elements.vertCount=data.length;result.data=data}else{check(!data,"invalid element buffer data type")}if(typeof options==="object"){if("primitive"in options){var primitive=options.primitive;check.param(primitive,primTypes);elements.primType=primTypes[primitive]}if("usage"in options){result.usage=options.usage}if("count"in options){elements.vertCount=options.vertCount|0}}return result}Object.assign(REGLElementBuffer.prototype,{bind:function(){gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER,this.buffer._buffer.buffer)},destroy:function(){if(this.buffer){this.buffer.destroy();this.buffer=null}}});function createElements(options){var elements=new REGLElementBuffer;elements.buffer=bufferState.create(parseOptions(elements,options),GL_ELEMENT_ARRAY_BUFFER);function updateElements(options){elements.buffer(parseOptions(elements,options));return updateElements}updateElements._reglType="elements";updateElements._elements=elements;updateElements.destroy=function(){elements.destroy()};return updateElements}return{create:createElements,elements:elements,getElements:function(elements){if(elements&&elements._elements instanceof REGLElementBuffer){return elements._elements}return null}}}},{"./check":3,"./constants/primitives.json":12,"./is-typed-array":21}],19:[function(require,module,exports){var check=require("./check");module.exports=function createExtensionCache(gl,required){var extensions={};function refreshExtensions(){["oes_texture_float","oes_texture_float_linear","oes_texture_half_float","oes_texture_half_float_linear","oes_standard_derivatives","oes_element_index_uint","oes_fbo_render_mipmap","webgl_depth_texture","webgl_draw_buffers","webgl_color_buffer_float","ext_texture_filter_anisotropic","ext_frag_depth","ext_blend_minmax","ext_shader_texture_lod","ext_color_buffer_half_float","ext_srgb","angle_instanced_arrays"].forEach(function(ext){try{extensions[ext]=gl.getExtension(ext)}catch(e){}});required.forEach(function(ext){check(extensions[ext.toLowerCase()],'required extension "'+ext+'" is unsupported')})}refreshExtensions();return{extensions:extensions,refresh:refreshExtensions}}},{"./check":3}],20:[function(require,module,exports){module.exports=function wrapFBOState(gl,textureCache){function createFBO(options){}function clearCache(){}function refreshCache(){}return{create:createFBO,clear:clearCache,refresh:refreshCache,getFBO:function(wrapper){return null}}}},{}],21:[function(require,module,exports){var dtypes=require("./constants/arraytypes.json");module.exports=function(x){return Object.prototype.toString.call(x)in dtypes}},{"./constants/arraytypes.json":7}],22:[function(require,module,exports){if(typeof requestAnimationFrame==="function"&&typeof cancelAnimationFrame==="function"){module.exports={next:function(x){return requestAnimationFrame(x)},cancel:function(x){return cancelAnimationFrame(x)}}}else{module.exports={next:function(cb){setTimeout(cb,30)},cancel:clearTimeout}}},{}],23:[function(require,module,exports){var check=require("./check");var isTypedArray=require("./is-typed-array");var GL_RGBA=6408;var GL_UNSIGNED_BYTE=5121;var GL_PACK_ALIGNMENT=3333;module.exports=function wrapReadPixels(gl,glState){function readPixels(input){var options=input||{};if(isTypedArray(input)){options={data:options}}else if(arguments.length===2){options={width:arguments[0]|0,height:arguments[1]|0}}else if(typeof input!=="object"){options={}}glState.poll();var viewportState=glState.viewport;var x=options.x||0;var y=options.y||0;var width=options.width||viewportState.width;var height=options.height||viewportState.height;var size=width*height*4;var data=options.data||new Uint8Array(size);check.isTypedArray(data);check(data.byteLength>=size,"data buffer too small");gl.pixelStorei(GL_PACK_ALIGNMENT,4);gl.readPixels(x,y,width,height,GL_RGBA,GL_UNSIGNED_BYTE,data);return data}return readPixels}},{"./check":3,"./is-typed-array":21}],24:[function(require,module,exports){var check=require("./check");var DEFAULT_FRAG_SHADER="void main(){gl_FragColor=vec4(0,0,0,0);}";var DEFAULT_VERT_SHADER="void main(){gl_Position=vec4(0,0,0,0);}";var GL_FRAGMENT_SHADER=35632;var GL_VERTEX_SHADER=35633;function ActiveInfo(name,location,info){this.name=name;this.location=location;this.info=info}module.exports=function wrapShaderState(gl,extensions,attributeState,uniformState,compileShaderDraw){var shaders={};var fragShaders=[DEFAULT_FRAG_SHADER];var vertShaders=[DEFAULT_VERT_SHADER];function getShader(type,source){var cache=shaders[type];var shader=cache[source];if(!shader){shader=gl.createShader(type);gl.shaderSource(shader,source);gl.compileShader(shader);if(!gl.getShaderParameter(shader,gl.COMPILE_STATUS)){var errLog=gl.getShaderInfoLog(shader);check.raise("Error compiling shader:\n"+errLog)}cache[source]=shader}return shader}function refreshShaders(){shaders[GL_FRAGMENT_SHADER]={};shaders[GL_VERTEX_SHADER]={}}function clearShaders(){Object.keys(shaders).forEach(function(type){Object.keys(shaders[type]).forEach(function(shader){gl.deleteShader(shaders[type][shader])})});shaders[GL_FRAGMENT_SHADER]={};shaders[GL_VERTEX_SHADER]={}}var programCache={};var programList=[];function REGLProgram(fragSrc,vertSrc){this.fragSrc=fragSrc;this.vertSrc=vertSrc;this.program=null;this.uniforms=[];this.attributes=[];this.draw=function(){};this.batchCache={}}Object.assign(REGLProgram.prototype,{link:function(){var i,info;var fragShader=getShader(gl.FRAGMENT_SHADER,this.fragSrc);var vertShader=getShader(gl.VERTEX_SHADER,this.vertSrc);var program=this.program=gl.createProgram();gl.attachShader(program,fragShader);gl.attachShader(program,vertShader);gl.linkProgram(program);if(!gl.getProgramParameter(program,gl.LINK_STATUS)){var errLog=gl.getProgramInfoLog(program);check.raise("Error linking program:\n"+errLog)}var numUniforms=gl.getProgramParameter(program,gl.ACTIVE_UNIFORMS);var uniforms=this.uniforms=[];for(i=0;i<numUniforms;++i){info=gl.getActiveUniform(program,i);if(info){if(info.size>1){for(var j=0;j<info.size;++j){var name=info.name.replace("[0]","["+j+"]");uniforms.push(new ActiveInfo(name,gl.getUniformLocation(program,name),info));uniformState.def(name)}}else{uniforms.push(new ActiveInfo(info.name,gl.getUniformLocation(program,info.name),info));uniformState.def(info.name)}}}var numAttributes=gl.getProgramParameter(program,gl.ACTIVE_ATTRIBUTES);var attributes=this.attributes=[];for(i=0;i<numAttributes;++i){info=gl.getActiveAttrib(program,i);if(info){attributes.push(new ActiveInfo(info.name,gl.getAttribLocation(program,info.name),info));attributeState.def(info.name)}}this.draw=compileShaderDraw(this);this.batchCache={}},destroy:function(){gl.deleteProgram(this.program)}});function getProgram(vertSource,fragSource){var cache=programCache[fragSource];if(!cache){cache=programCache[vertSource]={}}var program=cache[vertSource];if(!program){program=new REGLProgram(fragSource,vertSource);program.link();cache[vertSource]=program;programList.push(program)}return program}function clearPrograms(){programList.forEach(function(program){program.destroy()});programList.length=0;programCache={}}function refreshPrograms(){programList.forEach(function(program){program.link()})}var programState=[null];function clear(){clearShaders();clearPrograms()}function refresh(){refreshShaders();refreshPrograms()}clear();return{create:getProgram,clear:clear,refresh:refresh,programs:programState,fragShaders:fragShaders,vertShaders:vertShaders}}},{"./check":3}],25:[function(require,module,exports){module.exports=function createStack(init,onChange){var n=init.length;var stack=init.slice();var dirty=true;function poll(){var ptr=stack.length-n;if(dirty){switch(n){case 1:onChange(stack[ptr]);break;case 2:onChange(stack[ptr],stack[ptr+1]);break;case 3:onChange(stack[ptr],stack[ptr+1],stack[ptr+2]);break;case 4:onChange(stack[ptr],stack[ptr+1],stack[ptr+2],stack[ptr+3]);break;case 5:onChange(stack[ptr],stack[ptr+1],stack[ptr+2],stack[ptr+3],stack[ptr+4]);break;case 6:onChange(stack[ptr],stack[ptr+1],stack[ptr+2],stack[ptr+3],stack[ptr+4],stack[ptr+5]);break;default:onChange.apply(null,stack.slice(ptr,stack.length))}dirty=false}}return{push:function(){for(var i=0;i<n;++i){stack.push(arguments[i])}dirty=true},pop:function(){stack.length-=n;dirty=true},poll:poll,setDirty:function(){dirty=true}}}},{}],26:[function(require,module,exports){var createStack=require("./stack");var createEnvironment=require("./codegen");var GL_CULL_FACE=2884;var GL_BLEND=3042;var GL_DITHER=3024;var GL_STENCIL_TEST=2960;var GL_DEPTH_TEST=2929;var GL_SCISSOR_TEST=3089;var GL_POLYGON_OFFSET_FILL=32823;var GL_SAMPLE_ALPHA_TO_COVERAGE=32926;var GL_SAMPLE_COVERAGE=32928;var GL_FUNC_ADD=32774;var GL_ZERO=0;var GL_ONE=1;var GL_FRONT=1028;var GL_BACK=1029;var GL_LESS=513;var GL_CCW=2305;var GL_ALWAYS=519;var GL_KEEP=7680;module.exports=function wrapContextState(gl,shaderState){function capStack(cap,dflt){var result=createStack([!!dflt],function(flag){if(flag){gl.enable(cap)}else{gl.disable(cap)}});result.flag=cap;return result}var viewportState={width:0,height:0};var contextState={dither:capStack(GL_DITHER),"blend.enable":capStack(GL_BLEND),"blend.color":createStack([0,0,0,0],function(r,g,b,a){gl.blendColor(r,g,b,a)}),"blend.equation":createStack([GL_FUNC_ADD,GL_FUNC_ADD],function(rgb,a){gl.blendEquationSeparate(rgb,a)}),"blend.func":createStack([GL_ONE,GL_ZERO,GL_ONE,GL_ZERO],function(srcRGB,dstRGB,srcAlpha,dstAlpha){gl.blendFuncSeparate(srcRGB,dstRGB,srcAlpha,dstAlpha)}),"depth.enable":capStack(GL_DEPTH_TEST,true),"depth.func":createStack([GL_LESS],function(func){gl.depthFunc(func)}),"depth.range":createStack([0,1],function(near,far){gl.depthRange(near,far)}),"depth.mask":createStack([true],function(m){gl.depthMask(m)}),"cull.enable":capStack(GL_CULL_FACE),"cull.face":createStack([GL_BACK],function(mode){gl.cullFace(mode)}),frontFace:createStack([GL_CCW],function(mode){gl.frontFace(mode)}),colorMask:createStack([true,true,true,true],function(r,g,b,a){gl.colorMask(r,g,b,a)}),lineWidth:createStack([1],function(w){gl.lineWidth(w)}),"polygonOffset.enable":capStack(GL_POLYGON_OFFSET_FILL),"polygonOffset.offset":createStack([0,0],function(factor,units){gl.polygonOffset(factor,units)}),"sample.alpha":capStack(GL_SAMPLE_ALPHA_TO_COVERAGE),"sample.enable":capStack(GL_SAMPLE_COVERAGE),"sample.coverage":createStack([1,false],function(value,invert){gl.sampleCoverage(value,invert)}),"stencil.enable":capStack(GL_STENCIL_TEST),"stencil.mask":createStack([-1],function(mask){gl.stencilMask(mask)}),"stencil.func":createStack([GL_ALWAYS,0,-1],function(func,ref,mask){gl.stencilFunc(func,ref,mask)}),"stencil.opFront":createStack([GL_KEEP,GL_KEEP,GL_KEEP],function(fail,zfail,pass){gl.stencilOpSeparate(GL_FRONT,fail,zfail,pass)}),"stencil.opBack":createStack([GL_KEEP,GL_KEEP,GL_KEEP],function(fail,zfail,pass){gl.stencilOpSeparate(GL_BACK,fail,zfail,pass)}),"scissor.enable":capStack(GL_SCISSOR_TEST),"scissor.box":createStack([0,0,-1,-1],function(x,y,w,h){var w_=w;if(w<0){w_=gl.drawingBufferWidth-x}var h_=h;if(h<0){h_=gl.drawingBufferHeight-y}gl.scissor(x,y,w_,h_)}),viewport:createStack([0,0,-1,-1],function(x,y,w,h){var w_=w;if(w<0){w_=gl.drawingBufferWidth-x}var h_=h;if(h<0){h_=gl.drawingBufferHeight-y}gl.viewport(x,y,w_,h_);viewportState.width=w_;viewportState.height=h_})};var env=createEnvironment();var poll=env.proc("poll");var refresh=env.proc("refresh");Object.keys(contextState).forEach(function(prop){var STACK=env.link(contextState[prop]);poll(STACK,".poll();");refresh(STACK,".setDirty();")});var procs=env.compile();return{contextState:contextState,viewport:viewportState,poll:procs.poll,refresh:procs.refresh,notifyViewportChanged:function(){contextState.viewport.setDirty();contextState["scissor.box"].setDirty()}}}},{"./codegen":5,"./stack":25}],27:[function(require,module,exports){var check=require("./check");var GL_TEXTURE_2D=3553;var GL_DEPTH_COMPONENT=6402;var GL_ALPHA=6406;var GL_RGB=6407;var GL_RGBA=6408;var GL_LUMINANCE=6409;var GL_LUMINANCE_ALPHA=6410;var GL_UNSIGNED_BYTE=5121;var GL_UNSIGNED_SHORT=5123;var GL_FLOAT=5126;var GL_TEXTURE_WRAP_S=10242;var GL_TEXTURE_WRAP_T=10243;var GL_REPEAT=10497;var GL_CLAMP_TO_EDGE=33071;var GL_MIRRORED_REPEAT=33648;var GL_TEXTURE_MAG_FILTER=10240;var GL_TEXTURE_MIN_FILTER=10241;var GL_NEAREST=9728;var GL_LINEAR=9729;var GL_NEAREST_MIPMAP_NEAREST=9984;var GL_LINEAR_MIPMAP_NEAREST=9985;var GL_NEAREST_MIPMAP_LINEAR=9986;var GL_LINEAR_MIPMAP_LINEAR=9987;var GL_UNPACK_FLIP_Y_WEBGL=37440;var GL_UNPACK_PREMULTIPLY_ALPHA_WEBGL=37441;var GL_UNPACK_COLORSPACE_CONVERSION_WEBGL=37443;var GL_BROWSER_DEFAULT_WEBGL=37444;var wrapModes={repeat:GL_REPEAT,clamp:GL_CLAMP_TO_EDGE,mirror:GL_MIRRORED_REPEAT};var magFilters={nearest:GL_NEAREST,linear:GL_LINEAR};var minFilters=Object.assign({"nearest mipmap nearest":GL_NEAREST_MIPMAP_NEAREST,"linear mipmap nearest":GL_LINEAR_MIPMAP_NEAREST,"nearest mipmap linear":GL_NEAREST_MIPMAP_LINEAR,"linear mipmap linear":GL_LINEAR_MIPMAP_LINEAR,mipmap:GL_LINEAR_MIPMAP_LINEAR},magFilters);module.exports=function createTextureSet(gl,extensionState){var extensions=extensionState.extensions;var textureCount=0;var textureSet={};function REGLTexture(){this.id=textureCount++;this.target=GL_TEXTURE_2D;this.texture=null;this.format=GL_RGBA;this.type=GL_UNSIGNED_BYTE;this.mipLevels=[];this.width=0;this.height=0;this.minFilter=GL_NEAREST;this.magFilter=GL_NEAREST;this.wrapS=GL_REPEAT;this.wrapT=GL_REPEAT;this.mipSamples=0;this.flipY=false;this.premultiplyAlpha=false;this.colorSpace=GL_BROWSER_DEFAULT_WEBGL}Object.assign(REGLTexture.prototype,{bind:function(){},update:function(args){var options=args||{};if(Array.isArray(args)||isTypedArray(args)||isHTMLElement(args)){options={data:args}}var data=options.data||null;var width=options.width||0;var height=options.height||0;var format=options.format||"rgba";this.minFilter=GL_NEAREST;if("min"in options){check.param(options.min,minFilters);this.minFilter=minFilters[options.min]}this.magFilter=GL_NEAREST;if("mag"in options){check.param(options.mag,magFilters);this.magFilter=magFilters(options.mag)}if(Array.isArray(data)){}else if(isTypedArray(data)){}else if(isHTMLElement(data)){}},refresh:function(){gl.textureParameteri(GL_TEXTURE_MIN_FILTER,this.minFilter);gl.textureParameteri(GL_TEXTURE_MAG_FILTER,this.magFilter);gl.textureParameteri(GL_TEXTURE_WRAP_T,this.wrapT);gl.textureParameteri(GL_TEXTURE_WRAP_S,this.wrapS)},destroy:function(){check(this.texture,"must not double free texture");gl.deleteTexture(this.texture);this.texture=null;delete textureSet[this.id]}});function createTexture(options){var texture=new REGLTexture;texture.texture=gl.createTexture();texture.update(options);textureSet[texture.id]=texture;function updateTexture(options){texture.update(options);return updateTexture}updateTexture._texture=texture;updateTexture.destroy=function(){texture.destroy()};return updateTexture}function refreshTextures(){Object.keys(textureSet).forEach(function(texId){textureSet[texId].refresh()})}function destroyTextures(){Object.keys(textureSet).forEach(function(texId){textureSet[texId].destroy()})}return{create:createTexture,refresh:refreshTextures,clear:destroyTextures,getTexture:function(wrapper){return null}}}},{"./check":3}],28:[function(require,module,exports){module.exports=function wrapUniformState(){var uniformState={};function defUniform(name){if(name in uniformState){return}uniformState[name]=[[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]]}return{uniforms:uniformState,def:defUniform}}},{}],regl:[function(require,module,exports){var check=require("./lib/check");var getContext=require("./lib/context");var wrapExtensions=require("./lib/extension");var wrapBuffers=require("./lib/buffer");var wrapElements=require("./lib/elements");var wrapTextures=require("./lib/texture");var wrapFBOs=require("./lib/fbo");var wrapUniforms=require("./lib/uniform");var wrapAttributes=require("./lib/attribute");var wrapShaders=require("./lib/shader");var wrapDraw=require("./lib/draw");var wrapContext=require("./lib/state");var createCompiler=require("./lib/compile");var wrapRead=require("./lib/read");var dynamic=require("./lib/dynamic");var raf=require("./lib/raf");var clock=require("./lib/clock");var GL_COLOR_BUFFER_BIT=16384;var GL_DEPTH_BUFFER_BIT=256;var GL_STENCIL_BUFFER_BIT=1024;var GL_ARRAY_BUFFER=34962;var CONTEXT_LOST_EVENT="webglcontextlost";var CONTEXT_RESTORED_EVENT="webglcontextrestored";module.exports=function wrapREGL(){var args=getContext(Array.prototype.slice.call(arguments));var gl=args.gl;var options=args.options;var extensionState=wrapExtensions(gl,options.requiredExtensions||[]);var bufferState=wrapBuffers(gl);var elementState=wrapElements(gl,extensionState,bufferState);var textureState=wrapTextures(gl,extensionState);var fboState=wrapFBOs(gl,extensionState,textureState);var uniformState=wrapUniforms();var attributeState=wrapAttributes(gl,extensionState,bufferState);var shaderState=wrapShaders(gl,extensionState,attributeState,uniformState,function(program){return compiler.draw(program)});var drawState=wrapDraw(gl,extensionState,bufferState);var glState=wrapContext(gl,shaderState);var frameState={count:0,start:clock(),dt:0,t:clock(),renderTime:0,width:gl.drawingBufferWidth,height:gl.drawingBufferHeight};var readPixels=wrapRead(gl,glState);var compiler=createCompiler(gl,extensionState,bufferState,elementState,textureState,fboState,glState,uniformState,attributeState,shaderState,drawState,frameState);var canvas=gl.canvas;var rafCallbacks=[];var activeRAF=0;function handleRAF(){activeRAF=raf.next(handleRAF);frameState.count+=1;if(frameState.width!==gl.drawingBufferWidth||frameState.height!==gl.drawingBufferHeight){frameState.width=gl.drawingBufferWidth;frameState.height=gl.drawingBufferHeight;glState.notifyViewportChanged()}var now=clock(); | |
frameState.dt=now-frameState.t;frameState.t=now;for(var i=0;i<rafCallbacks.length;++i){var cb=rafCallbacks[i];cb(frameState.count,frameState.t,frameState.dt)}frameState.renderTime=clock()-now}function startRAF(){if(!activeRAF&&rafCallbacks.length>0){handleRAF()}}function stopRAF(){if(activeRAF){raf.cancel(handleRAF);activeRAF=0}}function handleContextLoss(event){stopRAF();event.preventDefault();if(options.onContextLost){options.onContextLost()}}function handleContextRestored(event){gl.getError();extensionState.refresh();bufferState.refresh();textureState.refresh();fboState.refresh();shaderState.refresh();glState.refresh();if(options.onContextRestored){options.onContextRestored()}handleRAF()}if(canvas){canvas.addEventListener(CONTEXT_LOST_EVENT,handleContextLoss,false);canvas.addEventListener(CONTEXT_RESTORED_EVENT,handleContextRestored,false)}function destroy(){stopRAF();if(canvas){canvas.removeEventListener(CONTEXT_LOST_EVENT,handleContextLoss);canvas.removeEventListener(CONTEXT_RESTORED_EVENT,handleContextRestored)}shaderState.clear();fboState.clear();textureState.clear();bufferState.clear();if(options.onDestroy){options.onDestroy()}}function create(cache){return function(options){return cache.create(options)}}function compileProcedure(options){check(!!options,"invalid args to regl({...})");check.type(options,"object","invalid args to regl({...})");var hasDynamic=false;function flattenNestedOptions(options){var result=Object.assign({},options);delete result.uniforms;delete result.attributes;function merge(name){if(name in result){var child=result[name];delete result[name];Object.keys(child).forEach(function(prop){result[name+"."+prop]=child[prop]})}}merge("blend");merge("depth");merge("cull");merge("stencil");merge("polygonOffset");merge("scissor");merge("sample");return result}function separateDynamic(object){var staticItems={};var dynamicItems={};Object.keys(object).forEach(function(option){var value=object[option];if(dynamic.isDynamic(value)){hasDynamic=true;dynamicItems[option]=dynamic.unbox(value,option)}else{staticItems[option]=value}});return{dynamic:dynamicItems,"static":staticItems}}var uniforms=separateDynamic(options.uniforms||{});var attributes=separateDynamic(options.attributes||{});var opts=separateDynamic(flattenNestedOptions(options));var compiled=compiler.command(opts.static,uniforms.static,attributes.static,opts.dynamic,uniforms.dynamic,attributes.dynamic,hasDynamic);var draw=compiled.draw;var batch=compiled.batch;var scope=compiled.scope;var EMPTY_ARRAY=[];function reserve(count){while(EMPTY_ARRAY.length<count){EMPTY_ARRAY.push(null)}return EMPTY_ARRAY}function REGLCommand(args,body){if(typeof args==="number"){return batch(args|0,reserve(args|0))}else if(Array.isArray(args)){return batch(args.length,args)}else if(typeof args==="function"){return scope(null,args)}else if(typeof body==="function"){return scope(args,body)}return draw(args)}return REGLCommand}function clear(options){var clearFlags=0;glState.poll();var c=options.color;if(c){gl.clearColor(+c[0]||0,+c[1]||0,+c[2]||0,+c[3]||0);clearFlags|=GL_COLOR_BUFFER_BIT}if("depth"in options){gl.clearDepth(+options.depth);clearFlags|=GL_DEPTH_BUFFER_BIT}if("stencil"in options){gl.clearStencil(options.stencil|0);clearFlags|=GL_STENCIL_BUFFER_BIT}check(!!clearFlags,"called regl.clear with no buffer specified");gl.clear(clearFlags)}function frame(cb){rafCallbacks.push(cb);function cancel(){var index=rafCallbacks.find(function(item){return item===cb});if(index<0){return}rafCallbacks.splice(index,1);if(rafCallbacks.length<=0){stopRAF()}}startRAF();return{cancel:cancel}}return Object.assign(compileProcedure,{clear:clear,prop:dynamic.define,elements:create(elementState),buffer:function(options){return bufferState.create(options,GL_ARRAY_BUFFER)},texture:create(textureState),fbo:create(fboState),frame:frame,stats:frameState,read:readPixels,destroy:destroy})}},{"./lib/attribute":1,"./lib/buffer":2,"./lib/check":3,"./lib/clock":4,"./lib/compile":6,"./lib/context":15,"./lib/draw":16,"./lib/dynamic":17,"./lib/elements":18,"./lib/extension":19,"./lib/fbo":20,"./lib/raf":22,"./lib/read":23,"./lib/shader":24,"./lib/state":26,"./lib/texture":27,"./lib/uniform":28}]},{},[]);var regl=require("regl")();regl.clear({color:[0,0,0,1],depth:1});regl({frag:["precision mediump float;","uniform vec4 color;","void main() {"," gl_FragColor = color;","}"].join("\n"),vert:["precision mediump float;","attribute vec2 position;","void main() {"," gl_Position = vec4(position, 0, 1);","}"].join("\n"),attributes:{position:regl.buffer([-1,0,0,-1,1,1])},uniforms:{color:[1,0,0,1]},count:3})()},0); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"name": "requirebin-sketch", | |
"version": "1.0.0", | |
"dependencies": { | |
"regl": "0.1.0" | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!-- contents of this file will be placed inside the <body> --> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!-- contents of this file will be placed inside the <head> --> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment