A Pen by Seth Krasnianski on CodePen.
Created
May 11, 2016 17:36
-
-
Save sethkrasnianski/d249c2e3c0fdb9561206d843f002e3c7 to your computer and use it in GitHub Desktop.
eZXMRr
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<div id="main-container"></div> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var intro_straplines = { | |
"long": [ | |
"Good design is invisible", | |
"Starting complex means never ending", | |
"Courage is in shorter supply than genius", | |
], | |
"short": [ | |
"Beauty in simplicity", | |
"Insatiable curiousity", | |
"Do it with love", | |
] | |
} | |
var helpers = function() { | |
function a(a, b, c, d) { | |
return Math.sqrt(Math.pow(c - a, 2) + Math.pow(d - b, 2)) | |
} | |
function b(a) { | |
var b = void 0; | |
switch (a.type) { | |
case "polygon": | |
a.attributes.corners = a.attributes.corners || 3, | |
a.attributes.r = a.attributes.r || 100, | |
a.attributes.rotation = a.attributes.rotation || 0, | |
b = y(a.attributes.corners, a.attributes); | |
break; | |
case "circle": | |
case "rect": | |
b = x(a.type, a.attributes) | |
} | |
return b | |
} | |
function c(a) { | |
var b = []; | |
return helpers.each(a.split(" "), function(a) { | |
var c = a.split(","); | |
b.push([c[0], c[1]]) | |
}), | |
b | |
} | |
function d(a, b, c, d, e) { | |
var f = 2 * Math.PI / d; | |
e.beginPath(), | |
e.moveTo(Math.cos(0 * f) * c + a, Math.sin(0 * f) * c + b); | |
for (var g = 0; d > g; g++) { | |
var h = Math.cos(f * g) * c + a | |
, i = Math.sin(f * g) * c + b; | |
e.lineTo(h, i) | |
} | |
e.closePath() | |
} | |
function e(a, b) { | |
var c = { | |
type: "circle", | |
attributes: { | |
x: 0, | |
y: 0, | |
r: 10, | |
lineWidth: 1, | |
strokeStyle: "none", | |
fillStyle: "none" | |
} | |
} | |
, d = helpers.extend(c, a); | |
"circle" == d.type && (b.beginPath(), | |
b.arc(d.attributes.x, d.attributes.y, d.attributes.r, 0, 2 * Math.PI), | |
b.fillStyle = d.fillStyle, | |
b.strokeStyle = d.fillStyle, | |
b.lineWidth = d.lineWidth, | |
b.fill(), | |
b.stroke()) | |
} | |
function f(a) { | |
var b = a.toString(16); | |
return 1 == b.length ? "0" + b : b | |
} | |
function g(a, b, c) { | |
return "#" + f(a) + f(b) + f(c) | |
} | |
function h() { | |
var a, b, c, d, e, f = arguments[0] / 255, g = arguments[1] / 255, h = arguments[2] / 255, i = Math.max(f, g, h), j = i - Math.min(f, g, h), k = function(a) { | |
return (i - a) / 6 / j + .5 | |
} | |
; | |
return 0 == j ? d = e = 0 : (e = j / i, | |
a = k(f), | |
b = k(g), | |
c = k(h), | |
f === i ? d = c - b : g === i ? d = 1 / 3 + a - c : h === i && (d = 2 / 3 + b - a), | |
0 > d ? d += 1 : d > 1 && (d -= 1)), | |
{ | |
h: Math.round(360 * d), | |
s: Math.round(100 * e), | |
v: Math.round(100 * i) | |
} | |
} | |
function i(a, b, c) { | |
var d, e, f, g, h, i, j, k; | |
if (a = Math.max(0, Math.min(360, a)), | |
b = Math.max(0, Math.min(100, b)), | |
c = Math.max(0, Math.min(100, c)), | |
b /= 100, | |
c /= 100, | |
0 == b) | |
return d = e = f = c, | |
[Math.round(255 * d), Math.round(255 * e), Math.round(255 * f)]; | |
switch (a /= 60, | |
g = Math.floor(a), | |
h = a - g, | |
i = c * (1 - b), | |
j = c * (1 - b * h), | |
k = c * (1 - b * (1 - h)), | |
g) { | |
case 0: | |
d = c, | |
e = k, | |
f = i; | |
break; | |
case 1: | |
d = j, | |
e = c, | |
f = i; | |
break; | |
case 2: | |
d = i, | |
e = c, | |
f = k; | |
break; | |
case 3: | |
d = i, | |
e = j, | |
f = c; | |
break; | |
case 4: | |
d = k, | |
e = i, | |
f = c; | |
break; | |
default: | |
d = c, | |
e = i, | |
f = j | |
} | |
return [Math.round(255 * d), Math.round(255 * e), Math.round(255 * f)] | |
} | |
var j = Array.prototype.slice | |
, k = Array.prototype.forEach | |
, l = (Array.prototype.indexOf, | |
Object.prototype.keys) | |
, m = Function.prototype | |
, n = m.bind | |
, o = {} | |
, p = function(a) { | |
return u(j.call(arguments, 1), function(b) { | |
for (var c in b) | |
a[c] = b[c] | |
}), | |
a | |
} | |
, q = function(a) { | |
var b = typeof a; | |
return "function" === b || "object" === b && !!a | |
} | |
, r = function(a, b) { | |
return hasOwnProperty.call(a, b) | |
} | |
, s = function(a) { | |
return null == a ? 0 : a.length === +a.length ? a.length : t(a).length | |
} | |
, t = function(a) { | |
if (!q(a)) | |
return []; | |
if (l) | |
return l(a); | |
var b = []; | |
for (var c in a) | |
r(a, c) && b.push(c); | |
return b | |
} | |
, u = function(a, b, c) { | |
if (null != a) | |
if (k && a.forEach === k) | |
a.forEach(b, c); | |
else if (a.length === +a.length) { | |
for (var d = 0, e = a.length; e > d; d++) | |
if (d in a && b.call(c, a[d], d, a) === o) | |
return | |
} else | |
for (var f in a) | |
if (r(a, f) && b.call(c, a[f], f, a) === o) | |
return | |
} | |
, v = function(a, b) { | |
if (n && a.bind === n) | |
return n.apply(a, j.call(arguments, 1)); | |
if (!_.isFunction(a)) | |
throw TypeError("Bind must be called on a function"); | |
var c = j.call(arguments, 2); | |
return function d() { | |
return executeBound(a, d, b, this, c.concat(j.call(arguments))) | |
} | |
} | |
, w = function(a, b, c, d, e) { | |
var f = c - b | |
, g = e - d | |
, h = a - b / f; | |
return d + h * g | |
} | |
, x = function(a, b) { | |
var c = document.createElementNS("http://www.w3.org/2000/svg", a); | |
for (attribute in b) | |
b.hasOwnProperty(attribute) && c.setAttributeNS(null , attribute, b[attribute]); | |
return c | |
} | |
, y = function(a, b) { | |
for (var c = document.createElementNS("http://www.w3.org/2000/svg", "polygon"), d = "", e = 2 * Math.PI / a, f = b.rotate ? b.rotate * (Math.PI / 180) : 0, g = 0; a > g; g++) { | |
var h = Math.cos(e * g + f) * b.r | |
, i = Math.sin(e * g + f) * b.r; | |
d += h + " " + i + " " | |
} | |
for (attribute in b) | |
b.hasOwnProperty(attribute) && "rotate" !== attribute && "r" !== attribute && "corners" !== attribute && c.setAttributeNS(null , attribute, b[attribute]); | |
return c.setAttributeNS(null , "points", d), | |
c | |
} | |
, z = function() { | |
function a(a) { | |
var e = []; | |
return a.replace(d, function(a, d, f) { | |
var g = d.toLowerCase(); | |
for (f = b(f), | |
"m" == g && f.length > 2 && (e.push([d].concat(f.splice(0, 2))), | |
g = "l", | |
d = "m" == d ? "l" : "L"); ; ) { | |
if (f.length == c[g]) | |
return f.unshift(d), | |
e.push(f); | |
if (f.length < c[g]) | |
throw new Error("malformed path data"); | |
e.push([d].concat(f.splice(0, c[g]))) | |
} | |
}), | |
e | |
} | |
function b(a) { | |
return a = a.match(/-?[.0-9]+(?:e[-+]?\d+)?/gi), | |
a ? a.map(Number) : [] | |
} | |
var c = { | |
a: 7, | |
c: 6, | |
h: 1, | |
l: 2, | |
m: 2, | |
q: 4, | |
s: 4, | |
t: 2, | |
v: 1, | |
z: 0 | |
} | |
, d = /([astvzqmhlc])([^astvzqmhlc]*)/gi; | |
return a | |
}() | |
, A = function(a) { | |
var b = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(a); | |
return b ? { | |
r: parseInt(b[1], 16), | |
g: parseInt(b[2], 16), | |
b: parseInt(b[3], 16) | |
} : null | |
} | |
, B = function(a) { | |
var b = a.match(/\d+/g); | |
return b[0] = parseFloat(b[0]), | |
b[1] = parseFloat(b[1]), | |
b[2] = parseFloat(b[2]), | |
b | |
} | |
; | |
return { | |
extend: p, | |
each: u, | |
size: s, | |
map: w, | |
distance: a, | |
bind: v, | |
createShape: b, | |
createSvgShape: x, | |
createRegularPolygon: y, | |
parsePath: z, | |
parsePolygon: c, | |
createCanvasPolygon: d, | |
createCanvasShape: e, | |
hexToRgb: A, | |
rgbToHex: g, | |
rgbToHsv: h, | |
hsvToRgb: i, | |
arrayFromRGB: B | |
} | |
}() | |
, ticker = function() { | |
function a(a) { | |
helpers.each(a, function(a) { | |
e.push(setTimeout(a.do, a.time)) | |
}) | |
} | |
function b() { | |
helpers.each(e, function(a) { | |
window.clearTimeout(a) | |
}) | |
} | |
function c() { | |
return { | |
addTicks: a, | |
clearTimeouts: b | |
} | |
} | |
var d, e = []; | |
return { | |
init: function() { | |
return d || (d = c()), | |
d | |
} | |
} | |
}() | |
, swarmIntro = function() { | |
function a(a, b) { | |
return Math.floor(Math.random() * (b - a + 1)) + a | |
} | |
var b = document.documentElement.clientHeight | |
, c = document.documentElement.clientWidth | |
, d = new Physics | |
, e = function(b, c, d) { | |
var e = this; | |
this.state = -1, | |
this.canvas = document.createElement("canvas"), | |
this.ctx = this.canvas.getContext("2d"), | |
this.tcanvas = document.createElement("canvas"), | |
this.tcanvas.id = "placeholder", | |
this.tctx = this.tcanvas.getContext("2d"), | |
this.logocanvas = document.createElement("canvas"), | |
this.logocanvas.id = "placeholder", | |
this.logoctx = this.logocanvas.getContext("2d"), | |
this.canvas.width = b, | |
this.canvas.height = c, | |
this.text = d.text, | |
window.setTimeout(function() { | |
e.state = 0 | |
}, 800), | |
window.setTimeout(function() { | |
e.state = 1 | |
}, 1e3), | |
window.setTimeout(function() { | |
e.state = 2 | |
}, 1100), | |
window.setTimeout(function() { | |
this.frictionCoeff = 20, | |
e.state = 3, | |
e.mouse.moved || (e.mouse.position.x = b / 2 + a(-300, 300), | |
e.mouse.position.y = c / 2 + a(-300, 300)) | |
}, 1900), | |
window.setTimeout(function() { | |
for (var a = e.particles.length - 1; a >= 0; a--) | |
e.particles[a].mass = Math.min(e.particles[a].mass, 200); | |
e.state = 4 | |
}, 3400), | |
this.image = new Image; | |
var f = "/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAUAAA/+EDLWh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMwMTQgNzkuMTU2Nzk3LCAyMDE0LzA4LzIwLTA5OjUzOjAyICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpGQTg1REUwNDY3NzExMUU0OEZDQ0U5RTBFN0YwNkE5NiIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpGQTg1REUwMzY3NzExMUU0OEZDQ0U5RTBFN0YwNkE5NiIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChNYWNpbnRvc2gpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MEU1NjdDODMyODA2MTFFMjk0MzhCMTQ5MEJCRjNBMUYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MEU1NjdDODQyODA2MTFFMjk0MzhCMTQ5MEJCRjNBMUYiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7/7gAOQWRvYmUAZMAAAAAB/9sAhAACAgICAgICAgICAwICAgMEAwICAwQFBAQE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"; | |
this.image.src = "data:image/jpg;base64," + encodeURIComponent(f), | |
this.image.width = 597, | |
this.image.height = 79, | |
this.tcanvas.width = b, | |
this.tcanvas.height = c, | |
this.frictionCoeff = 20, | |
this.image.onload = this.init.bind(this) | |
} | |
; | |
e.prototype = { | |
init: function() { | |
function e(b, c) { | |
b.mass = a(100, 700), | |
b.fillStyle = "rgb(" + c + "," + c + "," + c + ")" | |
} | |
var k = this; | |
app.container.appendChild(this.canvas), | |
this.mouse = new i, | |
window.addEventListener("mousemove", helpers.bind(this.mouse.move, this.mouse)), | |
window.addEventListener("resize", helpers.bind(this.onWindowResize, this)), | |
this.attractor = new g(c / 2,b / 2), | |
this.attractor.gravityConstant = 8, | |
this.attractor.mass = 10, | |
this.refractor = new h, | |
this.refractor.gravityConstant = 8, | |
this.refractor.mass = 80, | |
this.mouseAttractor = new g, | |
this.mouseAttractor.gravityConstant = 10, | |
this.mouseAttractor.mass = 20, | |
this.dynamicAttractor = new h, | |
this.dynamicAttractor.mass = 100, | |
this.dynamicAttractor.gravityConstant = 1, | |
this.particles = [], | |
this.imageParticles = [], | |
this.tctx.font = c >= breakpoints.tabletl ? "bold 50px brownbold" : "bold 30px brownbold", | |
this.tctx.fillStyle = "rgba(255, 255, 255, 1)", | |
this.tctx.fillRect(0, 0, c, b), | |
this.tctx.fillStyle = "black", | |
this.tctx.textAlign = "center", | |
this.tctx.fillText(this.text, c / 2, b / 2), | |
this.logocanvas.width = this.image.width, | |
this.logocanvas.height = this.image.height, | |
this.logoctx.fillStyle = "white", | |
this.logoctx.fillRect(0, 0, this.image.width, this.image.height), | |
k.logoctx.drawImage(k.image, 0, 0, k.image.width, k.image.height); | |
for (var l = this.logoctx.getImageData(0, 0, this.image.width, this.image.height), m = l.data, n = this.tctx.getImageData(0, 0, c, b), o = n.data, p = 0; p < o.length; p += 4) | |
if (255 != o[p]) { | |
var q = p / 4 % c + (c - c) | |
, r = p / 4 / c + (b - b) | |
, s = new f(q,r); | |
e(s, o[p]), | |
s.repelOrigin = new j(s.position.x + a(-10, 10),s.position.y + a(-10, 10)), | |
this.particles.push(s) | |
} | |
window.setTimeout(function() { | |
for (var d = 0, g = (m.length > this.particles.length ? m.length : this.particles.length, | |
0); g < m.length; g += 16) | |
if (255 != m[g]) { | |
var h = g / 4 % this.image.width + (c / 2 - this.image.width / 2) | |
, i = g / 4 / this.image.width + (b / 2 - this.image.height / 2); | |
if (this.imageParticles.push(new j(h,i)), | |
d < this.particles.length) | |
this.particles[d].originPosition = new j(h,i); | |
else { | |
var k = a(0, this.particles.length - 1) | |
, l = this.particles[k] | |
, n = new f(l.position.x,l.position.y); | |
n.repelOrigin = new j(l.position.x + a(-10, 10),l.position.y + a(-10, 10)), | |
n.originPosition = new j(h,i), | |
e(n, 0), | |
this.particles.push(n) | |
} | |
d++ | |
} | |
for (var g = 0; g < this.particles.length; g += 1) | |
if ("undefined" == typeof this.particles[g].originPosition) { | |
var k = a(0, this.imageParticles.length - 1) | |
, l = this.imageParticles[k]; | |
this.particles[g].originPosition = new j(l.x,l.y) | |
} | |
} | |
.bind(this), 800), | |
this.center = new j(c / 2,b / 2 - 10), | |
d.onUpdate(helpers.bind(this.render, this)), | |
d.play() | |
}, | |
render: function() { | |
var a = this; | |
this.ctx.clearRect(0, 0, c, b), | |
this.mouseAttractor.position = this.mouse.position, | |
this.particles.forEach(function(b) { | |
0 === a.state ? b.applyForce(a.attractor.attract(b)) : 1 === a.state ? b.applyForce(a.refractor.repel(b, a.center)) : 3 === a.state ? b.applyForce(a.mouseAttractor.attract(b)) : 4 === a.state && b.applyForce(a.dynamicAttractor.attract(b, b.originPosition)); | |
var c = b.velocity.clone(); | |
c.multiply(-1), | |
c.multiply(a.frictionCoeff), | |
b.applyForce(c), | |
b.update(a.ctx) | |
}) | |
}, | |
destroy: function() { | |
d.clear(), | |
d.pause(), | |
d.removeOnUpdate(this.render), | |
this.particles = [], | |
window.removeEventListener("resize", this.onWindowResize) | |
}, | |
onWindowResize: function() { | |
b = document.documentElement.clientHeight, | |
c = document.documentElement.clientWidth, | |
this.canvas.width = c, | |
this.canvas.height = b | |
} | |
}; | |
var f = function(a, b) { | |
this.position = new j(a,b), | |
this.velocity = new j, | |
this.acceleration = new j, | |
this.mass = 10.9, | |
this.size = 1, | |
this.fillStyle = "#fff" | |
} | |
; | |
f.prototype = { | |
applyForce: function(a) { | |
this.acceleration.add(a.divide(this.mass)) | |
}, | |
update: function(a) { | |
this.velocity.add(this.acceleration), | |
this.position.add(this.velocity), | |
this.draw(a), | |
this.acceleration.multiply(0) | |
}, | |
draw: function(a) { | |
a.fillStyle = this.fillStyle, | |
a.fillRect(this.position.x, this.position.y, this.size, this.size) | |
} | |
}; | |
var g = function(a, b) { | |
this.position = new j(a,b), | |
this.mass = 20, | |
this.gravityConstant = .01 | |
} | |
; | |
g.prototype = { | |
attract: function(a, b) { | |
b = b || 1; | |
var c = this.position.clone().subtract(a.position) | |
, d = c.length(); | |
d = Math.max(5, Math.min(10, d)), | |
c.normalize(); | |
var e = b * this.gravityConstant * this.mass * a.mass / (d * d); | |
return c.multiply(e), | |
c | |
}, | |
repel: function(a) { | |
return this.attract(a, -1) | |
}, | |
draw: function(a) { | |
a.beginPath(), | |
a.fillStyle = "rgba(0, 0, 0, 0.6)", | |
a.arc(this.position.x, this.position.y, this.mass, 0, 2 * Math.PI, !0), | |
a.fill() | |
} | |
}; | |
var h = function() { | |
this.mass = 20, | |
this.gravityConstant = 1.01 | |
} | |
; | |
h.prototype = { | |
attract: function(a, b, c) { | |
c = c || 1; | |
var d = b.clone().subtract(a.position) | |
, e = d.length(); | |
e = Math.max(5, Math.min(10, e)), | |
d.normalize(); | |
var f = c * this.gravityConstant * this.mass * a.mass / (e * e); | |
return d.multiply(f), | |
d | |
}, | |
repel: function(a, b) { | |
return this.attract(a, b, -1) | |
} | |
}; | |
var i = function() { | |
this.x = 0, | |
this.y = 0, | |
this.position = new j(this.x,this.y), | |
this.oldX = 0, | |
this.oldY = 0, | |
this.moved = !1 | |
} | |
; | |
i.prototype = { | |
move: function(a) { | |
this.moved = !0, | |
this.oldX = this.position.x, | |
this.oldY = this.position.y, | |
this.position.x = a.pageX, | |
this.position.y = a.pageY | |
} | |
}; | |
var j = function(a, b) { | |
this.x = a || 0, | |
this.y = b || 0 | |
} | |
; | |
return j.prototype = { | |
invert: function() { | |
return this.x = -this.x, | |
this.y = -this.y, | |
this | |
}, | |
add: function(a) { | |
return this.x += a.x, | |
this.y += a.y, | |
this | |
}, | |
subtract: function(a) { | |
return this.x -= a.x, | |
this.y -= a.y, | |
this | |
}, | |
multiply: function(a) { | |
return this.x *= a, | |
this.y *= a, | |
this | |
}, | |
divide: function(a) { | |
return this.x /= a, | |
this.y /= a, | |
this | |
}, | |
normalize: function() { | |
return this.divide(this.length()) | |
}, | |
equals: function(a) { | |
return this.x == a.x && this.y == a.y | |
}, | |
length: function(a) { | |
return void 0 === a ? Math.sqrt(this.x * this.x + this.y * this.y) : (this.x = Math.cos(this.angle) * a, | |
this.y = Math.sin(this.angle) * a, | |
this) | |
}, | |
angle: function() { | |
return Math.atan2(this.y, this.x) | |
}, | |
clone: function() { | |
return new j(this.x,this.y) | |
}, | |
set: function(a, b) { | |
return this.x = a, | |
this.y = b, | |
this | |
} | |
}, | |
{ | |
init: function(a) { | |
this.stage = new e(c,b,a) | |
}, | |
destroy: function() { | |
this.stage.destroy() | |
} | |
} | |
} | |
; | |
!function() { | |
{ | |
var a = this; | |
a.Physics | |
} | |
common = function() { | |
var a = {} | |
, b = Array.prototype | |
, c = Object.prototype | |
, d = c.hasOwnProperty | |
, e = b.slice | |
, f = b.forEach | |
, g = b.indexOf | |
, h = c.toString | |
, i = function(a, b) { | |
return d.call(a, b) | |
} | |
, j = function(b, c, d) { | |
if (null != b) | |
if (f && b.forEach === f) | |
b.forEach(c, d); | |
else if (b.length === +b.length) { | |
for (var e = 0, g = b.length; g > e; e++) | |
if (e in b && c.call(d, b[e], e, b) === a) | |
return | |
} else | |
for (var h in b) | |
if (_.has(b, h) && c.call(d, b[h], h, b) === a) | |
return | |
} | |
, k = function(a) { | |
return a | |
} | |
, l = function(a, b, c) { | |
c || (c = k); | |
for (var d = 0, e = a.length; e > d; ) { | |
var f = d + e >> 1; | |
c(a[f]) < c(b) ? d = f + 1 : e = f | |
} | |
return d | |
} | |
; | |
return { | |
has: i, | |
each: j, | |
extend: function(a) { | |
return j(e.call(arguments, 1), function(b) { | |
for (var c in b) | |
a[c] = b[c] | |
}), | |
a | |
}, | |
indexOf: function(a, b, c) { | |
if (null == a) | |
return -1; | |
var d, e; | |
if (c) | |
return d = l(a, b), | |
a[d] === b ? d : -1; | |
if (g && a.indexOf === g) | |
return a.indexOf(b); | |
for (d = 0, | |
e = a.length; e > d; d++) | |
if (d in a && a[d] === b) | |
return d; | |
return -1 | |
}, | |
sortedIndex: l, | |
identity: k, | |
isNumber: function(a) { | |
return "[object Number]" == h.call(a) | |
}, | |
isFunction: function(a) { | |
return "[object Function]" == h.call(a) || "function" == typeof a | |
}, | |
isUndefined: function(a) { | |
return void 0 === a | |
}, | |
isNull: function(a) { | |
return null === a | |
} | |
} | |
}(), | |
Vector = function(a) { | |
var b = function(a, b) { | |
this.x = a || 0, | |
this.y = b || 0 | |
} | |
; | |
return a.extend(b.prototype, { | |
set: function(a, b) { | |
return this.x = a, | |
this.y = b, | |
this | |
}, | |
copy: function(a) { | |
return this.x = a.x, | |
this.y = a.y, | |
this | |
}, | |
clear: function() { | |
return this.x = 0, | |
this.y = 0, | |
this | |
}, | |
clone: function() { | |
return new b(this.x,this.y) | |
}, | |
add: function(a, b) { | |
return this.x = a.x + b.x, | |
this.y = a.y + b.y, | |
this | |
}, | |
addSelf: function(a) { | |
return this.x += a.x, | |
this.y += a.y, | |
this | |
}, | |
sub: function(a, b) { | |
return this.x = a.x - b.x, | |
this.y = a.y - b.y, | |
this | |
}, | |
subSelf: function(a) { | |
return this.x -= a.x, | |
this.y -= a.y, | |
this | |
}, | |
multiplySelf: function(a) { | |
return this.x *= a.x, | |
this.y *= a.y, | |
this | |
}, | |
multiplyScalar: function(a) { | |
return this.x *= a, | |
this.y *= a, | |
this | |
}, | |
divideScalar: function(a) { | |
return a ? (this.x /= a, | |
this.y /= a) : this.set(0, 0), | |
this | |
}, | |
negate: function() { | |
return this.multiplyScalar(-1) | |
}, | |
dot: function(a) { | |
return this.x * a.x + this.y * a.y | |
}, | |
lengthSquared: function() { | |
return this.x * this.x + this.y * this.y | |
}, | |
length: function() { | |
return Math.sqrt(this.lengthSquared()) | |
}, | |
normalize: function() { | |
return this.divideScalar(this.length()) | |
}, | |
distanceTo: function(a) { | |
return Math.sqrt(this.distanceToSquared(a)) | |
}, | |
distanceToSquared: function(a) { | |
var b = this.x - a.x | |
, c = this.y - a.y; | |
return b * b + c * c | |
}, | |
setLength: function(a) { | |
return this.normalize().multiplyScalar(a) | |
}, | |
equals: function(a) { | |
return this.distanceTo(a) < 1e-4 | |
}, | |
lerp: function(a, b) { | |
var c = (a.x - this.x) * b + this.x | |
, d = (a.y - this.y) * b + this.y; | |
return this.set(c, d) | |
}, | |
isZero: function() { | |
return this.length() < 1e-4 | |
} | |
}), | |
b | |
}(common), | |
a.Physics = Physics = function(a, b, c) { | |
function d() { | |
var a = this; | |
this.tick(), | |
c.each(this.animations, function(a) { | |
a() | |
}), | |
(this.__optimized && !this.__equilibrium || !this.__optimized) && this.playing && b(function() { | |
d.call(a) | |
}), | |
this.__optimized && this.__equilibrium && c.each(this.equilibriumCallbacks, function(a) { | |
a() | |
}) | |
} | |
var e = function() { | |
this.playing = !1, | |
a.apply(this, arguments), | |
this.animations = [], | |
this.equilibriumCallbacks = [], | |
d.call(this) | |
} | |
; | |
return c.extend(e, a, { | |
superclass: a | |
}), | |
c.extend(e.prototype, a.prototype, { | |
play: function() { | |
return this.playing ? this : (this.playing = !0, | |
this.__equilibrium = !1, | |
d.call(this), | |
this) | |
}, | |
pause: function() { | |
return this.playing = !1, | |
this | |
}, | |
toggle: function() { | |
return this.playing ? this.pause() : this.play(), | |
this | |
}, | |
onUpdate: function(a) { | |
return c.indexOf(this.animations, a) >= 0 || !c.isFunction(a) ? this : (this.animations.push(a), | |
this) | |
}, | |
removeOnUpdate: function(a) { | |
var b = c.indexOf(this.animations, a); | |
return -1 != b && c.isFunction(a) ? (this.animations.splice(b, 1), | |
this) : this | |
}, | |
onEquilibrium: function(a) { | |
return c.indexOf(this.equilibriumCallbacks, a) >= 0 || !c.isFunction(a) ? this : (this.equilibriumCallbacks.push(a), | |
this) | |
}, | |
update: function() { | |
return this.__equilibrium ? (this.__equilibrium = !1, | |
this.playing && d.call(this), | |
this) : this | |
} | |
}), | |
e | |
}(ParticleSystem = function(a, b, c, d, e, f) { | |
var g = function() { | |
this.__equilibriumCriteria = { | |
particles: !0, | |
springs: !0, | |
attractions: !0 | |
}, | |
this.__equilibrium = !1, | |
this.__optimized = !1, | |
this.particles = [], | |
this.springs = [], | |
this.attractions = [], | |
this.forces = [], | |
this.integrator = new e(this), | |
this.hasDeadParticles = !1; | |
var b = arguments.length; | |
1 === b ? (this.gravity = new a(0,arguments[0]), | |
this.drag = g.DEFAULT_DRAG) : 2 === b ? (this.gravity = new a(0,arguments[0]), | |
this.drag = arguments[1]) : 3 === b ? (this.gravity = new a(arguments[0],arguments[1]), | |
this.drag = arguments[3]) : (this.gravity = new a(0,g.DEFAULT_GRAVITY), | |
this.drag = g.DEFAULT_DRAG) | |
} | |
; | |
return f.extend(g, { | |
DEFAULT_GRAVITY: 0, | |
DEFAULT_DRAG: .001, | |
Attraction: d, | |
Integrator: e, | |
Particle: b, | |
Spring: c, | |
Vector: a | |
}), | |
f.extend(g.prototype, { | |
optimize: function(a) { | |
return this.__optimized = !!a, | |
this | |
}, | |
setGravity: function(a, b) { | |
return this.gravity.set(a, b), | |
this | |
}, | |
setEquilibriumCriteria: function(a, b, c) { | |
this.__equilibriumCriteria.particles = !!a, | |
this.__equilibriumCriteria.springs = !!b, | |
this.__equilibriumCriteria.attractions = !!c | |
}, | |
tick: function() { | |
return this.integrator.step(0 === arguments.length ? 1 : arguments[0]), | |
this.__optimized && (this.__equilibrium = !this.needsUpdate()), | |
this | |
}, | |
needsUpdate: function() { | |
var a = 0; | |
if (this.__equilibriumCriteria.particles) | |
for (a = 0, | |
l = this.particles.length; l > a; a++) | |
if (!this.particles[a].resting()) | |
return !0; | |
if (this.__equilibriumCriteria.springs) | |
for (a = 0, | |
l = this.springs.length; l > a; a++) | |
if (!this.springs[a].resting()) | |
return !0; | |
if (this.__equilibriumCriteria.attractions) | |
for (a = 0, | |
l = this.attractions.length; l > a; a++) | |
if (!this.attractions[a].resting()) | |
return !0; | |
return !1 | |
}, | |
addParticle: function(a) { | |
return this.particles.push(a), | |
this | |
}, | |
addSpring: function(a) { | |
return this.springs.push(a), | |
this | |
}, | |
addAttraction: function(a) { | |
return this.attractions.push(a), | |
this | |
}, | |
makeParticle: function(a, c, d) { | |
var e = f.isNumber(a) ? a : 1 | |
, c = c || 0 | |
, d = d || 0 | |
, g = new b(e); | |
return g.position.set(c, d), | |
this.addParticle(g), | |
g | |
}, | |
makeSpring: function(a, b, d, e, f) { | |
var g = new c(a,b,d,e,f); | |
return this.addSpring(g), | |
g | |
}, | |
makeAttraction: function(a, b, c, e) { | |
var a = new d(a,b,c,e); | |
return this.addAttraction(a), | |
a | |
}, | |
clear: function() { | |
this.particles.length = 0, | |
this.springs.length = 0, | |
this.attractions.length = 0 | |
}, | |
applyForces: function() { | |
this.gravity.isZero() || f.each(this.particles, function(a) { | |
a.force.addSelf(this.gravity) | |
}, this); | |
var b = new a; | |
return f.each(this.particles, function(a) { | |
b.set(-1 * a.velocity.x * this.drag, -1 * a.velocity.y * this.drag), | |
a.force.addSelf(b) | |
}, this), | |
f.each(this.springs, function(a) { | |
a.update() | |
}), | |
f.each(this.attractions, function(a) { | |
a.update() | |
}), | |
f.each(this.forces, function(a) { | |
a.update() | |
}), | |
this | |
}, | |
clearForces: function() { | |
return f.each(this.particles, function(a) { | |
a.clear() | |
}), | |
this | |
} | |
}), | |
g | |
}(Vector, Particle = function(a, b) { | |
var c = function(b) { | |
this.position = new a, | |
this.velocity = new a, | |
this.force = new a, | |
this.mass = b, | |
this.fixed = !1, | |
this.age = 0, | |
this.dead = !1 | |
} | |
; | |
return b.extend(c.prototype, { | |
distanceTo: function(a) { | |
return this.position.distanceTo(a.position) | |
}, | |
makeFixed: function() { | |
return this.fixed = !0, | |
this.velocity.clear(), | |
this | |
}, | |
reset: function() { | |
return this.age = 0, | |
this.dead = !1, | |
this.position.clear(), | |
this.velocity.clear(), | |
this.force.clear(), | |
this.mass = 1, | |
this | |
}, | |
resting: function() { | |
return this.fixed || this.velocity.isZero() && this.force.isZero() | |
} | |
}), | |
c | |
}(Vector, common), Spring = function(a, b) { | |
var c = function(a, b, c, d, e) { | |
this.constant = c, | |
this.damping = d, | |
this.length = e, | |
this.a = a, | |
this.b = b, | |
this.on = !0 | |
} | |
; | |
return b.extend(c.prototype, { | |
currentLength: function() { | |
return this.a.position.distanceTo(this.b.position) | |
}, | |
update: function() { | |
var b = this.a | |
, c = this.b; | |
if (!this.on || b.fixed && c.fixed) | |
return this; | |
var d = (new a).sub(b.position, c.position) | |
, e = d.length(); | |
0 === e ? d.clear() : d.divideScalar(e); | |
var f = -1 * (e - this.length) * this.constant | |
, g = (new a).sub(b.velocity, c.velocity) | |
, h = -1 * this.damping * g.dot(d) | |
, i = f + h; | |
return d.multiplyScalar(i), | |
b.fixed || b.force.addSelf(d), | |
c.fixed || c.force.subSelf(d), | |
this | |
}, | |
resting: function() { | |
var a = this.a | |
, b = this.b | |
, c = this.length; | |
return !this.on || a.fixed && b.fixed || a.fixed && (0 === c ? b.position.equals(a.position) : b.position.distanceTo(a.position) <= c) && b.resting() || b.fixed && (0 === c ? a.position.equals(b.position) : a.position.distanceTo(b.position) <= c) && a.resting() | |
} | |
}), | |
c | |
}(Vector, common), Attraction = function(a, b) { | |
var c = function(a, b, c, d) { | |
this.a = a, | |
this.b = b, | |
this.constant = c, | |
this.on = !0, | |
this.distanceMin = d, | |
this.distanceMinSquared = d * d | |
} | |
; | |
return b.extend(c.prototype, { | |
update: function() { | |
var b = this.a | |
, c = this.b; | |
if (!(!this.on || b.fixed && c.fixed)) { | |
var d = (b.position.x - c.position.x, | |
b.position.y - c.position.y, | |
(new a).sub(b.position, c.position)) | |
, e = Math.max(d.lengthSquared(), this.distanceMinSquared) | |
, f = this.constant * b.mass * c.mass / e | |
, g = Math.sqrt(e); | |
return 0 === f || 0 === g ? d.clear() : d.divideScalar(g).multiplyScalar(f), | |
b.fixed || b.force.subSelf(d), | |
c.fixed || c.force.addSelf(d), | |
this | |
} | |
}, | |
resting: function() { | |
var a = this.a | |
, b = this.b | |
, c = this.distanceMin; | |
return !this.on || a.fixed && b.fixed || a.fixed && b.position.distanceTo(a.position) <= c && b.resting() || b.fixed && a.position.distanceTo(b.position) <= c && a.resting() | |
} | |
}), | |
c | |
}(Vector, common), Integrator = function(a, b) { | |
var c = function(a) { | |
this.s = a, | |
this.originalPositions = [], | |
this.originalVelocities = [], | |
this.k1Forces = [], | |
this.k1Velocities = [], | |
this.k2Forces = [], | |
this.k2Velocities = [], | |
this.k3Forces = [], | |
this.k3Velocities = [], | |
this.k4Forces = [], | |
this.k4Velocities = [] | |
} | |
; | |
return b.extend(c.prototype, { | |
allocateParticles: function() { | |
for (; this.s.particles.length > this.originalPositions.length; ) | |
this.originalPositions.push(new a), | |
this.originalVelocities.push(new a), | |
this.k1Forces.push(new a), | |
this.k1Velocities.push(new a), | |
this.k2Forces.push(new a), | |
this.k2Velocities.push(new a), | |
this.k3Forces.push(new a), | |
this.k3Velocities.push(new a), | |
this.k4Forces.push(new a), | |
this.k4Velocities.push(new a); | |
return this | |
}, | |
step: function(a) { | |
var c, d, e = this.s; | |
return this.allocateParticles(), | |
b.each(e.particles, function(a, b) { | |
a.fixed || (this.originalPositions[b].copy(a.position), | |
this.originalVelocities[b].copy(a.velocity)), | |
a.force.clear() | |
}, this), | |
e.applyForces(), | |
b.each(e.particles, function(a, b) { | |
a.fixed || (this.k1Forces[b].copy(a.force), | |
this.k1Velocities[b].copy(a.velocity)), | |
a.force.clear() | |
}, this), | |
b.each(e.particles, function(b, e) { | |
if (!b.fixed) { | |
var f = this.originalPositions[e] | |
, g = this.k1Velocities[e]; | |
c = f.x + .5 * g.x * a, | |
d = f.y + .5 * g.y * a, | |
b.position.set(c, d); | |
var h = this.originalVelocities[e] | |
, i = this.k1Forces[e]; | |
c = h.x + .5 * i.x * a / b.mass, | |
d = h.y + .5 * i.y * a / b.mass, | |
b.velocity.set(c, d) | |
} | |
}, this), | |
e.applyForces(), | |
b.each(e.particles, function(a, b) { | |
a.fixed || (this.k2Forces[b].copy(a.force), | |
this.k2Velocities[b].copy(a.velocity)), | |
a.force.clear() | |
}, this), | |
b.each(e.particles, function(b, c) { | |
if (!b.fixed) { | |
var d = this.originalPositions[c] | |
, e = this.k2Velocities[c]; | |
b.position.set(d.x + .5 * e.x * a, d.y + .5 * e.y * a); | |
var f = this.originalVelocities[c] | |
, g = this.k2Forces[c]; | |
b.velocity.set(f.x + .5 * g.x * a / b.mass, f.y + .5 * g.y * a / b.mass) | |
} | |
}, this), | |
e.applyForces(), | |
b.each(e.particles, function(a, b) { | |
a.fixed || (this.k3Forces[b].copy(a.force), | |
this.k3Velocities[b].copy(a.velocity)), | |
a.force.clear() | |
}, this), | |
b.each(e.particles, function(b, c) { | |
if (!b.fixed) { | |
var d = this.originalPositions[c] | |
, e = this.k3Velocities[c]; | |
b.position.set(d.x + e.x * a, d.y + e.y * a); | |
var f = this.originalVelocities[c] | |
, g = this.k3Forces[c]; | |
b.velocity.set(f.x + g.x * a / b.mass, f.y + g.y * a / b.mass) | |
} | |
}, this), | |
e.applyForces(), | |
b.each(e.particles, function(a, b) { | |
a.fixed || (this.k4Forces[b].copy(a.force), | |
this.k4Velocities[b].copy(a.velocity)) | |
}, this), | |
b.each(e.particles, function(b, c) { | |
if (b.age += a, | |
!b.fixed) { | |
var d = this.originalPositions[c] | |
, e = this.k1Velocities[c] | |
, f = this.k2Velocities[c] | |
, g = this.k3Velocities[c] | |
, h = this.k4Velocities[c] | |
, i = d.x + a / 6 * (e.x + 2 * f.x + 2 * g.x + h.x) | |
, j = d.y + a / 6 * (e.y + 2 * f.y + 2 * g.y + h.y); | |
b.position.set(i, j); | |
var k = this.originalVelocities[c] | |
, l = this.k1Forces[c] | |
, m = this.k2Forces[c] | |
, n = this.k3Forces[c] | |
, o = this.k4Forces[c]; | |
i = k.x + a / (6 * b.mass) * (l.x + 2 * m.x + 2 * n.x + o.x), | |
j = k.y + a / (6 * b.mass) * (l.y + 2 * m.y + 2 * n.y + o.y), | |
b.velocity.set(i, j) | |
} | |
}, this), | |
this | |
} | |
}), | |
c | |
}(Vector, common), common), requestAnimationFrame = function() { | |
return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function(a) { | |
window.setTimeout(a, 1e3 / 60) | |
} | |
}(), common) | |
}(); | |
var Blob = function(a, b, c) { | |
var d = { | |
x: 0, | |
y: 0, | |
w: 10, | |
mass: 1e4, | |
color1: [255, 0, 0], | |
color2: [255, 0, 255], | |
fadeInFrames: 20, | |
maxDistance: 100 * app.scale, | |
renderCallback: function() {} | |
}; | |
this.config = helpers.extend(d, a), | |
this.physics = b, | |
this.others = c, | |
this.index = c.length, | |
this.closest = [], | |
this.closestIndexes = [], | |
this.closestIdCounter = 0, | |
this.x = this.config.x, | |
this.y = this.config.y, | |
this.init() | |
} | |
; | |
Blob.prototype = { | |
init: function() { | |
this.particle = this.physics.makeParticle(this.config.mass, this.config.x, this.config.y), | |
this.colorsHsv1 = helpers.rgbToHsv(this.config.color1[0], this.config.color1[1], this.config.color1[2]), | |
this.colorsHsv2 = helpers.rgbToHsv(this.config.color2[0], this.config.color2[1], this.config.color2[2]) | |
}, | |
update: function() { | |
var a = this | |
, b = this.x = this.particle.position.x | |
, c = this.y = this.particle.position.y; | |
if (b < window.innerWidth * app.scale + 100 && c < window.innerHeight * app.scale + 100 && b > -100 && c > -100) { | |
var d = [] | |
, e = [] | |
, f = new Array(this.closest.length); | |
helpers.each(this.others, function(b, c) { | |
if (a.index > c) { | |
var g = helpers.distance(a.x, a.y, b.x, b.y) | |
, h = a.closestIndexes.indexOf(c); | |
g < a.config.maxDistance ? -1 !== h ? (a.closest[h].fade++, | |
a.closest[h].fade++ > 20 && (a.closest[h].fade = 20), | |
a.closest[h].x = b.x, | |
a.closest[h].y = b.y, | |
f[h] = !0) : (a.closestIdCounter = (a.closestIdCounter + 1) % a.others.length, | |
d.push({ | |
x: a.x, | |
y: a.y, | |
fade: 0, | |
id: a.closestIdCounter, | |
dist: g | |
}), | |
e.push(c)) : -1 !== h && (a.closest[h].fade--, | |
a.closest[h].x = b.x, | |
a.closest[h].y = b.y, | |
f[h] = !1) | |
} | |
}); | |
for (var g = 0; g < this.closest.length; g++) | |
!f[g] && this.closest[g].fade <= 0 && (a.closest.splice(g, 1), | |
a.closestIndexes.splice(g, 1)); | |
this.closest = this.closest.concat(d), | |
this.closestIndexes = this.closestIndexes.concat(e); | |
var h = Math.sqrt(Math.pow(window.innerWidth, 2) + Math.pow(window.innerHeight, 2)) | |
, i = Math.sqrt(Math.pow(b, 2) + Math.pow(c, 2)) | |
, j = i / h | |
, k = helpers.map(j, 0, 1, this.colorsHsv1.h, this.colorsHsv2.h) | |
, l = helpers.map(j, 0, 1, this.colorsHsv1.s, this.colorsHsv2.s) | |
, m = helpers.map(j, 0, 1, this.colorsHsv1.v, this.colorsHsv2.v) | |
, n = helpers.hsvToRgb(k, l, m) | |
, o = helpers.rgbToHex(n[0], n[1], n[2]); | |
this.config.renderCallback(b, c, this.config.w, o) | |
} | |
} | |
}; | |
var particles = function(a) { | |
function b() { | |
return s = document.createElement("canvas"), | |
s.setAttribute("id", "canvas"), | |
t = s.getContext("2d"), | |
{ | |
run: c, | |
setSprings: e, | |
releaseSprings: f, | |
makeItRain: g, | |
repulse: i, | |
explode: h, | |
destroy: k | |
} | |
} | |
function c(b) { | |
b = b || {}, | |
app.container.appendChild(s); | |
var c = Math.floor(Math.random() * B.length); | |
w = B[c], | |
q = { | |
interactive: !1, | |
delaunay: !1, | |
gradient: !0, | |
springs: !0, | |
attraction: !0, | |
connections: !1, | |
baseRadius: 8 * app.scale, | |
baseMass: 7e3 * app.scale, | |
lineWidth: 1.5 * app.scale, | |
baseSpringDamping: 80 * app.scale, | |
baseSpringRest: 850 * app.scale, | |
baseSpringStrength: 1.7 * app.scale, | |
baseAttractionStrength: .5 * app.scale, | |
baseDistanceMin: 100 * app.scale, | |
gravityX: 0 * app.scale, | |
gravityY: 0 * app.scale | |
}, | |
p = helpers.extend(q, b), | |
u = new Physics, | |
u.gravity = new Physics.Vector(p.gravityX,p.gravityY), | |
o(); | |
var e = 0 | |
, f = a.setInterval(function() { | |
for (var b = 0; 20 > b; b++) | |
x > e && (d(), | |
e++); | |
e >= x && (p.interactive && n(), | |
a.clearInterval(f)) | |
}, 100); | |
j(), | |
u.onUpdate(l), | |
u.play() | |
} | |
function d() { | |
var a, b = s.width / 2 + (500 * Math.random() - 250), c = s.height / 2 + (500 * Math.random() - 250), d = Math.random() * p.baseMass / 2 + p.baseMass / 2, e = Math.random() * p.baseRadius / 2 + p.baseRadius / 2, f = Math.floor(Math.random() * A.length), g = A[f], h = new Blob({ | |
x: b, | |
y: c, | |
w: e, | |
maxDistance: 80 * app.scale, | |
mass: d, | |
color1: w[0], | |
color2: w[1], | |
renderCallback: g.render | |
},u,y); | |
y.push(h), | |
a = y.indexOf(h), | |
p.springs && helpers.each(u.particles, function(b, c) { | |
if (a > c) { | |
u.makeSpring(h.particle, b, p.baseSpringStrength, p.baseSpringDamping, p.baseSpringRest) | |
} | |
}) | |
} | |
function e(a) { | |
a.constant = a.constant * app.scale || p.baseSpringStrength, | |
a.damping = a.damping * app.scale || p.baseSpringDamping, | |
a.rest = a.rest * app.scale || p.baseSpringRest, | |
helpers.each(u.springs, function(b) { | |
b.constant = a.constant, | |
b.damping = a.damping, | |
b.length = a.rest | |
}) | |
} | |
function f() { | |
helpers.each(u.springs, function(a) { | |
a.on = !1 | |
}) | |
} | |
function g() { | |
u.setGravity(0, 2800 * app.scale), | |
helpers.each(u.springs, function(a) { | |
a.on = !1 | |
}) | |
} | |
function h() { | |
var b = u.makeParticle(1e4, a.innerWidth / 2 * app.scale, a.innerHeight / 2 * app.scale + 150); | |
helpers.each(u.particles, function(a) { | |
u.makeAttraction(b, a, -10 * app.scale, 50 * app.scale) | |
}), | |
helpers.each(u.springs, function(a) { | |
a.on = !1 | |
}), | |
b.fixed = !0 | |
} | |
function i() { | |
helpers.each(u.springs, function(a) { | |
a.on = !1 | |
}), | |
helpers.each(z, function(a) { | |
a.constant = -10 * app.scale | |
}) | |
} | |
function j() { | |
a.addEventListener("resize", o) | |
} | |
function k() { | |
u.clear(), | |
u.pause(), | |
u.removeOnUpdate(l), | |
u.setGravity(0, 0), | |
y = [], | |
a.removeEventListener("resize", o) | |
} | |
function l() { | |
t.clearRect(0, 0, s.width, s.height), | |
p.connections && m(); | |
for (var a = 0; a < y.length; a++) | |
y[a].update() | |
} | |
function m() { | |
helpers.each(y, function(a) { | |
helpers.each(a.closest, function(b) { | |
var c = b.fade / 20 | |
, d = (b.x - a.x) * c + a.x | |
, e = (b.y - a.y) * c + a.y; | |
t.beginPath(), | |
t.moveTo(a.x, a.y), | |
t.lineTo(d, e); | |
var f = b.fade / 20; | |
t.strokeStyle = "rgba(120, 120, 120," + f + ")", | |
t.lineWidth = b.fade / 100, | |
t.stroke() | |
}) | |
}) | |
} | |
function n() { | |
var a = 1 * app.scale; | |
v = new Blob({ | |
maxDistance: 100 * app.scale, | |
x: s.width / 2 - 200, | |
y: s.height / 2 - 200, | |
mass: 1e4 * app.scale | |
},u,y), | |
v.particle.fixed = !0, | |
helpers.each(u.particles, function(b) { | |
var c = u.makeAttraction(v.particle, b, a, 50 * app.scale); | |
z.push(c) | |
}), | |
y.push(v), | |
s.addEventListener("mousemove", function(a) { | |
v.particle.position.x = a.x * app.scale, | |
v.particle.position.y = a.y * app.scale | |
}) | |
} | |
function o() { | |
var b = a.innerWidth | |
, c = a.innerHeight; | |
s.width = b, | |
s.height = c, | |
a.devicePixelRatio > 1 && (s.width = 2 * b, | |
s.height = 2 * c) | |
} | |
var p, q, r, s, t, u, v, w, x = 150, y = [], z = [], A = [{ | |
type: "circle", | |
render: function(a, b, c, d) { | |
t.beginPath(), | |
t.arc(a, b, c, 0, 2 * Math.PI), | |
t.strokeStyle = d, | |
t.fillStyle = "rgba(0,0,0,0)", | |
t.lineWidth = p.lineWidth, | |
t.fill(), | |
t.stroke() | |
} | |
}, { | |
type: "rect", | |
render: function(a, b, c, d) { | |
t.beginPath(), | |
t.rect(a, b, c, c), | |
t.strokeStyle = d, | |
t.fillStyle = "rgba(0,0,0,0)", | |
t.lineWidth = p.lineWidth, | |
t.fill(), | |
t.stroke() | |
} | |
}, { | |
type: "triangle", | |
render: function(a, b, c, d) { | |
helpers.createCanvasPolygon(a, b, c, 3, t), | |
t.strokeStyle = d, | |
t.fillStyle = "rgba(0,0,0,0)", | |
t.lineWidth = p.lineWidth, | |
t.fill(), | |
t.stroke() | |
} | |
}, { | |
type: "hexagon", | |
render: function(a, b, c, d) { | |
helpers.createCanvasPolygon(a, b, c, 6, t), | |
t.strokeStyle = d, | |
t.fillStyle = "rgba(0,0,0,0)", | |
t.lineWidth = p.lineWidth, | |
t.fill(), | |
t.stroke() | |
} | |
}, { | |
type: "octagon", | |
render: function(a, b, c, d) { | |
helpers.createCanvasPolygon(a, b, c, 8, t), | |
t.strokeStyle = d, | |
t.fillStyle = "rgba(0,0,0,0)", | |
t.lineWidth = p.lineWidth, | |
t.fill(), | |
t.stroke() | |
} | |
}], B = [[[62, 143, 255], [91, 19, 255]], [[24, 85, 238], [0, 185, 238]], [[253, 239, 21], [255, 93, 21]], [[224, 36, 58], [250, 93, 226]], [[81, 219, 152], [132, 234, 22]], [[255, 0, 0], [0, 0, 255]]]; | |
return { | |
init: function() { | |
return r || (r = b()), | |
r | |
} | |
} | |
}(window) | |
, p = function() { | |
function a() { | |
this.ticker.addTicks(mode) | |
} | |
function b() { | |
mode != modes[3] ? (this.particles.destroy(), | |
this.ticker.clearTimeouts()) : app.swarmIntro.destroy() | |
} | |
function c() { | |
return e = particles.init(), | |
f = ticker.init(), | |
{ | |
run: a, | |
reset: b, | |
ticker: f, | |
particles: e, | |
scale: g, | |
container: h | |
} | |
} | |
var d, e, f, g = window.devicePixelRatio > 1 ? 2 : 1, h = $("#main-container")[0], i = $("<h2></h2>"), j = intro_straplines.long.concat(intro_straplines.short); | |
return strapline = j[Math.floor(Math.random() * j.length)], | |
modes = [[{ | |
time: 0, | |
"do": function() { | |
e.run({ | |
gradient: !0 | |
}), | |
i.addClass("intro__strap"), | |
i.addClass("intro__strap--hidden"), | |
i.html(strapline), | |
$(h).append(i) | |
} | |
}, { | |
time: 100, | |
"do": function() { | |
i.removeClass("intro__strap--hidden") | |
} | |
}, { | |
time: 2560, | |
"do": function() { | |
e.setSprings({ | |
rest: -1800 | |
}) | |
} | |
}, { | |
time: 2720, | |
"do": function() { | |
e.setSprings({ | |
rest: 100 | |
}) | |
} | |
}, { | |
time: 3200, | |
"do": function() { | |
e.setSprings({ | |
rest: 3e3 | |
}) | |
} | |
}, { | |
time: 3280, | |
"do": function() { | |
i.addClass("intro__strap--out"), | |
e.explode() | |
} | |
}, { | |
time: 3840, | |
"do": function() { | |
$("body").trigger("closeintro"), | |
setTimeout(function() { | |
app.reset() | |
}, 2e3) | |
} | |
}], [{ | |
time: 0, | |
"do": function() { | |
e.run({ | |
baseSpringStrength: 8 | |
}), | |
i.addClass("intro__strap"), | |
i.addClass("intro__strap--hidden"), | |
i.html(strapline), | |
$(h).append(i) | |
} | |
}, { | |
time: 100, | |
"do": function() { | |
i.removeClass("intro__strap--hidden") | |
} | |
}, { | |
time: 2e3, | |
"do": function() { | |
e.makeItRain() | |
} | |
}, { | |
time: 2500, | |
"do": function() { | |
i.addClass("intro__strap--down") | |
} | |
}, { | |
time: 3300, | |
"do": function() { | |
$("body").trigger("closeintro"), | |
setTimeout(function() { | |
app.reset() | |
}, 2e3) | |
} | |
}], [{ | |
time: 0, | |
"do": function() { | |
e.run({ | |
interactive: !0, | |
baseSpringStrength: 2.5 * app.scale, | |
baseSpringRest: 800 * app.scale, | |
connections: !0, | |
baseRadius: 4 * app.scale | |
}), | |
i.addClass("intro__strap"), | |
i.addClass("intro__strap--hidden"), | |
i.html(strapline), | |
$(h).append(i) | |
} | |
}, { | |
time: 100, | |
"do": function() { | |
i.removeClass("intro__strap--hidden") | |
} | |
}, { | |
time: 1500, | |
"do": function() { | |
e.setSprings({ | |
strength: .8 | |
}) | |
} | |
}, { | |
time: 1800, | |
"do": function() { | |
e.setSprings({ | |
strength: 0 | |
}) | |
} | |
}, { | |
time: 4500, | |
"do": function() { | |
i.addClass("intro__strap--out"), | |
e.repulse() | |
} | |
}, { | |
time: 5400, | |
"do": function() { | |
$("body").trigger("closeintro"), | |
setTimeout(function() { | |
app.reset() | |
}, 2e3) | |
} | |
}], [{ | |
time: 0, | |
"do": function() { | |
j = intro_straplines.short, | |
strapline = j[Math.floor(Math.random() * j.length)], | |
WebFont.load({ | |
custom: { | |
families: ["brownbold"] | |
}, | |
active: function() { | |
app.swarmIntro = swarmIntro(), | |
app.swarmIntro.init({ | |
text: strapline | |
}) | |
} | |
}) | |
} | |
}, { | |
time: 6900, | |
"do": function() { | |
$("body").trigger("closeintro"), | |
setTimeout(function() { | |
app.reset() | |
}, 2e3) | |
} | |
}]], | |
mode = modes[Math.floor(Math.random() * modes.length)], | |
{ | |
init: function() { | |
return d || (d = c()), | |
d | |
} | |
} | |
}(); | |
(function() { | |
function a() { | |
window.app = p.init() | |
app.run() | |
} | |
})(); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.2/jquery.min.js"></script> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment