├── .editorconfig ├── .gitignore ├── .nvmrc ├── LICENSE ├── README.hbs ├── README.md ├── demo ├── .gitkeep ├── demo.js ├── index.html ├── spring.umd.js └── spring.umd.js.map ├── lib ├── Spring.js └── index.js ├── package.json ├── test └── index.js └── yarn.lock /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | indent_style = space 7 | indent_size = 2 8 | tab_width = 2 9 | insert_final_newline = true 10 | trim_trailing_whitespace = true 11 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | docs 2 | .gh-pages-cache 3 | 4 | # Editors 5 | .idea 6 | .vscode 7 | 8 | # Node / Yarn / Npm 9 | node_modules 10 | npm-debug.log* 11 | 12 | # Logs and Temporary files 13 | .tmp 14 | logs 15 | *.log 16 | 17 | # MacOS 18 | .DS_Store 19 | .AppleDouble 20 | .LSOverride 21 | Icon 22 | ._* 23 | 24 | # Misc 25 | coverage -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | v10.11.0 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 pqml 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.hbs: -------------------------------------------------------------------------------- 1 | # :wavy_dash: Spring 2 | [:books: **Documentation**](#api) | [:tada: **Example**](https://pqml.github.io/spring) | [:globe_with_meridians: **Internet modules**](https://www.npmjs.com/org/internet) 3 | 4 | - Framerate-independant spring physics 5 | - Small, < 1kb gzipped 6 | - Control the spring with tension and friction 7 | - Adjustable timestep for the physics solver 8 | - `onStart` / `onStop` callbacks 9 | - This lib was made to learn more about fixed timesteps and integration. 10 | - It's a pretty basic Euler integration - not sure it will work for complex structures like spring chaining. 11 | - If you need a rock-solid spring physics library, use [ReboundJS](https://github.com/facebook/rebound-js) 12 | - Articles used : 13 | - [Fix Your Timestep!](https://gafferongames.com/post/fix_your_timestep/) 14 | - [Frame Rate Independent Damping using Lerp](http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/) 15 | - [Integration by Example - Euler vs Verlet vs Runge-Kutta](http://codeflow.org/entries/2010/aug/28/integration-by-example-euler-vs-verlet-vs-runge-kutta/) 16 | 17 |
18 | 19 | # Requirements 20 | - ES6 Modules support 21 | - Using a module bundler like Webpack, Rollup or Parcel 22 | - [Native support from browser](https://caniuse.com/#feat=es6-module) 23 | - From NodeJS with [esm](https://github.com/standard-things/esm) 24 | 25 |
26 | 27 | # API 28 | 29 | 30 | 31 | {{#globals name="Spring"}} 32 | {{>member-index~}} 33 |
34 | {{>members~}} 35 | {{/globals}} 36 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # :wavy_dash: Spring 2 | [:books: **Documentation**](#api) | [:tada: **Example**](https://pqml.github.io/spring) | [:globe_with_meridians: **Internet modules**](https://www.npmjs.com/org/internet) 3 | 4 | - Framerate-independant spring physics 5 | - Small, < 1kb gzipped 6 | - Control the spring with tension and friction 7 | - Adjustable timestep for the physics solver 8 | - `onStart` / `onStop` callbacks 9 | - This lib was made to learn more about fixed timesteps and integration. 10 | - It's a pretty basic Euler integration - not sure it will work for complex structures like spring chaining. 11 | - If you need a rock-solid spring physics library, use [ReboundJS](https://github.com/facebook/rebound-js) 12 | - Articles used : 13 | - [Fix Your Timestep!](https://gafferongames.com/post/fix_your_timestep/) 14 | - [Frame Rate Independent Damping using Lerp](http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/) 15 | - [Integration by Example - Euler vs Verlet vs Runge-Kutta](http://codeflow.org/entries/2010/aug/28/integration-by-example-euler-vs-verlet-vs-runge-kutta/) 16 | 17 |
18 | 19 | # Requirements 20 | - ES6 Modules support 21 | - Using a module bundler like Webpack, Rollup or Parcel 22 | - [Native support from browser](https://caniuse.com/#feat=es6-module) 23 | - From NodeJS with [esm](https://github.com/standard-things/esm) 24 | 25 |
26 | 27 | # API 28 | 29 | 30 | 31 | 32 | * [Spring](#Spring) 33 | * [new Spring([options])](#new_Spring_new) 34 | * _Methods_ 35 | * [.setValue(newCurrent)](#Spring+setValue) 36 | * [.setTarget(newTarget)](#Spring+setTarget) 37 | * [.setTension(tensionValue)](#Spring+setTension) 38 | * [.setFriction(frictionValue)](#Spring+setFriction) 39 | * [.start()](#Spring+start) 40 | * [.stop()](#Spring+stop) 41 | * [.update(dt)](#Spring+update) 42 | * [.dispose()](#Spring+dispose) 43 | * _Properties_ 44 | * [.initial](#Spring+initial) : number 45 | * [.value](#Spring+value) : number 46 | * [.previous](#Spring+previous) : number 47 | * [.velocity](#Spring+velocity) : number 48 | * [.onStart](#Spring+onStart) : function 49 | * [.onStop](#Spring+onStop) : function 50 | 51 |
52 | 53 | 54 | #### new Spring([options]) 55 | Create a new Spring instance. 56 | 57 | 58 | | Param | Type | Default | Description | 59 | | --- | --- | --- | --- | 60 | | [options] | Object | {} | Spring options. | 61 | | [options.initial] | number | 0 | Initial value / targetValue of your spring. | 62 | | [options.tension] | number | 0.1 | Tension/Stifness of your spring. | 63 | | [options.friction] | number | 0.2 | *From 0 to 1.* Friction (Damping) of your spring. | 64 | | [options.step] | number | 10 | Timestep of the physics solver (in ms). Step > 16.67ms will give you pretty bad results. | 65 | | [options.onStart] | function | | `onStart` will be called when the spring starts moving. | 66 | | [options.onStop] | function | | `onStop` will be called when your the spring stops moving. | 67 | | [options.precisionStop] | number | 0.0001 | Minimum distance between `value` and `target` to consider the spring stopped. | 68 | | [options.perfectStop] | boolean | false | Define if `value` is set precisely to targetValue when the spring stops moving. | 69 | 70 | **Example** 71 | ```js 72 | import { raf } from '@internet/raf' 73 | import Spring from '@internet/spring' 74 | 75 | const move = new Spring({ initial: 0 }) 76 | move.setTarget(300) 77 | raf.add(dt => { 78 | move.update(dt) 79 | console.log(move.value) 80 | }) 81 | ``` 82 | 83 | * * * 84 | 85 | 86 | 87 | #### spring.setValue(newCurrent) 88 | Change the current position of the spring. Can retrigger onStart / onStop. 89 | 90 | **Kind**: instance method of [Spring](#Spring) 91 | **Category**: Methods 92 | 93 | | Param | Type | Description | 94 | | --- | --- | --- | 95 | | newCurrent | number | New current value. | 96 | 97 | 98 | * * * 99 | 100 | 101 | 102 | #### spring.setTarget(newTarget) 103 | Update target / resting position of the spring. Can retrigger onStart / onStop. 104 | 105 | **Kind**: instance method of [Spring](#Spring) 106 | **Category**: Methods 107 | 108 | | Param | Type | Description | 109 | | --- | --- | --- | 110 | | newTarget | number | New target value. | 111 | 112 | 113 | * * * 114 | 115 | 116 | 117 | #### spring.setTension(tensionValue) 118 | Update tension of the spring 119 | 120 | **Kind**: instance method of [Spring](#Spring) 121 | **Category**: Methods 122 | 123 | | Param | Type | Description | 124 | | --- | --- | --- | 125 | | tensionValue | number | New tension value. | 126 | 127 | 128 | * * * 129 | 130 | 131 | 132 | #### spring.setFriction(frictionValue) 133 | Update friction of the spring 134 | 135 | **Kind**: instance method of [Spring](#Spring) 136 | **Category**: Methods 137 | 138 | | Param | Type | Description | 139 | | --- | --- | --- | 140 | | frictionValue | number | New friction value. | 141 | 142 | 143 | * * * 144 | 145 | 146 | 147 | #### spring.start() 148 | Force re-start of the spring. Only needed if you force-stop the spring with `stop()` 149 | 150 | **Kind**: instance method of [Spring](#Spring) 151 | **Category**: Methods 152 | 153 | * * * 154 | 155 | 156 | 157 | #### spring.stop() 158 | Force-stop the spring. 159 | 160 | **Kind**: instance method of [Spring](#Spring) 161 | **Category**: Methods 162 | 163 | * * * 164 | 165 | 166 | 167 | #### spring.update(dt) 168 | Update the spring physic state 169 | 170 | **Kind**: instance method of [Spring](#Spring) 171 | **Category**: Methods 172 | 173 | | Param | Type | Description | 174 | | --- | --- | --- | 175 | | dt | number | Elapsed time since the last frame (in ms) | 176 | 177 | 178 | * * * 179 | 180 | 181 | 182 | #### spring.dispose() 183 | Stop the spring and remove callbacks referenced in onStart and onStop. 184 | 185 | **Kind**: instance method of [Spring](#Spring) 186 | **Category**: Methods 187 | 188 | * * * 189 | 190 | 191 | 192 | #### spring.initial : number 193 | Initial position of the spring 194 | 195 | **Kind**: instance property of [Spring](#Spring) 196 | **Category**: Properties 197 | 198 | * * * 199 | 200 | 201 | 202 | #### spring.value : number 203 | Current position of the spring 204 | 205 | **Kind**: instance property of [Spring](#Spring) 206 | **Category**: Properties 207 | 208 | * * * 209 | 210 | 211 | 212 | #### spring.previous : number 213 | Previous frame position of the spring 214 | 215 | **Kind**: instance property of [Spring](#Spring) 216 | **Category**: Properties 217 | 218 | * * * 219 | 220 | 221 | 222 | #### spring.velocity : number 223 | Current velocity of the spring 224 | 225 | **Kind**: instance property of [Spring](#Spring) 226 | **Category**: Properties 227 | 228 | * * * 229 | 230 | 231 | 232 | #### spring.onStart : function 233 | Optional function called when the spring starts 234 | 235 | **Kind**: instance property of [Spring](#Spring) 236 | **Category**: Properties 237 | 238 | * * * 239 | 240 | 241 | 242 | #### spring.onStop : function 243 | Optional function called when the spring stops 244 | 245 | **Kind**: instance property of [Spring](#Spring) 246 | **Category**: Properties 247 | 248 | * * * 249 | 250 | -------------------------------------------------------------------------------- /demo/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pqml/spring/b025fdac71e31f20180fec84821a2ceeb04bdc8e/demo/.gitkeep -------------------------------------------------------------------------------- /demo/demo.js: -------------------------------------------------------------------------------- 1 | import Spring from '../lib' 2 | import { raf, fpsLimiter } from '@internet/raf' 3 | import * as dat from 'dat.gui' 4 | 5 | const FPS = [null, 10, 6] 6 | const gui = new dat.GUI() 7 | 8 | const params = { tension: 0.1, friction: 0.2, timestep: 8 } 9 | const els = Array 10 | .from(document.querySelectorAll('.dot')) 11 | .map((el, i) => createSpring(el, i, { 12 | precisionStop: 0.01, 13 | perfectStop: true, 14 | tension: params.tension, 15 | friction: params.friction, 16 | step: 8 17 | })) 18 | 19 | gui.add(params, 'tension', 0, 1).onChange(v => { els.forEach(el => el.setTension(v)) }) 20 | gui.add(params, 'friction', 0, 1).onChange(v => { els.forEach(el => el.setFriction(v)) }) 21 | 22 | document.addEventListener('mousemove', e => { 23 | for (let i = 0; i < els.length; i++) els[i].setTarget(e.clientX, e.clientY) 24 | }) 25 | 26 | function createSpring (el, i, opts) { 27 | const x = new Spring(opts) 28 | const y = new Spring(opts) 29 | const update = !FPS[i] ? _update : fpsLimiter(FPS[i], _update) 30 | x.onStart = () => !y.stopped && raf.add(update) 31 | y.onStart = () => !x.stopped && raf.add(update) 32 | x.onStop = () => y.stopped && raf.remove(update) 33 | y.onStop = () => x.stopped && raf.remove(update) 34 | 35 | return { setTarget, setTension, setFriction, setStep } 36 | 37 | function setTension (v) { 38 | x.setTension(v) 39 | y.setTension(v) 40 | } 41 | 42 | function setFriction (v) { 43 | x.setFriction(v) 44 | y.setFriction(v) 45 | } 46 | 47 | function setStep (v) { 48 | x.setStep(v) 49 | y.setStep(v) 50 | } 51 | 52 | function setTarget (nx, ny) { 53 | x.setTarget(nx) 54 | y.setTarget(ny) 55 | } 56 | 57 | function _update (dt) { 58 | x.update(dt) 59 | y.update(dt) 60 | el.classList[x.stopped && y.stopped ? 'add' : 'remove']('stopped') 61 | el.style.transform = `translate3d(${x.value}px, ${y.value}px, 0)` 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /demo/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | @internet/spring example 5 | 6 | 7 | 8 | 9 | 58 | 59 | 60 |

@internet/spring example

