From 458d0e61cc51ba8e6ea54ed725140a210530da55 Mon Sep 17 00:00:00 2001 From: So8res Date: Sun, 27 Jan 2013 01:47:18 -0800 Subject: [PATCH 1/5] updated ShaderGraph --- vendor/ShaderGraph.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/ShaderGraph.js b/vendor/ShaderGraph.js index 43134b2..59f6e83 160000 --- a/vendor/ShaderGraph.js +++ b/vendor/ShaderGraph.js @@ -1 +1 @@ -Subproject commit 43134b212f161bfdbd71185d33bb7cc7aaa0f96f +Subproject commit 59f6e83dbe4f42cb93d72a284d9b772d11b41102 From 807e785e64ca29936265cdb10bba772c823cf947 Mon Sep 17 00:00:00 2001 From: So8res Date: Sun, 27 Jan 2013 01:47:57 -0800 Subject: [PATCH 2/5] Added linear easing to animations. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Very useful when you want to create e.g. a continuous rotating graph. Now you can do: var n = 0; var duration = 1000; var spin = function() { mathbox.animate('surface', { worldRotation: [0, 0, n++ * τ] }, { duration: duration, ease: 'linear' }); setTimeout(spin, duration); }; spin(); For a continuous spin. I'd still like to see better support for this, but full support would require allowing properties (such as worldRotation above) to be functions that return the new result instead of being values. --- src/Animator.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Animator.js b/src/Animator.js index 34ee1e7..e620070 100644 --- a/src/Animator.js +++ b/src/Animator.js @@ -286,6 +286,9 @@ MathBox.Animator.Animation.prototype = { case 'out': rolloff = fraction * fraction; break; + case 'linear': + roloff = fraction; + break; default: rolloff = .5-.5*Math.cos(fraction * π); break; From 9701cb4afd47c4336bb3b502663742e39560dee4 Mon Sep 17 00:00:00 2001 From: So8res Date: Sun, 27 Jan 2013 01:58:29 -0800 Subject: [PATCH 3/5] updated builds --- build/MathBox-bundle.js | 3 + build/MathBox-bundle.min.js | 4 +- build/MathBox-core.js | 3 + build/MathBox-core.min.js | 4 +- build/MathBox.js | 3 + build/MathBox.min.js | 106 ++++++++++++++++++------------------ 6 files changed, 66 insertions(+), 57 deletions(-) diff --git a/build/MathBox-bundle.js b/build/MathBox-bundle.js index 6d0085e..6e3c213 100644 --- a/build/MathBox-bundle.js +++ b/build/MathBox-bundle.js @@ -42989,6 +42989,9 @@ MathBox.Animator.Animation.prototype = { case 'out': rolloff = fraction * fraction; break; + case 'linear': + roloff = fraction; + break; default: rolloff = .5-.5*Math.cos(fraction * π); break; diff --git a/build/MathBox-bundle.min.js b/build/MathBox-bundle.min.js index 2147abc..3c70b9c 100644 --- a/build/MathBox-bundle.min.js +++ b/build/MathBox-bundle.min.js @@ -1193,8 +1193,8 @@ MathBox.Animator.Delay.prototype={init:function(a){this.start=MathBox.Animator.n MathBox.Animator.Animation=function(a,b,c,d,e,f){this.object=a;this.key=b;this.from=null;this.to=c;this.duration=d;this.fraction=this.start=0;this.callback=e;this.ease=f}; MathBox.Animator.Animation.prototype={init:function(a){this.start=MathBox.Animator.now-(a||0);null===this.from&&(this.from=this.object.get(this.key));void 0===this.from&&(this.from=0)},apply:function(a){function b(a,d){void 0===d&&(d=a);void 0===a&&(a=d);if(d===a)return a;if(typeof a!=typeof d)throw console.log(c,e),"Data type mismatch between from/to values in animator. "+e+": "+a+" ("+a.constructor+"), "+d+"("+d.constructor+")";var f;switch(typeof d){default:case "string":throw"Unimplemented value type in animator. ("+ typeof d+")";case "function":return function(){return b(a.apply(this,arguments),d.apply(this,arguments))};case "boolean":return 0.5s;++s)f.elements[s]=a.elements[s]+(d.elements[s]-a.elements[s])*h;return f}return d.constructor==THREE.Vector3?(f=new THREE.Vector3,f.x= -a.x+(d.x-a.x)*h,f.y=a.y+(d.y-a.y)*h,f.z=a.z+(d.z-a.z)*h,f):d.constructor==THREE.Color?(f=new THREE.Color,f.r=a.r+(d.r-a.r)*h,f.g=a.g+(d.g-a.g)*h,f.b=a.b+(d.b-a.b)*h,f):0.5l;++l)f.elements[l]=a.elements[l]+(d.elements[l]-a.elements[l])*h;return f}return d.constructor==THREE.Vector3?(f=new THREE.Vector3,f.x= -a.x+(d.x-a.x)*h,f.y=a.y+(d.y-a.y)*h,f.z=a.z+(d.z-a.z)*h,f):d.constructor==THREE.Color?(f=new THREE.Color,f.r=a.r+(d.r-a.r)*h,f.g=a.g+(d.g-a.g)*h,f.b=a.b+(d.b-a.b)*h,f):0.5]*type=['"]text\/javascript['"][^>]*>([\s\S]+?)<\/script>$/m))?(b=document.createElement("script"),b.type="text/javascript",b.innerHTML=e[1],document.body.appendChild(b)):(e=document.createElement("div"),e.innerHTML=b,document.body.appendChild(e));console.log("Loaded HTML ",a);c()})}; ThreeBox.preload.image=function(a,b,c){THREE.ImageUtils.loadTexture(a,null,function(d){var e={};e[b]=d;console.log("Loaded texture ",a);c(e)})};ThreeBox.preload.audio=function(a,b,c){var d=new XMLHttpRequest;d.open("GET",a,!0);d.responseType="arraybuffer";d.onload=function(){var e={};e[b]=d.response;console.log("Loaded audio ",a);c(e)};d.send()};(function(a){for(var b in a)if(!window[b])throw"Error: ThreeRTT requires "+a[b];})({THREE:"Three.js"});window.ThreeRTT=window.ThreeRTT||{}; ThreeRTT.getShader=function(a){var b=document.getElementById(a);return b&&b.innerText||a};_.loop=function(a,b){for(var c=0;c=this.stack.length)throw"Popping factory stack too far.";this.next();this.stack.shift();var a=this.stack.shift(),c=this.stack[0];_.each(a.start,function(a){_.each(c.end,function(b){b.connect(a,!0)})});c.end=a.end;return this},end:function(){var b=this.graph;this.graph=new a.Graph;this.stack=[];this.group();b&&(b.compile=function(){return b.tail().owner().compile()});return b}}})(ShaderGraph); @@ -69,36 +69,36 @@ samplerCube:0};a.Snippet.prototype={compile:function(a,c,d){var e=this.signature return f.join(";\n")},arguments:function(){return{uniforms:this.uniforms,varyings:this.varyings,attributes:this.attributes,parameters:this.parameters}},type:function(b,c){b=(a.Snippet.types[b]||"f")+(c?"v":"");return"fv"==b?"fv1":b},parseAttribute:function(a){var c=a[1];this.attributes.push({name:a[3],type:this.type(a[2],a[4]),signature:c})},parseUniform:function(b){var c=b[1],d=b[2];this.uniforms.push({name:b[3],type:this.type(d,b[4]),value:a.Snippet.defaults[d]||0,signature:c})},parseVarying:function(a){var c= a[1];this.varyings.push({name:a[3],type:this.type(a[2],a[4]),signature:c})},parseSignature:function(b){this.name=b[1];var c=b[2].replace(/^\s*$/g,"");0==c.length?this.signature=[]:(arguments=this.signature=c.split(","),_.each(arguments,function(b){b=/((?:(in|out|inout)\s+)?([A-Za-z0-9]+)\s+([A-Za-z0-9_]+)\s*(?:\[([^\]]+)\])?)(?:$|(?=;))/.exec(b);var c=b[1];this.parameters.push({inout:{"in":a.IN,out:a.OUT,inout:a.INOUT}[b[2]||"in"],name:b[4],type:this.type(b[3],b[5]),signature:c})}.bind(this)))},parseCode:function(a){function c(a, b){if(!a.global)throw"Can't findAll non-global regexp";for(var c,d=[];c=a.exec(b);)d.push(c);return d}a=a.replace(/\r\n?/g,"\n").replace(/\/\/[^\n]*\n/g," ").replace(/\/\*(.|\n)*?\*\//g," ");var d=c(/(?:^|;)\s*attribute\s+(([A-Za-z0-9]+)\s+([A-Za-z0-9_]+)\s*(?:\[([^\]]+)\])?)(?:$|(?=;))/g,a),e=c(/(?:^|;)\s*uniform\s+(([A-Za-z0-9]+)\s+([A-Za-z0-9_]+)\s*(?:\[([^\]]+)\])?)(?:$|(?=;))/g,a),f=c(/(?:^|;)\s*varying\s+(([A-Za-z0-9]+)\s+([[A-Za-z0-9_]+)\s*(?:\[([^\]]+)\])?)(?:$|(?=;))/g,a),j=c(/(?:^|;)\s*void\s+([A-Za-z0-9]+)\s*\(([^\)]*)\)\s*{/g, -a);if(!j[0])throw"Could not parse shader snippet. Must contain a void-returning function with in/outs: "+a;var g=a;_.each({parseAttribute:d,parseUniform:e,parseVarying:f},function(a,b){_.each(a,function(a){this[b](a);g=g.replace(a[0],"")}.bind(this))}.bind(this));g=g.replace(/^\s*;/,"");this.parseSignature(j[0]);this.body=g}}})(ShaderGraph); +a);if(!j[0])throw"Could not parse shader snippet. Must contain a void-returning function with in/outs: "+a;var h=a;_.each({parseAttribute:d,parseUniform:e,parseVarying:f},function(a,b){_.each(a,function(a){this[b](a);h=h.replace(a[0],"")}.bind(this))}.bind(this));h=h.replace(/^\s*;/,"");this.parseSignature(j[0]);this.body=h}}})(ShaderGraph); (function(a){a.Graph=function(a,c){this.parent=c||null;this.nodes=[];a&&this.add(a)};a.Graph.prototype={iterate:function(a){_.each(this.nodes,function(c){a(c,c._owner)})},exposed:function(){var a=[];this.iterate(function(c){_.each(c.outlets(),function(c){c.exposed&&a.push(c)})});return a},inputs:function(){var a=[];this.iterate(function(c){_.each(c.inputs,function(c){null==c.input&&a.push(c)})});return a},outputs:function(){var a=[];this.iterate(function(c){_.each(c.outputs,function(c){0==c.output.length&& a.push(c)})});return a},tail:function(){return this.nodes[this.nodes.length-1]},add:function(a){if(a.constructor==Array)return _.each(a,function(a){this.add(a)}.bind(this));if(a.graph)throw"Adding node to two graphs at once";a.link(this);this.nodes.push(a)},remove:function(a,c){var d=this;if(a.constructor==Array)return _.each(a,function(a){d.remove(a)});if(a.graph!=this)throw"Removing node from wrong graph.";c||a.disconnect();this.nodes.splice(this.nodes.indexOf(a),1)}};a.IN=0;a.OUT=1;a.INOUT=2})(ShaderGraph); (function(a){a.Node=function(a,c){this.graph=null;this.inputs=[];this.outputs=[];this._outlets={};this.owner(a);this.outlets(c)};a.Node.prototype={owner:function(a){return void 0!==a?(this._owner=a,this):this._owner},link:function(a){this.graph=a},getIn:function(b){return this.get(b,a.IN)},getOut:function(b){return this.get(b,a.OUT)},get:function(b,c){return void 0===c?this.get(b,a.IN)||this.get(b,a.OUT):this._outlets[[b,c].join("-")]},key:function(a){return[a.name,a.inout].join("-")},outlets:function(b){if(void 0!== b){var c={};_.each(b,function(a){c[[a.name,a.inout,a.type].join("-")]=!0}.bind(this));_.each(this._outlets,function(a){c[[a.name,a.inout,a.type].join("-")]||this.remove(a)}.bind(this));_.each(b,function(b){var c=this.get(b.name,b.inout);c?c.morph(b):(b=new a.Outlet(b),this.add(b))}.bind(this));return this}return this._outlets},add:function(b){var c=this.key(b);outlets=this._outlets;_in=this.inputs;_out=this.outputs;if(b.node)throw"Adding outlet to two nodes at once.";if(outlets[c])throw"Adding two identical outlets to same node."; b.link(this);outlets[c]=b;(b.inout==a.IN?_in:_out).push(b);return this},remove:function(b){var c=this._outlets,d=this.key(b),e=b.inout==a.IN?this.inputs:this.outputs;if(b.node!=this)throw"Removing outlet from wrong node.";b.disconnect();b.link(null);delete c[d];e.splice(e.indexOf(b),1);return this},connect:function(a,c,d){var e={},f={};_.each(a.inputs,function(a){if(d||!a.input){var b=a.type,c=[b,a.hint].join("-");f[c]||(f[c]=a);e[b]=e[b]||[];e[b].push(a)}});_.each(this.outputs,function(a){if(!c|| !a.output.length){var b=a.type,d=[b,a.hint].join("-");f[d]?(f[d].connect(a),delete f[d],e[b].splice(e[b].indexOf(a),1)):e[b]&&e[b].length&&e[b].shift().connect(a)}});return this},disconnect:function(){_.each(this.inputs,function(a){a.disconnect()});_.each(this.outputs,function(a){a.disconnect()});return this}}})(ShaderGraph); -(function(a){a.Outlets=0;a.Outlet=function(b,c,d,e,f,j,g){if("object"==typeof b)return new a.Outlet(b.inout,b.name,b.hint,b.type,b.category,b.exposed);this.node=null;this.inout=b;this.name=c;this.hint=d||c;this.type=e;this.category=f;this.exposed=!!j;this.meta=g||{};this.index=++a.Outlets;this.input=this.key=null;this.output=[]};a.Outlet.prototype={id:function(){return["_sg",this.name,this.index].join("_")},expose:function(a){this.exposed=a},morph:function(a){this.inout=a.inout;this.name=a.name;this.type= +(function(a){a.Outlets=0;a.Outlet=function(b,c,d,e,f,j,h){if("object"==typeof b)return new a.Outlet(b.inout,b.name,b.hint,b.type,b.category,b.exposed);this.node=null;this.inout=b;this.name=c;this.hint=d||c;this.type=e;this.category=f;this.exposed=!!j;this.meta=h||{};this.index=++a.Outlets;this.input=this.key=null;this.output=[]};a.Outlet.prototype={id:function(){return["_sg",this.name,this.index].join("_")},expose:function(a){this.exposed=a},morph:function(a){this.inout=a.inout;this.name=a.name;this.type= a.type;this.category=a.category;this.exposed=a.exposed;this.meta=a.meta||{}},connect:function(b){if(this.inout==a.IN&&b.inout==a.OUT)return b.connect(this);if(this.inout!=a.OUT||b.inout!=a.IN)throw console.log(this,b),"Can't connect out/out or in/in outlets.";b.input!=this&&(b.disconnect(),b.input=this,this.output.push(b))},disconnect:function(b){if(this.inout==a.IN)this.input&&this.input.disconnect(this);else if(b){var c=this.output.indexOf(b);0<=c&&(this.output.splice(c,1),b.input=null)}else _.each(this.output, function(a){a.input=null}),this.output=[]},link:function(a){this.node=a}}})(ShaderGraph);\u03c0=Math.PI;\u03c4=2*\u03c0;(function(a){for(var b in a)if(!window[b])throw"Error: MathBox requires "+a[b];})({THREE:"Three.js",tQuery:"tQuery.js (bundle)",ThreeBox:"ThreeBox.js",ThreeRTT:"ThreeRTT.js"});window.MathBox={};window.mathBox=function(a,b){a&&!(a instanceof Node)&&(b=a,a=null);return tQuery.createWorld(b).mathBox(a,b)}; MathBox.getShader=function(a){var b=document.getElementById(a);return b&&(b.innerText||b.textContent)||a};Math.sign=function(a){return 0a?-1:0};MathBox.Attributes=function(){}; -MathBox.Attributes.prototype={get:function(a){return void 0===a?this.__attributes||{}:!this.__attributes?void 0:this.__attributes[a]},set:function(a,b){function c(a,b){try{b=g(a,b),d[a]=b,f[a]=b}catch(c){throw"Exception setting '"+a+"' to '"+b+"': "+c;}}this.__attributes||(this.__attributes={});this.__validators||(this.__validators={});var d={},e=this.__validators,f=this.__attributes,j=this,g=function(a,b){if(void 0===e[a]){var c="validate"+a.charAt(0).toUpperCase()+a.slice(1);e[a]=j[c]||!1}return e[a]? +MathBox.Attributes.prototype={get:function(a){return void 0===a?this.__attributes||{}:!this.__attributes?void 0:this.__attributes[a]},set:function(a,b){function c(a,b){try{b=h(a,b),d[a]=b,f[a]=b}catch(c){throw"Exception setting '"+a+"' to '"+b+"': "+c;}}this.__attributes||(this.__attributes={});this.__validators||(this.__validators={});var d={},e=this.__validators,f=this.__attributes,j=this,h=function(a,b){if(void 0===e[a]){var c="validate"+a.charAt(0).toUpperCase()+a.slice(1);e[a]=j[c]||!1}return e[a]? e[a].call(this,b):b}.bind(this);void 0===a||null===a||(a.constructor==String?c(a,b):_.each(a,function(a,b){c(b,a)}),this.emit("change",d))}};MicroEvent.mixin(MathBox.Attributes);MathBox.Attributes.mixin=function(a){_.each(["get","set","on","emit"],function(b){a.prototype[b]=MathBox.Attributes.prototype[b]})};MathBox.Animator=function(){this.active=[]};MathBox.Animator.now=1; MathBox.Animator.prototype={finalState:function(a){var b=_.extend({},a.get());a.__queue&&_.each(a.__queue,function(a,d){_.each(a,function(a){a.to&&(b[d]=a.to)})});return b},attach:function(a){if(!a.__queue){if(!a.__attributes)throw"Cannot attach to object without attributes";var b=this,c=a.set;a.set=function(a,e,f){if(!f){f=a;if(void 0===a||null===a)return;a.constructor==String&&(f={},f[a]=e);b.stop(this,f)}c.call(this,a,e)};a.__queue={};a.__animations=0}},hurry:function(a,b,c){c=c||4;_.each(b||a.__queue, function(b,e){_.each(a.__queue[e],function(a){a.hurry(c)})}.bind(this))},stop:function(a,b){_.each(b||a.__queue,function(b,d){for(;a.__queue[d];)this.dequeue(a,d,!0)}.bind(this))},animate:function(a,b,c){c=_.extend({duration:300},c||{});this.attach(a);_.each(b,function(b,e){var f=a.__queue[e]=a.__queue[e]||[];if(c.delay){var j=new MathBox.Animator.Delay(a,e,c.delay);f.push(j);0==a.__animations++&&this.active.push(a)}a.__validators[e]&&(b=a.__validators[e].call(a,b));j=new MathBox.Animator.Animation(a, -e,b,c.duration,c.callback,c.ease);f.push(j);0==a.__animations++&&this.active.push(a)}.bind(this))},dequeue:function(a,b,c){var d=a.__queue[b];if(d){var e=d.shift();0==d.length&&delete a.__queue[b];c&&e.skip();0==--a.__animations&&this.active.splice(this.active.indexOf(a),1)}},update:function(a){MathBox.Animator.now+=a;a=this.active.slice();_.each(a,function(a){var c=0;_.each(a.__queue,function e(f,j){var g=f[0];value=g.apply(c||0);g.done()&&(c=g.extra(),this.dequeue(a,j),f[0]&&e.call(this,f,j))}.bind(this))}.bind(this))}}; +e,b,c.duration,c.callback,c.ease);f.push(j);0==a.__animations++&&this.active.push(a)}.bind(this))},dequeue:function(a,b,c){var d=a.__queue[b];if(d){var e=d.shift();0==d.length&&delete a.__queue[b];c&&e.skip();0==--a.__animations&&this.active.splice(this.active.indexOf(a),1)}},update:function(a){MathBox.Animator.now+=a;a=this.active.slice();_.each(a,function(a){var c=0;_.each(a.__queue,function e(f,j){var h=f[0];value=h.apply(c||0);h.done()&&(c=h.extra(),this.dequeue(a,j),f[0]&&e.call(this,f,j))}.bind(this))}.bind(this))}}; MathBox.Animator.Delay=function(a,b,c){this.object=a;this.key=b;this.duration=c;this.fraction=this.start=0}; MathBox.Animator.Delay.prototype={init:function(a){this.start=MathBox.Animator.now-(a||0)},apply:function(a){this.start||this.init(a);this.fraction=0l;++l)f.elements[l]=a.elements[l]+(d.elements[l]-a.elements[l])*g;return f}return d.constructor==THREE.Vector3?(f=new THREE.Vector3,f.x= -a.x+(d.x-a.x)*g,f.y=a.y+(d.y-a.y)*g,f.z=a.z+(d.z-a.z)*g,f):d.constructor==THREE.Color?(f=new THREE.Color,f.r=a.r+(d.r-a.r)*g,f.g=a.g+(d.g-a.g)*g,f.b=a.b+(d.b-a.b)*g,f):0.5l;++l)f.elements[l]=a.elements[l]+(d.elements[l]-a.elements[l])*h;return f}return d.constructor==THREE.Vector3?(f=new THREE.Vector3,f.x= +a.x+(d.x-a.x)*h,f.y=a.y+(d.y-a.y)*h,f.z=a.z+(d.z-a.z)*h,f):d.constructor==THREE.Color?(f=new THREE.Color,f.r=a.r+(d.r-a.r)*h,f.g=a.g+(d.g-a.g)*h,f.b=a.b+(d.b-a.b)*h,f):0.5a.length)return{};var c=a[0];a=b.finalState(c);c.style&&(b=b.finalState(c.style),a.style=b);return a},transition:function(a){return void 0!==a?(this._transition=a,this):this._transition},speed:function(a){return void 0!==a?(this._speed=a,this):this._speed},animateOptions:function(a,b){var c=this._transition;!0===a&&(a={});if(c||b||a&&(a.delay||a.duration))a=_.extend({delay:0,duration:c||300},a||{});if(a&&(a.delay||a.duration))return a}, animate:function(a,b,c){var d=this.animator;b=this.extractStyle(b);c=this.animateOptions(c,!0);b.style&&(_.each(this.select(a),function(a){d.animate(a.style,b.style,c)}),b=_.extend({},b),delete b.style);_.each(this.select(a),function(a){d.animate(a,b,c)});return this},clone:function(a,b,c){_.each(this.select(a),function(a){var e=this.get(a);delete e.sequence;b=_.extend({},b);var f=[];_.each(b,function(a,c){if("id"==c||"boolean"==typeof a||null===a)e[c]=b[c],f.push(c)});_.each(f,function(a){delete b[a]}); e.id==a.get("id")&&(e.id=(e.id||"")+"-clone");a=this.spawn(a.type(),e,{duration:0});this.animate(a,b,c)}.bind(this));return this},hurry:function(a,b,c){var d=this.animator;_.each(this.select(a,!0),function(a){d.hurry(a,b,c);a.style&&d.hurry(a.style,b,c)});return this},halt:function(a,b){var c=this.animator;_.each(this.select(a,!0),function(a){c.stop(a,b);a.style&&c.stop(a.style,b)});return this},viewport:function(a){if(void 0!==a){if(!this._viewport||a.type&&a.type!=this.options.viewport.type){this._viewport&& @@ -110,12 +110,12 @@ _.each(a.attributes,function(a,d){b.attributes[d]={type:a.type,value:a.value}}); a);return a},position:function(a,b){b=b||{};a.snippet(b.shaded&&b.smooth?"getPositionDUDV":"getPosition");b.absolute||(b.shaded&&b.smooth?a.group().snippet("mathTransform").next().snippet("mathTransform").next().snippet("mathTransform").combine():a.snippet("mathTransform"));return a},factory:function(){return new ShaderGraph.Factory},finalize:function(a,b){b=b||{};var c=b.shaders||{};b.shaded?b.smooth?a.snippet("projectToViewDUDV"):a.snippet("projectToViewNormal"):a.snippet("projectToView");c.material? c.material(a,this):a.material("vertexOutput",{points:"fragmentSolidPoint",mesh:b.shaded?"fragmentShaded":"fragmentSolid"}[b.type]||"fragmentSolid");c=a.end().compile();c=new THREE.ShaderMaterial({uniforms:c.uniforms,attributes:c.attributes,vertexShader:c.vertexShader,fragmentShader:c.fragmentShader});b.wireframe&&(c.wireframe=!0);var d=this.apply.bind(this);c.applyUniforms=function(a){d(this,a,"uniforms")};c.applyAttributes=function(a){d(this,a,"attributes")};return c},apply:function(a,b,c){var d= a[c];_.each(b,function(a,b){var c=d[b];c&&(a instanceof THREE.Color&&(a.x=a.r,a.y=a.g,a.z=a.b),c.value=a,c.needsUpdate=!0)});"uniforms"==c&&(void 0!==b.map&&a.uniforms.texture&&(a.uniforms.texture.value=b.map),void 0!==b.lineWidth&&(a.wireframeLinewidth=a.linewidth=b.lineWidth),void 0!==b.opacity&&(a.transparent=1>b.opacity))},viewport:function(a,b){this.stage.viewport().shader(a,b)}}; -MathBox.Ticks=function(a,b,c,d,e,f,j){var g=(b-a)/(c||10);d=d||1;e=e||10;var h=d*((j||0)+Math.pow(e,Math.floor(Math.log(g/d)/Math.log(e))));c=_.map(0==e%2?[e/2,1,0.5]:[1],function(a){return h*a});var k=_.reduce(c,function(a,b){return Math.abs(b-g)this.step)return 0;if(b||!this.clocks[a])this.clocks[a]=+new Date;return 0.001*(+new Date-this.clocks[a])},invert:function(a){var b=this._stage,c=[],d,e=a[0],f=a[1],j=a[2],g=a[3];switch(e){case "add":d=[0];case "clone":d=d||b.select(f);_.each(d,function(a,b){c.push(["remove",j.sequence||MathBox.Primitive.sequence+1+b])});break;case "remove":d=b.select(f);_.each(d,function(a){c.push(["add",a.type(),b.get(a)])});break;case "animate":case "set":d= -b.select(f),_.each(d,function(a){var d=Math.min(300,g&&void 0!==g.duration?g.duration:300);c.push([e,a.singleton||a.get("sequence"),b.get(a),{duration:d}])})}return c},apply:function(a,b,c){var d=this._stage;_.each(a,function(a){var f=a[0]||"",j=a[1]||"",g=a[2]||{},h=a[3]||{};"remove"==f&&(h=g);b&&(a=this.invert(a),a=[0,0].concat(a),Array.prototype.splice.apply(b,a));c&&h&&(h=_.extend({},h),h.delay=0,h.duration/=2);switch(f){case "clone":d.clone(j,g,h);break;case "add":d.spawn(j,g,h);break;case "remove":_.each(d.select(j), -function(a){d.remove(a,h)});break;case "set":var f=d.select(j),k=g.constructor==Array;_.each(f,function(a,b){d.set(a,k?g[b]:g)});break;case "animate":f=d.select(j),k=g.constructor==Array,_.each(f,function(a,b){d.animate(a,k?g[b]:g,h)})}}.bind(this));return this},insert:function(a){a[0].constructor!=Array&&(a=[a]);this.script.splice(this.step,0,a);this.forward();return this},is:function(a){if(!this.script.length)return!1;for(;0>a;)a+=this.script.length+1;for(;a>=this.script.length+1;)a-=this.script.length+ +MathBox.Director.prototype={clock:function(a,b){if(a>this.step)return 0;if(b||!this.clocks[a])this.clocks[a]=+new Date;return 0.001*(+new Date-this.clocks[a])},invert:function(a){var b=this._stage,c=[],d,e=a[0],f=a[1],j=a[2],h=a[3];switch(e){case "add":d=[0];case "clone":d=d||b.select(f);_.each(d,function(a,b){c.push(["remove",j.sequence||MathBox.Primitive.sequence+1+b])});break;case "remove":d=b.select(f);_.each(d,function(a){c.push(["add",a.type(),b.get(a)])});break;case "animate":case "set":d= +b.select(f),_.each(d,function(a){var d=Math.min(300,h&&void 0!==h.duration?h.duration:300);c.push([e,a.singleton||a.get("sequence"),b.get(a),{duration:d}])})}return c},apply:function(a,b,c){var d=this._stage;_.each(a,function(a){var f=a[0]||"",j=a[1]||"",h=a[2]||{},g=a[3]||{};"remove"==f&&(g=h);b&&(a=this.invert(a),a=[0,0].concat(a),Array.prototype.splice.apply(b,a));c&&g&&(g=_.extend({},g),g.delay=0,g.duration/=2);switch(f){case "clone":d.clone(j,h,g);break;case "add":d.spawn(j,h,g);break;case "remove":_.each(d.select(j), +function(a){d.remove(a,g)});break;case "set":var f=d.select(j),k=h.constructor==Array;_.each(f,function(a,b){d.set(a,k?h[b]:h)});break;case "animate":f=d.select(j),k=h.constructor==Array,_.each(f,function(a,b){d.animate(a,k?h[b]:h,g)})}}.bind(this));return this},insert:function(a){a[0].constructor!=Array&&(a=[a]);this.script.splice(this.step,0,a);this.forward();return this},is:function(a){if(!this.script.length)return!1;for(;0>a;)a+=this.script.length+1;for(;a>=this.script.length+1;)a-=this.script.length+ 1;return a==this.step},isFirst:function(){return this.is(0)},isLast:function(){return this.is(-1)},go:function(a,b){if(this.script.length){for(;0>a;)a+=this.script.length+1;for(;a>=this.script.length+1;)a-=this.script.length+1;for(;a>this.step;)this.forward(b);for(;aa-this.lastCommand&&(b=!0);this.stage().hurry("*");this.lastCommand=a;return b},forward:function(a,b){if(!(this.step>=this.script.length)){var c=this.script[this.step], d=this.rollback[this.step]=[];this.step++;var e=function(){this.apply(c,d,a||this.skipping());this.clock(this.step,!0);this.emit("go",this.step,1)}.bind(this);b?setTimeout(e,+b):e();return this}},back:function(a,b){if(!(0>=this.step)){this.step--;var c=this.rollback[this.step],d=function(){this.apply(c,null,a||this.skipping());delete this.rollback[this.step];this.emit("go",this.step,-1)}.bind(this);b?setTimeout(d,+b):d();return this}},stage:function(){return this._stage}}; _.each(MathBox.Stage.prototype,function(a,b){MathBox.Director.prototype[b]||(MathBox.Director.prototype[b]=function(){var b=this.stage[a].apply(this.stage,arguments);return b===this.stage?this:b})});MicroEvent.mixin(MathBox.Director);MathBox.Style=function(a){var b=this.defaults();a=_.extend(b,a||{});this.set(a)}; @@ -127,37 +127,37 @@ MathBox.CameraProxy=function(a,b){this.set({orbit:b.orbit||3.5,phi:b.phi||\u03c4 MathBox.Overlay=function(){(this.domElement=document.createElement("div")).className="mathbox-overlay";this.sprites=[];this.v=new THREE.Vector3;this.q=new THREE.Vector3}; MathBox.Overlay.prototype={size:function(a,b){this.width=a;this.height=b;this.domElement.style.width=a+"px";this.domElement.style.height=b+"px"},add:function(a){-1==this.sprites.indexOf(a)&&(this.sprites.push(a),a.element.parentNode||this.domElement.appendChild(a.element),_.each(a.children,function(a){this.add(a)}.bind(this)))},remove:function(a){var b;if(-1!=(b=this.sprites.indexOf(a)))this.sprites.splice(b,1),a.element.parentNode&&a.element.parentNode.removeChild(a.element),_.each(a.children,function(a){this.remove(a)}.bind(this))}, update:function(a){this.fov=0.5/Math.tan(a.fov*Math.PI/360)*this.height;_.each(this.sprites,function(b){this._update(b,a)}.bind(this));_.each(this.sprites,function(b){this._measure(b,a)}.bind(this));_.each(this.sprites,function(b){this._vis(b,a)}.bind(this))},_measure:function(a){if(a.measure){var b=a.element;a.width=b.offsetWidth;a.height=b.offsetHeight;a.measure=!1}},_vis:function(a){if(a.render&&(a.width||a.height)){var b=a.left,c=a.top,d=a.width+b,e=a.height+c;found=!1;_.each(this.sprites,function(f){if(f=== -a)found=!0;else if(found&&f.render){var j=f.left,g=f.top,h=f.width+j,k=f.height+g;dh||ek||(f.element.style.display="none",f.render=!1)}})}},_update:function(a,b){for(var c=this.v,d=this.q,e=a.render,f=a.visible,j=a.parent;f&&j;)f=f&&j.visible,j=j.parent;a.render=f&&0g||ek||(f.element.style.display="none",f.render=!1)}})}},_update:function(a,b){for(var c=this.v,d=this.q,e=a.render,f=a.visible,j=a.parent;f&&j;)f=f&&j.visible,j=j.parent;a.render=f&&0e||3h&&(g=g.slice(0,h));var h=[0,0,0],x;h[2==c?0:1-c]=0.01*(a-w); -this.epsilon.set.apply(this.epsilon,h);u=[0,0,0];_.each(g,function(a,b){u[c]=a;var d=2*b;s[d].set.apply(s[d],u);s[d].addSelf(v);t[d]=1;s[d+1].copy(s[d]);t[d+1]=-1;r[b].copy(s[d]);x=d+1});h=x+1;for(g=s.length;hd&&(g=g.slice(0,d));_.each(g,function(d){f[b.axis]=d+k[b.axis]; -f[c.axis]=c.min+k[c.axis];_.loop(e-1,function(){a[h].set.apply(a[h],f);h++;f[c.axis]+=c.inv;a[h].set.apply(a[h],f);h++})});d=Math.max(0,h-1);for(g=a.length;he||3g&&(h=h.slice(0,g));var g=[0,0,0],x;g[2==c?0:1-c]=0.01*(a-w); +this.epsilon.set.apply(this.epsilon,g);u=[0,0,0];_.each(h,function(a,b){u[c]=a;var d=2*b;s[d].set.apply(s[d],u);s[d].addSelf(v);t[d]=1;s[d+1].copy(s[d]);t[d+1]=-1;r[b].copy(s[d]);x=d+1});g=x+1;for(h=s.length;gd&&(j=j.slice(0,d));_.each(j,function(d){f[b.axis]=d+k[b.axis]; +f[c.axis]=c.min+k[c.axis];_.loop(e-1,function(){a[g].set.apply(a[g],f);g++;f[c.axis]+=c.inv;a[g].set.apply(a[g],f);g++})});d=Math.max(0,g-1);for(j=a.length;gt?-1:1,t=Math.abs(t),u=Math.pow(10,h-1-Math.floor(Math.log(t)*l)),d=t=d*Math.round(u*t)/u}m||(d=(""+d).replace(/^-/,"\u2013"))}b.content!==d&&(t=b.element.children[0],b.content=d,b.measure=!0,m?(t.innerHTML="\\("+d+"\\)",MathJax.Hub.queue.Push(["Typeset",MathJax.Hub,t])):t.innerHTML=d)});MathBox.Renderable.prototype.adjust.call(this,a)}}); +MathBox.Renderable.Labels.prototype=_.extend(new MathBox.Renderable(null),{defaults:function(){return{absolute:!0,distance:15,size:1}},make:function(){this.get();var a=this.tangent,b=this.sprites,c=this.points.length;this._anchor=new THREE.Vector3;var d=document.createElement("div"),e=this.object=new MathBox.Sprite(d);d.className="mathbox-labels";_.loop(c,function(){var c=document.createElement("div"),d=document.createElement("div");c.appendChild(d);var h=new MathBox.Sprite(c,a);c.className="mathbox-label"; +d.className="mathbox-wrap";d.style.position="relative";d.style.display="inline-block";d.style.left="-50%";d.style.top="-.5em";b.push(h);e.add(h)})},adjust:function(a,b,c,d,e){var f=this.get(),j=this.points;b=this.sprites;var h=this.callback,g=f.decimals,k=this.style.get("opacity"),m=window.MathJax&&MathJax.Hub,l=1/Math.log(10);_.each(b,function(b,c){b.position.copy(j[c]);a.to(b.position);e.matrix.multiplyVector3(b.position);b.distance=f.distance;b.opacity=k;var d="";if(h){d=h(c);void 0===d&&(d=""); +if(+d==d){var t=+d;if(0!=t)var d=0>t?-1:1,t=Math.abs(t),u=Math.pow(10,g-1-Math.floor(Math.log(t)*l)),d=t=d*Math.round(u*t)/u}m||(d=(""+d).replace(/^-/,"\u2013"))}b.content!==d&&(t=b.element.children[0],b.content=d,b.measure=!0,m?(t.innerHTML="\\("+d+"\\)",MathJax.Hub.queue.Push(["Typeset",MathJax.Hub,t])):t.innerHTML=d)});MathBox.Renderable.prototype.adjust.call(this,a)}}); MathBox.Viewport=function(a){if(null!==a){var b=this.defaults();a=_.extend(b,a||{});this.set(a);this.singleton="viewport";this._uniforms={}}}; MathBox.Viewport.prototype={defaults:function(){return{type:"none",rotation:[0,0,0],position:[0,0,0]}},uniforms:function(){return this._uniforms},axis:function(){return[0,1]},to:function(){},from:function(){},update:function(a){var b=this.get();_.each(["position","rotation"],function(c){a[c].set.apply(a[c],b[c])})},shader:function(a){a.snippet("mathToWorld")},validateRotation:function(a){return a.constructor==Array?(a=a.concat([0,0,0]),a.slice(0,3)):this.get("rotation")},validatePosition:function(a){return a.constructor== Array?(a=a.concat([0,0,0]),a.slice(0,3)):this.get("position")}};MathBox.Attributes.mixin(MathBox.Viewport,"type");MathBox.Viewport.types={};MathBox.Viewport.make=function(a){return new (MathBox.Viewport.types[a.type]||MathBox.Viewport.types.cartesian||MathBox.Viewport)(a)}; MathBox.ViewportCartesian=function(a){if(null!==a){var b=MathBox.Viewport;b.call(this,a);this.super=b.prototype;this.transform=new THREE.Matrix4;this.inverse=new THREE.Matrix4;_.extend(this._uniforms,{viewportTransform:this.transform,viewportInverse:this.inverse})}}; -MathBox.ViewportCartesian.prototype=_.extend(new MathBox.Viewport(null),{defaults:function(){return{type:"cartesian",range:[[-1,1],[-1,1],[-1,1]],scale:[1,1,1],rotation:[0,0,0],position:[0,0,0]}},to:function(a){this.transform.multiplyVector3(a)},from:function(a){this.inverse.multiplyVector3(a)},axis:function(a){var b=this.get().range[a];a=b[0];var c=b[1],b=Math.min(a,c);a=Math.max(a,c);return[b,a]},update:function(a){var b=this.get(),c=b.range,d=b.scale,b=c[0][0],e=c[1][0],f=c[2][0],j=c[0][1]-b,g= -c[1][1]-e,c=c[2][1]-f,h=d[0],k=d[1],d=d[2],m=[j/(2*h),0,0,b+j/2,0,g/(2*k),0,e+g/2,0,0,c/(2*d),f+c/2,0,0,0,1];this.transform.set.apply(this.transform,[2*h/j,0,0,-(2*b+j)*h/j,0,2*k/g,0,-(2*e+g)*k/g,0,0,2*d/c,-(2*f+c)*d/c,0,0,0,1]);this.inverse.set.apply(this.inverse,m);MathBox.Viewport.prototype.update.call(this,a)},validateRange:function(a){a=a||[];for(var b=0;3>b;++b){a[b]=a[b]||[];for(var c=0;2>c;++c)a[b][c]=void 0!==a[b][c]?a[b][c]:2*c-1}return a},validateScale:function(a){a=a||[];for(var b=0;3> +MathBox.ViewportCartesian.prototype=_.extend(new MathBox.Viewport(null),{defaults:function(){return{type:"cartesian",range:[[-1,1],[-1,1],[-1,1]],scale:[1,1,1],rotation:[0,0,0],position:[0,0,0]}},to:function(a){this.transform.multiplyVector3(a)},from:function(a){this.inverse.multiplyVector3(a)},axis:function(a){var b=this.get().range[a];a=b[0];var c=b[1],b=Math.min(a,c);a=Math.max(a,c);return[b,a]},update:function(a){var b=this.get(),c=b.range,d=b.scale,b=c[0][0],e=c[1][0],f=c[2][0],j=c[0][1]-b,h= +c[1][1]-e,c=c[2][1]-f,g=d[0],k=d[1],d=d[2],m=[j/(2*g),0,0,b+j/2,0,h/(2*k),0,e+h/2,0,0,c/(2*d),f+c/2,0,0,0,1];this.transform.set.apply(this.transform,[2*g/j,0,0,-(2*b+j)*g/j,0,2*k/h,0,-(2*e+h)*k/h,0,0,2*d/c,-(2*f+c)*d/c,0,0,0,1]);this.inverse.set.apply(this.inverse,m);MathBox.Viewport.prototype.update.call(this,a)},validateRange:function(a){a=a||[];for(var b=0;3>b;++b){a[b]=a[b]||[];for(var c=0;2>c;++c)a[b][c]=void 0!==a[b][c]?a[b][c]:2*c-1}return a},validateScale:function(a){a=a||[];for(var b=0;3> b;++b)a[b]=a[b]||1;return a}});MathBox.Attributes.mixin(MathBox.Viewport);MathBox.Viewport.types.cartesian=MathBox.ViewportCartesian;MathBox.ViewportPolar=function(a){var b=MathBox.ViewportCartesian;b.call(this,a);this.super=b.prototype;_.extend(this._uniforms,{polarAlpha:0,polarAspect:1,polarPower:1,polarFold:1,polarFocus:1,polarHelix:0})}; MathBox.ViewportPolar.prototype=_.extend(new MathBox.ViewportCartesian(null),{defaults:function(){return{type:"polar",range:[[-1,1],[-1,1],[-1,1]],polar:1,fold:1,power:1,helix:0,scale:[1,1,1],rotation:[0,0,0],position:[0,0,0]}},to:function(a){var b=this._uniforms.polarAspect,c=this._uniforms.polarFocus,d=this._uniforms.polarAlpha,e=this._uniforms.polarPower,f=this._uniforms.polarHelix;a.x*=this._uniforms.polarFold;a.y=Math.sign(a.y)*Math.pow(Math.abs(a.y),e);if(1E-4 Date: Sun, 27 Jan 2013 01:47:57 -0800 Subject: [PATCH 4/5] Added linear easing to animations. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Very useful when you want to create e.g. a continuous rotating graph. Now you can do: var n = 0; var duration = 1000; var spin = function() { mathbox.animate('surface', { worldRotation: [0, 0, n++ * τ] }, { duration: duration, ease: 'linear' }); setTimeout(spin, duration); }; spin(); For a continuous spin. I'd still like to see better support for this, but full support would require allowing properties (such as worldRotation above) to be functions that return the new result instead of being values. --- src/Animator.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Animator.js b/src/Animator.js index 34ee1e7..f8f0bfb 100644 --- a/src/Animator.js +++ b/src/Animator.js @@ -286,6 +286,9 @@ MathBox.Animator.Animation.prototype = { case 'out': rolloff = fraction * fraction; break; + case 'linear': + rolloff = fraction; + break; default: rolloff = .5-.5*Math.cos(fraction * π); break; From 62a9badc3d3e6b13e28fd7bbea1971b4e051264d Mon Sep 17 00:00:00 2001 From: So8res Date: Sun, 27 Jan 2013 02:07:55 -0800 Subject: [PATCH 5/5] updated build files --- build/MathBox-bundle.js | 2 +- build/MathBox-bundle.min.js | 4 +- build/MathBox-core.js | 2 +- build/MathBox-core.min.js | 4 +- build/MathBox.js | 2 +- build/MathBox.min.js | 106 ++++++++++++++++++------------------ 6 files changed, 60 insertions(+), 60 deletions(-) diff --git a/build/MathBox-bundle.js b/build/MathBox-bundle.js index 6e3c213..a149864 100644 --- a/build/MathBox-bundle.js +++ b/build/MathBox-bundle.js @@ -42990,7 +42990,7 @@ MathBox.Animator.Animation.prototype = { rolloff = fraction * fraction; break; case 'linear': - roloff = fraction; + rolloff = fraction; break; default: rolloff = .5-.5*Math.cos(fraction * π); diff --git a/build/MathBox-bundle.min.js b/build/MathBox-bundle.min.js index 3c70b9c..72d81d8 100644 --- a/build/MathBox-bundle.min.js +++ b/build/MathBox-bundle.min.js @@ -1193,8 +1193,8 @@ MathBox.Animator.Delay.prototype={init:function(a){this.start=MathBox.Animator.n MathBox.Animator.Animation=function(a,b,c,d,e,f){this.object=a;this.key=b;this.from=null;this.to=c;this.duration=d;this.fraction=this.start=0;this.callback=e;this.ease=f}; MathBox.Animator.Animation.prototype={init:function(a){this.start=MathBox.Animator.now-(a||0);null===this.from&&(this.from=this.object.get(this.key));void 0===this.from&&(this.from=0)},apply:function(a){function b(a,d){void 0===d&&(d=a);void 0===a&&(a=d);if(d===a)return a;if(typeof a!=typeof d)throw console.log(c,e),"Data type mismatch between from/to values in animator. "+e+": "+a+" ("+a.constructor+"), "+d+"("+d.constructor+")";var f;switch(typeof d){default:case "string":throw"Unimplemented value type in animator. ("+ typeof d+")";case "function":return function(){return b(a.apply(this,arguments),d.apply(this,arguments))};case "boolean":return 0.5s;++s)f.elements[s]=a.elements[s]+(d.elements[s]-a.elements[s])*h;return f}return d.constructor==THREE.Vector3?(f=new THREE.Vector3,f.x= -a.x+(d.x-a.x)*h,f.y=a.y+(d.y-a.y)*h,f.z=a.z+(d.z-a.z)*h,f):d.constructor==THREE.Color?(f=new THREE.Color,f.r=a.r+(d.r-a.r)*h,f.g=a.g+(d.g-a.g)*h,f.b=a.b+(d.b-a.b)*h,f):0.5l;++l)f.elements[l]=a.elements[l]+(d.elements[l]-a.elements[l])*h;return f}return d.constructor==THREE.Vector3?(f=new THREE.Vector3,f.x= -a.x+(d.x-a.x)*h,f.y=a.y+(d.y-a.y)*h,f.z=a.z+(d.z-a.z)*h,f):d.constructor==THREE.Color?(f=new THREE.Color,f.r=a.r+(d.r-a.r)*h,f.g=a.g+(d.g-a.g)*h,f.b=a.b+(d.b-a.b)*h,f):0.5]*type=['"]text\/javascript['"][^>]*>([\s\S]+?)<\/script>$/m))?(b=document.createElement("script"),b.type="text/javascript",b.innerHTML=e[1],document.body.appendChild(b)):(e=document.createElement("div"),e.innerHTML=b,document.body.appendChild(e));console.log("Loaded HTML ",a);c()})}; ThreeBox.preload.image=function(a,b,c){THREE.ImageUtils.loadTexture(a,null,function(d){var e={};e[b]=d;console.log("Loaded texture ",a);c(e)})};ThreeBox.preload.audio=function(a,b,c){var d=new XMLHttpRequest;d.open("GET",a,!0);d.responseType="arraybuffer";d.onload=function(){var e={};e[b]=d.response;console.log("Loaded audio ",a);c(e)};d.send()};(function(a){for(var b in a)if(!window[b])throw"Error: ThreeRTT requires "+a[b];})({THREE:"Three.js"});window.ThreeRTT=window.ThreeRTT||{}; ThreeRTT.getShader=function(a){var b=document.getElementById(a);return b&&b.innerText||a};_.loop=function(a,b){for(var c=0;c=this.stack.length)throw"Popping factory stack too far.";this.next();this.stack.shift();var a=this.stack.shift(),c=this.stack[0];_.each(a.start,function(a){_.each(c.end,function(b){b.connect(a,!0)})});c.end=a.end;return this},end:function(){var b=this.graph;this.graph=new a.Graph;this.stack=[];this.group();b&&(b.compile=function(){return b.tail().owner().compile()});return b}}})(ShaderGraph); @@ -69,36 +69,36 @@ samplerCube:0};a.Snippet.prototype={compile:function(a,c,d){var e=this.signature return f.join(";\n")},arguments:function(){return{uniforms:this.uniforms,varyings:this.varyings,attributes:this.attributes,parameters:this.parameters}},type:function(b,c){b=(a.Snippet.types[b]||"f")+(c?"v":"");return"fv"==b?"fv1":b},parseAttribute:function(a){var c=a[1];this.attributes.push({name:a[3],type:this.type(a[2],a[4]),signature:c})},parseUniform:function(b){var c=b[1],d=b[2];this.uniforms.push({name:b[3],type:this.type(d,b[4]),value:a.Snippet.defaults[d]||0,signature:c})},parseVarying:function(a){var c= a[1];this.varyings.push({name:a[3],type:this.type(a[2],a[4]),signature:c})},parseSignature:function(b){this.name=b[1];var c=b[2].replace(/^\s*$/g,"");0==c.length?this.signature=[]:(arguments=this.signature=c.split(","),_.each(arguments,function(b){b=/((?:(in|out|inout)\s+)?([A-Za-z0-9]+)\s+([A-Za-z0-9_]+)\s*(?:\[([^\]]+)\])?)(?:$|(?=;))/.exec(b);var c=b[1];this.parameters.push({inout:{"in":a.IN,out:a.OUT,inout:a.INOUT}[b[2]||"in"],name:b[4],type:this.type(b[3],b[5]),signature:c})}.bind(this)))},parseCode:function(a){function c(a, b){if(!a.global)throw"Can't findAll non-global regexp";for(var c,d=[];c=a.exec(b);)d.push(c);return d}a=a.replace(/\r\n?/g,"\n").replace(/\/\/[^\n]*\n/g," ").replace(/\/\*(.|\n)*?\*\//g," ");var d=c(/(?:^|;)\s*attribute\s+(([A-Za-z0-9]+)\s+([A-Za-z0-9_]+)\s*(?:\[([^\]]+)\])?)(?:$|(?=;))/g,a),e=c(/(?:^|;)\s*uniform\s+(([A-Za-z0-9]+)\s+([A-Za-z0-9_]+)\s*(?:\[([^\]]+)\])?)(?:$|(?=;))/g,a),f=c(/(?:^|;)\s*varying\s+(([A-Za-z0-9]+)\s+([[A-Za-z0-9_]+)\s*(?:\[([^\]]+)\])?)(?:$|(?=;))/g,a),j=c(/(?:^|;)\s*void\s+([A-Za-z0-9]+)\s*\(([^\)]*)\)\s*{/g, -a);if(!j[0])throw"Could not parse shader snippet. Must contain a void-returning function with in/outs: "+a;var h=a;_.each({parseAttribute:d,parseUniform:e,parseVarying:f},function(a,b){_.each(a,function(a){this[b](a);h=h.replace(a[0],"")}.bind(this))}.bind(this));h=h.replace(/^\s*;/,"");this.parseSignature(j[0]);this.body=h}}})(ShaderGraph); +a);if(!j[0])throw"Could not parse shader snippet. Must contain a void-returning function with in/outs: "+a;var g=a;_.each({parseAttribute:d,parseUniform:e,parseVarying:f},function(a,b){_.each(a,function(a){this[b](a);g=g.replace(a[0],"")}.bind(this))}.bind(this));g=g.replace(/^\s*;/,"");this.parseSignature(j[0]);this.body=g}}})(ShaderGraph); (function(a){a.Graph=function(a,c){this.parent=c||null;this.nodes=[];a&&this.add(a)};a.Graph.prototype={iterate:function(a){_.each(this.nodes,function(c){a(c,c._owner)})},exposed:function(){var a=[];this.iterate(function(c){_.each(c.outlets(),function(c){c.exposed&&a.push(c)})});return a},inputs:function(){var a=[];this.iterate(function(c){_.each(c.inputs,function(c){null==c.input&&a.push(c)})});return a},outputs:function(){var a=[];this.iterate(function(c){_.each(c.outputs,function(c){0==c.output.length&& a.push(c)})});return a},tail:function(){return this.nodes[this.nodes.length-1]},add:function(a){if(a.constructor==Array)return _.each(a,function(a){this.add(a)}.bind(this));if(a.graph)throw"Adding node to two graphs at once";a.link(this);this.nodes.push(a)},remove:function(a,c){var d=this;if(a.constructor==Array)return _.each(a,function(a){d.remove(a)});if(a.graph!=this)throw"Removing node from wrong graph.";c||a.disconnect();this.nodes.splice(this.nodes.indexOf(a),1)}};a.IN=0;a.OUT=1;a.INOUT=2})(ShaderGraph); (function(a){a.Node=function(a,c){this.graph=null;this.inputs=[];this.outputs=[];this._outlets={};this.owner(a);this.outlets(c)};a.Node.prototype={owner:function(a){return void 0!==a?(this._owner=a,this):this._owner},link:function(a){this.graph=a},getIn:function(b){return this.get(b,a.IN)},getOut:function(b){return this.get(b,a.OUT)},get:function(b,c){return void 0===c?this.get(b,a.IN)||this.get(b,a.OUT):this._outlets[[b,c].join("-")]},key:function(a){return[a.name,a.inout].join("-")},outlets:function(b){if(void 0!== b){var c={};_.each(b,function(a){c[[a.name,a.inout,a.type].join("-")]=!0}.bind(this));_.each(this._outlets,function(a){c[[a.name,a.inout,a.type].join("-")]||this.remove(a)}.bind(this));_.each(b,function(b){var c=this.get(b.name,b.inout);c?c.morph(b):(b=new a.Outlet(b),this.add(b))}.bind(this));return this}return this._outlets},add:function(b){var c=this.key(b);outlets=this._outlets;_in=this.inputs;_out=this.outputs;if(b.node)throw"Adding outlet to two nodes at once.";if(outlets[c])throw"Adding two identical outlets to same node."; b.link(this);outlets[c]=b;(b.inout==a.IN?_in:_out).push(b);return this},remove:function(b){var c=this._outlets,d=this.key(b),e=b.inout==a.IN?this.inputs:this.outputs;if(b.node!=this)throw"Removing outlet from wrong node.";b.disconnect();b.link(null);delete c[d];e.splice(e.indexOf(b),1);return this},connect:function(a,c,d){var e={},f={};_.each(a.inputs,function(a){if(d||!a.input){var b=a.type,c=[b,a.hint].join("-");f[c]||(f[c]=a);e[b]=e[b]||[];e[b].push(a)}});_.each(this.outputs,function(a){if(!c|| !a.output.length){var b=a.type,d=[b,a.hint].join("-");f[d]?(f[d].connect(a),delete f[d],e[b].splice(e[b].indexOf(a),1)):e[b]&&e[b].length&&e[b].shift().connect(a)}});return this},disconnect:function(){_.each(this.inputs,function(a){a.disconnect()});_.each(this.outputs,function(a){a.disconnect()});return this}}})(ShaderGraph); -(function(a){a.Outlets=0;a.Outlet=function(b,c,d,e,f,j,h){if("object"==typeof b)return new a.Outlet(b.inout,b.name,b.hint,b.type,b.category,b.exposed);this.node=null;this.inout=b;this.name=c;this.hint=d||c;this.type=e;this.category=f;this.exposed=!!j;this.meta=h||{};this.index=++a.Outlets;this.input=this.key=null;this.output=[]};a.Outlet.prototype={id:function(){return["_sg",this.name,this.index].join("_")},expose:function(a){this.exposed=a},morph:function(a){this.inout=a.inout;this.name=a.name;this.type= +(function(a){a.Outlets=0;a.Outlet=function(b,c,d,e,f,j,g){if("object"==typeof b)return new a.Outlet(b.inout,b.name,b.hint,b.type,b.category,b.exposed);this.node=null;this.inout=b;this.name=c;this.hint=d||c;this.type=e;this.category=f;this.exposed=!!j;this.meta=g||{};this.index=++a.Outlets;this.input=this.key=null;this.output=[]};a.Outlet.prototype={id:function(){return["_sg",this.name,this.index].join("_")},expose:function(a){this.exposed=a},morph:function(a){this.inout=a.inout;this.name=a.name;this.type= a.type;this.category=a.category;this.exposed=a.exposed;this.meta=a.meta||{}},connect:function(b){if(this.inout==a.IN&&b.inout==a.OUT)return b.connect(this);if(this.inout!=a.OUT||b.inout!=a.IN)throw console.log(this,b),"Can't connect out/out or in/in outlets.";b.input!=this&&(b.disconnect(),b.input=this,this.output.push(b))},disconnect:function(b){if(this.inout==a.IN)this.input&&this.input.disconnect(this);else if(b){var c=this.output.indexOf(b);0<=c&&(this.output.splice(c,1),b.input=null)}else _.each(this.output, function(a){a.input=null}),this.output=[]},link:function(a){this.node=a}}})(ShaderGraph);\u03c0=Math.PI;\u03c4=2*\u03c0;(function(a){for(var b in a)if(!window[b])throw"Error: MathBox requires "+a[b];})({THREE:"Three.js",tQuery:"tQuery.js (bundle)",ThreeBox:"ThreeBox.js",ThreeRTT:"ThreeRTT.js"});window.MathBox={};window.mathBox=function(a,b){a&&!(a instanceof Node)&&(b=a,a=null);return tQuery.createWorld(b).mathBox(a,b)}; MathBox.getShader=function(a){var b=document.getElementById(a);return b&&(b.innerText||b.textContent)||a};Math.sign=function(a){return 0a?-1:0};MathBox.Attributes=function(){}; -MathBox.Attributes.prototype={get:function(a){return void 0===a?this.__attributes||{}:!this.__attributes?void 0:this.__attributes[a]},set:function(a,b){function c(a,b){try{b=h(a,b),d[a]=b,f[a]=b}catch(c){throw"Exception setting '"+a+"' to '"+b+"': "+c;}}this.__attributes||(this.__attributes={});this.__validators||(this.__validators={});var d={},e=this.__validators,f=this.__attributes,j=this,h=function(a,b){if(void 0===e[a]){var c="validate"+a.charAt(0).toUpperCase()+a.slice(1);e[a]=j[c]||!1}return e[a]? +MathBox.Attributes.prototype={get:function(a){return void 0===a?this.__attributes||{}:!this.__attributes?void 0:this.__attributes[a]},set:function(a,b){function c(a,b){try{b=g(a,b),d[a]=b,f[a]=b}catch(c){throw"Exception setting '"+a+"' to '"+b+"': "+c;}}this.__attributes||(this.__attributes={});this.__validators||(this.__validators={});var d={},e=this.__validators,f=this.__attributes,j=this,g=function(a,b){if(void 0===e[a]){var c="validate"+a.charAt(0).toUpperCase()+a.slice(1);e[a]=j[c]||!1}return e[a]? e[a].call(this,b):b}.bind(this);void 0===a||null===a||(a.constructor==String?c(a,b):_.each(a,function(a,b){c(b,a)}),this.emit("change",d))}};MicroEvent.mixin(MathBox.Attributes);MathBox.Attributes.mixin=function(a){_.each(["get","set","on","emit"],function(b){a.prototype[b]=MathBox.Attributes.prototype[b]})};MathBox.Animator=function(){this.active=[]};MathBox.Animator.now=1; MathBox.Animator.prototype={finalState:function(a){var b=_.extend({},a.get());a.__queue&&_.each(a.__queue,function(a,d){_.each(a,function(a){a.to&&(b[d]=a.to)})});return b},attach:function(a){if(!a.__queue){if(!a.__attributes)throw"Cannot attach to object without attributes";var b=this,c=a.set;a.set=function(a,e,f){if(!f){f=a;if(void 0===a||null===a)return;a.constructor==String&&(f={},f[a]=e);b.stop(this,f)}c.call(this,a,e)};a.__queue={};a.__animations=0}},hurry:function(a,b,c){c=c||4;_.each(b||a.__queue, function(b,e){_.each(a.__queue[e],function(a){a.hurry(c)})}.bind(this))},stop:function(a,b){_.each(b||a.__queue,function(b,d){for(;a.__queue[d];)this.dequeue(a,d,!0)}.bind(this))},animate:function(a,b,c){c=_.extend({duration:300},c||{});this.attach(a);_.each(b,function(b,e){var f=a.__queue[e]=a.__queue[e]||[];if(c.delay){var j=new MathBox.Animator.Delay(a,e,c.delay);f.push(j);0==a.__animations++&&this.active.push(a)}a.__validators[e]&&(b=a.__validators[e].call(a,b));j=new MathBox.Animator.Animation(a, -e,b,c.duration,c.callback,c.ease);f.push(j);0==a.__animations++&&this.active.push(a)}.bind(this))},dequeue:function(a,b,c){var d=a.__queue[b];if(d){var e=d.shift();0==d.length&&delete a.__queue[b];c&&e.skip();0==--a.__animations&&this.active.splice(this.active.indexOf(a),1)}},update:function(a){MathBox.Animator.now+=a;a=this.active.slice();_.each(a,function(a){var c=0;_.each(a.__queue,function e(f,j){var h=f[0];value=h.apply(c||0);h.done()&&(c=h.extra(),this.dequeue(a,j),f[0]&&e.call(this,f,j))}.bind(this))}.bind(this))}}; +e,b,c.duration,c.callback,c.ease);f.push(j);0==a.__animations++&&this.active.push(a)}.bind(this))},dequeue:function(a,b,c){var d=a.__queue[b];if(d){var e=d.shift();0==d.length&&delete a.__queue[b];c&&e.skip();0==--a.__animations&&this.active.splice(this.active.indexOf(a),1)}},update:function(a){MathBox.Animator.now+=a;a=this.active.slice();_.each(a,function(a){var c=0;_.each(a.__queue,function e(f,j){var g=f[0];value=g.apply(c||0);g.done()&&(c=g.extra(),this.dequeue(a,j),f[0]&&e.call(this,f,j))}.bind(this))}.bind(this))}}; MathBox.Animator.Delay=function(a,b,c){this.object=a;this.key=b;this.duration=c;this.fraction=this.start=0}; MathBox.Animator.Delay.prototype={init:function(a){this.start=MathBox.Animator.now-(a||0)},apply:function(a){this.start||this.init(a);this.fraction=0l;++l)f.elements[l]=a.elements[l]+(d.elements[l]-a.elements[l])*h;return f}return d.constructor==THREE.Vector3?(f=new THREE.Vector3,f.x= -a.x+(d.x-a.x)*h,f.y=a.y+(d.y-a.y)*h,f.z=a.z+(d.z-a.z)*h,f):d.constructor==THREE.Color?(f=new THREE.Color,f.r=a.r+(d.r-a.r)*h,f.g=a.g+(d.g-a.g)*h,f.b=a.b+(d.b-a.b)*h,f):0.5l;++l)f.elements[l]=a.elements[l]+(d.elements[l]-a.elements[l])*g;return f}return d.constructor==THREE.Vector3?(f=new THREE.Vector3,f.x= +a.x+(d.x-a.x)*g,f.y=a.y+(d.y-a.y)*g,f.z=a.z+(d.z-a.z)*g,f):d.constructor==THREE.Color?(f=new THREE.Color,f.r=a.r+(d.r-a.r)*g,f.g=a.g+(d.g-a.g)*g,f.b=a.b+(d.b-a.b)*g,f):0.5a.length)return{};var c=a[0];a=b.finalState(c);c.style&&(b=b.finalState(c.style),a.style=b);return a},transition:function(a){return void 0!==a?(this._transition=a,this):this._transition},speed:function(a){return void 0!==a?(this._speed=a,this):this._speed},animateOptions:function(a,b){var c=this._transition;!0===a&&(a={});if(c||b||a&&(a.delay||a.duration))a=_.extend({delay:0,duration:c||300},a||{});if(a&&(a.delay||a.duration))return a}, animate:function(a,b,c){var d=this.animator;b=this.extractStyle(b);c=this.animateOptions(c,!0);b.style&&(_.each(this.select(a),function(a){d.animate(a.style,b.style,c)}),b=_.extend({},b),delete b.style);_.each(this.select(a),function(a){d.animate(a,b,c)});return this},clone:function(a,b,c){_.each(this.select(a),function(a){var e=this.get(a);delete e.sequence;b=_.extend({},b);var f=[];_.each(b,function(a,c){if("id"==c||"boolean"==typeof a||null===a)e[c]=b[c],f.push(c)});_.each(f,function(a){delete b[a]}); e.id==a.get("id")&&(e.id=(e.id||"")+"-clone");a=this.spawn(a.type(),e,{duration:0});this.animate(a,b,c)}.bind(this));return this},hurry:function(a,b,c){var d=this.animator;_.each(this.select(a,!0),function(a){d.hurry(a,b,c);a.style&&d.hurry(a.style,b,c)});return this},halt:function(a,b){var c=this.animator;_.each(this.select(a,!0),function(a){c.stop(a,b);a.style&&c.stop(a.style,b)});return this},viewport:function(a){if(void 0!==a){if(!this._viewport||a.type&&a.type!=this.options.viewport.type){this._viewport&& @@ -110,12 +110,12 @@ _.each(a.attributes,function(a,d){b.attributes[d]={type:a.type,value:a.value}}); a);return a},position:function(a,b){b=b||{};a.snippet(b.shaded&&b.smooth?"getPositionDUDV":"getPosition");b.absolute||(b.shaded&&b.smooth?a.group().snippet("mathTransform").next().snippet("mathTransform").next().snippet("mathTransform").combine():a.snippet("mathTransform"));return a},factory:function(){return new ShaderGraph.Factory},finalize:function(a,b){b=b||{};var c=b.shaders||{};b.shaded?b.smooth?a.snippet("projectToViewDUDV"):a.snippet("projectToViewNormal"):a.snippet("projectToView");c.material? c.material(a,this):a.material("vertexOutput",{points:"fragmentSolidPoint",mesh:b.shaded?"fragmentShaded":"fragmentSolid"}[b.type]||"fragmentSolid");c=a.end().compile();c=new THREE.ShaderMaterial({uniforms:c.uniforms,attributes:c.attributes,vertexShader:c.vertexShader,fragmentShader:c.fragmentShader});b.wireframe&&(c.wireframe=!0);var d=this.apply.bind(this);c.applyUniforms=function(a){d(this,a,"uniforms")};c.applyAttributes=function(a){d(this,a,"attributes")};return c},apply:function(a,b,c){var d= a[c];_.each(b,function(a,b){var c=d[b];c&&(a instanceof THREE.Color&&(a.x=a.r,a.y=a.g,a.z=a.b),c.value=a,c.needsUpdate=!0)});"uniforms"==c&&(void 0!==b.map&&a.uniforms.texture&&(a.uniforms.texture.value=b.map),void 0!==b.lineWidth&&(a.wireframeLinewidth=a.linewidth=b.lineWidth),void 0!==b.opacity&&(a.transparent=1>b.opacity))},viewport:function(a,b){this.stage.viewport().shader(a,b)}}; -MathBox.Ticks=function(a,b,c,d,e,f,j){var h=(b-a)/(c||10);d=d||1;e=e||10;var g=d*((j||0)+Math.pow(e,Math.floor(Math.log(h/d)/Math.log(e))));c=_.map(0==e%2?[e/2,1,0.5]:[1],function(a){return g*a});var k=_.reduce(c,function(a,b){return Math.abs(b-h)this.step)return 0;if(b||!this.clocks[a])this.clocks[a]=+new Date;return 0.001*(+new Date-this.clocks[a])},invert:function(a){var b=this._stage,c=[],d,e=a[0],f=a[1],j=a[2],h=a[3];switch(e){case "add":d=[0];case "clone":d=d||b.select(f);_.each(d,function(a,b){c.push(["remove",j.sequence||MathBox.Primitive.sequence+1+b])});break;case "remove":d=b.select(f);_.each(d,function(a){c.push(["add",a.type(),b.get(a)])});break;case "animate":case "set":d= -b.select(f),_.each(d,function(a){var d=Math.min(300,h&&void 0!==h.duration?h.duration:300);c.push([e,a.singleton||a.get("sequence"),b.get(a),{duration:d}])})}return c},apply:function(a,b,c){var d=this._stage;_.each(a,function(a){var f=a[0]||"",j=a[1]||"",h=a[2]||{},g=a[3]||{};"remove"==f&&(g=h);b&&(a=this.invert(a),a=[0,0].concat(a),Array.prototype.splice.apply(b,a));c&&g&&(g=_.extend({},g),g.delay=0,g.duration/=2);switch(f){case "clone":d.clone(j,h,g);break;case "add":d.spawn(j,h,g);break;case "remove":_.each(d.select(j), -function(a){d.remove(a,g)});break;case "set":var f=d.select(j),k=h.constructor==Array;_.each(f,function(a,b){d.set(a,k?h[b]:h)});break;case "animate":f=d.select(j),k=h.constructor==Array,_.each(f,function(a,b){d.animate(a,k?h[b]:h,g)})}}.bind(this));return this},insert:function(a){a[0].constructor!=Array&&(a=[a]);this.script.splice(this.step,0,a);this.forward();return this},is:function(a){if(!this.script.length)return!1;for(;0>a;)a+=this.script.length+1;for(;a>=this.script.length+1;)a-=this.script.length+ +MathBox.Director.prototype={clock:function(a,b){if(a>this.step)return 0;if(b||!this.clocks[a])this.clocks[a]=+new Date;return 0.001*(+new Date-this.clocks[a])},invert:function(a){var b=this._stage,c=[],d,e=a[0],f=a[1],j=a[2],g=a[3];switch(e){case "add":d=[0];case "clone":d=d||b.select(f);_.each(d,function(a,b){c.push(["remove",j.sequence||MathBox.Primitive.sequence+1+b])});break;case "remove":d=b.select(f);_.each(d,function(a){c.push(["add",a.type(),b.get(a)])});break;case "animate":case "set":d= +b.select(f),_.each(d,function(a){var d=Math.min(300,g&&void 0!==g.duration?g.duration:300);c.push([e,a.singleton||a.get("sequence"),b.get(a),{duration:d}])})}return c},apply:function(a,b,c){var d=this._stage;_.each(a,function(a){var f=a[0]||"",j=a[1]||"",g=a[2]||{},h=a[3]||{};"remove"==f&&(h=g);b&&(a=this.invert(a),a=[0,0].concat(a),Array.prototype.splice.apply(b,a));c&&h&&(h=_.extend({},h),h.delay=0,h.duration/=2);switch(f){case "clone":d.clone(j,g,h);break;case "add":d.spawn(j,g,h);break;case "remove":_.each(d.select(j), +function(a){d.remove(a,h)});break;case "set":var f=d.select(j),k=g.constructor==Array;_.each(f,function(a,b){d.set(a,k?g[b]:g)});break;case "animate":f=d.select(j),k=g.constructor==Array,_.each(f,function(a,b){d.animate(a,k?g[b]:g,h)})}}.bind(this));return this},insert:function(a){a[0].constructor!=Array&&(a=[a]);this.script.splice(this.step,0,a);this.forward();return this},is:function(a){if(!this.script.length)return!1;for(;0>a;)a+=this.script.length+1;for(;a>=this.script.length+1;)a-=this.script.length+ 1;return a==this.step},isFirst:function(){return this.is(0)},isLast:function(){return this.is(-1)},go:function(a,b){if(this.script.length){for(;0>a;)a+=this.script.length+1;for(;a>=this.script.length+1;)a-=this.script.length+1;for(;a>this.step;)this.forward(b);for(;aa-this.lastCommand&&(b=!0);this.stage().hurry("*");this.lastCommand=a;return b},forward:function(a,b){if(!(this.step>=this.script.length)){var c=this.script[this.step], d=this.rollback[this.step]=[];this.step++;var e=function(){this.apply(c,d,a||this.skipping());this.clock(this.step,!0);this.emit("go",this.step,1)}.bind(this);b?setTimeout(e,+b):e();return this}},back:function(a,b){if(!(0>=this.step)){this.step--;var c=this.rollback[this.step],d=function(){this.apply(c,null,a||this.skipping());delete this.rollback[this.step];this.emit("go",this.step,-1)}.bind(this);b?setTimeout(d,+b):d();return this}},stage:function(){return this._stage}}; _.each(MathBox.Stage.prototype,function(a,b){MathBox.Director.prototype[b]||(MathBox.Director.prototype[b]=function(){var b=this.stage[a].apply(this.stage,arguments);return b===this.stage?this:b})});MicroEvent.mixin(MathBox.Director);MathBox.Style=function(a){var b=this.defaults();a=_.extend(b,a||{});this.set(a)}; @@ -127,37 +127,37 @@ MathBox.CameraProxy=function(a,b){this.set({orbit:b.orbit||3.5,phi:b.phi||\u03c4 MathBox.Overlay=function(){(this.domElement=document.createElement("div")).className="mathbox-overlay";this.sprites=[];this.v=new THREE.Vector3;this.q=new THREE.Vector3}; MathBox.Overlay.prototype={size:function(a,b){this.width=a;this.height=b;this.domElement.style.width=a+"px";this.domElement.style.height=b+"px"},add:function(a){-1==this.sprites.indexOf(a)&&(this.sprites.push(a),a.element.parentNode||this.domElement.appendChild(a.element),_.each(a.children,function(a){this.add(a)}.bind(this)))},remove:function(a){var b;if(-1!=(b=this.sprites.indexOf(a)))this.sprites.splice(b,1),a.element.parentNode&&a.element.parentNode.removeChild(a.element),_.each(a.children,function(a){this.remove(a)}.bind(this))}, update:function(a){this.fov=0.5/Math.tan(a.fov*Math.PI/360)*this.height;_.each(this.sprites,function(b){this._update(b,a)}.bind(this));_.each(this.sprites,function(b){this._measure(b,a)}.bind(this));_.each(this.sprites,function(b){this._vis(b,a)}.bind(this))},_measure:function(a){if(a.measure){var b=a.element;a.width=b.offsetWidth;a.height=b.offsetHeight;a.measure=!1}},_vis:function(a){if(a.render&&(a.width||a.height)){var b=a.left,c=a.top,d=a.width+b,e=a.height+c;found=!1;_.each(this.sprites,function(f){if(f=== -a)found=!0;else if(found&&f.render){var j=f.left,h=f.top,g=f.width+j,k=f.height+h;dg||ek||(f.element.style.display="none",f.render=!1)}})}},_update:function(a,b){for(var c=this.v,d=this.q,e=a.render,f=a.visible,j=a.parent;f&&j;)f=f&&j.visible,j=j.parent;a.render=f&&0h||ek||(f.element.style.display="none",f.render=!1)}})}},_update:function(a,b){for(var c=this.v,d=this.q,e=a.render,f=a.visible,j=a.parent;f&&j;)f=f&&j.visible,j=j.parent;a.render=f&&0e||3g&&(h=h.slice(0,g));var g=[0,0,0],x;g[2==c?0:1-c]=0.01*(a-w); -this.epsilon.set.apply(this.epsilon,g);u=[0,0,0];_.each(h,function(a,b){u[c]=a;var d=2*b;s[d].set.apply(s[d],u);s[d].addSelf(v);t[d]=1;s[d+1].copy(s[d]);t[d+1]=-1;r[b].copy(s[d]);x=d+1});g=x+1;for(h=s.length;gd&&(j=j.slice(0,d));_.each(j,function(d){f[b.axis]=d+k[b.axis]; -f[c.axis]=c.min+k[c.axis];_.loop(e-1,function(){a[g].set.apply(a[g],f);g++;f[c.axis]+=c.inv;a[g].set.apply(a[g],f);g++})});d=Math.max(0,g-1);for(j=a.length;ge||3h&&(g=g.slice(0,h));var h=[0,0,0],x;h[2==c?0:1-c]=0.01*(a-w); +this.epsilon.set.apply(this.epsilon,h);u=[0,0,0];_.each(g,function(a,b){u[c]=a;var d=2*b;s[d].set.apply(s[d],u);s[d].addSelf(v);t[d]=1;s[d+1].copy(s[d]);t[d+1]=-1;r[b].copy(s[d]);x=d+1});h=x+1;for(g=s.length;hd&&(g=g.slice(0,d));_.each(g,function(d){f[b.axis]=d+k[b.axis]; +f[c.axis]=c.min+k[c.axis];_.loop(e-1,function(){a[h].set.apply(a[h],f);h++;f[c.axis]+=c.inv;a[h].set.apply(a[h],f);h++})});d=Math.max(0,h-1);for(g=a.length;ht?-1:1,t=Math.abs(t),u=Math.pow(10,g-1-Math.floor(Math.log(t)*l)),d=t=d*Math.round(u*t)/u}m||(d=(""+d).replace(/^-/,"\u2013"))}b.content!==d&&(t=b.element.children[0],b.content=d,b.measure=!0,m?(t.innerHTML="\\("+d+"\\)",MathJax.Hub.queue.Push(["Typeset",MathJax.Hub,t])):t.innerHTML=d)});MathBox.Renderable.prototype.adjust.call(this,a)}}); +MathBox.Renderable.Labels.prototype=_.extend(new MathBox.Renderable(null),{defaults:function(){return{absolute:!0,distance:15,size:1}},make:function(){this.get();var a=this.tangent,b=this.sprites,c=this.points.length;this._anchor=new THREE.Vector3;var d=document.createElement("div"),e=this.object=new MathBox.Sprite(d);d.className="mathbox-labels";_.loop(c,function(){var c=document.createElement("div"),d=document.createElement("div");c.appendChild(d);var g=new MathBox.Sprite(c,a);c.className="mathbox-label"; +d.className="mathbox-wrap";d.style.position="relative";d.style.display="inline-block";d.style.left="-50%";d.style.top="-.5em";b.push(g);e.add(g)})},adjust:function(a,b,c,d,e){var f=this.get(),j=this.points;b=this.sprites;var g=this.callback,h=f.decimals,k=this.style.get("opacity"),m=window.MathJax&&MathJax.Hub,l=1/Math.log(10);_.each(b,function(b,c){b.position.copy(j[c]);a.to(b.position);e.matrix.multiplyVector3(b.position);b.distance=f.distance;b.opacity=k;var d="";if(g){d=g(c);void 0===d&&(d=""); +if(+d==d){var t=+d;if(0!=t)var d=0>t?-1:1,t=Math.abs(t),u=Math.pow(10,h-1-Math.floor(Math.log(t)*l)),d=t=d*Math.round(u*t)/u}m||(d=(""+d).replace(/^-/,"\u2013"))}b.content!==d&&(t=b.element.children[0],b.content=d,b.measure=!0,m?(t.innerHTML="\\("+d+"\\)",MathJax.Hub.queue.Push(["Typeset",MathJax.Hub,t])):t.innerHTML=d)});MathBox.Renderable.prototype.adjust.call(this,a)}}); MathBox.Viewport=function(a){if(null!==a){var b=this.defaults();a=_.extend(b,a||{});this.set(a);this.singleton="viewport";this._uniforms={}}}; MathBox.Viewport.prototype={defaults:function(){return{type:"none",rotation:[0,0,0],position:[0,0,0]}},uniforms:function(){return this._uniforms},axis:function(){return[0,1]},to:function(){},from:function(){},update:function(a){var b=this.get();_.each(["position","rotation"],function(c){a[c].set.apply(a[c],b[c])})},shader:function(a){a.snippet("mathToWorld")},validateRotation:function(a){return a.constructor==Array?(a=a.concat([0,0,0]),a.slice(0,3)):this.get("rotation")},validatePosition:function(a){return a.constructor== Array?(a=a.concat([0,0,0]),a.slice(0,3)):this.get("position")}};MathBox.Attributes.mixin(MathBox.Viewport,"type");MathBox.Viewport.types={};MathBox.Viewport.make=function(a){return new (MathBox.Viewport.types[a.type]||MathBox.Viewport.types.cartesian||MathBox.Viewport)(a)}; MathBox.ViewportCartesian=function(a){if(null!==a){var b=MathBox.Viewport;b.call(this,a);this.super=b.prototype;this.transform=new THREE.Matrix4;this.inverse=new THREE.Matrix4;_.extend(this._uniforms,{viewportTransform:this.transform,viewportInverse:this.inverse})}}; -MathBox.ViewportCartesian.prototype=_.extend(new MathBox.Viewport(null),{defaults:function(){return{type:"cartesian",range:[[-1,1],[-1,1],[-1,1]],scale:[1,1,1],rotation:[0,0,0],position:[0,0,0]}},to:function(a){this.transform.multiplyVector3(a)},from:function(a){this.inverse.multiplyVector3(a)},axis:function(a){var b=this.get().range[a];a=b[0];var c=b[1],b=Math.min(a,c);a=Math.max(a,c);return[b,a]},update:function(a){var b=this.get(),c=b.range,d=b.scale,b=c[0][0],e=c[1][0],f=c[2][0],j=c[0][1]-b,h= -c[1][1]-e,c=c[2][1]-f,g=d[0],k=d[1],d=d[2],m=[j/(2*g),0,0,b+j/2,0,h/(2*k),0,e+h/2,0,0,c/(2*d),f+c/2,0,0,0,1];this.transform.set.apply(this.transform,[2*g/j,0,0,-(2*b+j)*g/j,0,2*k/h,0,-(2*e+h)*k/h,0,0,2*d/c,-(2*f+c)*d/c,0,0,0,1]);this.inverse.set.apply(this.inverse,m);MathBox.Viewport.prototype.update.call(this,a)},validateRange:function(a){a=a||[];for(var b=0;3>b;++b){a[b]=a[b]||[];for(var c=0;2>c;++c)a[b][c]=void 0!==a[b][c]?a[b][c]:2*c-1}return a},validateScale:function(a){a=a||[];for(var b=0;3> +MathBox.ViewportCartesian.prototype=_.extend(new MathBox.Viewport(null),{defaults:function(){return{type:"cartesian",range:[[-1,1],[-1,1],[-1,1]],scale:[1,1,1],rotation:[0,0,0],position:[0,0,0]}},to:function(a){this.transform.multiplyVector3(a)},from:function(a){this.inverse.multiplyVector3(a)},axis:function(a){var b=this.get().range[a];a=b[0];var c=b[1],b=Math.min(a,c);a=Math.max(a,c);return[b,a]},update:function(a){var b=this.get(),c=b.range,d=b.scale,b=c[0][0],e=c[1][0],f=c[2][0],j=c[0][1]-b,g= +c[1][1]-e,c=c[2][1]-f,h=d[0],k=d[1],d=d[2],m=[j/(2*h),0,0,b+j/2,0,g/(2*k),0,e+g/2,0,0,c/(2*d),f+c/2,0,0,0,1];this.transform.set.apply(this.transform,[2*h/j,0,0,-(2*b+j)*h/j,0,2*k/g,0,-(2*e+g)*k/g,0,0,2*d/c,-(2*f+c)*d/c,0,0,0,1]);this.inverse.set.apply(this.inverse,m);MathBox.Viewport.prototype.update.call(this,a)},validateRange:function(a){a=a||[];for(var b=0;3>b;++b){a[b]=a[b]||[];for(var c=0;2>c;++c)a[b][c]=void 0!==a[b][c]?a[b][c]:2*c-1}return a},validateScale:function(a){a=a||[];for(var b=0;3> b;++b)a[b]=a[b]||1;return a}});MathBox.Attributes.mixin(MathBox.Viewport);MathBox.Viewport.types.cartesian=MathBox.ViewportCartesian;MathBox.ViewportPolar=function(a){var b=MathBox.ViewportCartesian;b.call(this,a);this.super=b.prototype;_.extend(this._uniforms,{polarAlpha:0,polarAspect:1,polarPower:1,polarFold:1,polarFocus:1,polarHelix:0})}; MathBox.ViewportPolar.prototype=_.extend(new MathBox.ViewportCartesian(null),{defaults:function(){return{type:"polar",range:[[-1,1],[-1,1],[-1,1]],polar:1,fold:1,power:1,helix:0,scale:[1,1,1],rotation:[0,0,0],position:[0,0,0]}},to:function(a){var b=this._uniforms.polarAspect,c=this._uniforms.polarFocus,d=this._uniforms.polarAlpha,e=this._uniforms.polarPower,f=this._uniforms.polarHelix;a.x*=this._uniforms.polarFold;a.y=Math.sign(a.y)*Math.pow(Math.abs(a.y),e);if(1E-4