{"version":3,"sources":["../../../app/vendors/fss.js"],"names":["$","toggleClass","isMobile","any","apple","device","navigator","userAgent","indexOf","jQuery","uuid","replace","c","r","Math","random","toString","generateYears","today","Date","currentYear","getFullYear","output","first","i","year","parseInt","isLoading","getBrandByNumber","n","callback","context","ajax","url","apiURL","method","headers","Content-Type","ServiceKey","dataType","timeout","done","response","error","arguments","setTimeout","always","fn","serializeObject","o","a","this","serializeArray","each","undefined","name","push","value","urlParam","results","RegExp","exec","window","location","href","statesSelectsToPopulate","fillCitiesSelect","cselect","children","remove","y","length","city","append","id","addClass","removeClass","parents","bind","loadBrCities","get","resp","states","cities","z","select","hasClass","BR","state","label","toUpperCase","on","e","select2","data","val","currentTarget","isProdAPI","test","cookiesService","isMundiCallcenterCookie","cookieName","substr","callByDomain","functionToCall","args","crossDomain","setByAPIEnvironment","domain","Cookies","set","cookieValue","setNoEnv","applyTwoSelect","_el","el","_","isFunction","params","text","find","call","sel2","defaultOpts","theme","language","selectOnClose","dropdownCssClass","attr","onSelect2Callback","minimumResultsForSearch","Infinity","blur","isEmpty","findFunctionByString","applySelect2","sel","els","document","css","width","getBoundingClientRect","visibility","changeElementType","newType","attrs","attributes","idx","nodeName","nodeValue","replaceWith","SVGInject","noMobile","mySVGsToInject","querySelectorAll","SVGInjector","svg","setAttribute","strfn","fnArr","split","v","validationTooltipTpl","html","Mustache","parse","updatePosition","rendered","offset","posX","round","left","outerWidth","top","outerHeight","dropValidationBox","type","noDangerRemove","toLowerCase","snakeCase","slice","already","render","binded","TweenMax","opacity","off","throttle","self","focus","timeId","parent","to","ease","Sine","easeOut","closeFn","arr","clearTimeout","height","onComplete","input","activeElement","className","closeBtn","authorizeFor","role","externData","roles","userType","includes","DEFAULTS","transitionEnd","processingPayment","customerKey","userProfile","_uuidRegExp","testUUid","str","getCustomerKey","store","setCustomerKey","key","setUserProfile","userWelcome","day","hr","getHours","console","warn","FS","trueId","userId","identify","substring","lastIndexOf","displayName","email","username","userId_str","userType_str","customerKey_str","zopimZenDeskChat","__isCallcenterStone__","hide","MUNDIPAGG","user","setCheckLastMerchant","payMethod","selPayMethod","Merchants","prototype","isMundiAdmin","prop","add","getResponseBasedError","mixpanel","track","_callback","responseJSON","errors","message","apply","status","TRANSLATOR","translate","_key","finded","forEachRight","dictionary","abbreviation","search","forEach","Diners","CasaShow","HugCard","Brazil","MasterCard","Residential","Billing","Comercial","AuthAndCapture","AuthOnly","Invalid","NotAuthorized","Stone|1","Stone|0","Stone|1000","Stone|1001","Stone|1002","Stone|1003","Stone|1004","Stone|1005","Stone|1006","Stone|1007","Stone|1008","Stone|1009","Stone|1010","Stone|1011","Stone|1013","Stone|1014","Stone|1016","Stone|1017","Stone|1019","Stone|1020","Stone|1021","Stone|1022","Stone|1023","Stone|1024","Stone|1025","Stone|1042","Stone|1045","Stone|2000","Stone|2001","Stone|2002","Stone|2003","Stone|2004","Stone|2005","Stone|2006","Stone|2007","Stone|2008","Stone|2009","Stone|9102","Stone|9108","Stone|9109","Stone|9111","Stone|9112","Stone|9999","abbreviations","Rio de Janeiro","Mundipagg","merchant","customer","totalAmount","recurrencyOptions","headerTotalAmount","publicMerchantKey","isSandboxEnabled","setCustomer","setMerchant","people","Customer","customerName","Language","Email Confirmed","Is Enabled","isEnabled","$first_name","$email","getMerchant","getBoletoExpirationDiff","date","DaysToAddInBoletoExpirationDate","moment","diff","parseValue","parseNormalPattern","toVal","hasAttribute","matchRegex","getAttribute","match","advRegex","getHumanAmountInCents","isNaN","maskMoney","prefix","allowNegative","thousands","decimal","affixesStay","checkKeyMember","isCollection","isArray","setRequestData","isObject","merge","getRequestData","deleteDataKey","parseAmountInCents","toFixed","setSandboxMode","toggleSandbox","payBtn","ajaxSettings","hasOwnProperty","IsSandboxEnabled","next","LOGINCLIENT","_getCustomerData","makeCreditCardTransaction","preObj","items","$select","continuePreMerchant","LDUClass","lastPublicMerchantKey","$ajax","delay","retryFunction","setupMerchants","term","pageNumber","page","pageSize","processResults","dataItems","map","obj","merchantName","pagination","more","options","itemCount","cache","setupPaymentMethod","ccPayMethod","selHolder","statusCode","200","paymentMethodId","paymentMethod","log","txt","setupBoletoStone","modalStatus","backBtn","removeAttr","showModal","waitingBoletoStone","isBoletoStone","boletoStone","select2Merchant","placeholder","currentRequest","merchantsCache","query","newAJAX","success","complete","abort","escapeMarkup","markup","templateResult","repo","loading","description","corporateName","isAntiFraudEnabled","templateSelection","initSelection","lastMerchantFor","Authorization","then","removeParticleJs","pjs","installMerchants","merchants","MERCHANTS"],"mappings":"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","file":"main.js","sourcesContent":["//============================================================\n//\n// Copyright (C) 2013 Matthew Wagerfield\n//\n// Twitter: https://twitter.com/mwagerfield\n//\n// Permission is hereby granted, free of charge, to any\n// person obtaining a copy of this software and associated\n// documentation files (the \"Software\"), to deal in the\n// Software without restriction, including without limitation\n// the rights to use, copy, modify, merge, publish, distribute,\n// sublicense, and/or sell copies of the Software, and to\n// permit persons to whom the Software is furnished to do\n// so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice\n// shall be included in all copies or substantial portions\n// of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY\n// OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT\n// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO\n// EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE\n// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN\n// AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE\n// OR OTHER DEALINGS IN THE SOFTWARE.\n//\n//============================================================\n\n/**\n * Defines the Flat Surface Shader namespace for all the awesomeness to exist upon.\n * @author Matthew Wagerfield\n */\nFSS = {\n FRONT : 0,\n BACK : 1,\n DOUBLE : 2,\n SVGNS : 'http://www.w3.org/2000/svg'\n};\n\n/**\n * @class Array\n * @author Matthew Wagerfield\n */\nFSS.Array = typeof Float32Array === 'function' ? Float32Array : Array;\n\n/**\n * @class Utils\n * @author Matthew Wagerfield\n */\nFSS.Utils = {\n isNumber: function(value) {\n return !isNaN(parseFloat(value)) && isFinite(value);\n }\n};\n\n/**\n * Request Animation Frame Polyfill.\n * @author Paul Irish\n * @see https://gist.github.com/paulirish/1579671\n */\n(function() {\n if(document.getElementById('ffshadeoutput') === null){\n return false;\n }\n\n var lastTime = 0;\n var vendors = ['ms', 'moz', 'webkit', 'o'];\n\n for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {\n window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame'];\n window.cancelAnimationFrame = window[vendors[x]+'CancelAnimationFrame'] || window[vendors[x]+'CancelRequestAnimationFrame'];\n }\n\n if (!window.requestAnimationFrame) {\n window.requestAnimationFrame = function(callback, element) {\n var currentTime = new Date().getTime();\n var timeToCall = Math.max(0, 16 - (currentTime - lastTime));\n var id = window.setTimeout(function() {\n callback(currentTime + timeToCall);\n }, timeToCall);\n lastTime = currentTime + timeToCall;\n return id;\n };\n }\n\n if (!window.cancelAnimationFrame) {\n window.cancelAnimationFrame = function(id) {\n clearTimeout(id);\n };\n }\n\n}());\n\n/**\n * @object Math Augmentation\n * @author Matthew Wagerfield\n */\nMath.PIM2 = Math.PI*2;\nMath.PID2 = Math.PI/2;\nMath.randomInRange = function(min, max) {\n return min + (max - min) * Math.random();\n};\nMath.clamp = function(value, min, max) {\n value = Math.max(value, min);\n value = Math.min(value, max);\n return value;\n};\n\n/**\n * @object Vector3\n * @author Matthew Wagerfield\n */\nFSS.Vector3 = {\n create: function(x, y, z) {\n var vector = new FSS.Array(3);\n this.set(vector, x, y, z);\n return vector;\n },\n clone: function(a) {\n var vector = this.create();\n this.copy(vector, a);\n return vector;\n },\n set: function(target, x, y, z) {\n target[0] = x || 0;\n target[1] = y || 0;\n target[2] = z || 0;\n return this;\n },\n setX: function(target, x) {\n target[0] = x || 0;\n return this;\n },\n setY: function(target, y) {\n target[1] = y || 0;\n return this;\n },\n setZ: function(target, z) {\n target[2] = z || 0;\n return this;\n },\n copy: function(target, a) {\n target[0] = a[0];\n target[1] = a[1];\n target[2] = a[2];\n return this;\n },\n add: function(target, a) {\n target[0] += a[0];\n target[1] += a[1];\n target[2] += a[2];\n return this;\n },\n addVectors: function(target, a, b) {\n target[0] = a[0] + b[0];\n target[1] = a[1] + b[1];\n target[2] = a[2] + b[2];\n return this;\n },\n addScalar: function(target, s) {\n target[0] += s;\n target[1] += s;\n target[2] += s;\n return this;\n },\n subtract: function(target, a) {\n target[0] -= a[0];\n target[1] -= a[1];\n target[2] -= a[2];\n return this;\n },\n subtractVectors: function(target, a, b) {\n target[0] = a[0] - b[0];\n target[1] = a[1] - b[1];\n target[2] = a[2] - b[2];\n return this;\n },\n subtractScalar: function(target, s) {\n target[0] -= s;\n target[1] -= s;\n target[2] -= s;\n return this;\n },\n multiply: function(target, a) {\n target[0] *= a[0];\n target[1] *= a[1];\n target[2] *= a[2];\n return this;\n },\n multiplyVectors: function(target, a, b) {\n target[0] = a[0] * b[0];\n target[1] = a[1] * b[1];\n target[2] = a[2] * b[2];\n return this;\n },\n multiplyScalar: function(target, s) {\n target[0] *= s;\n target[1] *= s;\n target[2] *= s;\n return this;\n },\n divide: function(target, a) {\n target[0] /= a[0];\n target[1] /= a[1];\n target[2] /= a[2];\n return this;\n },\n divideVectors: function(target, a, b) {\n target[0] = a[0] / b[0];\n target[1] = a[1] / b[1];\n target[2] = a[2] / b[2];\n return this;\n },\n divideScalar: function(target, s) {\n if (s !== 0) {\n target[0] /= s;\n target[1] /= s;\n target[2] /= s;\n } else {\n target[0] = 0;\n target[1] = 0;\n target[2] = 0;\n }\n return this;\n },\n cross: function(target, a) {\n var x = target[0];\n var y = target[1];\n var z = target[2];\n target[0] = y*a[2] - z*a[1];\n target[1] = z*a[0] - x*a[2];\n target[2] = x*a[1] - y*a[0];\n return this;\n },\n crossVectors: function(target, a, b) {\n target[0] = a[1]*b[2] - a[2]*b[1];\n target[1] = a[2]*b[0] - a[0]*b[2];\n target[2] = a[0]*b[1] - a[1]*b[0];\n return this;\n },\n min: function(target, value) {\n if (target[0] < value) { target[0] = value; }\n if (target[1] < value) { target[1] = value; }\n if (target[2] < value) { target[2] = value; }\n return this;\n },\n max: function(target, value) {\n if (target[0] > value) { target[0] = value; }\n if (target[1] > value) { target[1] = value; }\n if (target[2] > value) { target[2] = value; }\n return this;\n },\n clamp: function(target, min, max) {\n this.min(target, min);\n this.max(target, max);\n return this;\n },\n limit: function(target, min, max) {\n var length = this.length(target);\n if (min !== null && length < min) {\n this.setLength(target, min);\n } else if (max !== null && length > max) {\n this.setLength(target, max);\n }\n return this;\n },\n dot: function(a, b) {\n return a[0]*b[0] + a[1]*b[1] + a[2]*b[2];\n },\n normalise: function(target) {\n return this.divideScalar(target, this.length(target));\n },\n negate: function(target) {\n return this.multiplyScalar(target, -1);\n },\n distanceSquared: function(a, b) {\n var dx = a[0] - b[0];\n var dy = a[1] - b[1];\n var dz = a[2] - b[2];\n return dx*dx + dy*dy + dz*dz;\n },\n distance: function(a, b) {\n return Math.sqrt(this.distanceSquared(a, b));\n },\n lengthSquared: function(a) {\n return a[0]*a[0] + a[1]*a[1] + a[2]*a[2];\n },\n length: function(a) {\n return Math.sqrt(this.lengthSquared(a));\n },\n setLength: function(target, l) {\n var length = this.length(target);\n if (length !== 0 && l !== length) {\n this.multiplyScalar(target, l / length);\n }\n return this;\n }\n};\n\n/**\n * @object Vector4\n * @author Matthew Wagerfield\n */\nFSS.Vector4 = {\n create: function(x, y, z, w) {\n var vector = new FSS.Array(4);\n this.set(vector, x, y, z);\n return vector;\n },\n set: function(target, x, y, z, w) {\n target[0] = x || 0;\n target[1] = y || 0;\n target[2] = z || 0;\n target[3] = w || 0;\n return this;\n },\n setX: function(target, x) {\n target[0] = x || 0;\n return this;\n },\n setY: function(target, y) {\n target[1] = y || 0;\n return this;\n },\n setZ: function(target, z) {\n target[2] = z || 0;\n return this;\n },\n setW: function(target, w) {\n target[3] = w || 0;\n return this;\n },\n add: function(target, a) {\n target[0] += a[0];\n target[1] += a[1];\n target[2] += a[2];\n target[3] += a[3];\n return this;\n },\n multiplyVectors: function(target, a, b) {\n target[0] = a[0] * b[0];\n target[1] = a[1] * b[1];\n target[2] = a[2] * b[2];\n target[3] = a[3] * b[3];\n return this;\n },\n multiplyScalar: function(target, s) {\n target[0] *= s;\n target[1] *= s;\n target[2] *= s;\n target[3] *= s;\n return this;\n },\n min: function(target, value) {\n if (target[0] < value) { target[0] = value; }\n if (target[1] < value) { target[1] = value; }\n if (target[2] < value) { target[2] = value; }\n if (target[3] < value) { target[3] = value; }\n return this;\n },\n max: function(target, value) {\n if (target[0] > value) { target[0] = value; }\n if (target[1] > value) { target[1] = value; }\n if (target[2] > value) { target[2] = value; }\n if (target[3] > value) { target[3] = value; }\n return this;\n },\n clamp: function(target, min, max) {\n this.min(target, min);\n this.max(target, max);\n return this;\n }\n};\n\n/**\n * @class Color\n * @author Matthew Wagerfield\n */\nFSS.Color = function(hex, opacity) {\n this.rgba = FSS.Vector4.create();\n this.hex = hex || '#000000';\n this.opacity = FSS.Utils.isNumber(opacity) ? opacity : 1;\n this.set(this.hex, this.opacity);\n};\n\nFSS.Color.prototype = {\n set: function(hex, opacity) {\n hex = hex.replace('#', '');\n var size = hex.length / 3;\n this.rgba[0] = parseInt(hex.substring(size*0, size*1), 16) / 255;\n this.rgba[1] = parseInt(hex.substring(size*1, size*2), 16) / 255;\n this.rgba[2] = parseInt(hex.substring(size*2, size*3), 16) / 255;\n this.rgba[3] = FSS.Utils.isNumber(opacity) ? opacity : this.rgba[3];\n return this;\n },\n hexify: function(channel) {\n var hex = Math.ceil(channel*255).toString(16);\n if (hex.length === 1) { hex = '0' + hex; }\n return hex;\n },\n format: function() {\n var r = this.hexify(this.rgba[0]);\n var g = this.hexify(this.rgba[1]);\n var b = this.hexify(this.rgba[2]);\n this.hex = '#' + r + g + b;\n return this.hex;\n }\n};\n\n/**\n * @class Object\n * @author Matthew Wagerfield\n */\nFSS.Object = function() {\n this.position = FSS.Vector3.create();\n};\n\nFSS.Object.prototype = {\n setPosition: function(x, y, z) {\n FSS.Vector3.set(this.position, x, y, z);\n return this;\n }\n};\n\n/**\n * @class Light\n * @author Matthew Wagerfield\n */\nFSS.Light = function(ambient, diffuse) {\n FSS.Object.call(this);\n this.ambient = new FSS.Color(ambient || '#FFFFFF');\n this.diffuse = new FSS.Color(diffuse || '#FFFFFF');\n this.ray = FSS.Vector3.create();\n};\n\nFSS.Light.prototype = Object.create(FSS.Object.prototype);\n\n/**\n * @class Vertex\n * @author Matthew Wagerfield\n */\nFSS.Vertex = function(x, y, z) {\n this.position = FSS.Vector3.create(x, y, z);\n};\n\nFSS.Vertex.prototype = {\n setPosition: function(x, y, z) {\n FSS.Vector3.set(this.position, x, y, z);\n return this;\n }\n};\n\n/**\n * @class Triangle\n * @author Matthew Wagerfield\n */\nFSS.Triangle = function(a, b, c) {\n this.a = a || new FSS.Vertex();\n this.b = b || new FSS.Vertex();\n this.c = c || new FSS.Vertex();\n this.vertices = [this.a, this.b, this.c];\n this.u = FSS.Vector3.create();\n this.v = FSS.Vector3.create();\n this.centroid = FSS.Vector3.create();\n this.normal = FSS.Vector3.create();\n this.color = new FSS.Color();\n this.polygon = document.createElementNS(FSS.SVGNS, 'polygon');\n this.polygon.setAttributeNS(null, 'stroke-linejoin', 'round');\n this.polygon.setAttributeNS(null, 'stroke-miterlimit', '1');\n this.polygon.setAttributeNS(null, 'stroke-width', '1');\n this.computeCentroid();\n this.computeNormal();\n};\n\nFSS.Triangle.prototype = {\n computeCentroid: function() {\n this.centroid[0] = this.a.position[0] + this.b.position[0] + this.c.position[0];\n this.centroid[1] = this.a.position[1] + this.b.position[1] + this.c.position[1];\n this.centroid[2] = this.a.position[2] + this.b.position[2] + this.c.position[2];\n FSS.Vector3.divideScalar(this.centroid, 3);\n return this;\n },\n computeNormal: function() {\n FSS.Vector3.subtractVectors(this.u, this.b.position, this.a.position);\n FSS.Vector3.subtractVectors(this.v, this.c.position, this.a.position);\n FSS.Vector3.crossVectors(this.normal, this.u, this.v);\n FSS.Vector3.normalise(this.normal);\n return this;\n }\n};\n\n/**\n * @class Geometry\n * @author Matthew Wagerfield\n */\nFSS.Geometry = function() {\n this.vertices = [];\n this.triangles = [];\n this.dirty = false;\n};\n\nFSS.Geometry.prototype = {\n update: function() {\n if (this.dirty) {\n var t,triangle;\n for (t = this.triangles.length - 1; t >= 0; t--) {\n triangle = this.triangles[t];\n triangle.computeCentroid();\n triangle.computeNormal();\n }\n this.dirty = false;\n }\n return this;\n }\n};\n\n/**\n * @class Plane\n * @author Matthew Wagerfield\n */\nFSS.Plane = function(width, height, segments, slices) {\n FSS.Geometry.call(this);\n this.width = width || 100;\n this.height = height || 100;\n this.segments = segments || 4;\n this.slices = slices || 4;\n this.segmentWidth = this.width / this.segments;\n this.sliceHeight = this.height / this.slices;\n\n // Cache Variables\n var x, y, v0, v1, v2, v3,\n vertex, triangle, vertices = [],\n offsetX = this.width * -0.5,\n offsetY = this.height * 0.5;\n\n // Add Vertices\n for (x = 0; x <= this.segments; x++) {\n vertices.push([]);\n for (y = 0; y <= this.slices; y++) {\n vertex = new FSS.Vertex(offsetX + x*this.segmentWidth, offsetY - y*this.sliceHeight);\n vertices[x].push(vertex);\n this.vertices.push(vertex);\n }\n }\n\n // Add Triangles\n for (x = 0; x < this.segments; x++) {\n for (y = 0; y < this.slices; y++) {\n v0 = vertices[x+0][y+0];\n v1 = vertices[x+0][y+1];\n v2 = vertices[x+1][y+0];\n v3 = vertices[x+1][y+1];\n t0 = new FSS.Triangle(v0, v1, v2);\n t1 = new FSS.Triangle(v2, v1, v3);\n this.triangles.push(t0, t1);\n }\n }\n};\n\nFSS.Plane.prototype = Object.create(FSS.Geometry.prototype);\n\n/**\n * @class Material\n * @author Matthew Wagerfield\n */\nFSS.Material = function(ambient, diffuse) {\n this.ambient = new FSS.Color(ambient || '#444444');\n this.diffuse = new FSS.Color(diffuse || '#000');\n this.slave = new FSS.Color();\n};\n\n/**\n * @class Mesh\n * @author Matthew Wagerfield\n */\nFSS.Mesh = function(geometry, material) {\n FSS.Object.call(this);\n this.geometry = geometry || new FSS.Geometry();\n this.material = material || new FSS.Material();\n this.side = FSS.FRONT;\n this.visible = true;\n};\n\nFSS.Mesh.prototype = Object.create(FSS.Object.prototype);\n\nFSS.Mesh.prototype.update = function(lights, calculate) {\n var t,triangle, l,light, illuminance;\n\n // Update Geometry\n this.geometry.update();\n\n // Calculate the triangle colors\n if (calculate) {\n\n // Iterate through Triangles\n for (t = this.geometry.triangles.length - 1; t >= 0; t--) {\n triangle = this.geometry.triangles[t];\n\n // Reset Triangle Color\n FSS.Vector4.set(triangle.color.rgba);\n\n // Iterate through Lights\n for (l = lights.length - 1; l >= 0; l--) {\n light = lights[l];\n\n // Calculate Illuminance\n FSS.Vector3.subtractVectors(light.ray, light.position, triangle.centroid);\n FSS.Vector3.normalise(light.ray);\n illuminance = FSS.Vector3.dot(triangle.normal, light.ray);\n if (this.side === FSS.FRONT) {\n illuminance = Math.max(illuminance, 0);\n } else if (this.side === FSS.BACK) {\n illuminance = Math.abs(Math.min(illuminance, 0));\n } else if (this.side === FSS.DOUBLE) {\n illuminance = Math.max(Math.abs(illuminance), 0);\n }\n\n // Calculate Ambient Light\n FSS.Vector4.multiplyVectors(this.material.slave.rgba, this.material.ambient.rgba, light.ambient.rgba);\n FSS.Vector4.add(triangle.color.rgba, this.material.slave.rgba);\n\n // Calculate Diffuse Light\n FSS.Vector4.multiplyVectors(this.material.slave.rgba, this.material.diffuse.rgba, light.diffuse.rgba);\n FSS.Vector4.multiplyScalar(this.material.slave.rgba, illuminance);\n FSS.Vector4.add(triangle.color.rgba, this.material.slave.rgba);\n }\n\n // Clamp & Format Color\n FSS.Vector4.clamp(triangle.color.rgba, 0, 1);\n }\n }\n return this;\n};\n\n/**\n * @class Scene\n * @author Matthew Wagerfield\n */\nFSS.Scene = function() {\n this.meshes = [];\n this.lights = [];\n};\n\nFSS.Scene.prototype = {\n add: function(object) {\n if (object instanceof FSS.Mesh && !~this.meshes.indexOf(object)) {\n this.meshes.push(object);\n } else if (object instanceof FSS.Light && !~this.lights.indexOf(object)) {\n this.lights.push(object);\n }\n return this;\n },\n remove: function(object) {\n if (object instanceof FSS.Mesh && ~this.meshes.indexOf(object)) {\n this.meshes.splice(this.meshes.indexOf(object), 1);\n } else if (object instanceof FSS.Light && ~this.lights.indexOf(object)) {\n this.lights.splice(this.lights.indexOf(object), 1);\n }\n return this;\n }\n};\n\n/**\n * @class Renderer\n * @author Matthew Wagerfield\n */\nFSS.Renderer = function() {\n this.width = 0;\n this.height = 0;\n this.halfWidth = 0;\n this.halfHeight = 0;\n};\n\nFSS.Renderer.prototype = {\n setSize: function(width, height) {\n if (this.width === width && this.height === height) return;\n this.width = width;\n this.height = height;\n this.halfWidth = this.width * 0.5;\n this.halfHeight = this.height * 0.5;\n return this;\n },\n clear: function() {\n return this;\n },\n render: function(scene) {\n return this;\n }\n};\n\n/**\n * @class Canvas Renderer\n * @author Matthew Wagerfield\n */\nFSS.CanvasRenderer = function() {\n FSS.Renderer.call(this);\n this.element = document.createElement('canvas');\n this.element.style.display = 'block';\n this.element.setAttribute(\"id\", \"myCanvas\"); \n this.context = this.element.getContext('2d'); \n //this.element.style.filter = \"blur(10px)\";\n this.setSize(this.element.width, this.element.height);\n};\n\nFSS.CanvasRenderer.prototype = Object.create(FSS.Renderer.prototype);\n\nFSS.CanvasRenderer.prototype.setSize = function(width, height) {\n FSS.Renderer.prototype.setSize.call(this, width, height);\n this.element.width = width;\n this.element.height = height;\n this.context.setTransform(1, 0, 0, -1, this.halfWidth, this.halfHeight);\n return this;\n};\n\nFSS.CanvasRenderer.prototype.clear = function() {\n FSS.Renderer.prototype.clear.call(this);\n this.context.clearRect(-this.halfWidth, -this.halfHeight, this.width, this.height);\n return this;\n};\n\nFSS.CanvasRenderer.prototype.render = function(scene) {\n FSS.Renderer.prototype.render.call(this, scene);\n var m,mesh, t,triangle, color;\n\n // Clear Context\n this.clear();\n\n // Configure Context\n this.context.lineJoin = 'round';\n this.context.lineWidth = 1;\n\n // Update Meshes\n for (m = scene.meshes.length - 1; m >= 0; m--) {\n mesh = scene.meshes[m];\n if (mesh.visible) {\n mesh.update(scene.lights, true);\n\n // Render Triangles\n for (t = mesh.geometry.triangles.length - 1; t >= 0; t--) {\n triangle = mesh.geometry.triangles[t];\n color = triangle.color.format();\n this.context.beginPath();\n this.context.moveTo(triangle.a.position[0], triangle.a.position[1]);\n this.context.lineTo(triangle.b.position[0], triangle.b.position[1]);\n this.context.lineTo(triangle.c.position[0], triangle.c.position[1]);\n this.context.closePath();\n this.context.globalAlpha = 0.3;\n this.context.strokeStyle = color;\n this.context.fillStyle = color;\n this.context.stroke();\n this.context.fill();\n }\n }\n }\n return this;\n};\n\n/**\n * @class WebGL Renderer\n * @author Matthew Wagerfield\n */\nFSS.WebGLRenderer = function() {\n FSS.Renderer.call(this);\n this.element = document.createElement('canvas');\n this.element.style.display = 'block';\n\n // Set initial vertex and light count\n this.vertices = null;\n this.lights = null;\n\n // Create parameters object\n var parameters = {\n preserveDrawingBuffer: false,\n premultipliedAlpha: true,\n antialias: true,\n stencil: true,\n alpha: true\n };\n\n // Create and configure the gl context\n this.gl = this.getContext(this.element, parameters);\n\n // Set the internal support flag\n this.unsupported = !this.gl;\n\n // Setup renderer\n if (this.unsupported) {\n return 'WebGL is not supported by your browser.';\n } else {\n this.gl.clearColor(0.0, 0.0, 0.0, 0.0);\n this.gl.enable(this.gl.DEPTH_TEST);\n this.setSize(this.element.width, this.element.height);\n }\n};\n\nFSS.WebGLRenderer.prototype = Object.create(FSS.Renderer.prototype);\n\nFSS.WebGLRenderer.prototype.getContext = function(canvas, parameters) {\n var context = false;\n try {\n if (!(context = canvas.getContext('experimental-webgl', parameters))) {\n throw 'Error creating WebGL context.';\n }\n } catch (error) {\n console.error(error);\n }\n return context;\n};\n\nFSS.WebGLRenderer.prototype.setSize = function(width, height) {\n FSS.Renderer.prototype.setSize.call(this, width, height);\n if (this.unsupported) return;\n\n // Set the size of the canvas element\n this.element.width = width;\n this.element.height = height;\n\n // Set the size of the gl viewport\n this.gl.viewport(0, 0, width, height);\n return this;\n};\n\nFSS.WebGLRenderer.prototype.clear = function() {\n FSS.Renderer.prototype.clear.call(this);\n if (this.unsupported) return;\n this.gl.clear(this.gl.COLOR_BUFFER_BIT | this.gl.DEPTH_BUFFER_BIT);\n return this;\n};\n\nFSS.WebGLRenderer.prototype.render = function(scene) {\n FSS.Renderer.prototype.render.call(this, scene);\n if (this.unsupported) return;\n var m,mesh, t,tl,triangle, l,light,\n attribute, uniform, buffer, data, location,\n update = false, lights = scene.lights.length,\n index, v,vl,vetex,vertices = 0;\n\n // Clear context\n this.clear();\n\n // Build the shader program\n if (this.lights !== lights) {\n this.lights = lights;\n if (this.lights > 0) {\n this.buildProgram(lights);\n } else {\n return;\n }\n }\n\n // Update program\n if (!!this.program) {\n\n // Increment vertex counter\n for (m = scene.meshes.length - 1; m >= 0; m--) {\n mesh = scene.meshes[m];\n if (mesh.geometry.dirty) update = true;\n mesh.update(scene.lights, false);\n vertices += mesh.geometry.triangles.length*3;\n }\n\n // Compare vertex counter\n if (update || this.vertices !== vertices) {\n this.vertices = vertices;\n\n // Build buffers\n for (attribute in this.program.attributes) {\n buffer = this.program.attributes[attribute];\n buffer.data = new FSS.Array(vertices*buffer.size);\n\n // Reset vertex index\n index = 0;\n\n // Update attribute buffer data\n for (m = scene.meshes.length - 1; m >= 0; m--) {\n mesh = scene.meshes[m];\n\n for (t = 0, tl = mesh.geometry.triangles.length; t < tl; t++) {\n triangle = mesh.geometry.triangles[t];\n\n for (v = 0, vl = triangle.vertices.length; v < vl; v++) {\n vertex = triangle.vertices[v];\n switch (attribute) {\n case 'side':\n this.setBufferData(index, buffer, mesh.side);\n break;\n case 'position':\n this.setBufferData(index, buffer, vertex.position);\n break;\n case 'centroid':\n this.setBufferData(index, buffer, triangle.centroid);\n break;\n case 'normal':\n this.setBufferData(index, buffer, triangle.normal);\n break;\n case 'ambient':\n this.setBufferData(index, buffer, mesh.material.ambient.rgba);\n break;\n case 'diffuse':\n this.setBufferData(index, buffer, mesh.material.diffuse.rgba);\n break;\n }\n index++;\n }\n }\n }\n\n // Upload attribute buffer data\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, buffer.buffer);\n this.gl.bufferData(this.gl.ARRAY_BUFFER, buffer.data, this.gl.DYNAMIC_DRAW);\n this.gl.enableVertexAttribArray(buffer.location);\n this.gl.vertexAttribPointer(buffer.location, buffer.size, this.gl.FLOAT, false, 0, 0);\n }\n }\n\n // Build uniform buffers\n this.setBufferData(0, this.program.uniforms.resolution, [this.width, this.height, this.width]);\n for (l = lights-1; l >= 0; l--) {\n light = scene.lights[l];\n this.setBufferData(l, this.program.uniforms.lightPosition, light.position);\n this.setBufferData(l, this.program.uniforms.lightAmbient, light.ambient.rgba);\n this.setBufferData(l, this.program.uniforms.lightDiffuse, light.diffuse.rgba);\n }\n\n // Update uniforms\n for (uniform in this.program.uniforms) {\n buffer = this.program.uniforms[uniform];\n location = buffer.location;\n data = buffer.data;\n switch (buffer.structure) {\n case '3f':\n this.gl.uniform3f(location, data[0], data[1], data[2]);\n break;\n case '3fv':\n this.gl.uniform3fv(location, data);\n break;\n case '4fv':\n this.gl.uniform4fv(location, data);\n break;\n }\n }\n }\n\n // Draw those lovely triangles\n this.gl.drawArrays(this.gl.TRIANGLES, 0, this.vertices);\n return this;\n};\n\nFSS.WebGLRenderer.prototype.setBufferData = function(index, buffer, value) {\n if (FSS.Utils.isNumber(value)) {\n buffer.data[index*buffer.size] = value;\n } else {\n for (var i = value.length - 1; i >= 0; i--) {\n buffer.data[index*buffer.size+i] = value[i];\n }\n }\n};\n\n/**\n * Concepts taken from three.js WebGLRenderer\n * @see https://github.com/mrdoob/three.js/blob/master/src/renderers/WebGLRenderer.js\n */\nFSS.WebGLRenderer.prototype.buildProgram = function(lights) {\n if (this.unsupported) return;\n\n // Create shader source\n var vs = FSS.WebGLRenderer.VS(lights);\n var fs = FSS.WebGLRenderer.FS(lights);\n\n // Derive the shader fingerprint\n var code = vs + fs;\n\n // Check if the program has already been compiled\n if (!!this.program && this.program.code === code) return;\n\n // Create the program and shaders\n var program = this.gl.createProgram();\n var vertexShader = this.buildShader(this.gl.VERTEX_SHADER, vs);\n var fragmentShader = this.buildShader(this.gl.FRAGMENT_SHADER, fs);\n\n // Attach an link the shader\n this.gl.attachShader(program, vertexShader);\n this.gl.attachShader(program, fragmentShader);\n this.gl.linkProgram(program);\n\n // Add error handling\n if (!this.gl.getProgramParameter(program, this.gl.LINK_STATUS)) {\n var error = this.gl.getError();\n var status = this.gl.getProgramParameter(program, this.gl.VALIDATE_STATUS);\n console.error('Could not initialise shader.\\nVALIDATE_STATUS: '+status+'\\nERROR: '+error);\n return null;\n }\n\n // Delete the shader\n this.gl.deleteShader(fragmentShader);\n this.gl.deleteShader(vertexShader);\n\n // Set the program code\n program.code = code;\n\n // Add the program attributes\n program.attributes = {\n side: this.buildBuffer(program, 'attribute', 'aSide', 1, 'f' ),\n position: this.buildBuffer(program, 'attribute', 'aPosition', 3, 'v3'),\n centroid: this.buildBuffer(program, 'attribute', 'aCentroid', 3, 'v3'),\n normal: this.buildBuffer(program, 'attribute', 'aNormal', 3, 'v3'),\n ambient: this.buildBuffer(program, 'attribute', 'aAmbient', 4, 'v4'),\n diffuse: this.buildBuffer(program, 'attribute', 'aDiffuse', 4, 'v4')\n };\n\n // Add the program uniforms\n program.uniforms = {\n resolution: this.buildBuffer(program, 'uniform', 'uResolution', 3, '3f', 1 ),\n lightPosition: this.buildBuffer(program, 'uniform', 'uLightPosition', 3, '3fv', lights),\n lightAmbient: this.buildBuffer(program, 'uniform', 'uLightAmbient', 4, '4fv', lights),\n lightDiffuse: this.buildBuffer(program, 'uniform', 'uLightDiffuse', 4, '4fv', lights)\n };\n\n // Set the renderer program\n this.program = program;\n\n // Enable program\n this.gl.useProgram(this.program);\n\n // Return the program\n return program;\n};\n\nFSS.WebGLRenderer.prototype.buildShader = function(type, source) {\n if (this.unsupported) return;\n\n // Create and compile shader\n var shader = this.gl.createShader(type);\n this.gl.shaderSource(shader, source);\n this.gl.compileShader(shader);\n\n // Add error handling\n if (!this.gl.getShaderParameter(shader, this.gl.COMPILE_STATUS)) {\n console.error(this.gl.getShaderInfoLog(shader));\n return null;\n }\n\n // Return the shader\n return shader;\n};\n\nFSS.WebGLRenderer.prototype.buildBuffer = function(program, type, identifier, size, structure, count) {\n var buffer = {buffer:this.gl.createBuffer(), size:size, structure:structure, data:null};\n\n // Set the location\n switch (type) {\n case 'attribute':\n buffer.location = this.gl.getAttribLocation(program, identifier);\n break;\n case 'uniform':\n buffer.location = this.gl.getUniformLocation(program, identifier);\n break;\n }\n\n // Create the buffer if count is provided\n if (!!count) {\n buffer.data = new FSS.Array(count*size);\n }\n\n // Return the buffer\n return buffer;\n};\n\nFSS.WebGLRenderer.VS = function(lights) {\n var shader = [\n\n // Precision\n 'precision mediump float;',\n\n // Lights\n '#define LIGHTS ' + lights,\n\n // Attributes\n 'attribute float aSide;',\n 'attribute vec3 aPosition;',\n 'attribute vec3 aCentroid;',\n 'attribute vec3 aNormal;',\n 'attribute vec4 aAmbient;',\n 'attribute vec4 aDiffuse;',\n\n // Uniforms\n 'uniform vec3 uResolution;',\n 'uniform vec3 uLightPosition[LIGHTS];',\n 'uniform vec4 uLightAmbient[LIGHTS];',\n 'uniform vec4 uLightDiffuse[LIGHTS];',\n\n // Varyings\n 'varying vec4 vColor;',\n\n // Main\n 'void main() {',\n\n // Create color\n 'vColor = vec4(0.0);',\n\n // Calculate the vertex position\n 'vec3 position = aPosition / uResolution * 2.0;',\n\n // Iterate through lights\n 'for (int i = 0; i < LIGHTS; i++) {',\n 'vec3 lightPosition = uLightPosition[i];',\n 'vec4 lightAmbient = uLightAmbient[i];',\n 'vec4 lightDiffuse = uLightDiffuse[i];',\n\n // Calculate illuminance\n 'vec3 ray = normalize(lightPosition - aCentroid);',\n 'float illuminance = dot(aNormal, ray);',\n 'if (aSide == 0.0) {',\n 'illuminance = max(illuminance, 0.0);',\n '} else if (aSide == 1.0) {',\n 'illuminance = abs(min(illuminance, 0.0));',\n '} else if (aSide == 2.0) {',\n 'illuminance = max(abs(illuminance), 0.0);',\n '}',\n\n // Calculate ambient light\n 'vColor += aAmbient * lightAmbient;',\n\n // Calculate diffuse light\n 'vColor += aDiffuse * lightDiffuse * illuminance;',\n '}',\n\n // Clamp color\n 'vColor = clamp(vColor, 0.0, 1.0);',\n\n // Set gl_Position\n 'gl_Position = vec4(position, 1.0);',\n\n '}'\n\n // Return the shader\n ].join('\\n');\n return shader;\n};\n\nFSS.WebGLRenderer.FS = function(lights) {\n var shader = [\n\n // Precision\n 'precision mediump float;',\n\n // Varyings\n 'varying vec4 vColor;',\n\n // Main\n 'void main() {',\n\n // Set gl_FragColor\n 'gl_FragColor = vColor;',\n\n '}'\n\n // Return the shader\n ].join('\\n');\n return shader;\n};\n\n/**\n * @class SVG Renderer\n * @author Matthew Wagerfield\n */\nFSS.SVGRenderer = function() {\n FSS.Renderer.call(this);\n this.element = document.createElementNS(FSS.SVGNS, 'svg');\n this.element.setAttribute('xmlns', FSS.SVGNS);\n this.element.setAttribute('version', '1.1');\n this.element.style.display = 'block';\n this.setSize(300, 150);\n};\n\nFSS.SVGRenderer.prototype = Object.create(FSS.Renderer.prototype);\n\nFSS.SVGRenderer.prototype.setSize = function(width, height) {\n FSS.Renderer.prototype.setSize.call(this, width, height);\n this.element.setAttribute('width', width);\n this.element.setAttribute('height', height);\n return this;\n};\n\nFSS.SVGRenderer.prototype.clear = function() {\n FSS.Renderer.prototype.clear.call(this);\n for (var i = this.element.childNodes.length - 1; i >= 0; i--) {\n this.element.removeChild(this.element.childNodes[i]);\n }\n return this;\n};\n\nFSS.SVGRenderer.prototype.render = function(scene) {\n FSS.Renderer.prototype.render.call(this, scene);\n var m,mesh, t,triangle, points, style;\n\n // Update Meshes\n for (m = scene.meshes.length - 1; m >= 0; m--) {\n mesh = scene.meshes[m];\n if (mesh.visible) {\n mesh.update(scene.lights, true);\n\n // Render Triangles\n for (t = mesh.geometry.triangles.length - 1; t >= 0; t--) {\n triangle = mesh.geometry.triangles[t];\n if (triangle.polygon.parentNode !== this.element) {\n this.element.appendChild(triangle.polygon);\n }\n points = this.formatPoint(triangle.a)+' ';\n points += this.formatPoint(triangle.b)+' ';\n points += this.formatPoint(triangle.c);\n style = this.formatStyle(triangle.color.format());\n triangle.polygon.setAttributeNS(null, 'points', points);\n triangle.polygon.setAttributeNS(null, 'style', style);\n }\n }\n }\n return this;\n};\n\nFSS.SVGRenderer.prototype.formatPoint = function(vertex) {\n return (this.halfWidth+vertex.position[0])+','+(this.halfHeight-vertex.position[1]);\n};\n\nFSS.SVGRenderer.prototype.formatStyle = function(color) {\n var style = 'fill:'+color+';';\n style += 'stroke:'+color+';';\n return style;\n};\n\n\n\n////////////////////////////////\n////////////////////////////////\n////////////////////////////////\n\n\n(function(){\n if(!document.getElementById('ffshadeoutput')){\n return false;\n }\n //------------------------------\n // Mesh Properties\n //------------------------------\n var MESH = {\n width: 1.8,\n height: 1.8,\n depth: 10,\n segments: 16,\n slices: 8,\n xRange: 0.8,\n yRange: 0.1,\n zRange: 1.0,\n ambient: '#555555',\n diffuse: '#696969',\n speed: 0.0001\n };\n\n //------------------------------\n // Light Properties\n //------------------------------\n var LIGHT = {\n count: 2,\n xyScalar: 1,\n zOffset: 100,\n ambient: '#1C2B36',\n diffuse: '#3BC0C3',\n speed: 0.0002,\n gravity: 500,\n dampening: 0.95,\n minLimit: 10,\n maxLimit: null,\n minDistance: 20,\n maxDistance: 400,\n autopilot: true,\n draw: false,\n bounds: FSS.Vector3.create(),\n step: FSS.Vector3.create(\n Math.randomInRange(0.2, 1.0),\n Math.randomInRange(0.2, 1.0),\n Math.randomInRange(0.2, 1.0)\n )\n };\n\n //------------------------------\n // Render Properties\n //------------------------------\n\n var RENDER = {\n renderer: 'canvas'\n };\n\n //------------------------------\n // Global Properties\n //------------------------------\n var now, start = Date.now();\n var center = FSS.Vector3.create();\n var attractor = FSS.Vector3.create();\n var container = document.getElementById('ffshade');\n var output = document.getElementById('ffshadeoutput');\n var renderer, scene, mesh, geometry, material;\n var canvasRenderer;\n var gui, autopilotController;\n //------------------------------\n // Methods\n //------------------------------\n function initialise() {\n createRenderer();\n createScene();\n createMesh();\n createLights();\n addEventListeners();\n resize(container.offsetWidth, container.offsetHeight);\n animate();\n }\n\n function createRenderer() {\n canvasRenderer = new FSS.CanvasRenderer();\n setRenderer(RENDER.renderer);\n }\n\n function setRenderer(index) {\n if (renderer) {\n output.removeChild(renderer.element);\n }\n\n renderer = canvasRenderer;\n\n renderer.setSize(container.offsetWidth, container.offsetHeight);\n output.appendChild(renderer.element);\n }\n\n function createScene() {\n scene = new FSS.Scene();\n }\n\n function createMesh() {\n scene.remove(mesh);\n renderer.clear();\n geometry = new FSS.Plane(MESH.width * renderer.width, MESH.height * renderer.height, MESH.segments, MESH.slices);\n material = new FSS.Material(MESH.ambient, MESH.diffuse);\n mesh = new FSS.Mesh(geometry, material);\n scene.add(mesh);\n\n // Augment vertices for animation\n var v, vertex;\n for (v = geometry.vertices.length - 1; v >= 0; v--) {\n vertex = geometry.vertices[v];\n vertex.anchor = FSS.Vector3.clone(vertex.position);\n vertex.step = FSS.Vector3.create(\n Math.randomInRange(0.2, 1.0),\n Math.randomInRange(0.2, 1.0),\n Math.randomInRange(0.2, 1.0)\n );\n vertex.time = Math.randomInRange(0, Math.PIM2);\n }\n }\n\n function createLights() {\n var l, light;\n for (l = scene.lights.length - 1; l >= 0; l--) {\n light = scene.lights[l];\n scene.remove(light);\n }\n renderer.clear();\n for (l = 0; l < LIGHT.count; l++) {\n light = new FSS.Light(LIGHT.ambient, LIGHT.diffuse);\n light.ambientHex = light.ambient.format();\n light.diffuseHex = light.diffuse.format();\n scene.add(light);\n\n // Augment light for animation\n light.mass = Math.randomInRange(0.5, 1);\n light.velocity = FSS.Vector3.create();\n light.acceleration = FSS.Vector3.create();\n light.force = FSS.Vector3.create();\n\n // Ring SVG Circle\n light.ring = document.createElementNS(FSS.SVGNS, 'circle');\n light.ring.setAttributeNS(null, 'stroke', light.ambientHex);\n light.ring.setAttributeNS(null, 'stroke-width', '0.5');\n light.ring.setAttributeNS(null, 'fill', 'none');\n light.ring.setAttributeNS(null, 'r', '10');\n\n // Core SVG Circle\n light.core = document.createElementNS(FSS.SVGNS, 'circle');\n light.core.setAttributeNS(null, 'fill', light.diffuseHex);\n light.core.setAttributeNS(null, 'r', '4');\n }\n }\n\n function resize(width, height) {\n renderer.setSize(width, height);\n FSS.Vector3.set(center, renderer.halfWidth, renderer.halfHeight);\n createMesh();\n }\n\n function animate() {\n now = Date.now() - start;\n update();\n render();\n requestAnimationFrame(animate);\n }\n\n function update() {\n var ox, oy, oz, l, light, v, vertex, offset = MESH.depth/2;\n\n // Update Bounds\n FSS.Vector3.copy(LIGHT.bounds, center);\n FSS.Vector3.multiplyScalar(LIGHT.bounds, LIGHT.xyScalar);\n\n // Update Attractor\n FSS.Vector3.setZ(attractor, LIGHT.zOffset);\n\n // Overwrite the Attractor position\n if (LIGHT.autopilot) {\n ox = Math.sin(LIGHT.step[0] * now * LIGHT.speed);\n oy = Math.cos(LIGHT.step[1] * now * LIGHT.speed);\n FSS.Vector3.set(attractor,\n LIGHT.bounds[0]*ox,\n LIGHT.bounds[1]*oy,\n LIGHT.zOffset);\n }\n\n // Animate Lights\n for (l = scene.lights.length - 1; l >= 0; l--) {\n light = scene.lights[l];\n\n // Reset the z position of the light\n FSS.Vector3.setZ(light.position, LIGHT.zOffset);\n\n // Calculate the force Luke!\n var D = Math.clamp(FSS.Vector3.distanceSquared(light.position, attractor), LIGHT.minDistance, LIGHT.maxDistance);\n var F = LIGHT.gravity * light.mass / D;\n FSS.Vector3.subtractVectors(light.force, attractor, light.position);\n FSS.Vector3.normalise(light.force);\n FSS.Vector3.multiplyScalar(light.force, F);\n\n // Update the light position\n FSS.Vector3.set(light.acceleration);\n FSS.Vector3.add(light.acceleration, light.force);\n FSS.Vector3.add(light.velocity, light.acceleration);\n FSS.Vector3.multiplyScalar(light.velocity, LIGHT.dampening);\n FSS.Vector3.limit(light.velocity, LIGHT.minLimit, LIGHT.maxLimit);\n FSS.Vector3.add(light.position, light.velocity);\n }\n\n // Animate Vertices\n for (v = geometry.vertices.length - 1; v >= 0; v--) {\n vertex = geometry.vertices[v];\n ox = Math.sin(vertex.time + vertex.step[0] * now * MESH.speed);\n oy = Math.cos(vertex.time + vertex.step[1] * now * MESH.speed);\n oz = Math.sin(vertex.time + vertex.step[2] * now * MESH.speed);\n FSS.Vector3.set(vertex.position,\n MESH.xRange*geometry.segmentWidth*ox,\n MESH.yRange*geometry.sliceHeight*oy,\n MESH.zRange*offset*oz - offset);\n FSS.Vector3.add(vertex.position, vertex.anchor);\n }\n\n // Set the Geometry to dirty\n geometry.dirty = true;\n }\n\n function render() {\n renderer.render(scene);\n\n // Draw Lights\n if (LIGHT.draw) {\n var l, lx, ly, light;\n for (l = scene.lights.length - 1; l >= 0; l--) {\n light = scene.lights[l];\n lx = light.position[0];\n ly = light.position[1];\n renderer.context.lineWidth = 0.5;\n renderer.context.beginPath();\n renderer.context.arc(lx, ly, 10, 0, Math.PIM2);\n renderer.context.strokeStyle = light.ambientHex;\n renderer.context.stroke();\n renderer.context.beginPath();\n renderer.context.arc(lx, ly, 4, 0, Math.PIM2);\n renderer.context.fillStyle = light.diffuseHex;\n renderer.context.fill();\n \n }\n }\n }\n\n function addEventListeners() {\n window.addEventListener('resize', onWindowResize);\n //container.addEventListener('mousemove', onMouseMove);\n }\n\n //------------------------------\n // Callbacks\n //------------------------------\n\n function onMouseMove(event) {\n FSS.Vector3.set(attractor, event.x, renderer.height - event.y);\n FSS.Vector3.subtract(attractor, center);\n }\n\n function onWindowResize(event) {\n resize(container.offsetWidth, container.offsetHeight);\n render();\n }\n\n\n // Let there be light!\n if(output !== null){\n //initialise();\n window.initFFS = initialise;\n }\n\n})(); "]}