Skip to content

Instantly share code, notes, and snippets.

@guybrush
Created April 19, 2016 03:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save guybrush/027395068fd61379b3b7b4dd225a0fd6 to your computer and use it in GitHub Desktop.
Save guybrush/027395068fd61379b3b7b4dd225a0fd6 to your computer and use it in GitHub Desktop.
requirebin sketch
// 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
})()
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);
{
"name": "requirebin-sketch",
"version": "1.0.0",
"dependencies": {
"regl": "0.1.0"
}
}
<!-- contents of this file will be placed inside the <body> -->
<!-- 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