-
Notifications
You must be signed in to change notification settings - Fork 38
/
fireworks.min.js
18 lines (18 loc) · 7.16 KB
/
fireworks.min.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var Fireworks={createEmitter:function(a){return new Fireworks.Emitter(a)},Emitter:function(a){this._nParticles=void 0!==a.nParticles?a.nParticles:100;this._particles=[];this._spawner=null;this._effects=[];this._started=!1;this._onUpdated=null;this._intensity=0;this._effectsStackBuilder=new Fireworks.EffectsStackBuilder(this)}};Fireworks.Emitter.prototype.destroy=function(){this._effects.forEach(function(a){a.destroy()});this._spawner&&this._spawner.destroy();this._particles.forEach(function(a){a.destroy()})};
Fireworks.Emitter.prototype.effects=function(){return this._effects};Fireworks.Emitter.prototype.effectByName=function(a){for(var b=0;b<this._effects.length;b++){var c=this._effects[b];if(c.name===a)return c}return null};Fireworks.Emitter.prototype.particles=function(){return this._particles};Fireworks.Emitter.prototype.liveParticles=function(){return this._liveParticles};Fireworks.Emitter.prototype.deadParticles=function(){return this._deadParticles};Fireworks.Emitter.prototype.nParticles=function(){return this._nParticles};
Fireworks.Emitter.prototype.effectsStackBuilder=function(){return this._effectsStackBuilder};Fireworks.Emitter.prototype.spawner=function(a){if(void 0===a)return this._spawner;this._spawner=a;return this};
Fireworks.Emitter.prototype.intensity=function(a){if(void 0===a)return this._intensity;if(a===this._intensity)return this;console.assert(0<=a,"Fireworks.Emitter.intensity: invalid value.",a);console.assert(1>=a,"Fireworks.Emitter.intensity: invalid value.",a);this._intensity=a;this._effects.forEach(function(a){if(a.onIntensityChange)a.onIntensityChange(this._intensity)}.bind(this));return this};Fireworks.Emitter.prototype.setSpawner=Fireworks.Emitter.prototype.spawner;
Fireworks.Emitter.prototype.setParticleData=function(a,b,c){a.set(b,c)};Fireworks.Emitter.prototype.getParticleData=function(a,b){return a.get(b)};
Fireworks.Emitter.prototype.start=function(){console.assert(this._spawner,"a spawner MUST be set");console.assert(0<this._effects.length,"Some effects MUST be set");console.assert(!1===this._started);this._particles=Array(this._nParticles);for(var a=0;a<this._nParticles;a++)this._particles[a]=new Fireworks.Particle;this._liveParticles=[];this._deadParticles=this._particles.slice(0);this._started=!0;this._effects.forEach(function(a){a.onCreate&&this._particles.forEach(function(c,d){a.onCreate(c,d)})}.bind(this));
return this};Fireworks.Emitter.prototype.update=function(a){this._spawner.update(this,a);this._effects.forEach(function(b){b.onUpdate&&this._liveParticles.forEach(function(c){b.onUpdate(c,a)})}.bind(this));return this};
Fireworks.Emitter.prototype.render=function(){this._effects.forEach(function(a){if(a.onPreRender)a.onPreRender()}.bind(this));this._effects.forEach(function(a){a.onRender&&this._liveParticles.forEach(function(b){a.onRender(b)})}.bind(this));this._effects.forEach(function(a){if(a.onPostRender)a.onPostRender()}.bind(this));return this};
Fireworks.Emitter.prototype.killParticle=function(a){var b=this._liveParticles.indexOf(a);console.assert(-1!==b);this._liveParticles.splice(b,1);this._deadParticles.push(a);this.effects().forEach(function(b){b.onDeath&&b.onDeath(a)}.bind(this))};Fireworks.Emitter.prototype.spawnParticle=function(){console.assert(1<=this._deadParticles.length,"no more particle available");var a=this.deadParticles().pop();this.liveParticles().push(a);this.effects().forEach(function(b){b.onBirth&&b.onBirth(a)}.bind(this))};
Fireworks.Spawner=function(){this._isRunning=!1};Fireworks.Spawner.prototype.start=function(){this._isRunning=!0};Fireworks.Spawner.prototype.stop=function(){this._isRunning=!1};Fireworks.Spawner.prototype.isRunning=function(){return this._isRunning};Fireworks.Particle=function(){};Fireworks.Particle.prototype.set=function(a,b){console.assert(void 0===this[a],"key already defined: "+a);this[a]=b;return this[a]};
Fireworks.Particle.prototype.get=function(a){console.assert(void 0!==this[a],"key undefined: "+a);return this[a]};Fireworks.Particle.prototype.has=function(a){return void 0!==this[a]?!0:!1};Fireworks.EffectsStackBuilder=function(a){this._emitter=a};Fireworks.EffectsStackBuilder.prototype.back=function(){return this._emitter};Fireworks.EffectsStackBuilder.prototype.createEffect=function(a,b){return Fireworks.createEffect(a,b).pushTo(this._emitter).back(this)};
Fireworks.createEffect=function(a,b){"object"===typeof a&&(b=a,a=void 0);var c=new Fireworks.Effect;c.opts=b;c.name=a;c.back=null;var d={onCreate:function(a){c.onCreate=a;return d},onBirth:function(a){c.onBirth=a;return d},onUpdate:function(a){c.onUpdate=a;return d},onDeath:function(a){c.onDeath=a;return d},onPreRender:function(a){c.onPreRender=a;return d},onRender:function(a){c.onRender=a;return d},onPostRender:function(a){c.onPostRender=a;return d},onIntensityChange:function(a){c.onIntensityChange=
a;return d},pushTo:function(a){a.effects().push(c);return d},back:function(a){if(a===void 0)return c.back;c.back=a;return d},effect:function(){return c}};return d};Fireworks.Effect=function(){};Fireworks.Shape=function(){};Fireworks.createVector=function(a,b,c){return new Fireworks.Vector(a,b,c)};Fireworks.Vector=function(a,b,c){this.x=a||0;this.y=b||0;this.z=c||0};
Fireworks.Vector.prototype={constructor:Fireworks.Vector,set:function(a,b,c){this.x=a;this.y=b;this.z=c;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setZ:function(a){this.z=a;return this},random:function(){this.x=Math.random()-0.5;this.y=Math.random()-0.5;this.z=Math.random()-0.5;return this},toString:function(){return JSON.stringify(this)},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;return this},add:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=
a.z+b.z;return this},addSelf:function(a){this.x+=a.x;this.y+=a.y;this.z+=a.z;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;return this},sub:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;return this},subSelf:function(a){this.x-=a.x;this.y-=a.y;this.z-=a.z;return this},multiply:function(a,b){this.x=a.x*b.x;this.y=a.y*b.y;this.z=a.z*b.z;return this},multiplySelf:function(a){this.x*=a.x;this.y*=a.y;this.z*=a.z;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;
this.z*=a;return this},divideSelf:function(a){this.x/=a.x;this.y/=a.y;this.z/=a.z;return this},divideScalar:function(a){a?(this.x/=a,this.y/=a,this.z/=a):this.z=this.y=this.x=0;return this},negate:function(){return this.multiplyScalar(-1)},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z},length:function(){return Math.sqrt(this.lengthSq())},normalize:function(){return this.divideScalar(this.length())},setLength:function(a){return this.normalize().multiplyScalar(a)},
cross:function(a,b){this.x=a.y*b.z-a.z*b.y;this.y=a.z*b.x-a.x*b.z;this.z=a.x*b.y-a.y*b.x;return this},crossSelf:function(a){var b=this.x,c=this.y,d=this.z;this.x=c*a.z-d*a.y;this.y=d*a.x-b*a.z;this.z=b*a.y-c*a.x;return this},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){return(new Fireworks.Vector).sub(this,a).lengthSq()},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z},isZero:function(){return 1E-4>this.lengthSq()},clone:function(){return new Fireworks.Vector(this.x,
this.y,this.z)}};