interactive-shader-format-for-modv
Version:
Rendering engine for Interactive Shader Format effects and generators
877 lines (791 loc) • 796 kB
JavaScript
(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 ISFTexture = require("./ISFTexture.js");
function ISFBuffer(pass, contextState) {
this.contextState = contextState;
this.gl = this.contextState.gl;
this.persistent = pass.persistent;
// Since float buffers have a lot of problems in webgl we dont actually use them.
// This should be revisited.
// this.float = pass.float;
this.name = pass.target;
this.textures = [];
this.textures.push(new ISFTexture(pass, this.contextState));
this.textures.push(new ISFTexture(pass, this.contextState));
this.flipFlop = false;
this.fbo = this.gl.createFramebuffer();
this.flipFlop = false;
}
ISFBuffer.prototype.setSize = function(w, h) {
if (this.width !== w || this.height !== h) {
this.width = w;
this.height = h;
for (var i = 0; i < this.textures.length; i++) {
var texture = this.textures[i];
texture.setSize(w, h);
}
}
};
ISFBuffer.prototype.readTexture = function() {
if (this.flipFlop) {
return this.textures[1];
} else {
return this.textures[0];
}
};
ISFBuffer.prototype.writeTexture = function() {
if (!this.flipFlop) {
return this.textures[1];
} else {
return this.textures[0];
}
};
ISFBuffer.prototype.flip = function() {
this.flipFlop = !this.flipFlop;
};
ISFBuffer.prototype.destroy = function() {
for (var i = 0; i < this.textures.length; i++) {
var texture = this.textures[i];
texture.destroy();
}
this.gl.deleteFramebuffer(this.fbo);
};
module.exports = ISFBuffer;
},{"./ISFTexture.js":6}],2:[function(require,module,exports){
function ISFGLProgram(gl, vs, fs) {
this.gl = gl;
this.vShader = this.createShader(vs, this.gl.VERTEX_SHADER);
this.fShader = this.createShader(fs, this.gl.FRAGMENT_SHADER);
this.program = this.createProgram(this.vShader, this.fShader);
this.locations = {};
}
ISFGLProgram.prototype.use = function() {
this.gl.useProgram(this.program);
};
ISFGLProgram.prototype.getUniformLocation = function(name) {
return this.gl.getUniformLocation(this.program, name);
};
ISFGLProgram.prototype.setUniform1i = function(uniformName, value) {
if (locations[uniformName] == null) {
locations[uniformName] = this.getUniformLocation(this.program, uniformName);
}
this.gl.uniform1i(this.paintProgram.texLocation, target.textureUnit);
};
ISFGLProgram.prototype.bindVertices = function() {
this.use();
var positionLocation = this.gl.getAttribLocation(this.program, "position");
this.buffer = this.gl.createBuffer();
this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.buffer);
this.gl.bufferData(this.gl.ARRAY_BUFFER, new Float32Array([-1.0, -1.0, 1.0, -1.0, -1.0, 1.0, -1.0, 1.0, 1.0, -1.0, 1.0, 1.0]), this.gl.STATIC_DRAW);
this.gl.enableVertexAttribArray(positionLocation);
this.gl.vertexAttribPointer(positionLocation, 2, this.gl.FLOAT, false, 0, 0);
};
ISFGLProgram.prototype.cleanup = function() {
this.gl.deleteShader(this.fShader);
this.gl.deleteShader(this.vShader);
this.gl.deleteProgram(this.program);
this.gl.deleteBuffer(this.buffer);
};
ISFGLProgram.prototype.createShader = function(src, type) {
var shader = this.gl.createShader(type);
this.gl.shaderSource(shader, src);
this.gl.compileShader(shader);
var compiled = this.gl.getShaderParameter(shader, this.gl.COMPILE_STATUS);
if (!compiled) {
var lastError = this.gl.getShaderInfoLog(shader);
console.log("Error Compiling Shader ", lastError);
throw {
message: lastError,
type: "shader"
};
}
return shader;
};
ISFGLProgram.prototype.createProgram = function(vShader, fShader) {
var program = this.gl.createProgram();
this.gl.attachShader(program, vShader);
this.gl.attachShader(program, fShader);
this.gl.linkProgram(program);
var linked = this.gl.getProgramParameter(program, this.gl.LINK_STATUS);
if (!linked) {
var lastError = this.gl.getProgramInfoLog(program);
console.log("Error in program linking", lastError);
throw {
message: lastError,
type: "program"
};
}
return program;
};
module.exports = ISFGLProgram;
},{}],3:[function(require,module,exports){
var ISFGLState = function(gl) {
this.gl = gl;
this.textureIndex = 0;
}
ISFGLState.prototype.newTextureIndex = function() {
var i = this.textureIndex;
this.textureIndex += 1;
return i;
}
ISFGLState.prototype.reset = function() {
this.textureIndex = 0;
}
module.exports = ISFGLState;
},{}],4:[function(require,module,exports){
(function (Buffer){
var MetadataExtractor = require('./MetadataExtractor')
/*
Uniforms you will need to set, in addition to any inputs specified are
RENDERSIZE: vec2 rendering size in pixels
TIME: float time in seconds since rendering started
PASSINDEX: int index of the current pass being rendered
See http://vdmx.vidvox.net/blog/isf for more info
*/
var ISFParser = function () {};
ISFParser.prototype.parse = function ( rawFragmentShader, rawVertexShader ) {
try {
this.rawFragmentShader = rawFragmentShader;
this.rawVertexShader = rawVertexShader || ISFParser.vertexShaderDefault;
this.error = null;
var metadataInfo = MetadataExtractor(this.rawFragmentShader);
var metadata = metadataInfo.objectValue;
var metadataString = metadataInfo.stringValue
this.metadata = metadata
this.credit = metadata.CREDIT;
this.categories = metadata.CATEGORIES;
this.inputs = metadata.INPUTS;
this.imports = ( metadata.IMPORTED || {} );
this.description = metadata.DESCRIPTION
var passesArray = metadata.PASSES || [ {} ];
this.passes = this.parsePasses(passesArray);
var endOfMetadata = this.rawFragmentShader.indexOf(metadataString) + metadataString.length + 2;
this.rawFragmentMain = this.rawFragmentShader.substring(endOfMetadata);
this.generateShaders();
this.inferFilterType();
this.isfVersion = this.inferISFVersion();
} catch (e) {
this.valid = false;
this.error = e;
this.inputs = [];
this.categories = [];
this.credit = "";
}
}
ISFParser.prototype.parsePasses = function ( passesArray ) {
var passes = [];
for ( var i = 0; i < passesArray.length; ++i ) {
var passDefinition = passesArray[ i ];
var pass = { };
if ( passDefinition.TARGET ) pass.target = passDefinition.TARGET;
pass.persistent = !!passDefinition.PERSISTENT
pass.width = passDefinition.WIDTH || "$WIDTH";
pass.height = passDefinition.HEIGHT || "$HEIGHT";
pass.float = !!passDefinition.FLOAT;
passes.push( pass );
}
return passes;
}
ISFParser.prototype.generateShaders = function () {
this.uniformDefs = "";
for ( var i = 0; i < this.inputs.length; ++i ) {
this.addUniform( this.inputs[ i ] );
}
for ( var i = 0; i < this.passes.length; ++i ) {
if ( this.passes[i].target ) {
this.addUniform( {NAME: this.passes[i].target, TYPE: "image"} );
}
}
for ( var k in this.imports ) {
if ( this.imports.hasOwnProperty(k) ) {
this.addUniform( {NAME: k, TYPE: "image"} )
}
}
this.fragmentShader = this.buildFragmentShader();
this.vertexShader = this.buildVertexShader();
}
ISFParser.prototype.addUniform = function ( input ) {
var type = this.inputToType(input.TYPE);
this.addUniformLine( "uniform " + type + " " + input.NAME + ";" );
if ( type == "sampler2D" ) {
this.addUniformLine( this.samplerUniforms(input) );
}
}
ISFParser.prototype.addUniformLine = function ( line ) {
this.uniformDefs += line + "\n";
}
ISFParser.prototype.samplerUniforms = function ( input ) {
var name = input.NAME;
var lines = "";
lines += "uniform vec4 _" + name + "_imgRect;\n";
lines += "uniform vec2 _" + name + "_imgSize;\n";
lines += "uniform bool _" + name + "_flip;\n";
lines += "varying vec2 _" + name + "_normTexCoord;\n";
lines += "varying vec2 _" + name + "_texCoord;\n";
lines += "\n";
return lines;
}
ISFParser.prototype.buildFragmentShader = function () {
var main = this.replaceSpecialFunctions( this.rawFragmentMain );
return ISFParser.fragmentShaderSkeleton.replace("[[uniforms]]", this.uniformDefs).replace("[[main]]", main);
}
ISFParser.prototype.replaceSpecialFunctions = function ( source ) {
var regex;
// IMG_THIS_PIXEL
regex = /IMG_THIS_PIXEL\((.+?)\)/g;
source = source.replace( regex, function( fullMatch, innerMatch ) {
return "texture2D(" + innerMatch + ", isf_FragNormCoord)";
});
// IMG_THIS_NORM_PIXEL
regex = /IMG_THIS_NORM_PIXEL\((.+?)\)/g;
source = source.replace( regex, function( fullMatch, innerMatch ) {
return "texture2D(" + innerMatch + ", isf_FragNormCoord)";
});
// IMG_PIXEL
regex = /IMG_PIXEL\((.+?)\)/g;
source = source.replace( regex, function( fullMatch, innerMatch ) {
var results = innerMatch.split(",");
var sampler = results[0];
var coord = results[1];
return "texture2D(" + sampler + ", (" + coord + ") / RENDERSIZE)";
});
// IMG_NORM_PIXEL
regex = /IMG_NORM_PIXEL\((.+?)\)/g
source = source.replace(regex, function( fullMatch, innerMatch ) {
var results = innerMatch.split(",");
var sampler = results[0];
var coord = results[1];
return "VVSAMPLER_2DBYNORM(" + sampler + ", _" + sampler + "_imgRect, _" + sampler + "_imgSize, _" + sampler + "_flip, " + coord + ")";
});
return source;
}
ISFParser.prototype.buildVertexShader = function () {
var functionLines = "\n";
for ( var i = 0; i < this.inputs.length; ++i ) {
var input = this.inputs[i];
if ( input.TYPE == "image" ) {
functionLines += this.texCoordFunctions( input ) + "\n";
}
}
return ISFParser.vertexShaderSkeleton.replace("[[functions]]", functionLines).replace("[[uniforms]]", this.uniformDefs).replace("[[main]]", this.rawVertexShader)
}
ISFParser.prototype.texCoordFunctions = function ( input ) {
var name = input.NAME;
return [
"_[[name]]_texCoord =",
" vec2(((isf_fragCoord.x / _[[name]]_imgSize.x * _[[name]]_imgRect.z) + _[[name]]_imgRect.x), ",
" (isf_fragCoord.y / _[[name]]_imgSize.y * _[[name]]_imgRect.w) + _[[name]]_imgRect.y);",
"",
"_[[name]]_normTexCoord =",
" vec2((((isf_FragNormCoord.x * _[[name]]_imgSize.x) / _[[name]]_imgSize.x * _[[name]]_imgRect.z) + _[[name]]_imgRect.x),",
" ((isf_FragNormCoord.y * _[[name]]_imgSize.y) / _[[name]]_imgSize.y * _[[name]]_imgRect.w) + _[[name]]_imgRect.y);"
].join("\n").replace(/\[\[name\]\]/g, name);
}
ISFParser.prototype.inferFilterType = function() {
function any(arr, test) {
return arr.filter(test).length > 0
}
var isFilter = any(this.inputs, function(input) {
return input.TYPE == 'image' && input.NAME == 'inputImage';
});
var isTransition =
any(this.inputs, function(input) {
return input.TYPE == 'image' && input.NAME == 'startImage';
})
&&
any(this.inputs, function(input) {
return input.TYPE == 'image' && input.NAME == 'endImage';
})
&&
any(this.inputs, function(input) {
return input.TYPE == 'float' && input.NAME == 'progress';
})
if (isFilter) {
this.type = 'filter';
} else if (isTransition) {
this.type = 'transition';
} else {
this.type = 'generator';
}
}
ISFParser.prototype.inferISFVersion = function () {
var v = 2;
if (this.metadata.PERSISTENT_BUFFERS ||
this.rawFragmentShader.indexOf('vv_FragNormCoord') != -1 ||
this.rawVertexShader.indexOf('vv_FragNormCoord') != -1) {
v = 1;
}
return v;
}
ISFParser.prototype.inputToType = function ( inputType ) {
var type = ISFParser._typeUniformMap[inputType];
if ( !type ) throw "Unknown input type [" + inputType + "]";
return type;
}
ISFParser._typeUniformMap = {
"float": "float",
"image": "sampler2D",
"bool": "bool",
"event": "bool",
"long": "int",
"color": "vec4",
"point2D": "vec2"
};
ISFParser.fragmentShaderSkeleton = Buffer("cHJlY2lzaW9uIGhpZ2hwIGZsb2F0OwpwcmVjaXNpb24gaGlnaHAgaW50OwoKdW5pZm9ybSBpbnQgUEFTU0lOREVYOwp1bmlmb3JtIHZlYzIgUkVOREVSU0laRTsKdmFyeWluZyB2ZWMyIGlzZl9GcmFnTm9ybUNvb3JkOwp2YXJ5aW5nIHZlYzIgaXNmX0ZyYWdDb29yZDsKdW5pZm9ybSBmbG9hdCBUSU1FOwp1bmlmb3JtIGZsb2F0IFRJTUVERUxUQTsKdW5pZm9ybSBpbnQgRlJBTUVJTkRFWDsKdW5pZm9ybSB2ZWM0IERBVEU7CgpbW3VuaWZvcm1zXV0KCi8vIFdlIGRvbid0IG5lZWQgMkRSZWN0IGZ1bmN0aW9ucyBzaW5jZSB3ZSBjb250cm9sIGFsbCBpbnB1dHMuICBEb24ndCBuZWVkIGZsaXAgZWl0aGVyLCBidXQgbGVhdmluZwovLyBmb3IgY29uc2lzdGVuY3kgc2FrZS4KdmVjNCBWVlNBTVBMRVJfMkRCWVBJWEVMKHNhbXBsZXIyRCBzYW1wbGVyLCB2ZWM0IHNhbXBsZXJJbWdSZWN0LCB2ZWMyIHNhbXBsZXJJbWdTaXplLCBib29sIHNhbXBsZXJGbGlwLCB2ZWMyIGxvYykgewogIHJldHVybiAoc2FtcGxlckZsaXApCiAgICA/IHRleHR1cmUyRCAgIChzYW1wbGVyLHZlYzIoKChsb2MueC9zYW1wbGVySW1nU2l6ZS54KnNhbXBsZXJJbWdSZWN0LnopK3NhbXBsZXJJbWdSZWN0LngpLCAoc2FtcGxlckltZ1JlY3Qudy0obG9jLnkvc2FtcGxlckltZ1NpemUueSpzYW1wbGVySW1nUmVjdC53KStzYW1wbGVySW1nUmVjdC55KSkpCiAgICA6IHRleHR1cmUyRCAgIChzYW1wbGVyLHZlYzIoKChsb2MueC9zYW1wbGVySW1nU2l6ZS54KnNhbXBsZXJJbWdSZWN0LnopK3NhbXBsZXJJbWdSZWN0LngpLCAoKGxvYy55L3NhbXBsZXJJbWdTaXplLnkqc2FtcGxlckltZ1JlY3Qudykrc2FtcGxlckltZ1JlY3QueSkpKTsKfQp2ZWM0IFZWU0FNUExFUl8yREJZTk9STShzYW1wbGVyMkQgc2FtcGxlciwgdmVjNCBzYW1wbGVySW1nUmVjdCwgdmVjMiBzYW1wbGVySW1nU2l6ZSwgYm9vbCBzYW1wbGVyRmxpcCwgdmVjMiBub3JtTG9jKSAgewogIHZlYzQgICAgcmV0dXJuTWUgPSBWVlNBTVBMRVJfMkRCWVBJWEVMKCAgIHNhbXBsZXIsc2FtcGxlckltZ1JlY3Qsc2FtcGxlckltZ1NpemUsc2FtcGxlckZsaXAsdmVjMihub3JtTG9jLngqc2FtcGxlckltZ1NpemUueCwgbm9ybUxvYy55KnNhbXBsZXJJbWdTaXplLnkpKTsKICByZXR1cm4gcmV0dXJuTWU7Cn0KCltbbWFpbl1dCg==","base64").toString()
ISFParser.vertexShaderDefault = Buffer("dm9pZCBtYWluKCkgewogIGlzZl92ZXJ0U2hhZGVySW5pdCgpOwp9Cg==","base64").toString()
ISFParser.vertexShaderSkeleton = Buffer("cHJlY2lzaW9uIGhpZ2hwIGZsb2F0OwpwcmVjaXNpb24gaGlnaHAgaW50Owp2b2lkIGlzZl92ZXJ0U2hhZGVySW5pdCgpOwoKYXR0cmlidXRlIHZlYzIgcG9zaXRpb247IC8vIC0xLi4xCgp1bmlmb3JtIGludCAgICAgUEFTU0lOREVYOwp1bmlmb3JtIHZlYzIgICAgUkVOREVSU0laRTsKdmFyeWluZyB2ZWMyICAgIGlzZl9GcmFnTm9ybUNvb3JkOyAvLyAwLi4xCnZlYzIgICAgaXNmX2ZyYWdDb29yZDsgLy8gUGl4ZWwgU3BhY2UKCltbdW5pZm9ybXNdXQoKW1ttYWluXV0Kdm9pZCBpc2ZfdmVydFNoYWRlckluaXQodm9pZCkgIHsKZ2xfUG9zaXRpb24gPSB2ZWM0KCBwb3NpdGlvbiwgMC4wLCAxLjAgKTsKICBpc2ZfRnJhZ05vcm1Db29yZCA9IHZlYzIoKGdsX1Bvc2l0aW9uLngrMS4wKS8yLjAsIChnbF9Qb3NpdGlvbi55KzEuMCkvMi4wKTsKICBpc2ZfZnJhZ0Nvb3JkID0gZmxvb3IoaXNmX0ZyYWdOb3JtQ29vcmQgKiBSRU5ERVJTSVpFKTsKICBbW2Z1bmN0aW9uc11dCn0K","base64").toString()
module.exports = ISFParser;
}).call(this,require("buffer").Buffer)
},{"./MetadataExtractor":8,"buffer":55}],5:[function(require,module,exports){
var ISFGLState = require("./ISFGLState.js");
var ISFGLProgram = require("./ISFGLProgram.js");
var ISFBuffer = require("./ISFBuffer.js");
var ISFParser = require("./ISFParser.js");
var ISFTexture = require("./ISFTexture.js");
var MathJS = require("./math.js")
function ISFRenderer(gl) {
this.gl = gl;
this.uniforms = [];
this.contextState = new ISFGLState(this.gl);
this.setupPaintToScreen();
this.startTime = Date.now();
this.lastRenderTime = Date.now();
this.frameIndex = 0;
}
ISFRenderer.prototype.loadSource = function(fragmentISF, vertexISFOpt) {
var parser = new ISFParser()
parser.parse(fragmentISF, vertexISFOpt);
this.sourceChanged(parser.fragmentShader, parser.vertexShader, parser);
}
ISFRenderer.prototype.sourceChanged = function(fragmentShader, vertexShader, model) {
this.fragmentShader = fragmentShader;
this.vertexShader = vertexShader;
this.model = model;
this.setupGL();
this.initUniforms();
for (var i = 0; i < model.inputs.length; i++) {
var input = model.inputs[i];
if (input.DEFAULT !== undefined) {
this.setValue(input.NAME, input.DEFAULT);
}
}
};
ISFRenderer.prototype.initUniforms = function() {
this.uniforms = this.findUniforms(this.fragmentShader);
var inputs = this.model.inputs;
for (var i = 0; i < inputs.length; ++i) {
var input = inputs[i];
var uniform = this.uniforms[input.NAME];
if (!uniform) {
continue;
}
uniform.value = this.model[input.NAME];
if (uniform.type === 't') {
uniform.texture = new ISFTexture({}, this.contextState);
}
}
this.pushTextures();
};
ISFRenderer.prototype.setValue = function(name, value) {
var uniform = this.uniforms[name];
if (!uniform) {
console.error("No uniform named " + name);
return;
}
uniform.value = value;
if (uniform.type === 't') {
uniform.textureLoaded = false;
}
this.pushUniform(uniform);
};
ISFRenderer.prototype.setNormalizedValue = function(name, normalizedValue) {
var uniform = this.uniforms[name];
var inputs = this.model.inputs;
var input = null;
for (var i = 0; i < inputs.length; i++) {
var thisInput = inputs[i];
if (thisInput.NAME == name) {
input = thisInput;
break;
}
}
if (input && input.MIN !== undefined && input.MAX !== undefined) {
this.setValue(name, input.MIN + (input.MAX - input.MIN) * normalizedValue);
} else {
console.log("Trying to set normalized value without MIN and MAX input", name, input);
}
}
ISFRenderer.prototype.setupPaintToScreen = function() {
this.paintProgram = new ISFGLProgram(this.gl, this.basicVertexShader, this.basicFragmentShader);
return this.paintProgram.bindVertices();
};
ISFRenderer.prototype.setupGL = function() {
this.cleanup();
this.program = new ISFGLProgram(this.gl, this.vertexShader, this.fragmentShader);
this.program.bindVertices();
this.generatePersistentBuffers();
};
ISFRenderer.prototype.generatePersistentBuffers = function() {
this.renderBuffers = [];
var passes = this.model.passes;
for (var i = 0; i < passes.length; ++i) {
var pass = passes[i];
var buffer = new ISFBuffer(pass, this.contextState);
pass.buffer = buffer;
this.renderBuffers.push(buffer);
}
};
ISFRenderer.prototype.paintToScreen = function(destination, target) {
this.paintProgram.use();
this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, null);
this.gl.viewport(0, 0, destination.width, destination.height);
var loc = this.paintProgram.getUniformLocation("tex");
target.readTexture().bind(loc);
this.gl.drawArrays(this.gl.TRIANGLES, 0, 6);
this.program.use();
};
ISFRenderer.prototype.pushTextures = function() {
for (var i = 0; i < this.uniforms.length; ++i) {
var uniform = this.uniforms[i];
if (this.uniforms.hasOwnProperty(name)) {
if (uniform.type == 't') {
this.pushTexture(uniform);
}
}
}
};
ISFRenderer.prototype.pushTexture = function(uniform) {
if (!uniform.value) {
return;
}
if (uniform.value.tagName != "CANVAS" && !uniform.value.complete && uniform.value.readyState !== 4) {
return;
}
var loc = this.program.getUniformLocation(uniform.name);
uniform.texture.bind(loc);
this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA, this.gl.RGBA, this.gl.UNSIGNED_BYTE, uniform.value);
if (!uniform.textureLoaded) {
var img = uniform.value;
uniform.textureLoaded = true;
var w = img.naturalWidth || img.width || img.videoWidth;
var h = img.naturalHeight || img.height || img.videoHeight;
this.setValue("_" + uniform.name + "_imgSize", [w, h]);
this.setValue("_" + uniform.name + "_imgRect", [0, 0, 1, 1]);
return this.setValue("_" + uniform.name + "_flip", false);
}
};
ISFRenderer.prototype.pushUniforms = function() {
for (var name in this.uniforms) {
var uniform = this.uniforms[name];
if (this.uniforms.hasOwnProperty(name)) {
this.pushUniform(value);
}
}
};
ISFRenderer.prototype.pushUniform = function(uniform) {
var loc = this.program.getUniformLocation(uniform.name);
if (loc !== -1) {
if (uniform.type === 't') {
return this.pushTexture(uniform);
} else {
var v = uniform.value;
switch (uniform.type) {
case 'f':
return this.gl.uniform1f(loc, v);
case 'v2':
return this.gl.uniform2f(loc, v[0], v[1]);
case 'v3':
return this.gl.uniform3f(loc, v[0], v[1], v[2]);
case 'v4':
return this.gl.uniform4f(loc, v[0], v[1], v[2], v[3]);
case 'i':
return this.gl.uniform1i(loc, v);
case 'color':
return this.gl.uniform4f(loc, v[0], v[1], v[2], v[3]);
default:
return console.log("Unknown type for uniform setting " + uniform.type, uniform);
}
}
}
};
ISFRenderer.prototype.findUniforms = function(shader) {
var lines = shader.split("\n");
var uniforms = {
TIME: 0,
PASSINDEX: 0,
RENDERSIZE: [0, 0]
};
var len = lines.length
for (var i = 0; i < len; ++i) {
var line = lines[i];
if (line.indexOf("uniform") === 0) {
var tokens = line.split(" ");
var name = tokens[2].substring(0, tokens[2].length - 1);
var uniform = this.typeToUniform(tokens[1]);
uniform.name = name;
uniforms[name] = uniform;
}
}
return uniforms;
};
ISFRenderer.prototype.typeToUniform = function(type) {
switch (type) {
case "float":
return {
type: "f",
value: 0
};
case "vec2":
return {
type: "v2",
value: [0, 0]
};
case "vec3":
return {
type: "v3",
value: [0, 0, 0]
};
case "vec4":
return {
type: "v4",
value: [0, 0, 0, 0]
};
case "bool":
return {
type: "i",
value: 0
};
case "int":
return {
type: "i",
value: 0
};
case "color":
return {
type: "v4",
value: [0, 0, 0, 0]
};
case "point2D":
return {
type: "v2",
value: [0, 0],
isPoint: true
};
case "sampler2D":
return {
type: "t",
value: {
complete: false,
readyState: 0
},
texture: null,
textureUnit: null
};
default:
throw "Unknown uniform type in ISFRenderer.typeToUniform: " + type;
}
};
ISFRenderer.prototype.setDateUniforms = function() {
var now = Date.now();
this.setValue("TIME", (now - this.startTime) / 1000);
this.setValue("TIMEDELTA", (now - this.lastRenderTime) / 1000);
this.setValue("FRAMEINDEX", this.frameIndex++);
var date = new Date();
console.log("Date is ", [date.getFullYear(), date.getMonth() + 1, date.getDate() + 1, date.getHours() * 3600 + date.getMinutes() * 60 + date.getSeconds()])
this.setValue("DATE", [date.getFullYear(), date.getMonth() + 1, date.getDate() + 1, date.getHours() * 3600 + date.getMinutes() * 60 + date.getSeconds()])
this.lastRenderTime = now;
}
ISFRenderer.prototype.draw = function(destination) {
this.contextState.reset();
this.program.use();
this.setDateUniforms()
var buffers = this.renderBuffers;
for (var i = 0; i < buffers.length; ++i) {
var buffer = buffers[i];
var readTexture = buffer.readTexture();
var loc = this.program.getUniformLocation(buffer.name);
readTexture.bind(loc);
if (buffer.name) {
this.setValue("_" + buffer.name + "_imgSize", [buffer.width, buffer.height]);
this.setValue("_" + buffer.name + "_imgRect", [0, 0, 1, 1]);
this.setValue("_" + buffer.name + "_flip", false);
}
}
var lastTarget = null;
var passes = this.model.passes;
for (var i = 0; i < passes.length; ++i) {
var pass = passes[i];
this.setValue("PASSINDEX", i);
var buffer = pass.buffer;
if (pass.target) {
var w = this.evaluateSize(destination, pass.width);
var h = this.evaluateSize(destination, pass.height);
buffer.setSize(w, h);
var writeTexture = buffer.writeTexture();
this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, buffer.fbo);
this.gl.framebufferTexture2D(this.gl.FRAMEBUFFER, this.gl.COLOR_ATTACHMENT0, this.gl.TEXTURE_2D, writeTexture.texture, 0);
this.setValue("RENDERSIZE", [buffer.width, buffer.height]);
lastTarget = buffer;
this.gl.viewport(0, 0, w, h);
} else {
var renderWidth = destination.width;
var renderHeight = destination.height;
this.gl.bindTexture(this.gl.TEXTURE_2D, null);
this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, null);
this.setValue("RENDERSIZE", [renderWidth, renderHeight]);
lastTarget = null;
this.gl.viewport(0, 0, renderWidth, renderHeight);
}
this.gl.drawArrays(this.gl.TRIANGLES, 0, 6);
this.gl.bindTexture(this.gl.TEXTURE_2D, null);
this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, null);
}
var buffers = this.renderBuffers;
for (var i = 0; i < buffers.length; ++i) {
buffers[i].flip();
}
if (lastTarget) {
return this.paintToScreen(destination, lastTarget);
}
};
ISFRenderer.prototype.evaluateSize = function(destination, formula) {
formula = formula + "";
var s = formula.replace("$WIDTH", destination.offsetWidth).replace("$HEIGHT", destination.offsetHeight);
for (var name in this.uniforms) {
var uniform = this.uniforms[name];
s = s.replace("$" + name, uniform.value);
}
this.math || (this.math = new MathJS);
return this.math["eval"](s);
};
ISFRenderer.prototype.cleanup = function() {
this.contextState.reset();
if (this.renderBuffers) {
for (var i = 0; i < this.renderBuffers.length; ++i) {
this.renderBuffers[i].destroy();
}
}
};
ISFRenderer.prototype.basicVertexShader = "precision mediump float;\nprecision mediump int;\nattribute vec2 position; // -1..1\nvarying vec2 texCoord;\n\nvoid main(void) {\n // Since webgl doesn't support ftransform, we do this by hand.\n gl_Position = vec4(position, 0, 1);\n texCoord = position;\n}\n";
ISFRenderer.prototype.basicFragmentShader = "precision mediump float;\nuniform sampler2D tex;\nvarying vec2 texCoord;\nvoid main()\n{\n gl_FragColor = texture2D(tex, texCoord * 0.5 + 0.5);\n //gl_FragColor = vec4(texCoord.x);\n}";
console.log("I am here")
module.exports = ISFRenderer;
},{"./ISFBuffer.js":1,"./ISFGLProgram.js":2,"./ISFGLState.js":3,"./ISFParser.js":4,"./ISFTexture.js":6,"./math.js":9}],6:[function(require,module,exports){
function ISFTexture(params, contextState) {
if (params == null) {
params = {};
}
this.contextState = contextState;
this.float = params.float;
this.gl = this.contextState.gl;
this.texture = this.gl.createTexture();
this.gl.bindTexture(this.gl.TEXTURE_2D, this.texture);
this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_S, this.gl.CLAMP_TO_EDGE);
this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_T, this.gl.CLAMP_TO_EDGE);
this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MIN_FILTER, this.gl.LINEAR);
this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MAG_FILTER, this.gl.LINEAR);
this.gl.pixelStorei(this.gl.UNPACK_FLIP_Y_WEBGL, true);
this.gl.bindTexture(this.gl.TEXTURE_2D, null);
}
ISFTexture.prototype.bind = function(location) {
if (location == null) {
location = -1;
}
var newTexUnit = this.contextState.newTextureIndex();
this.gl.activeTexture(this.gl.TEXTURE0 + newTexUnit);
this.gl.bindTexture(this.gl.TEXTURE_2D, this.texture);
if (location !== -1) {
this.gl.uniform1i(location, newTexUnit);
}
};
ISFTexture.prototype.setSize = function(w, h) {
if (this.width !== w || this.height !== h) {
this.width = w;
this.height = h;
var pixelType = this.float ? this.gl.FLOAT : this.gl.UNSIGNED_BYTE;
this.gl.bindTexture(this.gl.TEXTURE_2D, this.texture);
this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA, w, h, 0, this.gl.RGBA, pixelType, null);
}
};
ISFTexture.prototype.destroy = function() {
this.gl.deleteTexture(this.texture);
};
module.exports = ISFTexture;
},{}],7:[function(require,module,exports){
var MetadataExtractor = require('./MetadataExtractor')
var ConvertFragment = function(fragShader) {
var metadataInfo = MetadataExtractor(fragShader)
var meta = metadataInfo.objectValue
var persistentBufferNames = meta.PERSISTENT_BUFFERS || []
if (meta.PASSES) {
meta.PASSES.forEach(function(pass) {
if (persistentBufferNames.indexOf(pass.TARGET) != -1) pass.persistent = true
})
}
delete meta.PERSISTENT_BUFFERS
fragShader = fragShader.replace(metadataInfo.stringValue, JSON.stringify(meta, null, 2))
fragShader = fragShader.replace(/vv_FragNormCoord/g, 'isf_FragNormCoord')
return fragShader
}
var ConvertVertex = function(vertShader) {
vertShader = vertShader.replace(/vv_vertShaderInit/g, 'isf_vertShaderInit')
vertShader = vertShader.replace(/vv_FragNormCoord/g, 'isf_FragNormCoord')
return vertShader
}
module.exports = {
convertFragment: ConvertFragment,
convertVertex: ConvertVertex
}
},{"./MetadataExtractor":8}],8:[function(require,module,exports){
module.exports = function(rawFragmentShader) {
// First pull out the comment JSON to get the metadata.
// This regex (should) match quotes in the form /* */.
var regex = /\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/;
var results = regex.exec( rawFragmentShader );
if ( !results ) {
throw "There is no metadata here."
}
var metadataString = results[0];
metadataString = metadataString.substring(1, metadataString.length - 1);
var metadata;
try {
metadata = JSON.parse(metadataString);
} catch (e) {
throw "Something is wrong with your metadata";
}
var startIndex = rawFragmentShader.indexOf("/*")
var endIndex = rawFragmentShader.indexOf("*/")
return {
objectValue: metadata,
stringValue: metadataString,
startIndex: startIndex,
endIndex: endIndex
}
}
},{}],9:[function(require,module,exports){
/**
* math.js
* https://github.com/josdejong/mathjs
*
* Math.js is an extensive math library for JavaScript and Node.js,
* It features real and complex numbers, units, matrices, a large set of
* mathematical functions, and a flexible expression parser.
*
* @version 0.21.1
* @date 2014-05-13
*
* @license
* Copyright (C) 2013-2014 Jos de Jong <wjosdejong@gmail.com>
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy
* of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
!function(e,r){"object"==typeof exports&&"object"==typeof module?module.exports=r(require("crypto")):"function"==typeof define&&define.amd?define(["crypto"],r):"object"==typeof exports?exports.mathjs=r(require("crypto")):e.mathjs=r(e.crypto)}(this,function(e){return function(e){function r(t){if(n[t])return n[t].exports;var i=n[t]={exports:{},id:t,loaded:!1};return e[t].call(i.exports,i,i.exports,r),i.loaded=!0,i.exports}var n={};return r.m=e,r.c=n,r.p="",r(0)}([function(e,r,n){e.exports=n(1)},function(e,r,n){function t(e){if("function"!=typeof Object.create)throw new Error("ES5 not supported by this JavaScript engine. Please load the es5-shim and es5-sham library for compatibility.");var r={},t={matrix:"matrix",number:"number",precision:20,epsilon:1e-14};r.config=function(e){if(e){if(i.deepExtend(t,e),e.precision&&r.type.BigNumber.config({precision:e.precision}),e.number&&e.number.defaultType)throw new Error("setting `number.defaultType` is deprecated. Use `number` instead.");if(e.number&&e.number.precision)throw new Error("setting `number.precision` is deprecated. Use `precision` instead.");if(e.matrix&&e.matrix.defaultType)throw new Error("setting `matrix.defaultType` is deprecated. Use `matrix` instead.");if(e.matrix&&e.matrix["default"])throw new Error("setting `matrix.default` is deprecated. Use `matrix` instead.");if(e.decimals)throw new Error("setting `decimals` is deprecated. Use `precision` instead.")}return i.clone(t)};var o=n(118).constructor();if("function"!=typeof o.prototype.clone&&(o.prototype.clone=function(){return new o(this)}),"function"==typeof o.convert)throw new Error("Cannot add function convert to BigNumber: function already exists");return o.convert=function(e){return digits(e)>15?e:new o(e)},r.error=n(4),r.type={},r.type.Complex=n(5),r.type.Range=n(6),r.type.Index=n(7),r.type.Matrix=n(8),r.type.Unit=n(9),r.type.Help=n(10),r.type.BigNumber=o,r.collection=n(11),r.expression={},r.expression.node=n(14),r.expression.parse=n(12),r.expression.Parser=n(13),r.expression.docs=n(15),n(17)(r,t),n(18)(r,t),n(19)(r,t),n(20)(r,t),n(21)(r,t),n(22)(r,t),n(23)(r,t),n(24)(r,t),n(25)(r,t),n(26)(r,t),n(27)(r,t),n(28)(r,t),n(29)(r,t),n(30)(r,t),n(31)(r,t),n(32)(r,t),n(33)(r,t),n(34)(r,t),n(35)(r,t),n(36)(r,t),n(37)(r,t),n(38)(r,t),n(39)(r,t),n(40)(r,t),n(41)(r,t),n(42)(r,t),n(43)(r,t),n(44)(r,t),n(45)(r,t),n(46)(r,t),n(47)(r,t),n(48)(r,t),n(49)(r,t),n(50)(r,t),n(51)(r,t),n(52)(r,t),n(53)(r,t),n(54)(r,t),n(55)(r,t),n(56)(r,t),n(57)(r,t),n(58)(r,t),n(59)(r,t),n(60)(r,t),n(61)(r,t),n(62)(r,t),n(63)(r,t),n(64)(r,t),n(65)(r,t),n(66)(r,t),n(67)(r,t),n(68)(r,t),n(69)(r,t),n(70)(r,t),n(71)(r,t),n(72)(r,t),n(73)(r,t),n(74)(r,t),n(75)(r,t),n(76)(r,t),n(77)(r,t),n(78)(r,t),n(79)(r,t),n(80)(r,t),n(81)(r,t),n(82)(r,t),n(83)(r,t),n(84)(r,t),n(85)(r,t),n(86)(r,t),n(87)(r,t),n(88)(r,t),n(89)(r,t),n(90)(r,t),n(91)(r,t),n(92)(r,t),n(93)(r,t),n(94)(r,t),n(95)(r,t),n(96)(r,t),n(97)(r,t),n(98)(r,t),n(99)(r,t),n(100)(r,t),n(101)(r,t),n(102)(r,t),n(103)(r,t),n(104)(r,t),n(105)(r,t),n(106)(r,t),n(107)(r,t),n(108)(r,t),n(109)(r,t),n(110)(r,t),n(111)(r,t),n(112)(r,t),n(113)(r,t),n(114)(r,t),n(115)(r,t),n(116)(r,t),n(117)(r,t),n(2)(r,t),r.chaining={},r.chaining.Selector=n(16)(r,t),r.config(e),r}var i=n(3);e.exports=t},function(e,r,n){e.exports=function(e){var r=n(5);e.pi=Math.PI,e.e=Math.E,e.tau=2*Math.PI,e.i=new r(0,1),e.Infinity=1/0,e.NaN=0/0,e["true"]=!0,e["false"]=!1,e.E=Math.E,e.LN2=Math.LN2,e.LN10=Math.LN10,e.LOG2E=Math.LOG2E,e.LOG10E=Math.LOG10E,e.PI=Math.PI,e.SQRT1_2=Math.SQRT1_2,e.SQRT2=Math.SQRT2}},function(e,r){r.clone=function n(e){var r=typeof e;if("number"===r||"string"===r||"boolean"===r||null===e||void 0===e)return e;if("function"==typeof e.clone)return e.clone();if(Array.isArray(e))return e.map(function(e){return n(e)});if(e instanceof Number)return new Number(e.valueOf());if(e instanceof String)return new String(e.valueOf());if(e instanceof Boolean)return new Boolean(e.valueOf());if(e instanceof Date)return new Date(e.valueOf());if(e instanceof RegExp)throw new TypeError("Cannot clone "+e);var t={};for(var i in e)e.hasOwnProperty(i)&&(t[i]=n(e[i]));return t},r.extend=function(e,r){for(var n in r)r.hasOwnProperty(n)&&(e[n]=r[n]);return e},r.deepExtend=function t(e,r){if(Array.isArray(r))throw new TypeError("Arrays are not supported by deepExtend");for(var n in r)if(r.hasOwnProperty(n))if(r[n]&&r[n].constructor===Object)void 0===e[n]&&(e[n]={}),e[n].constructor===Object?t(e[n],r[n]):e[n]=r[n];else{if(Array.isArray(r[n]))throw new TypeError("Arrays are not supported by deepExtend");e[n]=r[n]}return e},r.deepEqual=function(e,n){var t,i,o;if(Array.isArray(e)){if(!Array.isArray(n))return!1;if(e.length!=n.length)return!1;for(i=0,o=e.length;o>i;i++)if(!r.deepEqual(e[i],n[i]))return!1;return!0}if(e instanceof Object){if(Array.isArray(n)||!(n instanceof Object))return!1;for(t in e)if(!r.deepEqual(e[t],n[t]))return!1;for(t in n)if(!r.deepEqual(e[t],n[t]))return!1;return!0}return typeof e==typeof n&&e==n}},function(e,r,n){r.ArgumentsError=n(119),r.DimensionError=n(120),r.IndexError=n(121),r.UnsupportedTypeError=n(122)},function(e,r,n){function t(e,r){if(!(this instanceof t))throw new SyntaxError("Constructor must be called with the new operator");switch(arguments.length){case 0:this.re=0,this.im=0;break;case 1:var n=arguments[0];if("object"==typeof n){if("re"in n&&"im"in n){var i=new t(n.re,n.im);this.re=i.re,this.im=i.im;break}if("r"in n&&"phi"in n){var i=t.fromPolar(n.r,n.phi);this.re=i.re,this.im=i.im;break}}throw new SyntaxError("Object with the re and im or r and phi properties expected.");case 2:if(!h(e)||!h(r))throw new TypeError("Two numbers expected in Complex constructor");this.re=e,this.im=r;break;default:throw new SyntaxError("One, two or three arguments expected in Complex constructor")}}function i(){for(;" "==y||" "==y;)s()}function o(e){return e>="0"&&"9">=e||"."==e}function a(e){return e>="0"&&"9">=e}function s(){w++,y=x.charAt(w)}function u(e){w=e,y=x.charAt(w)}function f(){var e,r="";if(e=w,"+"==y?s():"-"==y&&(r+=y,s()),!o(y))return u(e),null;if("."==y){if(r+=y,s(),!a(y))return u(e),null}else{for(;a(y);)r+=y,s();"."==y&&(r+=y,s())}for(;a(y);)r+=y,s();if("E"==y||"e"==y){if(r+=y,s(),("+"==y||"-"==y)&&(r+=y,s()),!a(y))return u(e),null;for(;a(y);)r+=y,s()}return r}function c(){var e=x.charAt(w+1);if("I"==y||"i"==y)return s(),"1";if(!("+"!=y&&"-"!=y||"I"!=e&&"i"!=e)){var r="+"==y?"1":"-1";return s(),s(),r}return null}var l=n(123),p=n(9),m=l.number,h=l.number.isNumber,g=p.isUnit,d=l.string.isString;t.isComplex=function(e){return e instanceof t};var x,w,y;t.parse=function(e){if(x=e,w=-1,y="",!d(x))return null;s(),i();var r=f();if(r){if("I"==y||"i"==y)return s(),i(),y?null:new t(0,Number(r));i();var n=y;if("+"!=n&&"-"!=n)return i(),y?null:new t(Number(r),0);s(),i();var o=f();if(o){if("I"!=y&&"i"!=y)return null;s()}else if(o=c(),!o)return null;return"-"==n&&(o="-"==o[0]?"+"+o.substring(1):"-"+o),s(),i(),y?null:new t(Number(r),Number(o))}return(r=c())?(i(),y?null:new t(0,Number(r))):null},t.fromPolar=function(){switch(arguments.length){case 1:var e=arguments[0];if("object"==typeof e)return t.fromPolar(e.r,e.phi);throw new TypeError("Input has to be an object with r and phi keys.");case 2:var r=arguments[0],n=arguments[1];if(h(r)){if(g(n)&&n.hasBase(p.BASE_UNITS.ANGLE)&&(n=n.toNumber("rad")),h(n))return new t(r*Math.cos(n),r*Math.sin(n));throw new TypeError("Phi is not a number nor an angle unit.")}throw new TypeError("Radius r is not a number.");default:throw new SyntaxError("Wrong number of arguments in function fromPolar")}},t.prototype.toPolar=function(){return{r:Math.sqrt(this.re*this.re+this.im*this.im),phi:Math.atan2(this.im,this.re)}},t.prototype.clone=function(){return new t(this.re,this.im)},t.prototype.equals=function(e){return this.re===e.re&&this.im===e.im},t.prototype.format=function(e){var r="",n=m.format(this.re,e),t=m.format(this.im,e);return r=0==this.im?n:0==this.re?1==this.im?"i":-1==this.im?"-i":t+"i":this.im>0?1==this.im?n+" + i":n+" + "+t+"i":-1==this.im?n+" - i":n+" - "+t.substring(1)+"i"},t.prototype.toString=function(){return this.format()},e.exports=t},function(e,r,n){function t(e,r,n){if(!(this instanceof t))throw new SyntaxError("Constructor must be called with the new operator");if(null!=e&&!o.isNumber(e))throw new TypeError("Parameter start must be a number");if(null!=r&&!o.isNumber(r))throw new TypeError("Parameter end must be a number");if(null!=n&&!o.isNumber(n))throw new TypeError("Parameter step must be a number");this.start=null!=e?parseFloat(e):0,this.end=null!=r?parseFloat(r):0,this.step=null!=n?parseFloat(n):1}{var i=n(123),o=i.number,a=i.string;i.array}t.parse=function(e){if(!a.isString(e))return null;var r=e.split(":"),n=r.map(function(e){return parseFloat(e)}),i=n.some(function(e){return isNaN(e)});if(i)return null;switch(n.length){case 2:return new t(n[0],n[1]);case 3:return new t(n[0],n[2],n[1]);default:return null}},t.prototype.clone=function(){return new t(this.start,this.end,this.step)},t.isRange=function(e){return e instanceof t},t.prototype.size=function(){var e=0,r=this.start,n=this.step,t=this.end,i=t-r;return o.sign(n)==o.sign(i)?e=Math.ceil(i/n):0==i&&(e=0),isNaN(e)&&(e=0),[e]},t.prototype.min=function(){var e=this.size()[0];return e>0?this.step>0?this.start:this.start+(e-1)*this.step:void 0},t.prototype.max=function(){var e=this.size()[0];return e>0?this.step>0?this.start+(e-1)*this.step:this.start:void 0},t.prototype.forEach=function(e){var r=this.start,n=this.step,t=this.end,i=0;if(n>0)for(;t>r;)e(r,i,this),r+=n,i++;else if(0>n)for(;r>t;)e(r,i,this),r+=n,i++},t.prototype.map=function(e){var r=[];return this.forEach(function(n,t,i){r[t]=e(n,t,i)}),r},t.prototype.toArray=function(){var e=[];return this.forEach(function(r,n){e[n]=r}),e},t.prototype.valueOf=function(){return this.toArray()},t.prototype.format=function(e){var r=o.format(this.start,e);return 1!=this.step&&(r+=":"+o.format(this.step,e)),r+=":"+o.format(this.end,e)},t.prototype.toString=function(){return this.format()},e.exports=t},function(e,r,n){function t(){if(!(this instanceof t))throw new SyntaxError("Constructor must be called with the new operator");this._ranges=[];for(var e=0,r=arguments.length;r>e;e++){var n=arguments[e];if(n instanceof a)this._ranges.push(n);else if(c(n))this._ranges.push(i(n));else{if(!u(n))throw new TypeError("Ranges must be an Array, Number, or Range");this._ranges.push(i([n,n+1]))}}}function i(e){for(var r=e.length,n=0;r>n;n++)if(!u(e[n])||!f(e[n]))throw new TypeError("Index parameters must be integer numbers");switch(e.length){case 2:return new a(e[0],e[1]);case 3:return new a(e[0],e[1],e[2]);default:throw new SyntaxError("Wrong number of arguments in Index (2 or 3 expected)")}}{var o=n(123),a=n(6),s=o.number,u=s.isNumber,f=s.isInteger,c=Array.isArray;o.array.validateIndex}t.prototype.clone=function(){var e=new t;return e._ranges=o.object.clone(this._ranges),e},t.isIndex=function(e){return e instanceof t},t.create=function(e){var r=new t;return t.apply(r,e),r},t.prototype.size=function l(){for(var l=[],e=0,r=this._ranges.length;r>e;e++){var n=this._ranges[e];l[e]=n.size()[0]}return l},t.prototype.max=function(){for(var e=[],r=0,n=this._ranges.length;n>r;r++){var t=this._ranges[r];e[r]=t.max()}return e},t.prototype.min=function(){for(var e=[],r=0,n=this._ranges.length;n>r;r++){var t=this._ranges[r];e[r]=t.min()}return e},t.prototype.forEach=function(e){for(var r=0,n=this._ranges.length;n>r;r++)e(this._ranges[r],r,this)},t.prototype.range=function(e){return this._ranges[e]||null},t.prototype.isScalar=function(){for(var e=this.size(),r=0,n=e.length;n>r;r++)if(1!==e[r])return!1;return!0},t.prototype.toArray=function(){for(var e=[],r=0,n=this._ranges.length;n>r;r++){var t=this._ranges[r],i=[],o=t.start,a=t.end,s=t.step;if(s>0)for(;a>o;)i.push(o),o+=s;else if(0>s)for(;o>a;)i.push(o),o+=s;e.push(i)}return e},t.prototype.valueOf=t.prototype.toArray,t.prototype.toString=function(){for(var e=[],r=0,n=this._ranges.length;n>r;r++){var t=this._ranges[r],i=s.format(t.start);1!=t.step&&(i+=":"+s.format(t.step)),i+=":"+s.format(t.end),e.push(i)}return"["+e.join(", ")+"]"},e.exports=t},function(e,r,n){function t(e){if(!(this instanceof t))throw new SyntaxError("Constructor must be called with the new operator");if(e instanceof t)this._data=e.clone()._data;else if(d(e))this._data=f(e);else{if(null!=e)throw new TypeError("Unsupported type of data ("+c.types.type(e)+")");this._data=[]}this._size=h.size(this._data)}function i(e,r){if(!(r instanceof p))throw new TypeError("Invalid index");var n=r.isScalar();if(n)return e.get(r.min());var i=r.size();if(i.length!=e._size.length)throw new l(i.length,e._size.length);for(var a=new t(o(e._data,r,i.length,0));d(a._data)&&1==a._data.length;)a._data=a._data[0],a._size.shift();return a}function o(e,r,n,t){var i=t==n-1,a=r.range(t);return a.map(i?function(r){return x(r,e.length),e[r]}:function(i){x(i,e.length);var a=e[i];return o(a,r,n,t+1)})}function a(e,r,n,i){if(!(r instanceof p))throw new TypeError("Invalid index");var o,a=r.size(),f=r.isScalar();if(n instanceof t?(o=n.size(),n=n.valueOf()):o=h.size(n),f){if(0!=o.length)throw new TypeError("Scalar expected");e.set(r.min(),n,i)}else{if(a.length<e._size.length)throw new l(a.length,e._size.length,"<");for(var c=0,m=a.length-o.length;m>c;c++)n=[n],o.unshift(1);if(!g.deepEqual(a,o))throw new l(a,o);var d=r.max().map(function(e){return e+1});u(e,d,i);var x=a.length,w=0;s(e._data,r,n,x,w)}return e}function s(e,r,n,t,i){var o=i==t-1,a=r.range(i);a.forEach(o?function(r,t){x(r),e[r]=n[t]}:function(o,a){x(o),s(e[o],r,n[a],t,i+1)})}function u(e,r,n){for(var t=g.clone(e._size),i=!1;t.length<r.length;)t.unshift(0),i=!0;for(var o=0,a=r.length;a>o;o++)r[o]>t[o]&&(t[o]=r[o],i=!0);i&&e.resize(t,n)}function f(e){for(var r=0,n=e.length;n>r;r++){var i=e[r];d(i)?e[r]=f(i):i instanceof t&&(e[r]=f(i._data))}return e}var c=n(123),l=n(120),p=n(7),m=(c.number,c.string),h=c.array,g=c.object,d=Array.isArray,x=h.validateIndex;t.isMatrix=function(e){return e instanceof t},t.prototype.subset=function(e,r,n){switch(arguments.length){case 1:return i(this,e);case 2:case 3:return a(this,e,r,n);default:throw new SyntaxError("Wrong number of arguments")}},t.prototype.get=function(e){if(!d(e))throw new TypeError("Array expected");if(e.length!=this._size.length)throw new l(e.length,this._size.length);for(var r=this._data,n=0,t=e.length;t>n;n++){var i=e[n];x(i,r.length),r=r[i]}return g.clone(r)},t.prototype.set=function(e,r,n){var t,i;if(!d(e))throw new Error("Array expected");if(e.length<this._size.length)throw new l(e.length,this._size.length,"<");var o=e.map(function(e){return e+1});u(this,o,n);var a=this._data;for(t=0,i=e.length-1;i>t;t++){var s=e[t];x(s,a.length),a=a[s]}return s=e[e.length-1],x(s,a.length),a[s]=r,this},t.prototype.resize=function(e,r){return this._size=g.clone(e),this._data=h.resize(this._data,this._size,r),this},t.prototype.clone=function(){var e=new t;return e._data=g.clone(this._data),e._size=g.clone(this._size),e},t.prototype.size=function(){return this._size},t.prototype.map=function(e){var r=this,n=new t,i=[],o=function(n,t){return d(n)?n.map(function(e,r){return i[t]=r,o(e,t+1)}):e(n,i,r)};return n._data=o(this._data,0),n._size=g.clone(this._size),n},t.prototype.forEach=function(e){var r=this,n=[],t=function(i,o){d(i)?i.forEach(function(e,r){n[o]=r,t(e,o+1)}):e(i,n,r)};t(this._data,0)},t.prototype.toArray=function(){return g.clone(this._data)},t.prototype.valueOf=function(){return this._data},t.prototype.format=function(e){return m.format(this._data,e)},t.prototype.toString=function(){return m.format(this._data)},e.exports=t},function(e,r,n){function t(e,r){if(!(this instanceof t))throw new Error("Constructor must be called with the new operator");if(null!=e&&!w(e))throw new TypeError("First parameter in Unit constructor must be a number");if(null!=r&&(!y(r)||""==r))throw new TypeError("Second parameter in Unit constructor must be a string");if(null!=r){var n=l(r);if(!n)throw new SyntaxError('Unknown unit "'+r+'"');this.unit=n.unit,this.prefix=n.prefix}else this.unit=UNIT_NONE,this.prefix=b;null!=e?(this.value=this._normalize(e),this.fixPrefix=!1):(this.value=null,this.fixPrefix=!0)}function i(){for(;" "==h||" "==h;)s()}function o(e){return e>="0"&&"9">=e||"."==e}function a(e){return e>="0"&&"9">=e}function s(){m++,h=p.charAt(m)}function u(e){m=e,h=p.charAt(m)}function f(){var e,r="";if(e=m,"+"==h?s():"-"==h&&(r+=h,s()),!o(h))return u(e),null;if("."==h){if(r+=h,s(),!a(h))return u(e),null}else{for(;a(h);)r+=h,s();"."==h&&(r+=h,s())}for(;a(h);)r+=h,s();if("E"==h||"e"==h){if(r+=h,s(),("+"==h||"-"==h)&&(r+=h,s()),!a(h))return u(e),null;for(;a(h);)r+=h,s()}return r}function c(){var e="";for(i();h&&" "!=h&&" "!=h;)e+=h,s();return e||null}function l(e){for(var r in N)if(N.hasOwnProperty(r)&&x.endsWith(e,r)){var n=N[r],t=e.length-r.length,i=e.substring(0,t),o=n.prefixes[i];if(void 0!==o)return{unit:n,prefix:o}}return null}var p,m,h,g=n(123),d=g.number,x=g.string,w=g.number.isNumber,y=g.string.isString;t.parse=function(e){if(p=e,m=-1,h="",!y(p))return null;s(),i();var r,n=f();if(n){if(r=c(),s(),i(),h)return null;if(n&&r)try{return new t(Number(n),r)}catch(o){}}else{if(r=c(),s(),i(),h)return null;if(r)try{return new t(null,r)}catch(o){}}return null},t.isUnit=function(e){return e instanceof t},t.prototype.clone=function(){var e=new t;for(var r in this)this.hasOwnProperty(r)&&(e[r]=this[r]);return e},t.prototype._normalize=function(e){return(e+this.unit.offset)*this.unit.value*this.prefix.value},t.prototype._unnormalize=function(e,r){return void 0==r?e/this.unit.value/this.prefix.value-this.unit.offset:e/this.unit.value/r-this.unit.offset},t.isValuelessUnit=function(e){return null!=l(e)},t.prototype.hasBase=function(e){return this.unit.base===e},t.prototype.equalBase=function(e){return this.unit.base===e.unit.base},t.prototype.equals=function(e){return this.equalBase(e)&&this.value==e.value},t.prototype.to=function(e){var r;if(y(e)){if(r=new t(null,e),!this.equalBase(r))throw new Error("Units do not match");return r.value=this.value,r}if(e instanceof t){if(!this.equalBase(e))throw new Error("Units do not match");if(null!=e.value)throw new Error("Cannot convert to a unit with a value");return r=e.clone(),r.value=this.value,r.fixPrefix=!0,r}throw new Error("String or Unit expected as parameter")},t.prototype.toNumber=function(e){var r=this.to(e);return r._unnormalize(r.value,r.prefix.value)},t.prototype.toString=function(){return this.format()},t.prototype.format=function(e){var r,n;if(this.fixPrefix)r=this._unnormalize(this.value),n=null!=this.value?d.format(r,e)+" ":"",n+=this.prefix.name+this.unit.name;else{var t=this._bestPrefix();r=this._unnormalize(this.value,t.value),n=d.format(r,e)+" ",n+=t.name+this.unit.name}return n},t.prototype._bestPrefix=function(){var e=Math.abs(this.value/this.unit.value),r=b,n=Math.abs(Math.log(e/r.value)/Math.LN10-1.2),t=this.unit.prefixes;for(var i in t)if(t.hasOwnProperty(i)){var o=t[i];if(o.scientific){var a=Math.abs(Math.log(e/o.value)/Math.LN10-1.2);n>a&&(r=o,n=a)}}return r};var v={NONE:{"":{name:"",value:1,scientific:!0}},SHORT:{"":{name:"",value:1,scientific:!0},da:{name:"da",value:10,scientific:!1},h:{name:"h",value:100,scientific:!1},k:{name:"k",value:1e3,scientific:!0},M:{name:"M",value:1e6,scientific:!0},G:{name:"G",value:1e9,scientific:!0},T:{name:"T",value:1e12,