<script><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->var smokemachine = function (context, color){<!-- [et_pb_line_break_holder] --> color = color || [24, 46.8, 48.2]<!-- [et_pb_line_break_holder] --> var polyfillAnimFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame ||<!-- [et_pb_line_break_holder] --> window.webkitRequestAnimationFrame || window.msRequestAnimationFrame;<!-- [et_pb_line_break_holder] --> var lastframe;<!-- [et_pb_line_break_holder] --> var currentparticles = []<!-- [et_pb_line_break_holder] --> var pendingparticles = []<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --> var buffer = document.createElement('canvas'),<!-- [et_pb_line_break_holder] --> bctx = buffer.getContext('2d')<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --> buffer.width = 20<!-- [et_pb_line_break_holder] --> buffer.height = 20<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --> var opacities = [0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,3,5,5,7,4,4,1,1,0,1,0,0,0,0,0,1,0,0,17,27,41,52,56,34,23,15,11,4,9,5,1,0,0,0,0,0,0,1,45,63,57,45,78,66,52,41,34,37,23,20,0,1,0,0,0,0,1,43,62,66,64,67,115,112,114,56,58,47,33,18,12,10,0,0,0,0,39,50,63,76,87,107,105,112,128,104,69,64,29,18,21,15,0,0,0,7,42,52,85,91,103,126,153,128,124,82,57,52,52,24,1,0,0,0,2,17,41,67,84,100,122,136,159,127,78,69,60,50,47,25,7,1,0,0,0,34,33,66,82,113,138,149,168,175,82,142,133,70,62,41,25,6,0,0,0,18,39,55,113,111,137,141,139,141,128,102,130,90,96,65,37,0,0,0,2,15,27,71,104,129,129,158,140,154,146,150,131,92,100,67,26,3,0,0,0,0,46,73,104,124,145,135,122,107,120,122,101,98,96,35,38,7,2,0,0,0,50,58,91,124,127,139,118,121,177,156,88,90,88,28,43,3,0,0,0,0,30,62,68,91,83,117,89,139,139,99,105,77,32,1,1,0,0,0,0,0,16,21,8,45,101,125,118,87,110,86,64,39,0,0,0,0,0,0,0,0,0,1,28,79,79,117,122,88,84,54,46,11,0,0,0,0,0,0,0,0,0,1,0,6,55,61,68,71,30,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,23,25,20,12,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,12,9,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,2,2,0,0,0,0,0,0,0,0]<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --> var data = bctx.createImageData(20,20)<!-- [et_pb_line_break_holder] --> var d = data.data<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --> for(var i=0;i<d.length;i+=4){<!-- [et_pb_line_break_holder] --> d[i]=color[0]<!-- [et_pb_line_break_holder] --> d[i+1]=color[1]<!-- [et_pb_line_break_holder] --> d[i+2]=color[2]<!-- [et_pb_line_break_holder] --> d[i+3]=opacities[i / 4]<!-- [et_pb_line_break_holder] --> }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --> bctx.putImageData(data,0,0)<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --> var imagewidth = 20 * 5<!-- [et_pb_line_break_holder] --> var imageheight = 20 * 5<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --> function particle(x,y,l){<!-- [et_pb_line_break_holder] --> this.x = x<!-- [et_pb_line_break_holder] --> this.y = y<!-- [et_pb_line_break_holder] --> this.age = 0<!-- [et_pb_line_break_holder] --> this.vx = (Math.random()*8-4)/100<!-- [et_pb_line_break_holder] --> this.startvy = -(Math.random()*30+10)/100<!-- [et_pb_line_break_holder] --> this.vy = this.startvy<!-- [et_pb_line_break_holder] --> this.scale = Math.random()*.5<!-- [et_pb_line_break_holder] --> this.lifetime = Math.random()*l+l/2<!-- [et_pb_line_break_holder] --> this.finalscale = 5+this.scale+Math.random()<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --> this.update = function(deltatime){<!-- [et_pb_line_break_holder] --> this.x+=this.vx*deltatime<!-- [et_pb_line_break_holder] --> this.y+=this.vy*deltatime<!-- [et_pb_line_break_holder] --> var frac = Math.pow((this.age)/this.lifetime,.5)<!-- [et_pb_line_break_holder] --> this.vy = (1-frac)*this.startvy<!-- [et_pb_line_break_holder] --> this.age+=deltatime<!-- [et_pb_line_break_holder] --> this.scale=frac*this.finalscale<!-- [et_pb_line_break_holder] --> }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --> this.draw = function(){<!-- [et_pb_line_break_holder] --> context.globalAlpha = (1-Math.abs(1-2*(this.age)/this.lifetime))/8<!-- [et_pb_line_break_holder] --> var off = this.scale*imagewidth/2<!-- [et_pb_line_break_holder] --> var xmin = this.x-off<!-- [et_pb_line_break_holder] --> var xmax = xmin+this.scale*imageheight<!-- [et_pb_line_break_holder] --> var ymin = this.y-off<!-- [et_pb_line_break_holder] --> var ymax = ymin+this.scale*imageheight<!-- [et_pb_line_break_holder] --> context.drawImage(buffer, xmin, ymin, xmax-xmin, ymax-ymin)<!-- [et_pb_line_break_holder] --> }<!-- [et_pb_line_break_holder] --> }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --> function addparticles(x,y,n,lifetime){<!-- [et_pb_line_break_holder] --> lifetime = lifetime || 4000<!-- [et_pb_line_break_holder] --> n = n || 10<!-- [et_pb_line_break_holder] --> if(n < 1) return Math.random() <= n && pendingparticles.push(new particle(x,y,lifetime));<!-- [et_pb_line_break_holder] --> for (var i = 0; i < n; i++) {<!-- [et_pb_line_break_holder] --> pendingparticles.push(new particle(x,y,lifetime))<!-- [et_pb_line_break_holder] --> };<!-- [et_pb_line_break_holder] --> }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --> function updateanddrawparticles(deltatime){<!-- [et_pb_line_break_holder] --> context.clearRect(0, 0, canvas.width, canvas.height);<!-- [et_pb_line_break_holder] --> deltatime = deltatime || 16<!-- [et_pb_line_break_holder] --> var newparticles = []<!-- [et_pb_line_break_holder] --> currentparticles = currentparticles.concat(pendingparticles)<!-- [et_pb_line_break_holder] --> pendingparticles = []<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --> currentparticles.forEach(function(p){<!-- [et_pb_line_break_holder] --> p.update(deltatime)<!-- [et_pb_line_break_holder] --> if (p.age<p.lifetime){<!-- [et_pb_line_break_holder] --> p.draw()<!-- [et_pb_line_break_holder] --> newparticles.push(p)<!-- [et_pb_line_break_holder] --> }<!-- [et_pb_line_break_holder] --> })<!-- [et_pb_line_break_holder] --> currentparticles = newparticles<!-- [et_pb_line_break_holder] --> }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --> function frame(time){<!-- [et_pb_line_break_holder] --> if(running){<!-- [et_pb_line_break_holder] --> var deltat = time-lastframe<!-- [et_pb_line_break_holder] --> lastframe = time;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --> updateanddrawparticles(deltat)<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --> polyfillAnimFrame(frame)<!-- [et_pb_line_break_holder] --> }<!-- [et_pb_line_break_holder] --> }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --> var running = false<!-- [et_pb_line_break_holder] --> function start(){<!-- [et_pb_line_break_holder] --> running = true<!-- [et_pb_line_break_holder] --> polyfillAnimFrame(function(time){<!-- [et_pb_line_break_holder] --> lastframe = time<!-- [et_pb_line_break_holder] --> polyfillAnimFrame(frame)<!-- [et_pb_line_break_holder] --> })<!-- [et_pb_line_break_holder] --> }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --> function stop(){<!-- [et_pb_line_break_holder] --> running = false<!-- [et_pb_line_break_holder] --> }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --> return {<!-- [et_pb_line_break_holder] --> start:start,<!-- [et_pb_line_break_holder] --> stop:stop,<!-- [et_pb_line_break_holder] --> step: updateanddrawparticles,<!-- [et_pb_line_break_holder] --> addsmoke: addparticles<!-- [et_pb_line_break_holder] --> }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --></script>