{"version":3,"sources":["webpack:///webpack/bootstrap e1ce432564f371828215","webpack:///./js/util.js","webpack:///(webpack)/buildin/global.js","webpack:///./js/avatar.js","webpack:///./node_modules/sketch-js/js/sketch.js","webpack:///./js/perlin.js"],"names":[],"mappings":"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","file":"avatar.bundle.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 3);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap e1ce432564f371828215","function $(selector, context = document) {\r\n return context.querySelector(selector);\r\n}\r\n\r\nfunction $$(selector, context = document) {\r\n return [].slice.call(context.querySelectorAll(selector));\r\n}\r\n\r\nfunction $id(id, context = document) {\r\n return context.getElementById(id);\r\n}\r\n\r\nfunction on(el, event, cb) {\r\n el.addEventListener(event, cb);\r\n}\r\n\r\nexport {\r\n $,\r\n $$,\r\n $id,\r\n on\r\n};\n\n\n// WEBPACK FOOTER //\n// ./js/util.js","var g;\r\n\r\n// This works in non-strict mode\r\ng = (function() {\r\n\treturn this;\r\n})();\r\n\r\ntry {\r\n\t// This works if eval is allowed (see CSP)\r\n\tg = g || Function(\"return this\")() || (1,eval)(\"this\");\r\n} catch(e) {\r\n\t// This works if the window reference is available\r\n\tif(typeof window === \"object\")\r\n\t\tg = window;\r\n}\r\n\r\n// g can still be undefined, but nothing to do about it...\r\n// We return undefined, instead of nothing here, so it's\r\n// easier to handle this case. if(!global) { ...}\r\n\r\nmodule.exports = g;\r\n\n\n\n// WEBPACK FOOTER //\n// (webpack)/buildin/global.js","import {$} from \"./util\";\r\nimport Sketch from \"sketch-js\";\r\nimport \"./perlin\";\r\n\r\n(function () {\r\n const container = $('.js-avatar');\r\n if (!container) return;\r\n\r\n\r\n const imageUrl = window.PW.config.avatarImage;\r\n if (!imageUrl) return;\r\n\r\n const luma = (R, G, B) => (R + R + R + B + G + G + G + G) >> 3;\r\n\r\n Sketch.create({\r\n spacing: 10,\r\n minLuminance: 40,\r\n minSize: 3,\r\n sizeVariance: 4,\r\n keydown() {\r\n if (!(this.keys.R && this.keys.SHIFT)) return;\r\n this.resize();\r\n },\r\n resize() {\r\n this.clear();\r\n this.setup();\r\n },\r\n setup() {\r\n this.container.classList.remove('fade-in');\r\n this.fillStyle = '#222';\r\n this.fillRect(0, 0, this.width, this.height);\r\n this.np0 = random();\r\n this.ns0 = random();\r\n\r\n this.stop();\r\n this.loadImage(() => {\r\n this.preparePoints();\r\n this.clear();\r\n this.start();\r\n });\r\n },\r\n loadImage(cb) {\r\n let img = new Image();\r\n img.crossOrigin = 'anonymous';\r\n img.onload = () => {\r\n let w = img.width,\r\n h = img.height,\r\n r = w / h,\r\n adjW = round(r * this.height),\r\n adjH = round(this.width / r),\r\n x,\r\n y;\r\n\r\n if (w >= h) {\r\n // wide image\r\n h = this.height;\r\n w = adjW;\r\n } else {\r\n // portrait image\r\n w = this.width;\r\n h = adjH;\r\n }\r\n x = this.width / 3 - w / 2;\r\n y = this.height / 2 - h / 2;\r\n\r\n if (this.width < 500) x = this.width / 4 - w / 2;\r\n\r\n this.drawImage(img, x, y, w, h);\r\n this.container.classList.add('fade-in');\r\n cb();\r\n };\r\n img.src = imageUrl;\r\n },\r\n preparePoints() {\r\n let surface = this.getImageData(0, 0, this.width, this.height);\r\n let step = this.spacing;\r\n\r\n this.points = [];\r\n for (let x = 0; x < this.width; x += step) {\r\n for (let y = 0; y < this.height; y += step) {\r\n let i = y * this.width * 4 + (4 * x);\r\n\r\n let r = surface.data[i],\r\n g = surface.data[i + 1],\r\n b = surface.data[i + 2],\r\n a = surface.data[i + 3];\r\n\r\n let l = luma(r, g, b);\r\n\r\n if (l > this.minLuminance) {\r\n let p = {\r\n x: x,\r\n y: y,\r\n luma: l\r\n };\r\n this.points.push(p);\r\n }\r\n }\r\n }\r\n },\r\n draw() {\r\n let ns0 = this.ns0 += 0.012;\r\n\r\n for (let i = 0; i < this.points.length; ++i) {\r\n let p = this.points[i];\r\n let ns = noise.perlin2(ns0 + p.x / this.width, p.y / this.height + ns0);\r\n this.fillStyle = `rgba(200,200,200, ${p.luma / 255})`;\r\n let size = ceil(p.luma / 255 * this.sizeVariance) * ns + this.minSize;\r\n this.drawRect(p.x, p.y, size);\r\n }\r\n },\r\n drawRect(x, y, size) {\r\n this.fillRect(x - size / 2, y - size / 2, size, size);\r\n },\r\n container: container,\r\n autoclear: true,\r\n autopause: true,\r\n autostart: false,\r\n interval: 2\r\n });\r\n})();\n\n\n// WEBPACK FOOTER //\n// ./js/avatar.js","\n/* Copyright (C) 2013 Justin Windle, http://soulwire.co.uk */\n\n(function ( root, factory ) {\n\n if ( typeof exports === 'object' ) {\n\n // CommonJS like\n module.exports = factory(root, root.document);\n\n } else if ( typeof define === 'function' && define.amd ) {\n\n // AMD\n define( function() { return factory( root, root.document ); });\n\n } else {\n\n // Browser global\n root.Sketch = factory( root, root.document );\n }\n\n}( typeof window !== \"undefined\" ? window : this, function ( window, document ) {\n\n\n \"use strict\";\n\n /*\n ----------------------------------------------------------------------\n\n Config\n\n ----------------------------------------------------------------------\n */\n\n var MATH_PROPS = 'E LN10 LN2 LOG2E LOG10E PI SQRT1_2 SQRT2 abs acos asin atan ceil cos exp floor log round sin sqrt tan atan2 pow max min'.split( ' ' );\n var HAS_SKETCH = '__hasSketch';\n var M = Math;\n\n var CANVAS = 'canvas';\n var WEBGL = 'webgl';\n var DOM = 'dom';\n\n var doc = document;\n var win = window;\n\n var instances = [];\n\n var defaults = {\n\n fullscreen: true,\n autostart: true,\n autoclear: true,\n autopause: true,\n container: doc.body,\n interval: 1,\n globals: true,\n retina: false,\n type: CANVAS\n };\n\n var keyMap = {\n\n 8: 'BACKSPACE',\n 9: 'TAB',\n 13: 'ENTER',\n 16: 'SHIFT',\n 27: 'ESCAPE',\n 32: 'SPACE',\n 37: 'LEFT',\n 38: 'UP',\n 39: 'RIGHT',\n 40: 'DOWN'\n };\n\n /*\n ----------------------------------------------------------------------\n\n Utilities\n\n ----------------------------------------------------------------------\n */\n\n function isArray( object ) {\n\n return Object.prototype.toString.call( object ) == '[object Array]';\n }\n\n function isFunction( object ) {\n\n return typeof object == 'function';\n }\n\n function isNumber( object ) {\n\n return typeof object == 'number';\n }\n\n function isString( object ) {\n\n return typeof object == 'string';\n }\n\n function keyName( code ) {\n\n return keyMap[ code ] || String.fromCharCode( code );\n }\n\n function extend( target, source, overwrite ) {\n\n for ( var key in source )\n\n if ( overwrite || !( key in target ) )\n\n target[ key ] = source[ key ];\n\n return target;\n }\n\n function proxy( method, context ) {\n\n return function() {\n\n method.apply( context, arguments );\n };\n }\n\n function clone( target ) {\n\n var object = {};\n\n for ( var key in target ) {\n \n if ( key === 'webkitMovementX' || key === 'webkitMovementY' )\n continue;\n\n if ( isFunction( target[ key ] ) )\n\n object[ key ] = proxy( target[ key ], target );\n\n else\n\n object[ key ] = target[ key ];\n }\n\n return object;\n }\n\n /*\n ----------------------------------------------------------------------\n\n Constructor\n\n ----------------------------------------------------------------------\n */\n\n function constructor( context ) {\n\n var request, handler, target, parent, bounds, index, suffix, clock, node, copy, type, key, val, min, max, w, h;\n\n var counter = 0;\n var touches = [];\n var resized = false;\n var setup = false;\n var ratio = win.devicePixelRatio || 1;\n var isDiv = context.type == DOM;\n var is2D = context.type == CANVAS;\n\n var mouse = {\n x: 0.0, y: 0.0,\n ox: 0.0, oy: 0.0,\n dx: 0.0, dy: 0.0\n };\n\n var eventMap = [\n\n context.eventTarget || context.element,\n\n pointer, 'mousedown', 'touchstart',\n pointer, 'mousemove', 'touchmove',\n pointer, 'mouseup', 'touchend',\n pointer, 'click',\n pointer, 'mouseout',\n pointer, 'mouseover',\n\n doc,\n\n keypress, 'keydown', 'keyup',\n\n win,\n\n active, 'focus', 'blur',\n resize, 'resize'\n ];\n\n var keys = {}; for ( key in keyMap ) keys[ keyMap[ key ] ] = false;\n\n function trigger( method ) {\n\n if ( isFunction( method ) )\n\n method.apply( context, [].splice.call( arguments, 1 ) );\n }\n\n function bind( on ) {\n\n for ( index = 0; index < eventMap.length; index++ ) {\n\n node = eventMap[ index ];\n\n if ( isString( node ) )\n\n target[ ( on ? 'add' : 'remove' ) + 'EventListener' ].call( target, node, handler, false );\n\n else if ( isFunction( node ) )\n\n handler = node;\n\n else target = node;\n }\n }\n\n function update() {\n\n cAF( request );\n request = rAF( update );\n\n if ( !setup ) {\n\n trigger( context.setup );\n setup = isFunction( context.setup );\n }\n\n if ( !resized ) {\n trigger( context.resize );\n resized = isFunction( context.resize );\n }\n\n if ( context.running && !counter ) {\n\n context.dt = ( clock = +new Date() ) - context.now;\n context.millis += context.dt;\n context.now = clock;\n\n trigger( context.update );\n\n // Pre draw\n\n if ( is2D ) {\n\n if ( context.retina ) {\n\n context.save();\n \n if (context.autoclear) {\n context.scale( ratio, ratio );\n }\n }\n\n if ( context.autoclear )\n\n context.clear();\n }\n\n // Draw\n\n trigger( context.draw );\n\n // Post draw\n\n if ( is2D && context.retina )\n\n context.restore();\n }\n\n counter = ++counter % context.interval;\n }\n\n function resize() {\n\n target = isDiv ? context.style : context.canvas;\n suffix = isDiv ? 'px' : '';\n\n w = context.width;\n h = context.height;\n\n if ( context.fullscreen ) {\n\n h = context.height = win.innerHeight;\n w = context.width = win.innerWidth;\n }\n\n if ( context.retina && is2D && ratio ) {\n\n target.style.height = h + 'px';\n target.style.width = w + 'px';\n\n w *= ratio;\n h *= ratio;\n }\n\n if ( target.height !== h )\n\n target.height = h + suffix;\n\n if ( target.width !== w )\n\n target.width = w + suffix;\n\n if ( is2D && !context.autoclear && context.retina )\n\n context.scale( ratio, ratio );\n\n if ( setup ) trigger( context.resize );\n }\n\n function align( touch, target ) {\n\n bounds = target.getBoundingClientRect();\n\n touch.x = touch.pageX - bounds.left - (win.scrollX || win.pageXOffset);\n touch.y = touch.pageY - bounds.top - (win.scrollY || win.pageYOffset);\n\n return touch;\n }\n\n function augment( touch, target ) {\n\n align( touch, context.element );\n\n target = target || {};\n\n target.ox = target.x || touch.x;\n target.oy = target.y || touch.y;\n\n target.x = touch.x;\n target.y = touch.y;\n\n target.dx = target.x - target.ox;\n target.dy = target.y - target.oy;\n\n return target;\n }\n\n function process( event ) {\n\n event.preventDefault();\n\n copy = clone( event );\n copy.originalEvent = event;\n\n if ( copy.touches ) {\n\n touches.length = copy.touches.length;\n\n for ( index = 0; index < copy.touches.length; index++ )\n\n touches[ index ] = augment( copy.touches[ index ], touches[ index ] );\n\n } else {\n\n touches.length = 0;\n touches[0] = augment( copy, mouse );\n }\n\n extend( mouse, touches[0], true );\n\n return copy;\n }\n\n function pointer( event ) {\n\n event = process( event );\n\n min = ( max = eventMap.indexOf( type = event.type ) ) - 1;\n\n context.dragging =\n\n /down|start/.test( type ) ? true :\n\n /up|end/.test( type ) ? false :\n\n context.dragging;\n\n while( min )\n\n isString( eventMap[ min ] ) ?\n\n trigger( context[ eventMap[ min-- ] ], event ) :\n\n isString( eventMap[ max ] ) ?\n\n trigger( context[ eventMap[ max++ ] ], event ) :\n\n min = 0;\n }\n\n function keypress( event ) {\n\n key = event.keyCode;\n val = event.type == 'keyup';\n keys[ key ] = keys[ keyName( key ) ] = !val;\n\n trigger( context[ event.type ], event );\n }\n\n function active( event ) {\n\n if ( context.autopause )\n\n ( event.type == 'blur' ? stop : start )();\n\n trigger( context[ event.type ], event );\n }\n\n // Public API\n\n function start() {\n\n context.now = +new Date();\n context.running = true;\n }\n\n function stop() {\n\n context.running = false;\n }\n\n function toggle() {\n\n ( context.running ? stop : start )();\n }\n\n function clear() {\n\n if ( is2D )\n\n context.clearRect( 0, 0, context.width * ratio, context.height * ratio );\n }\n\n function destroy() {\n\n parent = context.element.parentNode;\n index = instances.indexOf( context );\n\n if ( parent ) parent.removeChild( context.element );\n if ( ~index ) instances.splice( index, 1 );\n\n bind( false );\n stop();\n }\n\n extend( context, {\n\n touches: touches,\n mouse: mouse,\n keys: keys,\n\n dragging: false,\n running: false,\n millis: 0,\n now: NaN,\n dt: NaN,\n\n destroy: destroy,\n toggle: toggle,\n clear: clear,\n start: start,\n stop: stop\n });\n\n instances.push( context );\n\n return ( context.autostart && start(), bind( true ), resize(), update(), context );\n }\n\n /*\n ----------------------------------------------------------------------\n\n Global API\n\n ----------------------------------------------------------------------\n */\n\n var element, context, Sketch = {\n\n CANVAS: CANVAS,\n WEB_GL: WEBGL,\n WEBGL: WEBGL,\n DOM: DOM,\n\n instances: instances,\n\n install: function( context ) {\n\n if ( !context[ HAS_SKETCH ] ) {\n\n for ( var i = 0; i < MATH_PROPS.length; i++ )\n\n context[ MATH_PROPS[i] ] = M[ MATH_PROPS[i] ];\n\n extend( context, {\n\n TWO_PI: M.PI * 2,\n HALF_PI: M.PI / 2,\n QUARTER_PI: M.PI / 4,\n\n random: function( min, max ) {\n\n if ( isArray( min ) )\n\n return min[ ~~( M.random() * min.length ) ];\n\n if ( !isNumber( max ) )\n\n max = min || 1, min = 0;\n\n return min + M.random() * ( max - min );\n },\n\n lerp: function( min, max, amount ) {\n\n return min + amount * ( max - min );\n },\n\n map: function( num, minA, maxA, minB, maxB ) {\n\n return ( num - minA ) / ( maxA - minA ) * ( maxB - minB ) + minB;\n }\n });\n\n context[ HAS_SKETCH ] = true;\n }\n },\n\n create: function( options ) {\n\n options = extend( options || {}, defaults );\n\n if ( options.globals ) Sketch.install( self );\n\n element = options.element = options.element || doc.createElement( options.type === DOM ? 'div' : 'canvas' );\n\n context = options.context = options.context || (function() {\n\n switch( options.type ) {\n\n case CANVAS:\n\n return element.getContext( '2d', options );\n\n case WEBGL:\n\n return element.getContext( 'webgl', options ) || element.getContext( 'experimental-webgl', options );\n\n case DOM:\n\n return element.canvas = element;\n }\n\n })();\n\n ( options.container || doc.body ).appendChild( element );\n\n return Sketch.augment( context, options );\n },\n\n augment: function( context, options ) {\n\n options = extend( options || {}, defaults );\n\n options.element = context.canvas || context;\n options.element.className += ' sketch';\n\n extend( context, options, true );\n\n return constructor( context );\n }\n };\n\n /*\n ----------------------------------------------------------------------\n\n Shims\n\n ----------------------------------------------------------------------\n */\n\n var vendors = [ 'ms', 'moz', 'webkit', 'o' ];\n var scope = self;\n var then = 0;\n\n var a = 'AnimationFrame';\n var b = 'request' + a;\n var c = 'cancel' + a;\n\n var rAF = scope[ b ];\n var cAF = scope[ c ];\n\n for ( var i = 0; i < vendors.length && !rAF; i++ ) {\n\n rAF = scope[ vendors[ i ] + 'Request' + a ];\n cAF = scope[ vendors[ i ] + 'Cancel' + a ];\n }\n\n scope[ b ] = rAF = rAF || function( callback ) {\n\n var now = +new Date();\n var dt = M.max( 0, 16 - ( now - then ) );\n var id = setTimeout( function() {\n callback( now + dt );\n }, dt );\n\n then = now + dt;\n return id;\n };\n\n scope[ c ] = cAF = cAF || function( id ) {\n clearTimeout( id );\n };\n\n /*\n ----------------------------------------------------------------------\n\n Output\n\n ----------------------------------------------------------------------\n */\n\n return Sketch;\n\n}));\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/sketch-js/js/sketch.js","/*\r\n * A speed-improved perlin and simplex noise algorithms for 2D.\r\n *\r\n * Based on example code by Stefan Gustavson (stegu@itn.liu.se).\r\n * Optimisations by Peter Eastman (peastman@drizzle.stanford.edu).\r\n * Better rank ordering method by Stefan Gustavson in 2012.\r\n * Converted to Javascript by Joseph Gentle.\r\n *\r\n * Version 2012-03-09\r\n *\r\n * This code was placed in the public domain by its original author,\r\n * Stefan Gustavson. You may use it as you see fit, but\r\n * attribution is appreciated.\r\n *\r\n */\r\n\r\nvar module = global.noise = {};\r\n\r\nfunction Grad(x, y, z) {\r\n this.x = x; this.y = y; this.z = z;\r\n}\r\n\r\nGrad.prototype.dot2 = function(x, y) {\r\n return this.x*x + this.y*y;\r\n};\r\n\r\nGrad.prototype.dot3 = function(x, y, z) {\r\n return this.x*x + this.y*y + this.z*z;\r\n};\r\n\r\nvar grad3 = [new Grad(1,1,0),new Grad(-1,1,0),new Grad(1,-1,0),new Grad(-1,-1,0),\r\n new Grad(1,0,1),new Grad(-1,0,1),new Grad(1,0,-1),new Grad(-1,0,-1),\r\n new Grad(0,1,1),new Grad(0,-1,1),new Grad(0,1,-1),new Grad(0,-1,-1)];\r\n\r\nvar p = [151,160,137,91,90,15,\r\n 131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23,\r\n 190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,\r\n 88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166,\r\n 77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244,\r\n 102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196,\r\n 135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123,\r\n 5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,\r\n 223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9,\r\n 129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228,\r\n 251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107,\r\n 49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254,\r\n 138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180];\r\n// To remove the need for index wrapping, double the permutation table length\r\nvar perm = new Array(512);\r\nvar gradP = new Array(512);\r\n\r\n// This isn't a very good seeding function, but it works ok. It supports 2^16\r\n// different seed values. Write something better if you need more seeds.\r\nmodule.seed = function(seed) {\r\n if(seed > 0 && seed < 1) {\r\n // Scale the seed out\r\n seed *= 65536;\r\n }\r\n\r\n seed = Math.floor(seed);\r\n if(seed < 256) {\r\n seed |= seed << 8;\r\n }\r\n\r\n for(var i = 0; i < 256; i++) {\r\n var v;\r\n if (i & 1) {\r\n v = p[i] ^ (seed & 255);\r\n } else {\r\n v = p[i] ^ ((seed>>8) & 255);\r\n }\r\n\r\n perm[i] = perm[i + 256] = v;\r\n gradP[i] = gradP[i + 256] = grad3[v % 12];\r\n }\r\n};\r\n\r\nmodule.seed(0);\r\n\r\n/*\r\nfor(var i=0; i<256; i++) {\r\n perm[i] = perm[i + 256] = p[i];\r\n gradP[i] = gradP[i + 256] = grad3[perm[i] % 12];\r\n}*/\r\n\r\n// Skewing and unskewing factors for 2, 3, and 4 dimensions\r\nvar F2 = 0.5*(Math.sqrt(3)-1);\r\nvar G2 = (3-Math.sqrt(3))/6;\r\n\r\nvar F3 = 1/3;\r\nvar G3 = 1/6;\r\n\r\n// 2D simplex noise\r\n// module.simplex2 = function(xin, yin) {\r\n// var n0, n1, n2; // Noise contributions from the three corners\r\n// // Skew the input space to determine which simplex cell we're in\r\n// var s = (xin+yin)*F2; // Hairy factor for 2D\r\n// var i = Math.floor(xin+s);\r\n// var j = Math.floor(yin+s);\r\n// var t = (i+j)*G2;\r\n// var x0 = xin-i+t; // The x,y distances from the cell origin, unskewed.\r\n// var y0 = yin-j+t;\r\n// // For the 2D case, the simplex shape is an equilateral triangle.\r\n// // Determine which simplex we are in.\r\n// var i1, j1; // Offsets for second (middle) corner of simplex in (i,j) coords\r\n// if(x0>y0) { // lower triangle, XY order: (0,0)->(1,0)->(1,1)\r\n// i1=1; j1=0;\r\n// } else { // upper triangle, YX order: (0,0)->(0,1)->(1,1)\r\n// i1=0; j1=1;\r\n// }\r\n// // A step of (1,0) in (i,j) means a step of (1-c,-c) in (x,y), and\r\n// // a step of (0,1) in (i,j) means a step of (-c,1-c) in (x,y), where\r\n// // c = (3-sqrt(3))/6\r\n// var x1 = x0 - i1 + G2; // Offsets for middle corner in (x,y) unskewed coords\r\n// var y1 = y0 - j1 + G2;\r\n// var x2 = x0 - 1 + 2 * G2; // Offsets for last corner in (x,y) unskewed coords\r\n// var y2 = y0 - 1 + 2 * G2;\r\n// // Work out the hashed gradient indices of the three simplex corners\r\n// i &= 255;\r\n// j &= 255;\r\n// var gi0 = gradP[i+perm[j]];\r\n// var gi1 = gradP[i+i1+perm[j+j1]];\r\n// var gi2 = gradP[i+1+perm[j+1]];\r\n// // Calculate the contribution from the three corners\r\n// var t0 = 0.5 - x0*x0-y0*y0;\r\n// if(t0<0) {\r\n// n0 = 0;\r\n// } else {\r\n// t0 *= t0;\r\n// n0 = t0 * t0 * gi0.dot2(x0, y0); // (x,y) of grad3 used for 2D gradient\r\n// }\r\n// var t1 = 0.5 - x1*x1-y1*y1;\r\n// if(t1<0) {\r\n// n1 = 0;\r\n// } else {\r\n// t1 *= t1;\r\n// n1 = t1 * t1 * gi1.dot2(x1, y1);\r\n// }\r\n// var t2 = 0.5 - x2*x2-y2*y2;\r\n// if(t2<0) {\r\n// n2 = 0;\r\n// } else {\r\n// t2 *= t2;\r\n// n2 = t2 * t2 * gi2.dot2(x2, y2);\r\n// }\r\n// // Add contributions from each corner to get the final noise value.\r\n// // The result is scaled to return values in the interval [-1,1].\r\n// return 70 * (n0 + n1 + n2);\r\n// };\r\n\r\n// 3D simplex noise\r\n// module.simplex3 = function(xin, yin, zin) {\r\n// var n0, n1, n2, n3; // Noise contributions from the four corners\r\n//\r\n// // Skew the input space to determine which simplex cell we're in\r\n// var s = (xin+yin+zin)*F3; // Hairy factor for 2D\r\n// var i = Math.floor(xin+s);\r\n// var j = Math.floor(yin+s);\r\n// var k = Math.floor(zin+s);\r\n//\r\n// var t = (i+j+k)*G3;\r\n// var x0 = xin-i+t; // The x,y distances from the cell origin, unskewed.\r\n// var y0 = yin-j+t;\r\n// var z0 = zin-k+t;\r\n//\r\n// // For the 3D case, the simplex shape is a slightly irregular tetrahedron.\r\n// // Determine which simplex we are in.\r\n// var i1, j1, k1; // Offsets for second corner of simplex in (i,j,k) coords\r\n// var i2, j2, k2; // Offsets for third corner of simplex in (i,j,k) coords\r\n// if(x0 >= y0) {\r\n// if(y0 >= z0) { i1=1; j1=0; k1=0; i2=1; j2=1; k2=0; }\r\n// else if(x0 >= z0) { i1=1; j1=0; k1=0; i2=1; j2=0; k2=1; }\r\n// else { i1=0; j1=0; k1=1; i2=1; j2=0; k2=1; }\r\n// } else {\r\n// if(y0 < z0) { i1=0; j1=0; k1=1; i2=0; j2=1; k2=1; }\r\n// else if(x0 < z0) { i1=0; j1=1; k1=0; i2=0; j2=1; k2=1; }\r\n// else { i1=0; j1=1; k1=0; i2=1; j2=1; k2=0; }\r\n// }\r\n// // A step of (1,0,0) in (i,j,k) means a step of (1-c,-c,-c) in (x,y,z),\r\n// // a step of (0,1,0) in (i,j,k) means a step of (-c,1-c,-c) in (x,y,z), and\r\n// // a step of (0,0,1) in (i,j,k) means a step of (-c,-c,1-c) in (x,y,z), where\r\n// // c = 1/6.\r\n// var x1 = x0 - i1 + G3; // Offsets for second corner\r\n// var y1 = y0 - j1 + G3;\r\n// var z1 = z0 - k1 + G3;\r\n//\r\n// var x2 = x0 - i2 + 2 * G3; // Offsets for third corner\r\n// var y2 = y0 - j2 + 2 * G3;\r\n// var z2 = z0 - k2 + 2 * G3;\r\n//\r\n// var x3 = x0 - 1 + 3 * G3; // Offsets for fourth corner\r\n// var y3 = y0 - 1 + 3 * G3;\r\n// var z3 = z0 - 1 + 3 * G3;\r\n//\r\n// // Work out the hashed gradient indices of the four simplex corners\r\n// i &= 255;\r\n// j &= 255;\r\n// k &= 255;\r\n// var gi0 = gradP[i+ perm[j+ perm[k ]]];\r\n// var gi1 = gradP[i+i1+perm[j+j1+perm[k+k1]]];\r\n// var gi2 = gradP[i+i2+perm[j+j2+perm[k+k2]]];\r\n// var gi3 = gradP[i+ 1+perm[j+ 1+perm[k+ 1]]];\r\n//\r\n// // Calculate the contribution from the four corners\r\n// var t0 = 0.6 - x0*x0 - y0*y0 - z0*z0;\r\n// if(t0<0) {\r\n// n0 = 0;\r\n// } else {\r\n// t0 *= t0;\r\n// n0 = t0 * t0 * gi0.dot3(x0, y0, z0); // (x,y) of grad3 used for 2D gradient\r\n// }\r\n// var t1 = 0.6 - x1*x1 - y1*y1 - z1*z1;\r\n// if(t1<0) {\r\n// n1 = 0;\r\n// } else {\r\n// t1 *= t1;\r\n// n1 = t1 * t1 * gi1.dot3(x1, y1, z1);\r\n// }\r\n// var t2 = 0.6 - x2*x2 - y2*y2 - z2*z2;\r\n// if(t2<0) {\r\n// n2 = 0;\r\n// } else {\r\n// t2 *= t2;\r\n// n2 = t2 * t2 * gi2.dot3(x2, y2, z2);\r\n// }\r\n// var t3 = 0.6 - x3*x3 - y3*y3 - z3*z3;\r\n// if(t3<0) {\r\n// n3 = 0;\r\n// } else {\r\n// t3 *= t3;\r\n// n3 = t3 * t3 * gi3.dot3(x3, y3, z3);\r\n// }\r\n// // Add contributions from each corner to get the final noise value.\r\n// // The result is scaled to return values in the interval [-1,1].\r\n// return 32 * (n0 + n1 + n2 + n3);\r\n//\r\n// };\r\n\r\n// ##### Perlin noise stuff\r\n\r\nfunction fade(t) {\r\n return t*t*t*(t*(t*6-15)+10);\r\n}\r\n\r\nfunction lerp(a, b, t) {\r\n return (1-t)*a + t*b;\r\n}\r\n\r\n// 2D Perlin Noise\r\nmodule.perlin2 = function(x, y) {\r\n // Find unit grid cell containing point\r\n var X = Math.floor(x), Y = Math.floor(y);\r\n // Get relative xy coordinates of point within that cell\r\n x = x - X; y = y - Y;\r\n // Wrap the integer cells at 255 (smaller integer period can be introduced here)\r\n X = X & 255; Y = Y & 255;\r\n\r\n // Calculate noise contributions from each of the four corners\r\n var n00 = gradP[X+perm[Y]].dot2(x, y);\r\n var n01 = gradP[X+perm[Y+1]].dot2(x, y-1);\r\n var n10 = gradP[X+1+perm[Y]].dot2(x-1, y);\r\n var n11 = gradP[X+1+perm[Y+1]].dot2(x-1, y-1);\r\n\r\n // Compute the fade curve value for x\r\n var u = fade(x);\r\n\r\n // Interpolate the four results\r\n return lerp(\r\n lerp(n00, n10, u),\r\n lerp(n01, n11, u),\r\n fade(y));\r\n};\r\n\r\n// 3D Perlin Noise\r\n// module.perlin3 = function(x, y, z) {\r\n// // Find unit grid cell containing point\r\n// var X = Math.floor(x), Y = Math.floor(y), Z = Math.floor(z);\r\n// // Get relative xyz coordinates of point within that cell\r\n// x = x - X; y = y - Y; z = z - Z;\r\n// // Wrap the integer cells at 255 (smaller integer period can be introduced here)\r\n// X = X & 255; Y = Y & 255; Z = Z & 255;\r\n//\r\n// // Calculate noise contributions from each of the eight corners\r\n// var n000 = gradP[X+ perm[Y+ perm[Z ]]].dot3(x, y, z);\r\n// var n001 = gradP[X+ perm[Y+ perm[Z+1]]].dot3(x, y, z-1);\r\n// var n010 = gradP[X+ perm[Y+1+perm[Z ]]].dot3(x, y-1, z);\r\n// var n011 = gradP[X+ perm[Y+1+perm[Z+1]]].dot3(x, y-1, z-1);\r\n// var n100 = gradP[X+1+perm[Y+ perm[Z ]]].dot3(x-1, y, z);\r\n// var n101 = gradP[X+1+perm[Y+ perm[Z+1]]].dot3(x-1, y, z-1);\r\n// var n110 = gradP[X+1+perm[Y+1+perm[Z ]]].dot3(x-1, y-1, z);\r\n// var n111 = gradP[X+1+perm[Y+1+perm[Z+1]]].dot3(x-1, y-1, z-1);\r\n//\r\n// // Compute the fade curve value for x, y, z\r\n// var u = fade(x);\r\n// var v = fade(y);\r\n// var w = fade(z);\r\n//\r\n// // Interpolate\r\n// return lerp(\r\n// lerp(\r\n// lerp(n000, n100, u),\r\n// lerp(n001, n101, u), w),\r\n// lerp(\r\n// lerp(n010, n110, u),\r\n// lerp(n011, n111, u), w),\r\n// v);\r\n// };\r\n\r\n\r\nexport default module;\n\n\n// WEBPACK FOOTER //\n// ./js/perlin.js"],"sourceRoot":""}