61 |
→ View github repository
62 |
63 |
64 |
65 | 66 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /demo/spring.umd.js: -------------------------------------------------------------------------------- 1 | !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t():"function"==typeof define&&define.amd?define(t):t()}(0,function(){function e(e){void 0===e&&(e={}),this.initial=e.initial||0,this.value=this.initial,this.previous=this.initial,this.velocity=0,this.onStart=e.onStart,this.onStop=e.onStop,this.precisionStop=e.precisionStop||1e-4,this.perfectStop=!!e.perfectStop,this.setValue(this.initial),this.setTarget(this.initial),this.setMass(e.mass||1),this.setTension(e.tension||.1),this.setFriction(e.friction||.2),this.setStep(e.step||10)}e.prototype.setValue=function(e){this.value=e,Math.abs(this.target-this.value)>this.precisionStop?this.start():this.stop()},e.prototype.setTarget=function(e){this.target=e,Math.abs(this.target-this.value)>this.precisionStop?this.start():this.stop()},e.prototype.setTension=function(e){this._K=e},e.prototype.setFriction=function(e){this._D=e,this._dampingAdjuster=Math.pow(1-this._D,this._stepAdjuster)},e.prototype.setMass=function(e){this.mass=e,this._inverseMass=1/this.mass},e.prototype.setStep=function(e){this._step=e,this._stepAdjuster=this._step/16.67,this.setFriction(this._D)},e.prototype.start=function(){this.stopped=!1,this.onStart&&this.onStart()},e.prototype.stop=function(){this.stopped||(this.perfectStop&&Math.abs(this.target-this.value)<=this.precisionStop&&(this.value=this.target),this.acceleration=0,this.velocity=0,this._accumulator=0,this._prevStepVel=0,this._prevStepValue=this.value,this._adjusted=!1,this.stopped=!0,this.onStop&&this.onStop())},e.prototype.update=function(e){if(!this.stopped){for(this._accumulator+=e,this.previous=this.value,this._adjusted&&(this._adjusted=!1,this.velocity=this._prevStepVel,this.value=this._prevStepValue),e=this._step;)this.acceleration=-this._K*(this.value-this.target)*this._inverseMass,this._prevStepVel=this.velocity,this.velocity=(this.velocity+this.acceleration*this._stepAdjuster)*this._dampingAdjuster,this._prevStepValue=this.value,this.value=this.value+this.velocity*this._stepAdjuster,this._accumulator-=this._step;if(this._adjusted){var t=this._accumulator/this._step;this.value=this.value*t+this._prevStepValue*(1-t)}Math.abs(this.target-this.value)<=this.precisionStop&&this.stop()}},e.prototype.dispose=function(){this.stop(),this.onStart=null,this.onStop=null};var t,n,i="undefined"==typeof window?global:window,o=[],r=[],s=[],a=null,l=null,d=!1,c=!1;function u(e){var h;if(void 0===e&&(e=0),null===l&&(l=e),t+=n=e-l,l=e,a=d?null:i.requestAnimationFrame(u),d&&(d=!1),c){for(h=0;h0||s.length>0)}function _(e,t,n){return!(!t||!e)&&(!~e.indexOf(t)&&((n=!!n)?e.unshift(t):e.push(t),!0))}function p(e,t){if(!t)return!1;var n=e.indexOf(t);return!!~n&&(e.splice(n,1),!(0!==e.length))}function f(e){d=!1,a||(l=null,(e=!!e)?u():a=i.requestAnimationFrame(u))}function m(){a&&(i.cancelAnimationFrame(a),a=null)}var g={add:function(e,t){_(o,e,t)&&f()},addAfter:function(e,t){_(r,e,t)&&h()},addBefore:function(e,t){_(s,e,t)&&h()},remove:function(e){p(o,e)&&m()},removeAfter:function(e,t){p(r,e)&&h()},removeBefore:function(e){p(s,e)&&h()},start:f,stop:m,time:t,dt:n,requestOnce:function(){a||(d=!0,l=null,a=i.requestAnimationFrame(u))},dispose:function(){m(),o.length=0,r.length=0,s.length=0,c=!1,l=null,t=0,n=0}};function b(e,t){var n=e.__state.conversionName.toString(),i=Math.round(e.r),o=Math.round(e.g),r=Math.round(e.b),s=e.a,a=Math.round(e.h),l=e.s.toFixed(1),d=e.v.toFixed(1);if(t||"THREE_CHAR_HEX"===n||"SIX_CHAR_HEX"===n){for(var c=e.hex.toString(16);c.length<6;)c="0"+c;return"#"+c}return"CSS_RGB"===n?"rgb("+i+","+o+","+r+")":"CSS_RGBA"===n?"rgba("+i+","+o+","+r+","+s+")":"HEX"===n?"0x"+e.hex.toString(16):"RGB_ARRAY"===n?"["+i+","+o+","+r+"]":"RGBA_ARRAY"===n?"["+i+","+o+","+r+","+s+"]":"RGB_OBJ"===n?"{r:"+i+",g:"+o+",b:"+r+"}":"RGBA_OBJ"===n?"{r:"+i+",g:"+o+",b:"+r+",a:"+s+"}":"HSV_OBJ"===n?"{h:"+a+",s:"+l+",v:"+d+"}":"HSVA_OBJ"===n?"{h:"+a+",s:"+l+",v:"+d+",a:"+s+"}":"unknown format"}var v=Array.prototype.forEach,y=Array.prototype.slice,w={BREAK:{},extend:function(e){return this.each(y.call(arguments,1),function(t){(this.isObject(t)?Object.keys(t):[]).forEach(function(n){this.isUndefined(t[n])||(e[n]=t[n])}.bind(this))},this),e},defaults:function(e){return this.each(y.call(arguments,1),function(t){(this.isObject(t)?Object.keys(t):[]).forEach(function(n){this.isUndefined(e[n])&&(e[n]=t[n])}.bind(this))},this),e},compose:function(){var e=y.call(arguments);return function(){for(var t=y.call(arguments),n=e.length-1;n>=0;n--)t=[e[n].apply(this,t)];return t[0]}},each:function(e,t,n){if(e)if(v&&e.forEach&&e.forEach===v)e.forEach(t,n);else if(e.length===e.length+0){var i,o=void 0;for(o=0,i=e.length;o1?w.toArray(arguments):arguments[0];return w.each(x,function(t){if(t.litmus(e))return w.each(t.conversions,function(t,n){if(E=t.read(e),!1===A&&!1!==E)return A=E,E.conversionName=n,E.conversion=t,w.BREAK}),w.BREAK}),A},S=void 0,k={hsv_to_rgb:function(e,t,n){var i=Math.floor(e/60)%6,o=e/60-Math.floor(e/60),r=n*(1-t),s=n*(1-o*t),a=n*(1-(1-o)*t),l=[[n,a,r],[s,n,r],[r,n,a],[r,s,n],[a,r,n],[n,r,s]][i];return{r:255*l[0],g:255*l[1],b:255*l[2]}},rgb_to_hsv:function(e,t,n){var i=Math.min(e,t,n),o=Math.max(e,t,n),r=o-i,s=void 0;return 0===o?{h:NaN,s:0,v:0}:(s=e===o?(t-n)/r:t===o?2+(n-e)/r:4+(e-t)/r,(s/=6)<0&&(s+=1),{h:360*s,s:r/o,v:o/255})},rgb_to_hex:function(e,t,n){var i=this.hex_with_component(0,2,e);return i=this.hex_with_component(i,1,t),i=this.hex_with_component(i,0,n)},component_from_hex:function(e,t){return e>>8*t&255},hex_with_component:function(e,t,n){return n<<(S=8*t)|e&~(255<-1?t.length-t.indexOf(".")-1:0}var K=function(e){function t(e,n,i){T(this,t);var o=F(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,n)),r=i||{};return o.__min=r.min,o.__max=r.max,o.__step=r.step,o.__impliedStep=w.isUndefined(o.__step)?0===o.initialValue?1:Math.pow(10,Math.floor(Math.log(Math.abs(o.initialValue))/Math.LN10))/10:o.__step,o.__precision=X(o.__impliedStep),o}return B(t,V),L(t,[{key:"setValue",value:function(e){var n=e;return void 0!==this.__min&&nthis.__max&&(n=this.__max),void 0!==this.__step&&n%this.__step!=0&&(n=Math.round(n/this.__step)*this.__step),R(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"setValue",this).call(this,n)}},{key:"min",value:function(e){return this.__min=e,this}},{key:"max",value:function(e){return this.__max=e,this}},{key:"step",value:function(e){return this.__step=e,this.__impliedStep=e,this.__precision=X(e),this}}]),t}();var Y=function(e){function t(e,n,i){T(this,t);var o=F(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,n,i));o.__truncationSuspended=!1;var r=o,s=void 0;function a(){r.__onFinishChange&&r.__onFinishChange.call(r,r.getValue())}function l(e){var t=s-e.clientY;r.setValue(r.getValue()+t*r.__impliedStep),s=e.clientY}function d(){z.unbind(window,"mousemove",l),z.unbind(window,"mouseup",d),a()}return o.__input=document.createElement("input"),o.__input.setAttribute("type","text"),z.bind(o.__input,"change",function(){var e=parseFloat(r.__input.value);w.isNaN(e)||r.setValue(e)}),z.bind(o.__input,"blur",function(){a()}),z.bind(o.__input,"mousedown",function(e){z.bind(window,"mousemove",l),z.bind(window,"mouseup",d),s=e.clientY}),z.bind(o.__input,"keydown",function(e){13===e.keyCode&&(r.__truncationSuspended=!0,this.blur(),r.__truncationSuspended=!1,a())}),o.updateDisplay(),o.domElement.appendChild(o.__input),o}return B(t,K),L(t,[{key:"updateDisplay",value:function(){var e,n;return this.__input.value=this.__truncationSuspended?this.getValue():(e=this.getValue(),n=Math.pow(10,this.__precision),Math.round(e*n)/n),R(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"updateDisplay",this).call(this)}}]),t}();function J(e,t,n,i,o){return i+(e-t)/(n-t)*(o-i)}var W=function(e){function t(e,n,i,o,r){T(this,t);var s=F(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,n,{min:i,max:o,step:r})),a=s;function l(e){e.preventDefault();var t=a.__background.getBoundingClientRect();return a.setValue(J(e.clientX,t.left,t.right,a.__min,a.__max)),!1}function d(){z.unbind(window,"mousemove",l),z.unbind(window,"mouseup",d),a.__onFinishChange&&a.__onFinishChange.call(a,a.getValue())}function c(e){var t=e.touches[0].clientX,n=a.__background.getBoundingClientRect();a.setValue(J(t,n.left,n.right,a.__min,a.__max))}function u(){z.unbind(window,"touchmove",c),z.unbind(window,"touchend",u),a.__onFinishChange&&a.__onFinishChange.call(a,a.getValue())}return s.__background=document.createElement("div"),s.__foreground=document.createElement("div"),z.bind(s.__background,"mousedown",function(e){document.activeElement.blur(),z.bind(window,"mousemove",l),z.bind(window,"mouseup",d),l(e)}),z.bind(s.__background,"touchstart",function(e){if(1!==e.touches.length)return;z.bind(window,"touchmove",c),z.bind(window,"touchend",u),c(e)}),z.addClass(s.__background,"slider"),z.addClass(s.__foreground,"slider-fg"),s.updateDisplay(),s.__background.appendChild(s.__foreground),s.domElement.appendChild(s.__background),s}return B(t,K),L(t,[{key:"updateDisplay",value:function(){var e=(this.getValue()-this.__min)/(this.__max-this.__min);return this.__foreground.style.width=100*e+"%",R(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"updateDisplay",this).call(this)}}]),t}(),Q=function(e){function t(e,n,i){T(this,t);var o=F(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,n)),r=o;return o.__button=document.createElement("div"),o.__button.innerHTML=void 0===i?"Fire":i,z.bind(o.__button,"click",function(e){return e.preventDefault(),r.fire(),!1}),z.addClass(o.__button,"button"),o.domElement.appendChild(o.__button),o}return B(t,V),L(t,[{key:"fire",value:function(){this.__onChange&&this.__onChange.call(this),this.getValue().call(this.object),this.__onFinishChange&&this.__onFinishChange.call(this,this.getValue())}}]),t}(),q=function(e){function t(e,n){T(this,t);var i=F(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,n));i.__color=new N(i.getValue()),i.__temp=new N(0);var o=i;i.domElement=document.createElement("div"),z.makeSelectable(i.domElement,!1),i.__selector=document.createElement("div"),i.__selector.className="selector",i.__saturation_field=document.createElement("div"),i.__saturation_field.className="saturation-field",i.__field_knob=document.createElement("div"),i.__field_knob.className="field-knob",i.__field_knob_border="2px solid ",i.__hue_knob=document.createElement("div"),i.__hue_knob.className="hue-knob",i.__hue_field=document.createElement("div"),i.__hue_field.className="hue-field",i.__input=document.createElement("input"),i.__input.type="text",i.__input_textShadow="0 1px 1px ",z.bind(i.__input,"keydown",function(e){13===e.keyCode&&u.call(this)}),z.bind(i.__input,"blur",u),z.bind(i.__selector,"mousedown",function(){z.addClass(this,"drag").bind(window,"mouseup",function(){z.removeClass(o.__selector,"drag")})}),z.bind(i.__selector,"touchstart",function(){z.addClass(this,"drag").bind(window,"touchend",function(){z.removeClass(o.__selector,"drag")})});var r,s=document.createElement("div");function a(e){_(e),z.bind(window,"mousemove",_),z.bind(window,"touchmove",_),z.bind(window,"mouseup",d),z.bind(window,"touchend",d)}function l(e){p(e),z.bind(window,"mousemove",p),z.bind(window,"touchmove",p),z.bind(window,"mouseup",c),z.bind(window,"touchend",c)}function d(){z.unbind(window,"mousemove",_),z.unbind(window,"touchmove",_),z.unbind(window,"mouseup",d),z.unbind(window,"touchend",d),h()}function c(){z.unbind(window,"mousemove",p),z.unbind(window,"touchmove",p),z.unbind(window,"mouseup",c),z.unbind(window,"touchend",c),h()}function u(){var e=C(this.value);!1!==e?(o.__color.__state=e,o.setValue(o.__color.toOriginal())):this.value=o.__color.toString()}function h(){o.__onFinishChange&&o.__onFinishChange.call(o,o.__color.toOriginal())}function _(e){-1===e.type.indexOf("touch")&&e.preventDefault();var t=o.__saturation_field.getBoundingClientRect(),n=e.touches&&e.touches[0]||e,i=(n.clientX-t.left)/(t.right-t.left),r=1-(n.clientY-t.top)/(t.bottom-t.top);return r>1?r=1:r<0&&(r=0),i>1?i=1:i<0&&(i=0),o.__color.v=r,o.__color.s=i,o.setValue(o.__color.toOriginal()),!1}function p(e){-1===e.type.indexOf("touch")&&e.preventDefault();var t=o.__hue_field.getBoundingClientRect(),n=1-((e.touches&&e.touches[0]||e).clientY-t.top)/(t.bottom-t.top);return n>1?n=1:n<0&&(n=0),o.__color.h=360*n,o.setValue(o.__color.toOriginal()),!1}return w.extend(i.__selector.style,{width:"122px",height:"102px",padding:"3px",backgroundColor:"#222",boxShadow:"0px 1px 3px rgba(0,0,0,0.3)"}),w.extend(i.__field_knob.style,{position:"absolute",width:"12px",height:"12px",border:i.__field_knob_border+(i.__color.v<.5?"#fff":"#000"),boxShadow:"0px 1px 3px rgba(0,0,0,0.5)",borderRadius:"12px",zIndex:1}),w.extend(i.__hue_knob.style,{position:"absolute",width:"15px",height:"2px",borderRight:"4px solid #fff",zIndex:1}),w.extend(i.__saturation_field.style,{width:"100px",height:"100px",border:"1px solid #555",marginRight:"3px",display:"inline-block",cursor:"pointer"}),w.extend(s.style,{width:"100%",height:"100%",background:"none"}),$(s,"top","rgba(0,0,0,0)","#000"),w.extend(i.__hue_field.style,{width:"15px",height:"100px",border:"1px solid #555",cursor:"ns-resize",position:"absolute",top:"3px",right:"3px"}),(r=i.__hue_field).style.background="",r.style.cssText+="background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);",r.style.cssText+="background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);",r.style.cssText+="background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);",r.style.cssText+="background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);",r.style.cssText+="background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);",w.extend(i.__input.style,{outline:"none",textAlign:"center",color:"#fff",border:0,fontWeight:"bold",textShadow:i.__input_textShadow+"rgba(0,0,0,0.7)"}),z.bind(i.__saturation_field,"mousedown",a),z.bind(i.__saturation_field,"touchstart",a),z.bind(i.__field_knob,"mousedown",a),z.bind(i.__field_knob,"touchstart",a),z.bind(i.__hue_field,"mousedown",l),z.bind(i.__hue_field,"touchstart",l),i.__saturation_field.appendChild(s),i.__selector.appendChild(i.__field_knob),i.__selector.appendChild(i.__saturation_field),i.__selector.appendChild(i.__hue_field),i.__hue_field.appendChild(i.__hue_knob),i.domElement.appendChild(i.__input),i.domElement.appendChild(i.__selector),i.updateDisplay(),i}return B(t,V),L(t,[{key:"updateDisplay",value:function(){var e=C(this.getValue());if(!1!==e){var t=!1;w.each(N.COMPONENTS,function(n){if(!w.isUndefined(e[n])&&!w.isUndefined(this.__color.__state[n])&&e[n]!==this.__color.__state[n])return t=!0,{}},this),t&&w.extend(this.__color.__state,e)}w.extend(this.__temp.__state,this.__color.__state),this.__temp.a=1;var n=this.__color.v<.5||this.__color.s>.5?255:0,i=255-n;w.extend(this.__field_knob.style,{marginLeft:100*this.__color.s-7+"px",marginTop:100*(1-this.__color.v)-7+"px",backgroundColor:this.__temp.toHexString(),border:this.__field_knob_border+"rgb("+n+","+n+","+n+")"}),this.__hue_knob.style.marginTop=100*(1-this.__color.h/360)+"px",this.__temp.s=1,this.__temp.v=1,$(this.__saturation_field,"left","#fff",this.__temp.toHexString()),this.__input.value=this.__color.toString(),w.extend(this.__input.style,{backgroundColor:this.__color.toHexString(),color:"rgb("+n+","+n+","+n+")",textShadow:this.__input_textShadow+"rgba("+i+","+i+","+i+",.7)"})}}]),t}(),Z=["-moz-","-o-","-webkit-","-ms-",""];function $(e,t,n,i){e.style.background="",w.each(Z,function(o){e.style.cssText+="background: "+o+"linear-gradient("+t+", "+n+" 0%, "+i+" 100%); "})}var ee=function(e,t){var n=t||document,i=document.createElement("style");i.type="text/css",i.innerHTML=e;var o=n.getElementsByTagName("head")[0];try{o.appendChild(i)}catch(e){}},te=function(e,t){var n=e[t];return w.isArray(arguments[2])||w.isObject(arguments[2])?new G(e,t,arguments[2]):w.isNumber(n)?w.isNumber(arguments[2])&&w.isNumber(arguments[3])?w.isNumber(arguments[4])?new W(e,t,arguments[2],arguments[3],arguments[4]):new W(e,t,arguments[2],arguments[3]):w.isNumber(arguments[4])?new Y(e,t,{min:arguments[2],max:arguments[3],step:arguments[4]}):new Y(e,t,{min:arguments[2],max:arguments[3]}):w.isString(n)?new U(e,t):w.isFunction(n)?new Q(e,t,""):w.isBoolean(n)?new I(e,t):null};var ne=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(e){setTimeout(e,1e3/60)},ie=function(){function e(){T(this,e),this.backgroundElement=document.createElement("div"),w.extend(this.backgroundElement.style,{backgroundColor:"rgba(0,0,0,0.8)",top:0,left:0,display:"none",zIndex:"1000",opacity:0,WebkitTransition:"opacity 0.2s linear",transition:"opacity 0.2s linear"}),z.makeFullscreen(this.backgroundElement),this.backgroundElement.style.position="fixed",this.domElement=document.createElement("div"),w.extend(this.domElement.style,{position:"fixed",display:"none",zIndex:"1001",opacity:0,WebkitTransition:"-webkit-transform 0.2s ease-out, opacity 0.2s linear",transition:"transform 0.2s ease-out, opacity 0.2s linear"}),document.body.appendChild(this.backgroundElement),document.body.appendChild(this.domElement);var t=this;z.bind(this.backgroundElement,"click",function(){t.hide()})}return L(e,[{key:"show",value:function(){var e=this;this.backgroundElement.style.display="block",this.domElement.style.display="block",this.domElement.style.opacity=0,this.domElement.style.webkitTransform="scale(1.1)",this.layout(),w.defer(function(){e.backgroundElement.style.opacity=1,e.domElement.style.opacity=1,e.domElement.style.webkitTransform="scale(1)"})}},{key:"hide",value:function(){var e=this,t=function t(){e.domElement.style.display="none",e.backgroundElement.style.display="none",z.unbind(e.domElement,"webkitTransitionEnd",t),z.unbind(e.domElement,"transitionend",t),z.unbind(e.domElement,"oTransitionEnd",t)};z.bind(this.domElement,"webkitTransitionEnd",t),z.bind(this.domElement,"transitionend",t),z.bind(this.domElement,"oTransitionEnd",t),this.backgroundElement.style.opacity=0,this.domElement.style.opacity=0,this.domElement.style.webkitTransform="scale(1.1)"}},{key:"layout",value:function(){this.domElement.style.left=window.innerWidth/2-z.getWidth(this.domElement)/2+"px",this.domElement.style.top=window.innerHeight/2-z.getHeight(this.domElement)/2+"px"}}]),e}();ee(function(e){if(e&&"undefined"!=typeof window){var t=document.createElement("style");return t.setAttribute("type","text/css"),t.innerHTML=e,document.head.appendChild(t),e}}(".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear;border:0;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button.close-top{position:relative}.dg.main .close-button.close-bottom{position:absolute}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-y:visible}.dg.a.has-save>ul.close-top{margin-top:0}.dg.a.has-save>ul.close-bottom{margin-top:27px}.dg.a.has-save>ul.closed{margin-top:0}.dg.a .save-row{top:0;z-index:1002}.dg.a .save-row.close-top{position:relative}.dg.a .save-row.close-bottom{position:fixed}.dg li{-webkit-transition:height .1s ease-out;-o-transition:height .1s ease-out;-moz-transition:height .1s ease-out;transition:height .1s ease-out;-webkit-transition:overflow .1s linear;-o-transition:overflow .1s linear;-moz-transition:overflow .1s linear;transition:overflow .1s linear}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li>*{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px;overflow:hidden}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .c{float:left;width:60%;position:relative}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:7px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .cr.color{overflow:visible}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.color{border-left:3px solid}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2FA1D6}.dg .cr.number input[type=text]{color:#2FA1D6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2FA1D6;max-width:100%}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\n"));var oe="Default",re=function(){try{return!!window.localStorage}catch(e){return!1}}(),se=void 0,ae=!0,le=void 0,de=!1,ce=[],ue=function e(t){var n=this,i=t||{};this.domElement=document.createElement("div"),this.__ul=document.createElement("ul"),this.domElement.appendChild(this.__ul),z.addClass(this.domElement,"dg"),this.__folders={},this.__controllers=[],this.__rememberedObjects=[],this.__rememberedObjectIndecesToControllers=[],this.__listening=[],i=w.defaults(i,{closeOnTop:!1,autoPlace:!0,width:e.DEFAULT_WIDTH}),i=w.defaults(i,{resizable:i.autoPlace,hideable:i.autoPlace}),w.isUndefined(i.load)?i.load={preset:oe}:i.preset&&(i.load.preset=i.preset),w.isUndefined(i.parent)&&i.hideable&&ce.push(this),i.resizable=w.isUndefined(i.parent)&&i.resizable,i.autoPlace&&w.isUndefined(i.scrollable)&&(i.scrollable=!0);var o,r=re&&"true"===localStorage.getItem(ge(this,"isLocal")),s=void 0,a=void 0;if(Object.defineProperties(this,{parent:{get:function(){return i.parent}},scrollable:{get:function(){return i.scrollable}},autoPlace:{get:function(){return i.autoPlace}},closeOnTop:{get:function(){return i.closeOnTop}},preset:{get:function(){return n.parent?n.getRoot().preset:i.load.preset},set:function(e){n.parent?n.getRoot().preset=e:i.load.preset=e,function(e){for(var t=0;t1){var i=n.__li.nextElementSibling;return n.remove(),me(e,n.object,n.property,{before:i,factoryArgs:[w.toArray(arguments)]})}if(w.isArray(t)||w.isObject(t)){var o=n.__li.nextElementSibling;return n.remove(),me(e,n.object,n.property,{before:o,factoryArgs:[t]})}},name:function(e){return n.__li.firstElementChild.firstElementChild.innerHTML=e,n},listen:function(){return n.__gui.listen(n),n},remove:function(){return n.__gui.remove(n),n}}),n instanceof W){var i=new Y(n.object,n.property,{min:n.__min,max:n.__max,step:n.__step});w.each(["updateDisplay","onChange","onFinishChange","step"],function(e){var t=n[e],o=i[e];n[e]=i[e]=function(){var e=Array.prototype.slice.call(arguments);return o.apply(i,e),t.apply(n,e)}}),z.addClass(t,"has-slider"),n.domElement.insertBefore(i.domElement,n.domElement.firstElementChild)}else if(n instanceof Y){var o=function(t){if(w.isNumber(n.__min)&&w.isNumber(n.__max)){var i=n.__li.firstElementChild.firstElementChild.innerHTML,o=n.__gui.__listening.indexOf(n)>-1;n.remove();var r=me(e,n.object,n.property,{before:n.__li.nextElementSibling,factoryArgs:[n.__min,n.__max,n.__step]});return r.name(i),o&&r.listen(),r}return t};n.min=w.compose(o,n.min),n.max=w.compose(o,n.max)}else n instanceof I?(z.bind(t,"click",function(){z.fakeEvent(n.__checkbox,"click")}),z.bind(n.__checkbox,"click",function(e){e.stopPropagation()})):n instanceof Q?(z.bind(t,"click",function(){z.fakeEvent(n.__button,"click")}),z.bind(t,"mouseover",function(){z.addClass(n.__button,"hover")}),z.bind(t,"mouseout",function(){z.removeClass(n.__button,"hover")})):n instanceof q&&(z.addClass(t,"color"),n.updateDisplay=w.compose(function(e){return t.style.borderLeftColor=n.__color.toString(),e},n.updateDisplay),n.updateDisplay());n.setValue=w.compose(function(t){return e.getRoot().__preset_select&&n.isModified()&&pe(e.getRoot(),!0),t},n.setValue)}(e,l,o),e.__controllers.push(o),o}function ge(e,t){return document.location.href+"."+t}function be(e,t,n){var i=document.createElement("option");i.innerHTML=t,i.value=t,e.__preset_select.appendChild(i),n&&(e.__preset_select.selectedIndex=e.__preset_select.length-1)}function ve(e,t){t.style.display=e.useLocalStorage?"block":"none"}function ye(e){var t=void 0;function n(n){return n.preventDefault(),e.width+=t-n.clientX,e.onResize(),t=n.clientX,!1}function i(){z.removeClass(e.__closeButton,ue.CLASS_DRAG),z.unbind(window,"mousemove",n),z.unbind(window,"mouseup",i)}function o(o){return o.preventDefault(),t=o.clientX,z.addClass(e.__closeButton,ue.CLASS_DRAG),z.bind(window,"mousemove",n),z.bind(window,"mouseup",i),!1}e.__resize_handle=document.createElement("div"),w.extend(e.__resize_handle.style,{width:"6px",marginLeft:"-3px",height:"200px",cursor:"ew-resize",position:"absolute"}),z.bind(e.__resize_handle,"mousedown",o),z.bind(e.__closeButton,"mousedown",o),e.domElement.insertBefore(e.__resize_handle,e.domElement.firstElementChild)}function we(e,t){e.domElement.style.width=t+"px",e.__save_row&&e.autoPlace&&(e.__save_row.style.width=t+"px"),e.__closeButton&&(e.__closeButton.style.width=t+"px")}function xe(e,t){var n={};return w.each(e.__rememberedObjects,function(i,o){var r={};w.each(e.__rememberedObjectIndecesToControllers[o],function(e,n){r[n]=t?e.initialValue:e.getValue()}),n[o]=r}),n}ue.toggleHide=function(){de=!de,w.each(ce,function(e){e.domElement.style.display=de?"none":""})},ue.CLASS_AUTO_PLACE="a",ue.CLASS_AUTO_PLACE_CONTAINER="ac",ue.CLASS_MAIN="main",ue.CLASS_CONTROLLER_ROW="cr",ue.CLASS_TOO_TALL="taller-than-window",ue.CLASS_CLOSED="closed",ue.CLASS_CLOSE_BUTTON="close-button",ue.CLASS_CLOSE_TOP="close-top",ue.CLASS_CLOSE_BOTTOM="close-bottom",ue.CLASS_DRAG="drag",ue.DEFAULT_WIDTH=245,ue.TEXT_CLOSED="Close Controls",ue.TEXT_OPEN="Open Controls",ue._keydownHandler=function(e){"text"===document.activeElement.type||72!==e.which&&72!==e.keyCode||ue.toggleHide()},z.bind(window,"keydown",ue._keydownHandler,!1),w.extend(ue.prototype,{add:function(e,t){return me(this,e,t,{factoryArgs:Array.prototype.slice.call(arguments,2)})},addColor:function(e,t){return me(this,e,t,{color:!0})},remove:function(e){this.__ul.removeChild(e.__li),this.__controllers.splice(this.__controllers.indexOf(e),1);var t=this;w.defer(function(){t.onResize()})},destroy:function(){if(this.parent)throw new Error("Only the root GUI should be removed with .destroy(). For subfolders, use gui.removeFolder(folder) instead.");this.autoPlace&&le.removeChild(this.domElement);var e=this;w.each(this.__folders,function(t){e.removeFolder(t)}),z.unbind(window,"keydown",ue._keydownHandler,!1),_e(this)},addFolder:function(e){if(void 0!==this.__folders[e])throw new Error('You already have a folder in this GUI by the name "'+e+'"');var t={name:e,parent:this};t.autoPlace=this.autoPlace,this.load&&this.load.folders&&this.load.folders[e]&&(t.closed=this.load.folders[e].closed,t.load=this.load.folders[e]);var n=new ue(t);this.__folders[e]=n;var i=he(this,n.domElement);return z.addClass(i,"folder"),n},removeFolder:function(e){this.__ul.removeChild(e.domElement.parentElement),delete this.__folders[e.name],this.load&&this.load.folders&&this.load.folders[e.name]&&delete this.load.folders[e.name],_e(e);var t=this;w.each(e.__folders,function(t){e.removeFolder(t)}),w.defer(function(){t.onResize()})},open:function(){this.closed=!1},close:function(){this.closed=!0},onResize:function(){var e=this.getRoot();if(e.scrollable){var t=z.getOffset(e.__ul).top,n=0;w.each(e.__ul.childNodes,function(t){e.autoPlace&&t===e.__save_row||(n+=z.getHeight(t))}),window.innerHeight-t-20GUI\'s constructor:\n\n \n\n
\n\n Automatically save\n values to localStorage on exit.\n\n
The values saved to localStorage will\n override those passed to dat.GUI\'s constructor. This makes it\n easier to work incrementally, but localStorage is fragile,\n and your friends may not see the same values you do.\n\n
\n\n
\n\n'),this.parent)throw new Error("You can only call remember on a top level GUI.");var e=this;w.each(Array.prototype.slice.call(arguments),function(t){0===e.__rememberedObjects.length&&function(e){var t=e.__save_row=document.createElement("li");z.addClass(e.domElement,"has-save"),e.__ul.insertBefore(t,e.__ul.firstChild),z.addClass(t,"save-row");var n=document.createElement("span");n.innerHTML=" ",z.addClass(n,"button gears");var i=document.createElement("span");i.innerHTML="Save",z.addClass(i,"button"),z.addClass(i,"save");var o=document.createElement("span");o.innerHTML="New",z.addClass(o,"button"),z.addClass(o,"save-as");var r=document.createElement("span");r.innerHTML="Revert",z.addClass(r,"button"),z.addClass(r,"revert");var s=e.__preset_select=document.createElement("select");e.load&&e.load.remembered?w.each(e.load.remembered,function(t,n){be(e,n,n===e.preset)}):be(e,oe,!1);if(z.bind(s,"change",function(){for(var t=0;t0&&(e.preset=this.preset,e.remembered||(e.remembered={}),e.remembered[this.preset]=xe(this)),e.folders={},w.each(this.__folders,function(t,n){e.folders[n]=t.getSaveObject()}),e},save:function(){this.load.remembered||(this.load.remembered={}),this.load.remembered[this.preset]=xe(this),pe(this,!1),this.saveToLocalStorageIfPossible()},saveAs:function(e){this.load.remembered||(this.load.remembered={},this.load.remembered[oe]=xe(this,!0)),this.load.remembered[e]=xe(this),this.preset=e,be(this,e,!0),this.saveToLocalStorageIfPossible()},revert:function(e){w.each(this.__controllers,function(t){this.getRoot().load.remembered?fe(e||this.getRoot(),t):t.setValue(t.initialValue),t.__onFinishChange&&t.__onFinishChange.call(t,t.getValue())},this),w.each(this.__folders,function(e){e.revert(e)}),e||pe(this.getRoot(),!1)},listen:function(e){var t=0===this.__listening.length;this.__listening.push(e),t&&function e(t){0!==t.length&&ne.call(window,function(){e(t)});w.each(t,function(e){e.updateDisplay()})}(this.__listening)},updateDisplay:function(){w.each(this.__controllers,function(e){e.updateDisplay()}),w.each(this.__folders,function(e){e.updateDisplay()})}});var Ee=[null,10,6],Ae=new ue,Ce={tension:.1,friction:.2,timestep:8},Se=Array.from(document.querySelectorAll(".dot")).map(function(t,n){return function(t,n,i){var o=new e(i),r=new e(i),s=Ee[n]?function(e,t){if(void 0===t)throw new Error("You must specify a callback");void 0===e&&(e=30);var n=1e3/e,i=0,o=0;return function(e){o+=e,(i-=e)<=0&&(t(o),o=0,i=n+i%n)}}(Ee[n],a):a;return o.onStart=function(){return!r.stopped&&g.add(s)},r.onStart=function(){return!o.stopped&&g.add(s)},o.onStop=function(){return r.stopped&&g.remove(s)},r.onStop=function(){return o.stopped&&g.remove(s)},{setTarget:function(e,t){o.setTarget(e),r.setTarget(t)},setTension:function(e){o.setTension(e),r.setTension(e)},setFriction:function(e){o.setFriction(e),r.setFriction(e)},setStep:function(e){o.setStep(e),r.setStep(e)}};function a(e){o.update(e),r.update(e),t.classList[o.stopped&&r.stopped?"add":"remove"]("stopped"),t.style.transform="translate3d("+o.value+"px, "+r.value+"px, 0)"}}(t,n,{precisionStop:.01,perfectStop:!0,tension:Ce.tension,friction:Ce.friction,step:8})});Ae.add(Ce,"tension",0,1).onChange(function(e){Se.forEach(function(t){return t.setTension(e)})}),Ae.add(Ce,"friction",0,1).onChange(function(e){Se.forEach(function(t){return t.setFriction(e)})}),document.addEventListener("mousemove",function(e){for(var t=0;t 16.67ms will give you pretty bad results.\n * @param {function} [options.onStart] `onStart` will be called when the spring starts moving.\n * @param {function} [options.onStop] `onStop` will be called when your the spring stops moving.\n * @param {number} [options.precisionStop=0.0001] Minimum distance between `value` and `target` to consider the spring stopped.\n * @param {boolean} [options.perfectStop=false] Define if `value` is set precisely to targetValue when the spring stops moving.\n * @constructor\n * @example\n * import { raf } from '@internet/raf'\n * import Spring from '@internet/spring'\n *\n * const move = new Spring({ initial: 0 })\n * move.setTarget(300)\n * raf.add(dt => {\n * move.update(dt)\n * console.log(move.value)\n * })\n *\n */\nfunction Spring (options) {\n if (options === void 0) options = {}\n /**\n * Initial position of the spring\n * @type {number}\n * @category Properties\n */\n this.initial = options.initial || 0\n\n /**\n * Current position of the spring\n * @type {number}\n * @category Properties\n */\n this.value = this.initial\n\n /**\n * Previous frame position of the spring\n * @type {number}\n * @category Properties\n */\n this.previous = this.initial\n\n /**\n * Current velocity of the spring\n * @type {number}\n * @category Properties\n */\n this.velocity = 0\n\n /**\n * Optional function called when the spring starts\n * @type {function}\n * @category Properties\n */\n this.onStart = options.onStart\n\n /**\n * Optional function called when the spring stops\n * @type {function}\n * @category Properties\n */\n this.onStop = options.onStop\n\n this.precisionStop = options.precisionStop || 0.0001\n this.perfectStop = !!options.perfectStop\n\n this.setValue(this.initial)\n this.setTarget(this.initial)\n this.setMass(options.mass || 1)\n this.setTension(options.tension || 0.1)\n this.setFriction(options.friction || 0.2)\n this.setStep(options.step || 10)\n}\n\n/**\n * Change the current position of the spring. Can retrigger onStart / onStop.\n * @method\n * @param {number} newCurrent New current value.\n * @category Methods\n */\nSpring.prototype.setValue = function setValue (v) {\n this.value = v\n if (Math.abs(this.target - this.value) > this.precisionStop) this.start()\n else this.stop()\n}\n\n/**\n * Update target / resting position of the spring. Can retrigger onStart / onStop.\n * @method\n * @param {number} newTarget New target value.\n * @category Methods\n */\nSpring.prototype.setTarget = function setTarget (v) {\n this.target = v\n if (Math.abs(this.target - this.value) > this.precisionStop) this.start()\n else this.stop()\n}\n\n/**\n * Update tension of the spring\n * @method\n * @param {number} tensionValue New tension value.\n * @category Methods\n */\nSpring.prototype.setTension = function setTension (v) {\n this._K = v\n}\n\n/**\n * Update friction of the spring\n * @method\n * @param {number} frictionValue New friction value.\n * @category Methods\n */\nSpring.prototype.setFriction = function setFriction (v) {\n this._D = v\n this._dampingAdjuster = Math.pow(1 - this._D, this._stepAdjuster)\n}\n\nSpring.prototype.setMass = function setMass (v) {\n this.mass = v\n this._inverseMass = 1 / this.mass\n}\n\nSpring.prototype.setStep = function setStep (v) {\n this._step = v\n this._stepAdjuster = this._step / 16.67\n this.setFriction(this._D) // recompute dampingAdjuster\n}\n\n/**\n * Force re-start of the spring. Only needed if you force-stop the spring with `stop()`\n * @method\n * @category Methods\n */\nSpring.prototype.start = function start () {\n this.stopped = false\n if (this.onStart) this.onStart()\n}\n\n/**\n * Force-stop the spring.\n * @method\n * @category Methods\n */\nSpring.prototype.stop = function stop () {\n if (this.stopped) return\n if (this.perfectStop && Math.abs(this.target - this.value) <= this.precisionStop) this.value = this.target\n this.acceleration = 0\n this.velocity = 0\n this._accumulator = 0\n this._prevStepVel = 0\n this._prevStepValue = this.value\n this._adjusted = false\n this.stopped = true\n if (this.onStop) this.onStop()\n}\n\n/**\n * Update the spring physic state\n * @method\n * @param {number} dt Elapsed time since the last frame (in ms)\n * @category Methods\n */\nSpring.prototype.update = function update (dt) {\n if (this.stopped) return\n this._accumulator += dt\n this.previous = this.value\n\n if (this._adjusted) {\n this._adjusted = false\n this.velocity = this._prevStepVel\n this.value = this._prevStepValue\n }\n\n if (dt < this._step) {\n this._adjusted = true\n this._accumulator += this._step\n }\n\n while (this._accumulator >= this._step) {\n this.acceleration = -this._K * (this.value - this.target) * this._inverseMass // f = a * m <=> a = f / m\n this._prevStepVel = this.velocity\n this.velocity = (this.velocity + this.acceleration * this._stepAdjuster) * this._dampingAdjuster\n this._prevStepValue = this.value\n this.value = this.value + this.velocity * this._stepAdjuster\n this._accumulator -= this._step\n }\n\n if (this._adjusted) {\n var lerp = this._accumulator / this._step\n this.value = this.value * lerp + this._prevStepValue * (1 - lerp)\n }\n\n if (Math.abs(this.target - this.value) <= this.precisionStop) this.stop()\n}\n\n/**\n * Stop the spring and remove callbacks referenced in onStart and onStop.\n * @category Methods\n */\nSpring.prototype.dispose = function dispose () {\n this.stop()\n this.onStart = null\n this.onStop = null\n}\n\nexport default Spring\n","'use strict'\n\n/**\n * Core of the raf package\n * @module raf\n * @type {Object}\n * @example\n * import { raf } from '@internet/raf'\n *\n * function tick (dt) {\n * console.log('called on new frame')\n * }\n *\n * raf.add(tick)\n */\n\nvar root = typeof window === 'undefined' ? global : window\nvar _observers = []\nvar _afterObservers = []\nvar _beforeObservers = []\nvar _rafHandler = null\nvar _lastDate = null\nvar _once = false\nvar _complex = false\n\n/**\n * Time elapsed between the previous and the current frame\n * @type {number}\n * @static\n * @category properties\n */\nvar time\n\n/**\n * Current delta time\n * @type {number}\n * @static\n * @category properties\n */\nvar dt\n\nfunction _frame (timestamp) {\n // compute deltatime and time\n if (timestamp === void 0) timestamp = 0\n if (_lastDate === null) _lastDate = timestamp\n dt = timestamp - _lastDate\n time += dt\n _lastDate = timestamp\n // we request the frame now, allowing to cancel it from observers\n _rafHandler = _once ? null : root.requestAnimationFrame(_frame)\n if (_once) _once = false\n // call all observers\n var i\n if (_complex) {\n for (i = 0; i < _beforeObservers.length; i++) _beforeObservers[i](dt)\n for (i = 0; i < _observers.length; i++) _observers[i](dt)\n for (i = 0; i < _afterObservers.length; i++) _afterObservers[i](dt)\n } else {\n for (i = 0; i < _observers.length; i++) _observers[i](dt)\n }\n}\n\nfunction _swapRunner () {\n _complex = !!(_afterObservers.length > 0 || _beforeObservers.length > 0)\n}\n\nfunction _addObserver (arr, fn, prepend) {\n if (!fn || !arr) return false\n if (~arr.indexOf(fn)) return false\n prepend = !!prepend\n prepend ? arr.unshift(fn) : arr.push(fn)\n return true\n}\n\nfunction _removeObserver (arr, fn) {\n if (!fn) return false\n var index = arr.indexOf(fn)\n if (!~index) return false\n arr.splice(index, 1)\n return !!(arr.length === 0)\n}\n\n/**\n * Add a function for execution at the beginning of the raf call\n * Calling addBefore will not start the raf.\n * @param {function} fn Function to be called at the start of the raf\n * @param {function} [prepend=false] Prepend the function to the beginning of the functions list\n * @static\n * @category methods\n */\nfunction addBefore (fn, prepend) {\n _addObserver(_beforeObservers, fn, prepend) && _swapRunner()\n}\n\n/**\n * Add a function for execution at the end of the raf call\n * Calling addAfter will not start the raf.\n * @param {function} fn Function to be called at the end of the raf\n * @param {function} [prepend=false] Prepend the function to the beginning of the functions list\n * @static\n * @category methods\n */\nfunction addAfter (fn, prepend) {\n _addObserver(_afterObservers, fn, prepend) && _swapRunner()\n}\n\n/**\n * Add a function for execution on each frame\n * @param {function} fn Function to be called\n * @param {function} [prepend=false] Prepend the function to the beginning of the functions list\n * @static\n * @category methods\n */\nfunction add (fn, prepend) {\n _addObserver(_observers, fn, prepend) && start()\n}\n\n/**\n * Remove a function for execution at the beginning of the raf call\n * Calling removeBefore will not stop the raf.\n * @param {function} fn Function to remove from the raf\n * @static\n * @category methods\n */\nfunction removeBefore (fn) {\n _removeObserver(_beforeObservers, fn) && _swapRunner()\n}\n\n/**\n * Remove a function for execution at the end of the raf call\n * Calling removeAfter will not stop the raf.\n * @param {function} fn Function to remove from the raf\n * @param {function} [prepend=false] Prepend the function to the beginning of the functions list\n * @static\n * @category methods\n */\nfunction removeAfter (fn, prepend) {\n _removeObserver(_afterObservers, fn) && _swapRunner()\n}\n\n/**\n * Remove a function for execution on each frame\n * @param {function} fn Function to remove from the raf\n * @static\n * @category methods\n */\nfunction remove (fn) {\n _removeObserver(_observers, fn) && stop()\n}\n\n/**\n * Force start the raf. You usually don't need to use it.\n * @param {boolean} [instant=false] Directly make a raf call without waiting for the next frame (default false)\n * @static\n * @category methods\n */\nfunction start (instant) {\n _once = false\n if (_rafHandler) return\n instant = !!instant\n _lastDate = null\n if (instant) _frame()\n else _rafHandler = root.requestAnimationFrame(_frame)\n}\n\n/**\n * Request once the raf. Will not be executed if the raf is already running.\n * @static\n * @category methods\n */\nfunction requestOnce () {\n if (_rafHandler) return\n _once = true\n _lastDate = null\n _rafHandler = root.requestAnimationFrame(_frame)\n}\n\n/**\n * Force stop the raf. You usually don't need to use it.\n * @static\n * @category methods\n */\nfunction stop () {\n if (!_rafHandler) return\n root.cancelAnimationFrame(_rafHandler)\n _rafHandler = null\n}\n\n/**\n * Remove all observers from the raf singleton and stop the raf if it's running. Reset time.\n * @static\n * @category methods\n */\nfunction dispose () {\n stop()\n _observers.length = 0\n _afterObservers.length = 0\n _beforeObservers.length = 0\n _complex = false\n _lastDate = null\n time = 0\n dt = 0\n}\n\nexport default {\n add: add,\n addAfter: addAfter,\n addBefore: addBefore,\n remove: remove,\n removeAfter: removeAfter,\n removeBefore: removeBefore,\n start: start,\n stop: stop,\n time: time,\n dt: dt,\n requestOnce: requestOnce,\n dispose: dispose\n}\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nfunction ___$insertStyle(css) {\n if (!css) {\n return;\n }\n if (typeof window === 'undefined') {\n return;\n }\n\n var style = document.createElement('style');\n\n style.setAttribute('type', 'text/css');\n style.innerHTML = css;\n document.head.appendChild(style);\n\n return css;\n}\n\nfunction colorToString (color, forceCSSHex) {\n var colorFormat = color.__state.conversionName.toString();\n var r = Math.round(color.r);\n var g = Math.round(color.g);\n var b = Math.round(color.b);\n var a = color.a;\n var h = Math.round(color.h);\n var s = color.s.toFixed(1);\n var v = color.v.toFixed(1);\n if (forceCSSHex || colorFormat === 'THREE_CHAR_HEX' || colorFormat === 'SIX_CHAR_HEX') {\n var str = color.hex.toString(16);\n while (str.length < 6) {\n str = '0' + str;\n }\n return '#' + str;\n } else if (colorFormat === 'CSS_RGB') {\n return 'rgb(' + r + ',' + g + ',' + b + ')';\n } else if (colorFormat === 'CSS_RGBA') {\n return 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')';\n } else if (colorFormat === 'HEX') {\n return '0x' + color.hex.toString(16);\n } else if (colorFormat === 'RGB_ARRAY') {\n return '[' + r + ',' + g + ',' + b + ']';\n } else if (colorFormat === 'RGBA_ARRAY') {\n return '[' + r + ',' + g + ',' + b + ',' + a + ']';\n } else if (colorFormat === 'RGB_OBJ') {\n return '{r:' + r + ',g:' + g + ',b:' + b + '}';\n } else if (colorFormat === 'RGBA_OBJ') {\n return '{r:' + r + ',g:' + g + ',b:' + b + ',a:' + a + '}';\n } else if (colorFormat === 'HSV_OBJ') {\n return '{h:' + h + ',s:' + s + ',v:' + v + '}';\n } else if (colorFormat === 'HSVA_OBJ') {\n return '{h:' + h + ',s:' + s + ',v:' + v + ',a:' + a + '}';\n }\n return 'unknown format';\n}\n\nvar ARR_EACH = Array.prototype.forEach;\nvar ARR_SLICE = Array.prototype.slice;\nvar Common = {\n BREAK: {},\n extend: function extend(target) {\n this.each(ARR_SLICE.call(arguments, 1), function (obj) {\n var keys = this.isObject(obj) ? Object.keys(obj) : [];\n keys.forEach(function (key) {\n if (!this.isUndefined(obj[key])) {\n target[key] = obj[key];\n }\n }.bind(this));\n }, this);\n return target;\n },\n defaults: function defaults(target) {\n this.each(ARR_SLICE.call(arguments, 1), function (obj) {\n var keys = this.isObject(obj) ? Object.keys(obj) : [];\n keys.forEach(function (key) {\n if (this.isUndefined(target[key])) {\n target[key] = obj[key];\n }\n }.bind(this));\n }, this);\n return target;\n },\n compose: function compose() {\n var toCall = ARR_SLICE.call(arguments);\n return function () {\n var args = ARR_SLICE.call(arguments);\n for (var i = toCall.length - 1; i >= 0; i--) {\n args = [toCall[i].apply(this, args)];\n }\n return args[0];\n };\n },\n each: function each(obj, itr, scope) {\n if (!obj) {\n return;\n }\n if (ARR_EACH && obj.forEach && obj.forEach === ARR_EACH) {\n obj.forEach(itr, scope);\n } else if (obj.length === obj.length + 0) {\n var key = void 0;\n var l = void 0;\n for (key = 0, l = obj.length; key < l; key++) {\n if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) {\n return;\n }\n }\n } else {\n for (var _key in obj) {\n if (itr.call(scope, obj[_key], _key) === this.BREAK) {\n return;\n }\n }\n }\n },\n defer: function defer(fnc) {\n setTimeout(fnc, 0);\n },\n debounce: function debounce(func, threshold, callImmediately) {\n var timeout = void 0;\n return function () {\n var obj = this;\n var args = arguments;\n function delayed() {\n timeout = null;\n if (!callImmediately) func.apply(obj, args);\n }\n var callNow = callImmediately || !timeout;\n clearTimeout(timeout);\n timeout = setTimeout(delayed, threshold);\n if (callNow) {\n func.apply(obj, args);\n }\n };\n },\n toArray: function toArray(obj) {\n if (obj.toArray) return obj.toArray();\n return ARR_SLICE.call(obj);\n },\n isUndefined: function isUndefined(obj) {\n return obj === undefined;\n },\n isNull: function isNull(obj) {\n return obj === null;\n },\n isNaN: function (_isNaN) {\n function isNaN(_x) {\n return _isNaN.apply(this, arguments);\n }\n isNaN.toString = function () {\n return _isNaN.toString();\n };\n return isNaN;\n }(function (obj) {\n return isNaN(obj);\n }),\n isArray: Array.isArray || function (obj) {\n return obj.constructor === Array;\n },\n isObject: function isObject(obj) {\n return obj === Object(obj);\n },\n isNumber: function isNumber(obj) {\n return obj === obj + 0;\n },\n isString: function isString(obj) {\n return obj === obj + '';\n },\n isBoolean: function isBoolean(obj) {\n return obj === false || obj === true;\n },\n isFunction: function isFunction(obj) {\n return Object.prototype.toString.call(obj) === '[object Function]';\n }\n};\n\nvar INTERPRETATIONS = [\n{\n litmus: Common.isString,\n conversions: {\n THREE_CHAR_HEX: {\n read: function read(original) {\n var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);\n if (test === null) {\n return false;\n }\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString() + test[1].toString() + test[2].toString() + test[2].toString() + test[3].toString() + test[3].toString(), 0)\n };\n },\n write: colorToString\n },\n SIX_CHAR_HEX: {\n read: function read(original) {\n var test = original.match(/^#([A-F0-9]{6})$/i);\n if (test === null) {\n return false;\n }\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString(), 0)\n };\n },\n write: colorToString\n },\n CSS_RGB: {\n read: function read(original) {\n var test = original.match(/^rgb\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\)/);\n if (test === null) {\n return false;\n }\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3])\n };\n },\n write: colorToString\n },\n CSS_RGBA: {\n read: function read(original) {\n var test = original.match(/^rgba\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\)/);\n if (test === null) {\n return false;\n }\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3]),\n a: parseFloat(test[4])\n };\n },\n write: colorToString\n }\n }\n},\n{\n litmus: Common.isNumber,\n conversions: {\n HEX: {\n read: function read(original) {\n return {\n space: 'HEX',\n hex: original,\n conversionName: 'HEX'\n };\n },\n write: function write(color) {\n return color.hex;\n }\n }\n }\n},\n{\n litmus: Common.isArray,\n conversions: {\n RGB_ARRAY: {\n read: function read(original) {\n if (original.length !== 3) {\n return false;\n }\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2]\n };\n },\n write: function write(color) {\n return [color.r, color.g, color.b];\n }\n },\n RGBA_ARRAY: {\n read: function read(original) {\n if (original.length !== 4) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2],\n a: original[3]\n };\n },\n write: function write(color) {\n return [color.r, color.g, color.b, color.a];\n }\n }\n }\n},\n{\n litmus: Common.isObject,\n conversions: {\n RGBA_OBJ: {\n read: function read(original) {\n if (Common.isNumber(original.r) && Common.isNumber(original.g) && Common.isNumber(original.b) && Common.isNumber(original.a)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b,\n a: original.a\n };\n }\n return false;\n },\n write: function write(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b,\n a: color.a\n };\n }\n },\n RGB_OBJ: {\n read: function read(original) {\n if (Common.isNumber(original.r) && Common.isNumber(original.g) && Common.isNumber(original.b)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b\n };\n }\n return false;\n },\n write: function write(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b\n };\n }\n },\n HSVA_OBJ: {\n read: function read(original) {\n if (Common.isNumber(original.h) && Common.isNumber(original.s) && Common.isNumber(original.v) && Common.isNumber(original.a)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v,\n a: original.a\n };\n }\n return false;\n },\n write: function write(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v,\n a: color.a\n };\n }\n },\n HSV_OBJ: {\n read: function read(original) {\n if (Common.isNumber(original.h) && Common.isNumber(original.s) && Common.isNumber(original.v)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v\n };\n }\n return false;\n },\n write: function write(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v\n };\n }\n }\n }\n}];\nvar result = void 0;\nvar toReturn = void 0;\nvar interpret = function interpret() {\n toReturn = false;\n var original = arguments.length > 1 ? Common.toArray(arguments) : arguments[0];\n Common.each(INTERPRETATIONS, function (family) {\n if (family.litmus(original)) {\n Common.each(family.conversions, function (conversion, conversionName) {\n result = conversion.read(original);\n if (toReturn === false && result !== false) {\n toReturn = result;\n result.conversionName = conversionName;\n result.conversion = conversion;\n return Common.BREAK;\n }\n });\n return Common.BREAK;\n }\n });\n return toReturn;\n};\n\nvar tmpComponent = void 0;\nvar ColorMath = {\n hsv_to_rgb: function hsv_to_rgb(h, s, v) {\n var hi = Math.floor(h / 60) % 6;\n var f = h / 60 - Math.floor(h / 60);\n var p = v * (1.0 - s);\n var q = v * (1.0 - f * s);\n var t = v * (1.0 - (1.0 - f) * s);\n var c = [[v, t, p], [q, v, p], [p, v, t], [p, q, v], [t, p, v], [v, p, q]][hi];\n return {\n r: c[0] * 255,\n g: c[1] * 255,\n b: c[2] * 255\n };\n },\n rgb_to_hsv: function rgb_to_hsv(r, g, b) {\n var min = Math.min(r, g, b);\n var max = Math.max(r, g, b);\n var delta = max - min;\n var h = void 0;\n var s = void 0;\n if (max !== 0) {\n s = delta / max;\n } else {\n return {\n h: NaN,\n s: 0,\n v: 0\n };\n }\n if (r === max) {\n h = (g - b) / delta;\n } else if (g === max) {\n h = 2 + (b - r) / delta;\n } else {\n h = 4 + (r - g) / delta;\n }\n h /= 6;\n if (h < 0) {\n h += 1;\n }\n return {\n h: h * 360,\n s: s,\n v: max / 255\n };\n },\n rgb_to_hex: function rgb_to_hex(r, g, b) {\n var hex = this.hex_with_component(0, 2, r);\n hex = this.hex_with_component(hex, 1, g);\n hex = this.hex_with_component(hex, 0, b);\n return hex;\n },\n component_from_hex: function component_from_hex(hex, componentIndex) {\n return hex >> componentIndex * 8 & 0xFF;\n },\n hex_with_component: function hex_with_component(hex, componentIndex, value) {\n return value << (tmpComponent = componentIndex * 8) | hex & ~(0xFF << tmpComponent);\n }\n};\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) {\n return typeof obj;\n} : function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n};\n\n\n\n\n\n\n\n\n\n\n\nvar classCallCheck = function (instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n};\n\nvar createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n}();\n\n\n\n\n\n\n\nvar get = function get(object, property, receiver) {\n if (object === null) object = Function.prototype;\n var desc = Object.getOwnPropertyDescriptor(object, property);\n\n if (desc === undefined) {\n var parent = Object.getPrototypeOf(object);\n\n if (parent === null) {\n return undefined;\n } else {\n return get(parent, property, receiver);\n }\n } else if (\"value\" in desc) {\n return desc.value;\n } else {\n var getter = desc.get;\n\n if (getter === undefined) {\n return undefined;\n }\n\n return getter.call(receiver);\n }\n};\n\nvar inherits = function (subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n};\n\n\n\n\n\n\n\n\n\n\n\nvar possibleConstructorReturn = function (self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n};\n\nvar Color = function () {\n function Color() {\n classCallCheck(this, Color);\n this.__state = interpret.apply(this, arguments);\n if (this.__state === false) {\n throw new Error('Failed to interpret color arguments');\n }\n this.__state.a = this.__state.a || 1;\n }\n createClass(Color, [{\n key: 'toString',\n value: function toString() {\n return colorToString(this);\n }\n }, {\n key: 'toHexString',\n value: function toHexString() {\n return colorToString(this, true);\n }\n }, {\n key: 'toOriginal',\n value: function toOriginal() {\n return this.__state.conversion.write(this);\n }\n }]);\n return Color;\n}();\nfunction defineRGBComponent(target, component, componentHexIndex) {\n Object.defineProperty(target, component, {\n get: function get$$1() {\n if (this.__state.space === 'RGB') {\n return this.__state[component];\n }\n Color.recalculateRGB(this, component, componentHexIndex);\n return this.__state[component];\n },\n set: function set$$1(v) {\n if (this.__state.space !== 'RGB') {\n Color.recalculateRGB(this, component, componentHexIndex);\n this.__state.space = 'RGB';\n }\n this.__state[component] = v;\n }\n });\n}\nfunction defineHSVComponent(target, component) {\n Object.defineProperty(target, component, {\n get: function get$$1() {\n if (this.__state.space === 'HSV') {\n return this.__state[component];\n }\n Color.recalculateHSV(this);\n return this.__state[component];\n },\n set: function set$$1(v) {\n if (this.__state.space !== 'HSV') {\n Color.recalculateHSV(this);\n this.__state.space = 'HSV';\n }\n this.__state[component] = v;\n }\n });\n}\nColor.recalculateRGB = function (color, component, componentHexIndex) {\n if (color.__state.space === 'HEX') {\n color.__state[component] = ColorMath.component_from_hex(color.__state.hex, componentHexIndex);\n } else if (color.__state.space === 'HSV') {\n Common.extend(color.__state, ColorMath.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v));\n } else {\n throw new Error('Corrupted color state');\n }\n};\nColor.recalculateHSV = function (color) {\n var result = ColorMath.rgb_to_hsv(color.r, color.g, color.b);\n Common.extend(color.__state, {\n s: result.s,\n v: result.v\n });\n if (!Common.isNaN(result.h)) {\n color.__state.h = result.h;\n } else if (Common.isUndefined(color.__state.h)) {\n color.__state.h = 0;\n }\n};\nColor.COMPONENTS = ['r', 'g', 'b', 'h', 's', 'v', 'hex', 'a'];\ndefineRGBComponent(Color.prototype, 'r', 2);\ndefineRGBComponent(Color.prototype, 'g', 1);\ndefineRGBComponent(Color.prototype, 'b', 0);\ndefineHSVComponent(Color.prototype, 'h');\ndefineHSVComponent(Color.prototype, 's');\ndefineHSVComponent(Color.prototype, 'v');\nObject.defineProperty(Color.prototype, 'a', {\n get: function get$$1() {\n return this.__state.a;\n },\n set: function set$$1(v) {\n this.__state.a = v;\n }\n});\nObject.defineProperty(Color.prototype, 'hex', {\n get: function get$$1() {\n if (!this.__state.space !== 'HEX') {\n this.__state.hex = ColorMath.rgb_to_hex(this.r, this.g, this.b);\n }\n return this.__state.hex;\n },\n set: function set$$1(v) {\n this.__state.space = 'HEX';\n this.__state.hex = v;\n }\n});\n\nvar Controller = function () {\n function Controller(object, property) {\n classCallCheck(this, Controller);\n this.initialValue = object[property];\n this.domElement = document.createElement('div');\n this.object = object;\n this.property = property;\n this.__onChange = undefined;\n this.__onFinishChange = undefined;\n }\n createClass(Controller, [{\n key: 'onChange',\n value: function onChange(fnc) {\n this.__onChange = fnc;\n return this;\n }\n }, {\n key: 'onFinishChange',\n value: function onFinishChange(fnc) {\n this.__onFinishChange = fnc;\n return this;\n }\n }, {\n key: 'setValue',\n value: function setValue(newValue) {\n this.object[this.property] = newValue;\n if (this.__onChange) {\n this.__onChange.call(this, newValue);\n }\n this.updateDisplay();\n return this;\n }\n }, {\n key: 'getValue',\n value: function getValue() {\n return this.object[this.property];\n }\n }, {\n key: 'updateDisplay',\n value: function updateDisplay() {\n return this;\n }\n }, {\n key: 'isModified',\n value: function isModified() {\n return this.initialValue !== this.getValue();\n }\n }]);\n return Controller;\n}();\n\nvar EVENT_MAP = {\n HTMLEvents: ['change'],\n MouseEvents: ['click', 'mousemove', 'mousedown', 'mouseup', 'mouseover'],\n KeyboardEvents: ['keydown']\n};\nvar EVENT_MAP_INV = {};\nCommon.each(EVENT_MAP, function (v, k) {\n Common.each(v, function (e) {\n EVENT_MAP_INV[e] = k;\n });\n});\nvar CSS_VALUE_PIXELS = /(\\d+(\\.\\d+)?)px/;\nfunction cssValueToPixels(val) {\n if (val === '0' || Common.isUndefined(val)) {\n return 0;\n }\n var match = val.match(CSS_VALUE_PIXELS);\n if (!Common.isNull(match)) {\n return parseFloat(match[1]);\n }\n return 0;\n}\nvar dom = {\n makeSelectable: function makeSelectable(elem, selectable) {\n if (elem === undefined || elem.style === undefined) return;\n elem.onselectstart = selectable ? function () {\n return false;\n } : function () {};\n elem.style.MozUserSelect = selectable ? 'auto' : 'none';\n elem.style.KhtmlUserSelect = selectable ? 'auto' : 'none';\n elem.unselectable = selectable ? 'on' : 'off';\n },\n makeFullscreen: function makeFullscreen(elem, hor, vert) {\n var vertical = vert;\n var horizontal = hor;\n if (Common.isUndefined(horizontal)) {\n horizontal = true;\n }\n if (Common.isUndefined(vertical)) {\n vertical = true;\n }\n elem.style.position = 'absolute';\n if (horizontal) {\n elem.style.left = 0;\n elem.style.right = 0;\n }\n if (vertical) {\n elem.style.top = 0;\n elem.style.bottom = 0;\n }\n },\n fakeEvent: function fakeEvent(elem, eventType, pars, aux) {\n var params = pars || {};\n var className = EVENT_MAP_INV[eventType];\n if (!className) {\n throw new Error('Event type ' + eventType + ' not supported.');\n }\n var evt = document.createEvent(className);\n switch (className) {\n case 'MouseEvents':\n {\n var clientX = params.x || params.clientX || 0;\n var clientY = params.y || params.clientY || 0;\n evt.initMouseEvent(eventType, params.bubbles || false, params.cancelable || true, window, params.clickCount || 1, 0,\n 0,\n clientX,\n clientY,\n false, false, false, false, 0, null);\n break;\n }\n case 'KeyboardEvents':\n {\n var init = evt.initKeyboardEvent || evt.initKeyEvent;\n Common.defaults(params, {\n cancelable: true,\n ctrlKey: false,\n altKey: false,\n shiftKey: false,\n metaKey: false,\n keyCode: undefined,\n charCode: undefined\n });\n init(eventType, params.bubbles || false, params.cancelable, window, params.ctrlKey, params.altKey, params.shiftKey, params.metaKey, params.keyCode, params.charCode);\n break;\n }\n default:\n {\n evt.initEvent(eventType, params.bubbles || false, params.cancelable || true);\n break;\n }\n }\n Common.defaults(evt, aux);\n elem.dispatchEvent(evt);\n },\n bind: function bind(elem, event, func, newBool) {\n var bool = newBool || false;\n if (elem.addEventListener) {\n elem.addEventListener(event, func, bool);\n } else if (elem.attachEvent) {\n elem.attachEvent('on' + event, func);\n }\n return dom;\n },\n unbind: function unbind(elem, event, func, newBool) {\n var bool = newBool || false;\n if (elem.removeEventListener) {\n elem.removeEventListener(event, func, bool);\n } else if (elem.detachEvent) {\n elem.detachEvent('on' + event, func);\n }\n return dom;\n },\n addClass: function addClass(elem, className) {\n if (elem.className === undefined) {\n elem.className = className;\n } else if (elem.className !== className) {\n var classes = elem.className.split(/ +/);\n if (classes.indexOf(className) === -1) {\n classes.push(className);\n elem.className = classes.join(' ').replace(/^\\s+/, '').replace(/\\s+$/, '');\n }\n }\n return dom;\n },\n removeClass: function removeClass(elem, className) {\n if (className) {\n if (elem.className === className) {\n elem.removeAttribute('class');\n } else {\n var classes = elem.className.split(/ +/);\n var index = classes.indexOf(className);\n if (index !== -1) {\n classes.splice(index, 1);\n elem.className = classes.join(' ');\n }\n }\n } else {\n elem.className = undefined;\n }\n return dom;\n },\n hasClass: function hasClass(elem, className) {\n return new RegExp('(?:^|\\\\s+)' + className + '(?:\\\\s+|$)').test(elem.className) || false;\n },\n getWidth: function getWidth(elem) {\n var style = getComputedStyle(elem);\n return cssValueToPixels(style['border-left-width']) + cssValueToPixels(style['border-right-width']) + cssValueToPixels(style['padding-left']) + cssValueToPixels(style['padding-right']) + cssValueToPixels(style.width);\n },\n getHeight: function getHeight(elem) {\n var style = getComputedStyle(elem);\n return cssValueToPixels(style['border-top-width']) + cssValueToPixels(style['border-bottom-width']) + cssValueToPixels(style['padding-top']) + cssValueToPixels(style['padding-bottom']) + cssValueToPixels(style.height);\n },\n getOffset: function getOffset(el) {\n var elem = el;\n var offset = { left: 0, top: 0 };\n if (elem.offsetParent) {\n do {\n offset.left += elem.offsetLeft;\n offset.top += elem.offsetTop;\n elem = elem.offsetParent;\n } while (elem);\n }\n return offset;\n },\n isActive: function isActive(elem) {\n return elem === document.activeElement && (elem.type || elem.href);\n }\n};\n\nvar BooleanController = function (_Controller) {\n inherits(BooleanController, _Controller);\n function BooleanController(object, property) {\n classCallCheck(this, BooleanController);\n var _this2 = possibleConstructorReturn(this, (BooleanController.__proto__ || Object.getPrototypeOf(BooleanController)).call(this, object, property));\n var _this = _this2;\n _this2.__prev = _this2.getValue();\n _this2.__checkbox = document.createElement('input');\n _this2.__checkbox.setAttribute('type', 'checkbox');\n function onChange() {\n _this.setValue(!_this.__prev);\n }\n dom.bind(_this2.__checkbox, 'change', onChange, false);\n _this2.domElement.appendChild(_this2.__checkbox);\n _this2.updateDisplay();\n return _this2;\n }\n createClass(BooleanController, [{\n key: 'setValue',\n value: function setValue(v) {\n var toReturn = get(BooleanController.prototype.__proto__ || Object.getPrototypeOf(BooleanController.prototype), 'setValue', this).call(this, v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n this.__prev = this.getValue();\n return toReturn;\n }\n }, {\n key: 'updateDisplay',\n value: function updateDisplay() {\n if (this.getValue() === true) {\n this.__checkbox.setAttribute('checked', 'checked');\n this.__checkbox.checked = true;\n this.__prev = true;\n } else {\n this.__checkbox.checked = false;\n this.__prev = false;\n }\n return get(BooleanController.prototype.__proto__ || Object.getPrototypeOf(BooleanController.prototype), 'updateDisplay', this).call(this);\n }\n }]);\n return BooleanController;\n}(Controller);\n\nvar OptionController = function (_Controller) {\n inherits(OptionController, _Controller);\n function OptionController(object, property, opts) {\n classCallCheck(this, OptionController);\n var _this2 = possibleConstructorReturn(this, (OptionController.__proto__ || Object.getPrototypeOf(OptionController)).call(this, object, property));\n var options = opts;\n var _this = _this2;\n _this2.__select = document.createElement('select');\n if (Common.isArray(options)) {\n var map = {};\n Common.each(options, function (element) {\n map[element] = element;\n });\n options = map;\n }\n Common.each(options, function (value, key) {\n var opt = document.createElement('option');\n opt.innerHTML = key;\n opt.setAttribute('value', value);\n _this.__select.appendChild(opt);\n });\n _this2.updateDisplay();\n dom.bind(_this2.__select, 'change', function () {\n var desiredValue = this.options[this.selectedIndex].value;\n _this.setValue(desiredValue);\n });\n _this2.domElement.appendChild(_this2.__select);\n return _this2;\n }\n createClass(OptionController, [{\n key: 'setValue',\n value: function setValue(v) {\n var toReturn = get(OptionController.prototype.__proto__ || Object.getPrototypeOf(OptionController.prototype), 'setValue', this).call(this, v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n return toReturn;\n }\n }, {\n key: 'updateDisplay',\n value: function updateDisplay() {\n if (dom.isActive(this.__select)) return this;\n this.__select.value = this.getValue();\n return get(OptionController.prototype.__proto__ || Object.getPrototypeOf(OptionController.prototype), 'updateDisplay', this).call(this);\n }\n }]);\n return OptionController;\n}(Controller);\n\nvar StringController = function (_Controller) {\n inherits(StringController, _Controller);\n function StringController(object, property) {\n classCallCheck(this, StringController);\n var _this2 = possibleConstructorReturn(this, (StringController.__proto__ || Object.getPrototypeOf(StringController)).call(this, object, property));\n var _this = _this2;\n function onChange() {\n _this.setValue(_this.__input.value);\n }\n function onBlur() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n _this2.__input = document.createElement('input');\n _this2.__input.setAttribute('type', 'text');\n dom.bind(_this2.__input, 'keyup', onChange);\n dom.bind(_this2.__input, 'change', onChange);\n dom.bind(_this2.__input, 'blur', onBlur);\n dom.bind(_this2.__input, 'keydown', function (e) {\n if (e.keyCode === 13) {\n this.blur();\n }\n });\n _this2.updateDisplay();\n _this2.domElement.appendChild(_this2.__input);\n return _this2;\n }\n createClass(StringController, [{\n key: 'updateDisplay',\n value: function updateDisplay() {\n if (!dom.isActive(this.__input)) {\n this.__input.value = this.getValue();\n }\n return get(StringController.prototype.__proto__ || Object.getPrototypeOf(StringController.prototype), 'updateDisplay', this).call(this);\n }\n }]);\n return StringController;\n}(Controller);\n\nfunction numDecimals(x) {\n var _x = x.toString();\n if (_x.indexOf('.') > -1) {\n return _x.length - _x.indexOf('.') - 1;\n }\n return 0;\n}\nvar NumberController = function (_Controller) {\n inherits(NumberController, _Controller);\n function NumberController(object, property, params) {\n classCallCheck(this, NumberController);\n var _this = possibleConstructorReturn(this, (NumberController.__proto__ || Object.getPrototypeOf(NumberController)).call(this, object, property));\n var _params = params || {};\n _this.__min = _params.min;\n _this.__max = _params.max;\n _this.__step = _params.step;\n if (Common.isUndefined(_this.__step)) {\n if (_this.initialValue === 0) {\n _this.__impliedStep = 1;\n } else {\n _this.__impliedStep = Math.pow(10, Math.floor(Math.log(Math.abs(_this.initialValue)) / Math.LN10)) / 10;\n }\n } else {\n _this.__impliedStep = _this.__step;\n }\n _this.__precision = numDecimals(_this.__impliedStep);\n return _this;\n }\n createClass(NumberController, [{\n key: 'setValue',\n value: function setValue(v) {\n var _v = v;\n if (this.__min !== undefined && _v < this.__min) {\n _v = this.__min;\n } else if (this.__max !== undefined && _v > this.__max) {\n _v = this.__max;\n }\n if (this.__step !== undefined && _v % this.__step !== 0) {\n _v = Math.round(_v / this.__step) * this.__step;\n }\n return get(NumberController.prototype.__proto__ || Object.getPrototypeOf(NumberController.prototype), 'setValue', this).call(this, _v);\n }\n }, {\n key: 'min',\n value: function min(minValue) {\n this.__min = minValue;\n return this;\n }\n }, {\n key: 'max',\n value: function max(maxValue) {\n this.__max = maxValue;\n return this;\n }\n }, {\n key: 'step',\n value: function step(stepValue) {\n this.__step = stepValue;\n this.__impliedStep = stepValue;\n this.__precision = numDecimals(stepValue);\n return this;\n }\n }]);\n return NumberController;\n}(Controller);\n\nfunction roundToDecimal(value, decimals) {\n var tenTo = Math.pow(10, decimals);\n return Math.round(value * tenTo) / tenTo;\n}\nvar NumberControllerBox = function (_NumberController) {\n inherits(NumberControllerBox, _NumberController);\n function NumberControllerBox(object, property, params) {\n classCallCheck(this, NumberControllerBox);\n var _this2 = possibleConstructorReturn(this, (NumberControllerBox.__proto__ || Object.getPrototypeOf(NumberControllerBox)).call(this, object, property, params));\n _this2.__truncationSuspended = false;\n var _this = _this2;\n var prevY = void 0;\n function onChange() {\n var attempted = parseFloat(_this.__input.value);\n if (!Common.isNaN(attempted)) {\n _this.setValue(attempted);\n }\n }\n function onFinish() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n function onBlur() {\n onFinish();\n }\n function onMouseDrag(e) {\n var diff = prevY - e.clientY;\n _this.setValue(_this.getValue() + diff * _this.__impliedStep);\n prevY = e.clientY;\n }\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n onFinish();\n }\n function onMouseDown(e) {\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n prevY = e.clientY;\n }\n _this2.__input = document.createElement('input');\n _this2.__input.setAttribute('type', 'text');\n dom.bind(_this2.__input, 'change', onChange);\n dom.bind(_this2.__input, 'blur', onBlur);\n dom.bind(_this2.__input, 'mousedown', onMouseDown);\n dom.bind(_this2.__input, 'keydown', function (e) {\n if (e.keyCode === 13) {\n _this.__truncationSuspended = true;\n this.blur();\n _this.__truncationSuspended = false;\n onFinish();\n }\n });\n _this2.updateDisplay();\n _this2.domElement.appendChild(_this2.__input);\n return _this2;\n }\n createClass(NumberControllerBox, [{\n key: 'updateDisplay',\n value: function updateDisplay() {\n this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision);\n return get(NumberControllerBox.prototype.__proto__ || Object.getPrototypeOf(NumberControllerBox.prototype), 'updateDisplay', this).call(this);\n }\n }]);\n return NumberControllerBox;\n}(NumberController);\n\nfunction map(v, i1, i2, o1, o2) {\n return o1 + (o2 - o1) * ((v - i1) / (i2 - i1));\n}\nvar NumberControllerSlider = function (_NumberController) {\n inherits(NumberControllerSlider, _NumberController);\n function NumberControllerSlider(object, property, min, max, step) {\n classCallCheck(this, NumberControllerSlider);\n var _this2 = possibleConstructorReturn(this, (NumberControllerSlider.__proto__ || Object.getPrototypeOf(NumberControllerSlider)).call(this, object, property, { min: min, max: max, step: step }));\n var _this = _this2;\n _this2.__background = document.createElement('div');\n _this2.__foreground = document.createElement('div');\n dom.bind(_this2.__background, 'mousedown', onMouseDown);\n dom.bind(_this2.__background, 'touchstart', onTouchStart);\n dom.addClass(_this2.__background, 'slider');\n dom.addClass(_this2.__foreground, 'slider-fg');\n function onMouseDown(e) {\n document.activeElement.blur();\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n onMouseDrag(e);\n }\n function onMouseDrag(e) {\n e.preventDefault();\n var bgRect = _this.__background.getBoundingClientRect();\n _this.setValue(map(e.clientX, bgRect.left, bgRect.right, _this.__min, _this.__max));\n return false;\n }\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n function onTouchStart(e) {\n if (e.touches.length !== 1) {\n return;\n }\n dom.bind(window, 'touchmove', onTouchMove);\n dom.bind(window, 'touchend', onTouchEnd);\n onTouchMove(e);\n }\n function onTouchMove(e) {\n var clientX = e.touches[0].clientX;\n var bgRect = _this.__background.getBoundingClientRect();\n _this.setValue(map(clientX, bgRect.left, bgRect.right, _this.__min, _this.__max));\n }\n function onTouchEnd() {\n dom.unbind(window, 'touchmove', onTouchMove);\n dom.unbind(window, 'touchend', onTouchEnd);\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n _this2.updateDisplay();\n _this2.__background.appendChild(_this2.__foreground);\n _this2.domElement.appendChild(_this2.__background);\n return _this2;\n }\n createClass(NumberControllerSlider, [{\n key: 'updateDisplay',\n value: function updateDisplay() {\n var pct = (this.getValue() - this.__min) / (this.__max - this.__min);\n this.__foreground.style.width = pct * 100 + '%';\n return get(NumberControllerSlider.prototype.__proto__ || Object.getPrototypeOf(NumberControllerSlider.prototype), 'updateDisplay', this).call(this);\n }\n }]);\n return NumberControllerSlider;\n}(NumberController);\n\nvar FunctionController = function (_Controller) {\n inherits(FunctionController, _Controller);\n function FunctionController(object, property, text) {\n classCallCheck(this, FunctionController);\n var _this2 = possibleConstructorReturn(this, (FunctionController.__proto__ || Object.getPrototypeOf(FunctionController)).call(this, object, property));\n var _this = _this2;\n _this2.__button = document.createElement('div');\n _this2.__button.innerHTML = text === undefined ? 'Fire' : text;\n dom.bind(_this2.__button, 'click', function (e) {\n e.preventDefault();\n _this.fire();\n return false;\n });\n dom.addClass(_this2.__button, 'button');\n _this2.domElement.appendChild(_this2.__button);\n return _this2;\n }\n createClass(FunctionController, [{\n key: 'fire',\n value: function fire() {\n if (this.__onChange) {\n this.__onChange.call(this);\n }\n this.getValue().call(this.object);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n }\n }]);\n return FunctionController;\n}(Controller);\n\nvar ColorController = function (_Controller) {\n inherits(ColorController, _Controller);\n function ColorController(object, property) {\n classCallCheck(this, ColorController);\n var _this2 = possibleConstructorReturn(this, (ColorController.__proto__ || Object.getPrototypeOf(ColorController)).call(this, object, property));\n _this2.__color = new Color(_this2.getValue());\n _this2.__temp = new Color(0);\n var _this = _this2;\n _this2.domElement = document.createElement('div');\n dom.makeSelectable(_this2.domElement, false);\n _this2.__selector = document.createElement('div');\n _this2.__selector.className = 'selector';\n _this2.__saturation_field = document.createElement('div');\n _this2.__saturation_field.className = 'saturation-field';\n _this2.__field_knob = document.createElement('div');\n _this2.__field_knob.className = 'field-knob';\n _this2.__field_knob_border = '2px solid ';\n _this2.__hue_knob = document.createElement('div');\n _this2.__hue_knob.className = 'hue-knob';\n _this2.__hue_field = document.createElement('div');\n _this2.__hue_field.className = 'hue-field';\n _this2.__input = document.createElement('input');\n _this2.__input.type = 'text';\n _this2.__input_textShadow = '0 1px 1px ';\n dom.bind(_this2.__input, 'keydown', function (e) {\n if (e.keyCode === 13) {\n onBlur.call(this);\n }\n });\n dom.bind(_this2.__input, 'blur', onBlur);\n dom.bind(_this2.__selector, 'mousedown', function () {\n dom.addClass(this, 'drag').bind(window, 'mouseup', function () {\n dom.removeClass(_this.__selector, 'drag');\n });\n });\n dom.bind(_this2.__selector, 'touchstart', function () {\n dom.addClass(this, 'drag').bind(window, 'touchend', function () {\n dom.removeClass(_this.__selector, 'drag');\n });\n });\n var valueField = document.createElement('div');\n Common.extend(_this2.__selector.style, {\n width: '122px',\n height: '102px',\n padding: '3px',\n backgroundColor: '#222',\n boxShadow: '0px 1px 3px rgba(0,0,0,0.3)'\n });\n Common.extend(_this2.__field_knob.style, {\n position: 'absolute',\n width: '12px',\n height: '12px',\n border: _this2.__field_knob_border + (_this2.__color.v < 0.5 ? '#fff' : '#000'),\n boxShadow: '0px 1px 3px rgba(0,0,0,0.5)',\n borderRadius: '12px',\n zIndex: 1\n });\n Common.extend(_this2.__hue_knob.style, {\n position: 'absolute',\n width: '15px',\n height: '2px',\n borderRight: '4px solid #fff',\n zIndex: 1\n });\n Common.extend(_this2.__saturation_field.style, {\n width: '100px',\n height: '100px',\n border: '1px solid #555',\n marginRight: '3px',\n display: 'inline-block',\n cursor: 'pointer'\n });\n Common.extend(valueField.style, {\n width: '100%',\n height: '100%',\n background: 'none'\n });\n linearGradient(valueField, 'top', 'rgba(0,0,0,0)', '#000');\n Common.extend(_this2.__hue_field.style, {\n width: '15px',\n height: '100px',\n border: '1px solid #555',\n cursor: 'ns-resize',\n position: 'absolute',\n top: '3px',\n right: '3px'\n });\n hueGradient(_this2.__hue_field);\n Common.extend(_this2.__input.style, {\n outline: 'none',\n textAlign: 'center',\n color: '#fff',\n border: 0,\n fontWeight: 'bold',\n textShadow: _this2.__input_textShadow + 'rgba(0,0,0,0.7)'\n });\n dom.bind(_this2.__saturation_field, 'mousedown', fieldDown);\n dom.bind(_this2.__saturation_field, 'touchstart', fieldDown);\n dom.bind(_this2.__field_knob, 'mousedown', fieldDown);\n dom.bind(_this2.__field_knob, 'touchstart', fieldDown);\n dom.bind(_this2.__hue_field, 'mousedown', fieldDownH);\n dom.bind(_this2.__hue_field, 'touchstart', fieldDownH);\n function fieldDown(e) {\n setSV(e);\n dom.bind(window, 'mousemove', setSV);\n dom.bind(window, 'touchmove', setSV);\n dom.bind(window, 'mouseup', fieldUpSV);\n dom.bind(window, 'touchend', fieldUpSV);\n }\n function fieldDownH(e) {\n setH(e);\n dom.bind(window, 'mousemove', setH);\n dom.bind(window, 'touchmove', setH);\n dom.bind(window, 'mouseup', fieldUpH);\n dom.bind(window, 'touchend', fieldUpH);\n }\n function fieldUpSV() {\n dom.unbind(window, 'mousemove', setSV);\n dom.unbind(window, 'touchmove', setSV);\n dom.unbind(window, 'mouseup', fieldUpSV);\n dom.unbind(window, 'touchend', fieldUpSV);\n onFinish();\n }\n function fieldUpH() {\n dom.unbind(window, 'mousemove', setH);\n dom.unbind(window, 'touchmove', setH);\n dom.unbind(window, 'mouseup', fieldUpH);\n dom.unbind(window, 'touchend', fieldUpH);\n onFinish();\n }\n function onBlur() {\n var i = interpret(this.value);\n if (i !== false) {\n _this.__color.__state = i;\n _this.setValue(_this.__color.toOriginal());\n } else {\n this.value = _this.__color.toString();\n }\n }\n function onFinish() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.__color.toOriginal());\n }\n }\n _this2.__saturation_field.appendChild(valueField);\n _this2.__selector.appendChild(_this2.__field_knob);\n _this2.__selector.appendChild(_this2.__saturation_field);\n _this2.__selector.appendChild(_this2.__hue_field);\n _this2.__hue_field.appendChild(_this2.__hue_knob);\n _this2.domElement.appendChild(_this2.__input);\n _this2.domElement.appendChild(_this2.__selector);\n _this2.updateDisplay();\n function setSV(e) {\n if (e.type.indexOf('touch') === -1) {\n e.preventDefault();\n }\n var fieldRect = _this.__saturation_field.getBoundingClientRect();\n var _ref = e.touches && e.touches[0] || e,\n clientX = _ref.clientX,\n clientY = _ref.clientY;\n var s = (clientX - fieldRect.left) / (fieldRect.right - fieldRect.left);\n var v = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top);\n if (v > 1) {\n v = 1;\n } else if (v < 0) {\n v = 0;\n }\n if (s > 1) {\n s = 1;\n } else if (s < 0) {\n s = 0;\n }\n _this.__color.v = v;\n _this.__color.s = s;\n _this.setValue(_this.__color.toOriginal());\n return false;\n }\n function setH(e) {\n if (e.type.indexOf('touch') === -1) {\n e.preventDefault();\n }\n var fieldRect = _this.__hue_field.getBoundingClientRect();\n var _ref2 = e.touches && e.touches[0] || e,\n clientY = _ref2.clientY;\n var h = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top);\n if (h > 1) {\n h = 1;\n } else if (h < 0) {\n h = 0;\n }\n _this.__color.h = h * 360;\n _this.setValue(_this.__color.toOriginal());\n return false;\n }\n return _this2;\n }\n createClass(ColorController, [{\n key: 'updateDisplay',\n value: function updateDisplay() {\n var i = interpret(this.getValue());\n if (i !== false) {\n var mismatch = false;\n Common.each(Color.COMPONENTS, function (component) {\n if (!Common.isUndefined(i[component]) && !Common.isUndefined(this.__color.__state[component]) && i[component] !== this.__color.__state[component]) {\n mismatch = true;\n return {};\n }\n }, this);\n if (mismatch) {\n Common.extend(this.__color.__state, i);\n }\n }\n Common.extend(this.__temp.__state, this.__color.__state);\n this.__temp.a = 1;\n var flip = this.__color.v < 0.5 || this.__color.s > 0.5 ? 255 : 0;\n var _flip = 255 - flip;\n Common.extend(this.__field_knob.style, {\n marginLeft: 100 * this.__color.s - 7 + 'px',\n marginTop: 100 * (1 - this.__color.v) - 7 + 'px',\n backgroundColor: this.__temp.toHexString(),\n border: this.__field_knob_border + 'rgb(' + flip + ',' + flip + ',' + flip + ')'\n });\n this.__hue_knob.style.marginTop = (1 - this.__color.h / 360) * 100 + 'px';\n this.__temp.s = 1;\n this.__temp.v = 1;\n linearGradient(this.__saturation_field, 'left', '#fff', this.__temp.toHexString());\n this.__input.value = this.__color.toString();\n Common.extend(this.__input.style, {\n backgroundColor: this.__color.toHexString(),\n color: 'rgb(' + flip + ',' + flip + ',' + flip + ')',\n textShadow: this.__input_textShadow + 'rgba(' + _flip + ',' + _flip + ',' + _flip + ',.7)'\n });\n }\n }]);\n return ColorController;\n}(Controller);\nvar vendors = ['-moz-', '-o-', '-webkit-', '-ms-', ''];\nfunction linearGradient(elem, x, a, b) {\n elem.style.background = '';\n Common.each(vendors, function (vendor) {\n elem.style.cssText += 'background: ' + vendor + 'linear-gradient(' + x + ', ' + a + ' 0%, ' + b + ' 100%); ';\n });\n}\nfunction hueGradient(elem) {\n elem.style.background = '';\n elem.style.cssText += 'background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);';\n elem.style.cssText += 'background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n}\n\nvar css = {\n load: function load(url, indoc) {\n var doc = indoc || document;\n var link = doc.createElement('link');\n link.type = 'text/css';\n link.rel = 'stylesheet';\n link.href = url;\n doc.getElementsByTagName('head')[0].appendChild(link);\n },\n inject: function inject(cssContent, indoc) {\n var doc = indoc || document;\n var injected = document.createElement('style');\n injected.type = 'text/css';\n injected.innerHTML = cssContent;\n var head = doc.getElementsByTagName('head')[0];\n try {\n head.appendChild(injected);\n } catch (e) {\n }\n }\n};\n\nvar saveDialogContents = \"
\\n\\n Here's the new load parameter for your GUI's constructor:\\n\\n \\n\\n
\\n\\n Automatically save\\n values to localStorage on exit.\\n\\n
The values saved to localStorage will\\n override those passed to dat.GUI's constructor. This makes it\\n easier to work incrementally, but localStorage is fragile,\\n and your friends may not see the same values you do.\\n\\n
\\n\\n
\\n\\n
\";\n\nvar ControllerFactory = function ControllerFactory(object, property) {\n var initialValue = object[property];\n if (Common.isArray(arguments[2]) || Common.isObject(arguments[2])) {\n return new OptionController(object, property, arguments[2]);\n }\n if (Common.isNumber(initialValue)) {\n if (Common.isNumber(arguments[2]) && Common.isNumber(arguments[3])) {\n if (Common.isNumber(arguments[4])) {\n return new NumberControllerSlider(object, property, arguments[2], arguments[3], arguments[4]);\n }\n return new NumberControllerSlider(object, property, arguments[2], arguments[3]);\n }\n if (Common.isNumber(arguments[4])) {\n return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3], step: arguments[4] });\n }\n return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3] });\n }\n if (Common.isString(initialValue)) {\n return new StringController(object, property);\n }\n if (Common.isFunction(initialValue)) {\n return new FunctionController(object, property, '');\n }\n if (Common.isBoolean(initialValue)) {\n return new BooleanController(object, property);\n }\n return null;\n};\n\nfunction requestAnimationFrame(callback) {\n setTimeout(callback, 1000 / 60);\n}\nvar requestAnimationFrame$1 = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || requestAnimationFrame;\n\nvar CenteredDiv = function () {\n function CenteredDiv() {\n classCallCheck(this, CenteredDiv);\n this.backgroundElement = document.createElement('div');\n Common.extend(this.backgroundElement.style, {\n backgroundColor: 'rgba(0,0,0,0.8)',\n top: 0,\n left: 0,\n display: 'none',\n zIndex: '1000',\n opacity: 0,\n WebkitTransition: 'opacity 0.2s linear',\n transition: 'opacity 0.2s linear'\n });\n dom.makeFullscreen(this.backgroundElement);\n this.backgroundElement.style.position = 'fixed';\n this.domElement = document.createElement('div');\n Common.extend(this.domElement.style, {\n position: 'fixed',\n display: 'none',\n zIndex: '1001',\n opacity: 0,\n WebkitTransition: '-webkit-transform 0.2s ease-out, opacity 0.2s linear',\n transition: 'transform 0.2s ease-out, opacity 0.2s linear'\n });\n document.body.appendChild(this.backgroundElement);\n document.body.appendChild(this.domElement);\n var _this = this;\n dom.bind(this.backgroundElement, 'click', function () {\n _this.hide();\n });\n }\n createClass(CenteredDiv, [{\n key: 'show',\n value: function show() {\n var _this = this;\n this.backgroundElement.style.display = 'block';\n this.domElement.style.display = 'block';\n this.domElement.style.opacity = 0;\n this.domElement.style.webkitTransform = 'scale(1.1)';\n this.layout();\n Common.defer(function () {\n _this.backgroundElement.style.opacity = 1;\n _this.domElement.style.opacity = 1;\n _this.domElement.style.webkitTransform = 'scale(1)';\n });\n }\n }, {\n key: 'hide',\n value: function hide() {\n var _this = this;\n var hide = function hide() {\n _this.domElement.style.display = 'none';\n _this.backgroundElement.style.display = 'none';\n dom.unbind(_this.domElement, 'webkitTransitionEnd', hide);\n dom.unbind(_this.domElement, 'transitionend', hide);\n dom.unbind(_this.domElement, 'oTransitionEnd', hide);\n };\n dom.bind(this.domElement, 'webkitTransitionEnd', hide);\n dom.bind(this.domElement, 'transitionend', hide);\n dom.bind(this.domElement, 'oTransitionEnd', hide);\n this.backgroundElement.style.opacity = 0;\n this.domElement.style.opacity = 0;\n this.domElement.style.webkitTransform = 'scale(1.1)';\n }\n }, {\n key: 'layout',\n value: function layout() {\n this.domElement.style.left = window.innerWidth / 2 - dom.getWidth(this.domElement) / 2 + 'px';\n this.domElement.style.top = window.innerHeight / 2 - dom.getHeight(this.domElement) / 2 + 'px';\n }\n }]);\n return CenteredDiv;\n}();\n\nvar styleSheet = ___$insertStyle(\".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear;border:0;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button.close-top{position:relative}.dg.main .close-button.close-bottom{position:absolute}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-y:visible}.dg.a.has-save>ul.close-top{margin-top:0}.dg.a.has-save>ul.close-bottom{margin-top:27px}.dg.a.has-save>ul.closed{margin-top:0}.dg.a .save-row{top:0;z-index:1002}.dg.a .save-row.close-top{position:relative}.dg.a .save-row.close-bottom{position:fixed}.dg li{-webkit-transition:height .1s ease-out;-o-transition:height .1s ease-out;-moz-transition:height .1s ease-out;transition:height .1s ease-out;-webkit-transition:overflow .1s linear;-o-transition:overflow .1s linear;-moz-transition:overflow .1s linear;transition:overflow .1s linear}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li>*{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px;overflow:hidden}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .c{float:left;width:60%;position:relative}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:7px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .cr.color{overflow:visible}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.color{border-left:3px solid}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2FA1D6}.dg .cr.number input[type=text]{color:#2FA1D6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2FA1D6;max-width:100%}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\\n\");\n\ncss.inject(styleSheet);\nvar CSS_NAMESPACE = 'dg';\nvar HIDE_KEY_CODE = 72;\nvar CLOSE_BUTTON_HEIGHT = 20;\nvar DEFAULT_DEFAULT_PRESET_NAME = 'Default';\nvar SUPPORTS_LOCAL_STORAGE = function () {\n try {\n return !!window.localStorage;\n } catch (e) {\n return false;\n }\n}();\nvar SAVE_DIALOGUE = void 0;\nvar autoPlaceVirgin = true;\nvar autoPlaceContainer = void 0;\nvar hide = false;\nvar hideableGuis = [];\nvar GUI = function GUI(pars) {\n var _this = this;\n var params = pars || {};\n this.domElement = document.createElement('div');\n this.__ul = document.createElement('ul');\n this.domElement.appendChild(this.__ul);\n dom.addClass(this.domElement, CSS_NAMESPACE);\n this.__folders = {};\n this.__controllers = [];\n this.__rememberedObjects = [];\n this.__rememberedObjectIndecesToControllers = [];\n this.__listening = [];\n params = Common.defaults(params, {\n closeOnTop: false,\n autoPlace: true,\n width: GUI.DEFAULT_WIDTH\n });\n params = Common.defaults(params, {\n resizable: params.autoPlace,\n hideable: params.autoPlace\n });\n if (!Common.isUndefined(params.load)) {\n if (params.preset) {\n params.load.preset = params.preset;\n }\n } else {\n params.load = { preset: DEFAULT_DEFAULT_PRESET_NAME };\n }\n if (Common.isUndefined(params.parent) && params.hideable) {\n hideableGuis.push(this);\n }\n params.resizable = Common.isUndefined(params.parent) && params.resizable;\n if (params.autoPlace && Common.isUndefined(params.scrollable)) {\n params.scrollable = true;\n }\n var useLocalStorage = SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(this, 'isLocal')) === 'true';\n var saveToLocalStorage = void 0;\n var titleRow = void 0;\n Object.defineProperties(this,\n {\n parent: {\n get: function get$$1() {\n return params.parent;\n }\n },\n scrollable: {\n get: function get$$1() {\n return params.scrollable;\n }\n },\n autoPlace: {\n get: function get$$1() {\n return params.autoPlace;\n }\n },\n closeOnTop: {\n get: function get$$1() {\n return params.closeOnTop;\n }\n },\n preset: {\n get: function get$$1() {\n if (_this.parent) {\n return _this.getRoot().preset;\n }\n return params.load.preset;\n },\n set: function set$$1(v) {\n if (_this.parent) {\n _this.getRoot().preset = v;\n } else {\n params.load.preset = v;\n }\n setPresetSelectIndex(this);\n _this.revert();\n }\n },\n width: {\n get: function get$$1() {\n return params.width;\n },\n set: function set$$1(v) {\n params.width = v;\n setWidth(_this, v);\n }\n },\n name: {\n get: function get$$1() {\n return params.name;\n },\n set: function set$$1(v) {\n params.name = v;\n if (titleRow) {\n titleRow.innerHTML = params.name;\n }\n }\n },\n closed: {\n get: function get$$1() {\n return params.closed;\n },\n set: function set$$1(v) {\n params.closed = v;\n if (params.closed) {\n dom.addClass(_this.__ul, GUI.CLASS_CLOSED);\n } else {\n dom.removeClass(_this.__ul, GUI.CLASS_CLOSED);\n }\n this.onResize();\n if (_this.__closeButton) {\n _this.__closeButton.innerHTML = v ? GUI.TEXT_OPEN : GUI.TEXT_CLOSED;\n }\n }\n },\n load: {\n get: function get$$1() {\n return params.load;\n }\n },\n useLocalStorage: {\n get: function get$$1() {\n return useLocalStorage;\n },\n set: function set$$1(bool) {\n if (SUPPORTS_LOCAL_STORAGE) {\n useLocalStorage = bool;\n if (bool) {\n dom.bind(window, 'unload', saveToLocalStorage);\n } else {\n dom.unbind(window, 'unload', saveToLocalStorage);\n }\n localStorage.setItem(getLocalStorageHash(_this, 'isLocal'), bool);\n }\n }\n }\n });\n if (Common.isUndefined(params.parent)) {\n params.closed = false;\n dom.addClass(this.domElement, GUI.CLASS_MAIN);\n dom.makeSelectable(this.domElement, false);\n if (SUPPORTS_LOCAL_STORAGE) {\n if (useLocalStorage) {\n _this.useLocalStorage = true;\n var savedGui = localStorage.getItem(getLocalStorageHash(this, 'gui'));\n if (savedGui) {\n params.load = JSON.parse(savedGui);\n }\n }\n }\n this.__closeButton = document.createElement('div');\n this.__closeButton.innerHTML = GUI.TEXT_CLOSED;\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BUTTON);\n if (params.closeOnTop) {\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_TOP);\n this.domElement.insertBefore(this.__closeButton, this.domElement.childNodes[0]);\n } else {\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BOTTOM);\n this.domElement.appendChild(this.__closeButton);\n }\n dom.bind(this.__closeButton, 'click', function () {\n _this.closed = !_this.closed;\n });\n } else {\n if (params.closed === undefined) {\n params.closed = true;\n }\n var titleRowName = document.createTextNode(params.name);\n dom.addClass(titleRowName, 'controller-name');\n titleRow = addRow(_this, titleRowName);\n var onClickTitle = function onClickTitle(e) {\n e.preventDefault();\n _this.closed = !_this.closed;\n return false;\n };\n dom.addClass(this.__ul, GUI.CLASS_CLOSED);\n dom.addClass(titleRow, 'title');\n dom.bind(titleRow, 'click', onClickTitle);\n if (!params.closed) {\n this.closed = false;\n }\n }\n if (params.autoPlace) {\n if (Common.isUndefined(params.parent)) {\n if (autoPlaceVirgin) {\n autoPlaceContainer = document.createElement('div');\n dom.addClass(autoPlaceContainer, CSS_NAMESPACE);\n dom.addClass(autoPlaceContainer, GUI.CLASS_AUTO_PLACE_CONTAINER);\n document.body.appendChild(autoPlaceContainer);\n autoPlaceVirgin = false;\n }\n autoPlaceContainer.appendChild(this.domElement);\n dom.addClass(this.domElement, GUI.CLASS_AUTO_PLACE);\n }\n if (!this.parent) {\n setWidth(_this, params.width);\n }\n }\n this.__resizeHandler = function () {\n _this.onResizeDebounced();\n };\n dom.bind(window, 'resize', this.__resizeHandler);\n dom.bind(this.__ul, 'webkitTransitionEnd', this.__resizeHandler);\n dom.bind(this.__ul, 'transitionend', this.__resizeHandler);\n dom.bind(this.__ul, 'oTransitionEnd', this.__resizeHandler);\n this.onResize();\n if (params.resizable) {\n addResizeHandle(this);\n }\n saveToLocalStorage = function saveToLocalStorage() {\n if (SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(_this, 'isLocal')) === 'true') {\n localStorage.setItem(getLocalStorageHash(_this, 'gui'), JSON.stringify(_this.getSaveObject()));\n }\n };\n this.saveToLocalStorageIfPossible = saveToLocalStorage;\n function resetWidth() {\n var root = _this.getRoot();\n root.width += 1;\n Common.defer(function () {\n root.width -= 1;\n });\n }\n if (!params.parent) {\n resetWidth();\n }\n};\nGUI.toggleHide = function () {\n hide = !hide;\n Common.each(hideableGuis, function (gui) {\n gui.domElement.style.display = hide ? 'none' : '';\n });\n};\nGUI.CLASS_AUTO_PLACE = 'a';\nGUI.CLASS_AUTO_PLACE_CONTAINER = 'ac';\nGUI.CLASS_MAIN = 'main';\nGUI.CLASS_CONTROLLER_ROW = 'cr';\nGUI.CLASS_TOO_TALL = 'taller-than-window';\nGUI.CLASS_CLOSED = 'closed';\nGUI.CLASS_CLOSE_BUTTON = 'close-button';\nGUI.CLASS_CLOSE_TOP = 'close-top';\nGUI.CLASS_CLOSE_BOTTOM = 'close-bottom';\nGUI.CLASS_DRAG = 'drag';\nGUI.DEFAULT_WIDTH = 245;\nGUI.TEXT_CLOSED = 'Close Controls';\nGUI.TEXT_OPEN = 'Open Controls';\nGUI._keydownHandler = function (e) {\n if (document.activeElement.type !== 'text' && (e.which === HIDE_KEY_CODE || e.keyCode === HIDE_KEY_CODE)) {\n GUI.toggleHide();\n }\n};\ndom.bind(window, 'keydown', GUI._keydownHandler, false);\nCommon.extend(GUI.prototype,\n{\n add: function add(object, property) {\n return _add(this, object, property, {\n factoryArgs: Array.prototype.slice.call(arguments, 2)\n });\n },\n addColor: function addColor(object, property) {\n return _add(this, object, property, {\n color: true\n });\n },\n remove: function remove(controller) {\n this.__ul.removeChild(controller.__li);\n this.__controllers.splice(this.__controllers.indexOf(controller), 1);\n var _this = this;\n Common.defer(function () {\n _this.onResize();\n });\n },\n destroy: function destroy() {\n if (this.parent) {\n throw new Error('Only the root GUI should be removed with .destroy(). ' + 'For subfolders, use gui.removeFolder(folder) instead.');\n }\n if (this.autoPlace) {\n autoPlaceContainer.removeChild(this.domElement);\n }\n var _this = this;\n Common.each(this.__folders, function (subfolder) {\n _this.removeFolder(subfolder);\n });\n dom.unbind(window, 'keydown', GUI._keydownHandler, false);\n removeListeners(this);\n },\n addFolder: function addFolder(name) {\n if (this.__folders[name] !== undefined) {\n throw new Error('You already have a folder in this GUI by the' + ' name \"' + name + '\"');\n }\n var newGuiParams = { name: name, parent: this };\n newGuiParams.autoPlace = this.autoPlace;\n if (this.load &&\n this.load.folders &&\n this.load.folders[name]) {\n newGuiParams.closed = this.load.folders[name].closed;\n newGuiParams.load = this.load.folders[name];\n }\n var gui = new GUI(newGuiParams);\n this.__folders[name] = gui;\n var li = addRow(this, gui.domElement);\n dom.addClass(li, 'folder');\n return gui;\n },\n removeFolder: function removeFolder(folder) {\n this.__ul.removeChild(folder.domElement.parentElement);\n delete this.__folders[folder.name];\n if (this.load &&\n this.load.folders &&\n this.load.folders[folder.name]) {\n delete this.load.folders[folder.name];\n }\n removeListeners(folder);\n var _this = this;\n Common.each(folder.__folders, function (subfolder) {\n folder.removeFolder(subfolder);\n });\n Common.defer(function () {\n _this.onResize();\n });\n },\n open: function open() {\n this.closed = false;\n },\n close: function close() {\n this.closed = true;\n },\n onResize: function onResize() {\n var root = this.getRoot();\n if (root.scrollable) {\n var top = dom.getOffset(root.__ul).top;\n var h = 0;\n Common.each(root.__ul.childNodes, function (node) {\n if (!(root.autoPlace && node === root.__save_row)) {\n h += dom.getHeight(node);\n }\n });\n if (window.innerHeight - top - CLOSE_BUTTON_HEIGHT < h) {\n dom.addClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = window.innerHeight - top - CLOSE_BUTTON_HEIGHT + 'px';\n } else {\n dom.removeClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = 'auto';\n }\n }\n if (root.__resize_handle) {\n Common.defer(function () {\n root.__resize_handle.style.height = root.__ul.offsetHeight + 'px';\n });\n }\n if (root.__closeButton) {\n root.__closeButton.style.width = root.width + 'px';\n }\n },\n onResizeDebounced: Common.debounce(function () {\n this.onResize();\n }, 50),\n remember: function remember() {\n if (Common.isUndefined(SAVE_DIALOGUE)) {\n SAVE_DIALOGUE = new CenteredDiv();\n SAVE_DIALOGUE.domElement.innerHTML = saveDialogContents;\n }\n if (this.parent) {\n throw new Error('You can only call remember on a top level GUI.');\n }\n var _this = this;\n Common.each(Array.prototype.slice.call(arguments), function (object) {\n if (_this.__rememberedObjects.length === 0) {\n addSaveMenu(_this);\n }\n if (_this.__rememberedObjects.indexOf(object) === -1) {\n _this.__rememberedObjects.push(object);\n }\n });\n if (this.autoPlace) {\n setWidth(this, this.width);\n }\n },\n getRoot: function getRoot() {\n var gui = this;\n while (gui.parent) {\n gui = gui.parent;\n }\n return gui;\n },\n getSaveObject: function getSaveObject() {\n var toReturn = this.load;\n toReturn.closed = this.closed;\n if (this.__rememberedObjects.length > 0) {\n toReturn.preset = this.preset;\n if (!toReturn.remembered) {\n toReturn.remembered = {};\n }\n toReturn.remembered[this.preset] = getCurrentPreset(this);\n }\n toReturn.folders = {};\n Common.each(this.__folders, function (element, key) {\n toReturn.folders[key] = element.getSaveObject();\n });\n return toReturn;\n },\n save: function save() {\n if (!this.load.remembered) {\n this.load.remembered = {};\n }\n this.load.remembered[this.preset] = getCurrentPreset(this);\n markPresetModified(this, false);\n this.saveToLocalStorageIfPossible();\n },\n saveAs: function saveAs(presetName) {\n if (!this.load.remembered) {\n this.load.remembered = {};\n this.load.remembered[DEFAULT_DEFAULT_PRESET_NAME] = getCurrentPreset(this, true);\n }\n this.load.remembered[presetName] = getCurrentPreset(this);\n this.preset = presetName;\n addPresetOption(this, presetName, true);\n this.saveToLocalStorageIfPossible();\n },\n revert: function revert(gui) {\n Common.each(this.__controllers, function (controller) {\n if (!this.getRoot().load.remembered) {\n controller.setValue(controller.initialValue);\n } else {\n recallSavedValue(gui || this.getRoot(), controller);\n }\n if (controller.__onFinishChange) {\n controller.__onFinishChange.call(controller, controller.getValue());\n }\n }, this);\n Common.each(this.__folders, function (folder) {\n folder.revert(folder);\n });\n if (!gui) {\n markPresetModified(this.getRoot(), false);\n }\n },\n listen: function listen(controller) {\n var init = this.__listening.length === 0;\n this.__listening.push(controller);\n if (init) {\n updateDisplays(this.__listening);\n }\n },\n updateDisplay: function updateDisplay() {\n Common.each(this.__controllers, function (controller) {\n controller.updateDisplay();\n });\n Common.each(this.__folders, function (folder) {\n folder.updateDisplay();\n });\n }\n});\nfunction addRow(gui, newDom, liBefore) {\n var li = document.createElement('li');\n if (newDom) {\n li.appendChild(newDom);\n }\n if (liBefore) {\n gui.__ul.insertBefore(li, liBefore);\n } else {\n gui.__ul.appendChild(li);\n }\n gui.onResize();\n return li;\n}\nfunction removeListeners(gui) {\n dom.unbind(window, 'resize', gui.__resizeHandler);\n if (gui.saveToLocalStorageIfPossible) {\n dom.unbind(window, 'unload', gui.saveToLocalStorageIfPossible);\n }\n}\nfunction markPresetModified(gui, modified) {\n var opt = gui.__preset_select[gui.__preset_select.selectedIndex];\n if (modified) {\n opt.innerHTML = opt.value + '*';\n } else {\n opt.innerHTML = opt.value;\n }\n}\nfunction augmentController(gui, li, controller) {\n controller.__li = li;\n controller.__gui = gui;\n Common.extend(controller, {\n options: function options(_options) {\n if (arguments.length > 1) {\n var nextSibling = controller.__li.nextElementSibling;\n controller.remove();\n return _add(gui, controller.object, controller.property, {\n before: nextSibling,\n factoryArgs: [Common.toArray(arguments)]\n });\n }\n if (Common.isArray(_options) || Common.isObject(_options)) {\n var _nextSibling = controller.__li.nextElementSibling;\n controller.remove();\n return _add(gui, controller.object, controller.property, {\n before: _nextSibling,\n factoryArgs: [_options]\n });\n }\n },\n name: function name(_name) {\n controller.__li.firstElementChild.firstElementChild.innerHTML = _name;\n return controller;\n },\n listen: function listen() {\n controller.__gui.listen(controller);\n return controller;\n },\n remove: function remove() {\n controller.__gui.remove(controller);\n return controller;\n }\n });\n if (controller instanceof NumberControllerSlider) {\n var box = new NumberControllerBox(controller.object, controller.property, { min: controller.__min, max: controller.__max, step: controller.__step });\n Common.each(['updateDisplay', 'onChange', 'onFinishChange', 'step'], function (method) {\n var pc = controller[method];\n var pb = box[method];\n controller[method] = box[method] = function () {\n var args = Array.prototype.slice.call(arguments);\n pb.apply(box, args);\n return pc.apply(controller, args);\n };\n });\n dom.addClass(li, 'has-slider');\n controller.domElement.insertBefore(box.domElement, controller.domElement.firstElementChild);\n } else if (controller instanceof NumberControllerBox) {\n var r = function r(returned) {\n if (Common.isNumber(controller.__min) && Common.isNumber(controller.__max)) {\n var oldName = controller.__li.firstElementChild.firstElementChild.innerHTML;\n var wasListening = controller.__gui.__listening.indexOf(controller) > -1;\n controller.remove();\n var newController = _add(gui, controller.object, controller.property, {\n before: controller.__li.nextElementSibling,\n factoryArgs: [controller.__min, controller.__max, controller.__step]\n });\n newController.name(oldName);\n if (wasListening) newController.listen();\n return newController;\n }\n return returned;\n };\n controller.min = Common.compose(r, controller.min);\n controller.max = Common.compose(r, controller.max);\n } else if (controller instanceof BooleanController) {\n dom.bind(li, 'click', function () {\n dom.fakeEvent(controller.__checkbox, 'click');\n });\n dom.bind(controller.__checkbox, 'click', function (e) {\n e.stopPropagation();\n });\n } else if (controller instanceof FunctionController) {\n dom.bind(li, 'click', function () {\n dom.fakeEvent(controller.__button, 'click');\n });\n dom.bind(li, 'mouseover', function () {\n dom.addClass(controller.__button, 'hover');\n });\n dom.bind(li, 'mouseout', function () {\n dom.removeClass(controller.__button, 'hover');\n });\n } else if (controller instanceof ColorController) {\n dom.addClass(li, 'color');\n controller.updateDisplay = Common.compose(function (val) {\n li.style.borderLeftColor = controller.__color.toString();\n return val;\n }, controller.updateDisplay);\n controller.updateDisplay();\n }\n controller.setValue = Common.compose(function (val) {\n if (gui.getRoot().__preset_select && controller.isModified()) {\n markPresetModified(gui.getRoot(), true);\n }\n return val;\n }, controller.setValue);\n}\nfunction recallSavedValue(gui, controller) {\n var root = gui.getRoot();\n var matchedIndex = root.__rememberedObjects.indexOf(controller.object);\n if (matchedIndex !== -1) {\n var controllerMap = root.__rememberedObjectIndecesToControllers[matchedIndex];\n if (controllerMap === undefined) {\n controllerMap = {};\n root.__rememberedObjectIndecesToControllers[matchedIndex] = controllerMap;\n }\n controllerMap[controller.property] = controller;\n if (root.load && root.load.remembered) {\n var presetMap = root.load.remembered;\n var preset = void 0;\n if (presetMap[gui.preset]) {\n preset = presetMap[gui.preset];\n } else if (presetMap[DEFAULT_DEFAULT_PRESET_NAME]) {\n preset = presetMap[DEFAULT_DEFAULT_PRESET_NAME];\n } else {\n return;\n }\n if (preset[matchedIndex] && preset[matchedIndex][controller.property] !== undefined) {\n var value = preset[matchedIndex][controller.property];\n controller.initialValue = value;\n controller.setValue(value);\n }\n }\n }\n}\nfunction _add(gui, object, property, params) {\n if (object[property] === undefined) {\n throw new Error('Object \"' + object + '\" has no property \"' + property + '\"');\n }\n var controller = void 0;\n if (params.color) {\n controller = new ColorController(object, property);\n } else {\n var factoryArgs = [object, property].concat(params.factoryArgs);\n controller = ControllerFactory.apply(gui, factoryArgs);\n }\n if (params.before instanceof Controller) {\n params.before = params.before.__li;\n }\n recallSavedValue(gui, controller);\n dom.addClass(controller.domElement, 'c');\n var name = document.createElement('span');\n dom.addClass(name, 'property-name');\n name.innerHTML = controller.property;\n var container = document.createElement('div');\n container.appendChild(name);\n container.appendChild(controller.domElement);\n var li = addRow(gui, container, params.before);\n dom.addClass(li, GUI.CLASS_CONTROLLER_ROW);\n if (controller instanceof ColorController) {\n dom.addClass(li, 'color');\n } else {\n dom.addClass(li, _typeof(controller.getValue()));\n }\n augmentController(gui, li, controller);\n gui.__controllers.push(controller);\n return controller;\n}\nfunction getLocalStorageHash(gui, key) {\n return document.location.href + '.' + key;\n}\nfunction addPresetOption(gui, name, setSelected) {\n var opt = document.createElement('option');\n opt.innerHTML = name;\n opt.value = name;\n gui.__preset_select.appendChild(opt);\n if (setSelected) {\n gui.__preset_select.selectedIndex = gui.__preset_select.length - 1;\n }\n}\nfunction showHideExplain(gui, explain) {\n explain.style.display = gui.useLocalStorage ? 'block' : 'none';\n}\nfunction addSaveMenu(gui) {\n var div = gui.__save_row = document.createElement('li');\n dom.addClass(gui.domElement, 'has-save');\n gui.__ul.insertBefore(div, gui.__ul.firstChild);\n dom.addClass(div, 'save-row');\n var gears = document.createElement('span');\n gears.innerHTML = ' ';\n dom.addClass(gears, 'button gears');\n var button = document.createElement('span');\n button.innerHTML = 'Save';\n dom.addClass(button, 'button');\n dom.addClass(button, 'save');\n var button2 = document.createElement('span');\n button2.innerHTML = 'New';\n dom.addClass(button2, 'button');\n dom.addClass(button2, 'save-as');\n var button3 = document.createElement('span');\n button3.innerHTML = 'Revert';\n dom.addClass(button3, 'button');\n dom.addClass(button3, 'revert');\n var select = gui.__preset_select = document.createElement('select');\n if (gui.load && gui.load.remembered) {\n Common.each(gui.load.remembered, function (value, key) {\n addPresetOption(gui, key, key === gui.preset);\n });\n } else {\n addPresetOption(gui, DEFAULT_DEFAULT_PRESET_NAME, false);\n }\n dom.bind(select, 'change', function () {\n for (var index = 0; index < gui.__preset_select.length; index++) {\n gui.__preset_select[index].innerHTML = gui.__preset_select[index].value;\n }\n gui.preset = this.value;\n });\n div.appendChild(select);\n div.appendChild(gears);\n div.appendChild(button);\n div.appendChild(button2);\n div.appendChild(button3);\n if (SUPPORTS_LOCAL_STORAGE) {\n var explain = document.getElementById('dg-local-explain');\n var localStorageCheckBox = document.getElementById('dg-local-storage');\n var saveLocally = document.getElementById('dg-save-locally');\n saveLocally.style.display = 'block';\n if (localStorage.getItem(getLocalStorageHash(gui, 'isLocal')) === 'true') {\n localStorageCheckBox.setAttribute('checked', 'checked');\n }\n showHideExplain(gui, explain);\n dom.bind(localStorageCheckBox, 'change', function () {\n gui.useLocalStorage = !gui.useLocalStorage;\n showHideExplain(gui, explain);\n });\n }\n var newConstructorTextArea = document.getElementById('dg-new-constructor');\n dom.bind(newConstructorTextArea, 'keydown', function (e) {\n if (e.metaKey && (e.which === 67 || e.keyCode === 67)) {\n SAVE_DIALOGUE.hide();\n }\n });\n dom.bind(gears, 'click', function () {\n newConstructorTextArea.innerHTML = JSON.stringify(gui.getSaveObject(), undefined, 2);\n SAVE_DIALOGUE.show();\n newConstructorTextArea.focus();\n newConstructorTextArea.select();\n });\n dom.bind(button, 'click', function () {\n gui.save();\n });\n dom.bind(button2, 'click', function () {\n var presetName = prompt('Enter a new preset name.');\n if (presetName) {\n gui.saveAs(presetName);\n }\n });\n dom.bind(button3, 'click', function () {\n gui.revert();\n });\n}\nfunction addResizeHandle(gui) {\n var pmouseX = void 0;\n gui.__resize_handle = document.createElement('div');\n Common.extend(gui.__resize_handle.style, {\n width: '6px',\n marginLeft: '-3px',\n height: '200px',\n cursor: 'ew-resize',\n position: 'absolute'\n });\n function drag(e) {\n e.preventDefault();\n gui.width += pmouseX - e.clientX;\n gui.onResize();\n pmouseX = e.clientX;\n return false;\n }\n function dragStop() {\n dom.removeClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.unbind(window, 'mousemove', drag);\n dom.unbind(window, 'mouseup', dragStop);\n }\n function dragStart(e) {\n e.preventDefault();\n pmouseX = e.clientX;\n dom.addClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.bind(window, 'mousemove', drag);\n dom.bind(window, 'mouseup', dragStop);\n return false;\n }\n dom.bind(gui.__resize_handle, 'mousedown', dragStart);\n dom.bind(gui.__closeButton, 'mousedown', dragStart);\n gui.domElement.insertBefore(gui.__resize_handle, gui.domElement.firstElementChild);\n}\nfunction setWidth(gui, w) {\n gui.domElement.style.width = w + 'px';\n if (gui.__save_row && gui.autoPlace) {\n gui.__save_row.style.width = w + 'px';\n }\n if (gui.__closeButton) {\n gui.__closeButton.style.width = w + 'px';\n }\n}\nfunction getCurrentPreset(gui, useInitialValues) {\n var toReturn = {};\n Common.each(gui.__rememberedObjects, function (val, index) {\n var savedValues = {};\n var controllerMap = gui.__rememberedObjectIndecesToControllers[index];\n Common.each(controllerMap, function (controller, property) {\n savedValues[property] = useInitialValues ? controller.initialValue : controller.getValue();\n });\n toReturn[index] = savedValues;\n });\n return toReturn;\n}\nfunction setPresetSelectIndex(gui) {\n for (var index = 0; index < gui.__preset_select.length; index++) {\n if (gui.__preset_select[index].value === gui.preset) {\n gui.__preset_select.selectedIndex = index;\n }\n }\n}\nfunction updateDisplays(controllerArray) {\n if (controllerArray.length !== 0) {\n requestAnimationFrame$1.call(window, function () {\n updateDisplays(controllerArray);\n });\n }\n Common.each(controllerArray, function (c) {\n c.updateDisplay();\n });\n}\n\nvar color = {\n Color: Color,\n math: ColorMath,\n interpret: interpret\n};\nvar controllers = {\n Controller: Controller,\n BooleanController: BooleanController,\n OptionController: OptionController,\n StringController: StringController,\n NumberController: NumberController,\n NumberControllerBox: NumberControllerBox,\n NumberControllerSlider: NumberControllerSlider,\n FunctionController: FunctionController,\n ColorController: ColorController\n};\nvar dom$1 = { dom: dom };\nvar gui = { GUI: GUI };\nvar GUI$1 = GUI;\nvar index = {\n color: color,\n controllers: controllers,\n dom: dom$1,\n gui: gui,\n GUI: GUI$1\n};\n\nexport { color, controllers, dom$1 as dom, gui, GUI$1 as GUI };\nexport default index;\n//# sourceMappingURL=dat.gui.module.js.map\n","import Spring from '../lib'\nimport { raf, fpsLimiter } from '@internet/raf'\nimport * as dat from 'dat.gui'\n\nconst FPS = [null, 10, 6]\nconst gui = new dat.GUI()\n\nconst params = { tension: 0.1, friction: 0.2, timestep: 8 }\nconst els = Array\n .from(document.querySelectorAll('.dot'))\n .map((el, i) => createSpring(el, i, {\n precisionStop: 0.01,\n perfectStop: true,\n tension: params.tension,\n friction: params.friction,\n step: 8\n }))\n\ngui.add(params, 'tension', 0, 1).onChange(v => { els.forEach(el => el.setTension(v)) })\ngui.add(params, 'friction', 0, 1).onChange(v => { els.forEach(el => el.setFriction(v)) })\n\ndocument.addEventListener('mousemove', e => {\n for (let i = 0; i < els.length; i++) els[i].setTarget(e.clientX, e.clientY)\n})\n\nfunction createSpring (el, i, opts) {\n const x = new Spring(opts)\n const y = new Spring(opts)\n const update = !FPS[i] ? _update : fpsLimiter(FPS[i], _update)\n x.onStart = () => !y.stopped && raf.add(update)\n y.onStart = () => !x.stopped && raf.add(update)\n x.onStop = () => y.stopped && raf.remove(update)\n y.onStop = () => x.stopped && raf.remove(update)\n\n return { setTarget, setTension, setFriction, setStep }\n\n function setTension (v) {\n x.setTension(v)\n y.setTension(v)\n }\n\n function setFriction (v) {\n x.setFriction(v)\n y.setFriction(v)\n }\n\n function setStep (v) {\n x.setStep(v)\n y.setStep(v)\n }\n\n function setTarget (nx, ny) {\n x.setTarget(nx)\n y.setTarget(ny)\n }\n\n function _update (dt) {\n x.update(dt)\n y.update(dt)\n el.classList[x.stopped && y.stopped ? 'add' : 'remove']('stopped')\n el.style.transform = `translate3d(${x.value}px, ${y.value}px, 0)`\n }\n}\n","'use strict'\n\n/**\n * Limit function calls to a specific framerate\n * @param {number} [framerate=30] Framerate\n * @param {function} callback Function to be called at the specified frame interval\n * @return {function} Framerate-limited function to add to your raf\n * @example\n * import { raf, fpsLimiter } from '@internet/raf'\n *\n * function tick () {\n * console.log('called each 10 fps')\n * }\n *\n * const limited = fpsLimiter(10, tick)\n * raf.add(limited)\n */\nfunction fpsLimiter (framerate, callback) {\n if (callback === void 0) throw new Error('You must specify a callback')\n if (framerate === void 0) framerate = 30\n var _interval = 1000 / framerate\n var _remainingTime = 0\n var _elapsedTime = 0\n return function (dt) {\n _remainingTime -= dt\n _elapsedTime += dt\n if (_remainingTime <= 0) {\n callback(_elapsedTime)\n _elapsedTime = 0\n _remainingTime = _interval + (_remainingTime % _interval)\n }\n }\n}\n\nexport default fpsLimiter\n"],"names":["Spring","options","this","initial","value","previous","velocity","onStart","onStop","precisionStop","perfectStop","setValue","setTarget","setMass","mass","setTension","tension","setFriction","friction","setStep","step","prototype","v","Math","abs","target","start","stop","_K","_D","_dampingAdjuster","pow","_stepAdjuster","_inverseMass","_step","stopped","acceleration","_accumulator","_prevStepVel","_prevStepValue","_adjusted","update","dt","lerp","dispose","time","root","window","global","_observers","_afterObservers","_beforeObservers","_rafHandler","_lastDate","_once","_complex","_frame","timestamp","i","requestAnimationFrame","length","_swapRunner","_addObserver","arr","fn","prepend","indexOf","unshift","push","_removeObserver","index","splice","instant","cancelAnimationFrame","add","addAfter","addBefore","remove","removeAfter","removeBefore","requestOnce","colorToString","color","forceCSSHex","colorFormat","__state","conversionName","toString","r","round","g","b","a","h","s","toFixed","str","hex","ARR_EACH","Array","forEach","ARR_SLICE","slice","Common","BREAK","extend","each","call","arguments","obj","isObject","Object","keys","key","isUndefined","bind","defaults","compose","toCall","args","apply","itr","scope","l","_key","defer","fnc","setTimeout","debounce","func","threshold","callImmediately","timeout","callNow","clearTimeout","toArray","undefined","isNull","isNaN","_isNaN","_x","isArray","constructor","isNumber","isString","isBoolean","isFunction","INTERPRETATIONS","litmus","conversions","THREE_CHAR_HEX","read","original","test","match","space","parseInt","write","SIX_CHAR_HEX","CSS_RGB","parseFloat","CSS_RGBA","HEX","RGB_ARRAY","RGBA_ARRAY","RGBA_OBJ","RGB_OBJ","HSVA_OBJ","HSV_OBJ","result","toReturn","interpret","family","conversion","tmpComponent","ColorMath","hsv_to_rgb","hi","floor","f","p","q","t","c","rgb_to_hsv","min","max","delta","NaN","rgb_to_hex","hex_with_component","component_from_hex","componentIndex","_typeof","Symbol","iterator","classCallCheck","instance","Constructor","TypeError","createClass","defineProperties","props","descriptor","enumerable","configurable","writable","defineProperty","protoProps","staticProps","get","object","property","receiver","Function","desc","getOwnPropertyDescriptor","parent","getPrototypeOf","getter","inherits","subClass","superClass","create","setPrototypeOf","__proto__","possibleConstructorReturn","self","ReferenceError","Color","Error","defineRGBComponent","component","componentHexIndex","recalculateRGB","set","defineHSVComponent","recalculateHSV","COMPONENTS","Controller","initialValue","domElement","document","createElement","__onChange","__onFinishChange","newValue","updateDisplay","getValue","EVENT_MAP_INV","HTMLEvents","MouseEvents","KeyboardEvents","k","e","CSS_VALUE_PIXELS","cssValueToPixels","val","dom","makeSelectable","elem","selectable","style","onselectstart","MozUserSelect","KhtmlUserSelect","unselectable","makeFullscreen","hor","vert","vertical","horizontal","position","left","right","top","bottom","fakeEvent","eventType","pars","aux","params","className","evt","createEvent","initMouseEvent","bubbles","cancelable","clickCount","x","clientX","y","clientY","init","initKeyboardEvent","initKeyEvent","ctrlKey","altKey","shiftKey","metaKey","keyCode","charCode","initEvent","dispatchEvent","event","newBool","addEventListener","attachEvent","unbind","removeEventListener","detachEvent","addClass","classes","split","join","replace","removeClass","removeAttribute","hasClass","RegExp","getWidth","getComputedStyle","width","getHeight","height","getOffset","el","offset","offsetParent","offsetLeft","offsetTop","isActive","activeElement","type","href","BooleanController","_Controller","_this2","_this","__prev","__checkbox","setAttribute","appendChild","checked","OptionController","opts","__select","map","element","opt","innerHTML","selectedIndex","StringController","onChange","__input","blur","numDecimals","NumberController","_params","__min","__max","__step","__impliedStep","log","LN10","__precision","_v","minValue","maxValue","stepValue","NumberControllerBox","_NumberController","__truncationSuspended","prevY","onFinish","onMouseDrag","diff","onMouseUp","attempted","tenTo","i1","i2","o1","o2","NumberControllerSlider","preventDefault","bgRect","__background","getBoundingClientRect","onTouchMove","touches","onTouchEnd","__foreground","pct","FunctionController","text","__button","fire","ColorController","__color","__temp","__selector","__saturation_field","__field_knob","__field_knob_border","__hue_knob","__hue_field","__input_textShadow","onBlur","valueField","fieldDown","setSV","fieldUpSV","fieldDownH","setH","fieldUpH","toOriginal","fieldRect","_ref","padding","backgroundColor","boxShadow","border","borderRadius","zIndex","borderRight","marginRight","display","cursor","background","linearGradient","cssText","outline","textAlign","fontWeight","textShadow","mismatch","flip","_flip","marginLeft","marginTop","toHexString","vendors","vendor","css","cssContent","indoc","doc","injected","head","getElementsByTagName","ControllerFactory","requestAnimationFrame$1","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","callback","CenteredDiv","backgroundElement","opacity","WebkitTransition","transition","body","hide","webkitTransform","layout","innerWidth","innerHeight","___$insertStyle","DEFAULT_DEFAULT_PRESET_NAME","SUPPORTS_LOCAL_STORAGE","localStorage","SAVE_DIALOGUE","autoPlaceVirgin","autoPlaceContainer","hideableGuis","GUI","__ul","__folders","__controllers","__rememberedObjects","__rememberedObjectIndecesToControllers","__listening","closeOnTop","autoPlace","DEFAULT_WIDTH","resizable","hideable","load","preset","scrollable","useLocalStorage","getItem","getLocalStorageHash","saveToLocalStorage","titleRow","getRoot","gui","__preset_select","setPresetSelectIndex","revert","setWidth","name","closed","CLASS_CLOSED","onResize","__closeButton","TEXT_OPEN","TEXT_CLOSED","bool","setItem","CLASS_MAIN","savedGui","JSON","parse","CLASS_CLOSE_BUTTON","CLASS_CLOSE_TOP","insertBefore","childNodes","CLASS_CLOSE_BOTTOM","titleRowName","createTextNode","addRow","CLASS_AUTO_PLACE_CONTAINER","CLASS_AUTO_PLACE","__resizeHandler","onResizeDebounced","addResizeHandle","saveToLocalStorageIfPossible","stringify","getSaveObject","newDom","liBefore","li","removeListeners","markPresetModified","modified","recallSavedValue","controller","matchedIndex","controllerMap","remembered","presetMap","_add","factoryArgs","concat","before","__li","container","CLASS_CONTROLLER_ROW","__gui","_options","nextSibling","nextElementSibling","_nextSibling","_name","firstElementChild","listen","box","method","pc","pb","returned","oldName","wasListening","newController","stopPropagation","borderLeftColor","isModified","augmentController","location","addPresetOption","setSelected","showHideExplain","explain","pmouseX","drag","dragStop","CLASS_DRAG","dragStart","__resize_handle","w","__save_row","getCurrentPreset","useInitialValues","savedValues","toggleHide","CLASS_TOO_TALL","_keydownHandler","which","addColor","removeChild","destroy","subfolder","removeFolder","addFolder","newGuiParams","folders","folder","parentElement","open","close","node","offsetHeight","remember","div","firstChild","gears","button","button2","button3","select","getElementById","localStorageCheckBox","saveLocally","newConstructorTextArea","show","focus","save","presetName","prompt","saveAs","addSaveMenu","updateDisplays","controllerArray","FPS","timestep","els","from","querySelectorAll","const","framerate","_interval","_remainingTime","_elapsedTime","fpsLimiter","_update","raf","nx","ny","classList","transform","createSpring","let"],"mappings":"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"} -------------------------------------------------------------------------------- /lib/Spring.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | /** 4 | * Create a new Spring instance. 5 | * @class Spring 6 | * @param {Object} [options={}] Spring options. 7 | * @param {number} [options.initial=0] Initial value / targetValue of your spring. 8 | * @param {number} [options.tension=0.1] Tension/Stifness of your spring. 9 | * @param {number} [options.friction=0.2] *From 0 to 1.* Friction (Damping) of your spring. 10 | * @param {number} [options.step=10] Timestep of the physics solver (in ms). Step > 16.67ms will give you pretty bad results. 11 | * @param {function} [options.onStart] `onStart` will be called when the spring starts moving. 12 | * @param {function} [options.onStop] `onStop` will be called when your the spring stops moving. 13 | * @param {number} [options.precisionStop=0.0001] Minimum distance between `value` and `target` to consider the spring stopped. 14 | * @param {boolean} [options.perfectStop=false] Define if `value` is set precisely to targetValue when the spring stops moving. 15 | * @constructor 16 | * @example 17 | * import { raf } from '@internet/raf' 18 | * import Spring from '@internet/spring' 19 | * 20 | * const move = new Spring({ initial: 0 }) 21 | * move.setTarget(300) 22 | * raf.add(dt => { 23 | * move.update(dt) 24 | * console.log(move.value) 25 | * }) 26 | * 27 | */ 28 | function Spring (options) { 29 | if (options === void 0) options = {} 30 | /** 31 | * Initial position of the spring 32 | * @type {number} 33 | * @category Properties 34 | */ 35 | this.initial = options.initial || 0 36 | 37 | /** 38 | * Current position of the spring 39 | * @type {number} 40 | * @category Properties 41 | */ 42 | this.value = this.initial 43 | 44 | /** 45 | * Previous frame position of the spring 46 | * @type {number} 47 | * @category Properties 48 | */ 49 | this.previous = this.initial 50 | 51 | /** 52 | * Current velocity of the spring 53 | * @type {number} 54 | * @category Properties 55 | */ 56 | this.velocity = 0 57 | 58 | /** 59 | * Optional function called when the spring starts 60 | * @type {function} 61 | * @category Properties 62 | */ 63 | this.onStart = options.onStart 64 | 65 | /** 66 | * Optional function called when the spring stops 67 | * @type {function} 68 | * @category Properties 69 | */ 70 | this.onStop = options.onStop 71 | 72 | this.precisionStop = options.precisionStop || 0.0001 73 | this.perfectStop = !!options.perfectStop 74 | 75 | this.setValue(this.initial) 76 | this.setTarget(this.initial) 77 | this.setMass(options.mass || 1) 78 | this.setTension(options.tension || 0.1) 79 | this.setFriction(options.friction || 0.2) 80 | this.setStep(options.step || 10) 81 | } 82 | 83 | /** 84 | * Change the current position of the spring. Can retrigger onStart / onStop. 85 | * @method 86 | * @param {number} newCurrent New current value. 87 | * @category Methods 88 | */ 89 | Spring.prototype.setValue = function setValue (v) { 90 | this.value = v 91 | if (Math.abs(this.target - this.value) > this.precisionStop) this.start() 92 | else this.stop() 93 | } 94 | 95 | /** 96 | * Update target / resting position of the spring. Can retrigger onStart / onStop. 97 | * @method 98 | * @param {number} newTarget New target value. 99 | * @category Methods 100 | */ 101 | Spring.prototype.setTarget = function setTarget (v) { 102 | this.target = v 103 | if (Math.abs(this.target - this.value) > this.precisionStop) this.start() 104 | else this.stop() 105 | } 106 | 107 | /** 108 | * Update tension of the spring 109 | * @method 110 | * @param {number} tensionValue New tension value. 111 | * @category Methods 112 | */ 113 | Spring.prototype.setTension = function setTension (v) { 114 | this._K = v 115 | } 116 | 117 | /** 118 | * Update friction of the spring 119 | * @method 120 | * @param {number} frictionValue New friction value. 121 | * @category Methods 122 | */ 123 | Spring.prototype.setFriction = function setFriction (v) { 124 | this._D = v 125 | this._dampingAdjuster = Math.pow(1 - this._D, this._stepAdjuster) 126 | } 127 | 128 | Spring.prototype.setMass = function setMass (v) { 129 | this.mass = v 130 | this._inverseMass = 1 / this.mass 131 | } 132 | 133 | Spring.prototype.setStep = function setStep (v) { 134 | this._step = v 135 | this._stepAdjuster = this._step / 16.67 136 | this.setFriction(this._D) // recompute dampingAdjuster 137 | } 138 | 139 | /** 140 | * Force re-start of the spring. Only needed if you force-stop the spring with `stop()` 141 | * @method 142 | * @category Methods 143 | */ 144 | Spring.prototype.start = function start () { 145 | this.stopped = false 146 | if (this.onStart) this.onStart() 147 | } 148 | 149 | /** 150 | * Force-stop the spring. 151 | * @method 152 | * @category Methods 153 | */ 154 | Spring.prototype.stop = function stop () { 155 | if (this.stopped) return 156 | if (this.perfectStop && Math.abs(this.target - this.value) <= this.precisionStop) this.value = this.target 157 | this.acceleration = 0 158 | this.velocity = 0 159 | this._accumulator = 0 160 | this._prevStepVel = 0 161 | this._prevStepValue = this.value 162 | this._adjusted = false 163 | this.stopped = true 164 | if (this.onStop) this.onStop() 165 | } 166 | 167 | /** 168 | * Update the spring physic state 169 | * @method 170 | * @param {number} dt Elapsed time since the last frame (in ms) 171 | * @category Methods 172 | */ 173 | Spring.prototype.update = function update (dt) { 174 | if (this.stopped) return 175 | this._accumulator += dt 176 | this.previous = this.value 177 | 178 | if (this._adjusted) { 179 | this._adjusted = false 180 | this.velocity = this._prevStepVel 181 | this.value = this._prevStepValue 182 | } 183 | 184 | if (dt < this._step) { 185 | this._adjusted = true 186 | this._accumulator += this._step 187 | } 188 | 189 | while (this._accumulator >= this._step) { 190 | this.acceleration = -this._K * (this.value - this.target) * this._inverseMass // f = a * m <=> a = f / m 191 | this._prevStepVel = this.velocity 192 | this.velocity = (this.velocity + this.acceleration * this._stepAdjuster) * this._dampingAdjuster 193 | this._prevStepValue = this.value 194 | this.value = this.value + this.velocity * this._stepAdjuster 195 | this._accumulator -= this._step 196 | } 197 | 198 | if (this._adjusted) { 199 | var lerp = this._accumulator / this._step 200 | this.value = this.value * lerp + this._prevStepValue * (1 - lerp) 201 | } 202 | 203 | if (Math.abs(this.target - this.value) <= this.precisionStop) this.stop() 204 | } 205 | 206 | /** 207 | * Stop the spring and remove callbacks referenced in onStart and onStop. 208 | * @category Methods 209 | */ 210 | Spring.prototype.dispose = function dispose () { 211 | this.stop() 212 | this.onStart = null 213 | this.onStop = null 214 | } 215 | 216 | export default Spring 217 | -------------------------------------------------------------------------------- /lib/index.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | import Spring from './Spring' 4 | 5 | export default Spring 6 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@internet/spring", 3 | "version": "0.0.3", 4 | "description": "Framerate-independant spring physics", 5 | "source": "lib/index.js", 6 | "main": "lib/index.js", 7 | "module": "lib/index.js", 8 | "files": [ 9 | "build" 10 | ], 11 | "repository": "git@github.com:pqml/spring.git", 12 | "author": "pqml ", 13 | "license": "MIT", 14 | "scripts": { 15 | "test": "tape -r esm test/index.js | tap-spec", 16 | "lint": "eslint lib/** test/**", 17 | "es": "es-check --module es5 lib/**/*.js", 18 | "build": "microbundle -f es --compress false --externals none", 19 | "demo": "microbundle -i demo/demo.js -f umd -o demo --target browser", 20 | "demo:serve": "npm run demo -- -w & light-server -s demo -p 8080 -w demo/**/*", 21 | "demo:deploy": "npm run demo && ghp demo -f", 22 | "docs": "jsdoc2md --template README.hbs --heading-depth 3 --separators --files lib/*.js > README.md", 23 | "prepublishOnly": "npm run lint && npm run test && npm run docs && npm run build && npm run demo:deploy" 24 | }, 25 | "devDependencies": { 26 | "@internet/eslint-config": "0.0.4", 27 | "@internet/raf": "^0.2.1", 28 | "dat.gui": "^0.7.3", 29 | "es-check": "^5.0.0", 30 | "esm": "^3.0.84", 31 | "ghp": "^1.3.1", 32 | "jsdoc-to-markdown": "^4.0.1", 33 | "light-server": "^2.6.0", 34 | "microbundle": "^0.7.0", 35 | "raf": "^3.4.1", 36 | "tap-spec": "^5.0.0", 37 | "tape": "^4.9.1", 38 | "tape-promise": "^4.0.0" 39 | }, 40 | "dependencies": {}, 41 | "eslintConfig": { 42 | "extends": "@internet" 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /test/index.js: -------------------------------------------------------------------------------- 1 | // import Spring from '../lib' 2 | import test from 'tape-promise/tape' 3 | 4 | test('Spring', t => { 5 | t.end() 6 | }) 7 | --------------------------------------------------------------------------------