Skip to content

Instantly share code, notes, and snippets.

@iwillig
Created September 24, 2014 18:40
Show Gist options
  • Save iwillig/ec9dd148da4110ce972e to your computer and use it in GitHub Desktop.
Save iwillig/ec9dd148da4110ce972e to your computer and use it in GitHub Desktop.
{
"version": 3,
"sources": [
"/home/ivan/dev/mapzen/tangram/node_modules/browserify/node_modules/browser-pack/_prelude.js",
"/home/ivan/dev/mapzen/tangram/node_modules/gl-matrix/dist/gl-matrix.js",
"/home/ivan/dev/mapzen/tangram/node_modules/queue-async/queue.js",
"/home/ivan/dev/mapzen/tangram/src/geo.js",
"/home/ivan/dev/mapzen/tangram/src/gl/gl.js",
"/home/ivan/dev/mapzen/tangram/src/gl/gl_builders.js",
"/home/ivan/dev/mapzen/tangram/src/gl/gl_geom.js",
"/home/ivan/dev/mapzen/tangram/src/gl/gl_modes.js",
"/home/ivan/dev/mapzen/tangram/src/gl/gl_program.js",
"/home/ivan/dev/mapzen/tangram/src/gl/gl_shaders.js",
"/home/ivan/dev/mapzen/tangram/src/gl/gl_texture.js",
"/home/ivan/dev/mapzen/tangram/src/gl/gl_vertex_layout.js",
"/home/ivan/dev/mapzen/tangram/src/leaflet_layer.js",
"/home/ivan/dev/mapzen/tangram/src/module.js",
"/home/ivan/dev/mapzen/tangram/src/point.js",
"/home/ivan/dev/mapzen/tangram/src/scene.js",
"/home/ivan/dev/mapzen/tangram/src/style.js",
"/home/ivan/dev/mapzen/tangram/src/utils.js",
"/home/ivan/dev/mapzen/tangram/src/vector.js"
],
"names": [],
"mappings": "AAAA;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/xHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/EA;;;;;;;;EAAO,MAAI;AAEJ,AAAI,EAAA,CAAA,GAAE,EAAI,GAAC,CAAC;AAGnB,EAAE,UAAU,EAAI,IAAE,CAAC;AACnB,EAAE,0BAA0B,EAAI,mBAAiB,CAAC;AAClD,EAAE,kBAAkB,EAAI,CAAA,KAAI,AAAC,CAAC,CAAC,GAAE,0BAA0B,CAAG,CAAA,GAAE,0BAA0B,CAAC,CAAC;AAC5F,EAAE,0BAA0B,EAAI,CAAA,GAAE,0BAA0B,EAAI,EAAA,CAAA,CAAI,CAAA,GAAE,UAAU,CAAC;AACjF,EAAE,iBAAiB,EAAI,GAAC,CAAC;AACzB,EAAE,SAAS,EAAI,GAAC,CAAC;AACjB,IAAS,GAAA,CAAA,CAAA,EAAE,EAAA,CAAG,CAAA,CAAA,GAAK,CAAA,GAAE,SAAS,CAAG,CAAA,CAAA,EAAE,CAAG;AAClC,IAAE,iBAAiB,CAAE,CAAA,CAAC,EAAI,CAAA,GAAE,0BAA0B,EAAI,CAAA,IAAG,IAAI,AAAC,CAAC,CAAA,CAAG,EAAA,CAAC,CAAC;AAC5E;AAAA,AAGA,EAAE,gBAAgB,EAAI,GAAC,CAAC;AACxB,EAAE,a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",
"file": "generated.js",
"sourceRoot": "",
"sourcesContent": [
"(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error(\"Cannot find module '\"+o+\"'\")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})",
"/**\n * @fileoverview gl-matrix - High performance matrix and vector operations\n * @author Brandon Jones\n * @author Colin MacKenzie IV\n * @version 2.1.0\n */\n\n/* Copyright (c) 2013, Brandon Jones, Colin MacKenzie IV. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation \n and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE \nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */\n\n\n(function() {\n \"use strict\";\n\n var shim = {};\n if (typeof(exports) === 'undefined') {\n if(typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n shim.exports = {};\n define(function() {\n return shim.exports;\n });\n } else {\n // gl-matrix lives in a browser, define its namespaces in global\n shim.exports = window;\n } \n }\n else {\n // gl-matrix lives in commonjs, define its namespaces in exports\n shim.exports = exports;\n }\n\n (function(exports) {\n /* Copyright (c) 2013, Brandon Jones, Colin MacKenzie IV. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation \n and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE \nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */\n\n\nif(!GLMAT_EPSILON) {\n var GLMAT_EPSILON = 0.000001;\n}\n\nif(!GLMAT_ARRAY_TYPE) {\n var GLMAT_ARRAY_TYPE = (typeof Float32Array !== 'undefined') ? Float32Array : Array;\n}\n\n/**\n * @class Common utilities\n * @name glMatrix\n */\nvar glMatrix = {};\n\n/**\n * Sets the type of array used when creating new vectors and matricies\n *\n * @param {Type} type Array type, such as Float32Array or Array\n */\nglMatrix.setMatrixArrayType = function(type) {\n GLMAT_ARRAY_TYPE = type;\n}\n\nif(typeof(exports) !== 'undefined') {\n exports.glMatrix = glMatrix;\n}\n;\n/* Copyright (c) 2013, Brandon Jones, Colin MacKenzie IV. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation \n and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE \nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */\n\n/**\n * @class 2 Dimensional Vector\n * @name vec2\n */\n\nvar vec2 = {};\n\n/**\n * Creates a new, empty vec2\n *\n * @returns {vec2} a new 2D vector\n */\nvec2.create = function() {\n var out = new GLMAT_ARRAY_TYPE(2);\n out[0] = 0;\n out[1] = 0;\n return out;\n};\n\n/**\n * Creates a new vec2 initialized with values from an existing vector\n *\n * @param {vec2} a vector to clone\n * @returns {vec2} a new 2D vector\n */\nvec2.clone = function(a) {\n var out = new GLMAT_ARRAY_TYPE(2);\n out[0] = a[0];\n out[1] = a[1];\n return out;\n};\n\n/**\n * Creates a new vec2 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @returns {vec2} a new 2D vector\n */\nvec2.fromValues = function(x, y) {\n var out = new GLMAT_ARRAY_TYPE(2);\n out[0] = x;\n out[1] = y;\n return out;\n};\n\n/**\n * Copy the values from one vec2 to another\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the source vector\n * @returns {vec2} out\n */\nvec2.copy = function(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n return out;\n};\n\n/**\n * Set the components of a vec2 to the given values\n *\n * @param {vec2} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @returns {vec2} out\n */\nvec2.set = function(out, x, y) {\n out[0] = x;\n out[1] = y;\n return out;\n};\n\n/**\n * Adds two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\nvec2.add = function(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n return out;\n};\n\n/**\n * Subtracts two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\nvec2.subtract = function(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n return out;\n};\n\n/**\n * Alias for {@link vec2.subtract}\n * @function\n */\nvec2.sub = vec2.subtract;\n\n/**\n * Multiplies two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\nvec2.multiply = function(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n return out;\n};\n\n/**\n * Alias for {@link vec2.multiply}\n * @function\n */\nvec2.mul = vec2.multiply;\n\n/**\n * Divides two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\nvec2.divide = function(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n return out;\n};\n\n/**\n * Alias for {@link vec2.divide}\n * @function\n */\nvec2.div = vec2.divide;\n\n/**\n * Returns the minimum of two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\nvec2.min = function(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n return out;\n};\n\n/**\n * Returns the maximum of two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\nvec2.max = function(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n return out;\n};\n\n/**\n * Scales a vec2 by a scalar number\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec2} out\n */\nvec2.scale = function(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n return out;\n};\n\n/**\n * Calculates the euclidian distance between two vec2's\n *\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {Number} distance between a and b\n */\nvec2.distance = function(a, b) {\n var x = b[0] - a[0],\n y = b[1] - a[1];\n return Math.sqrt(x*x + y*y);\n};\n\n/**\n * Alias for {@link vec2.distance}\n * @function\n */\nvec2.dist = vec2.distance;\n\n/**\n * Calculates the squared euclidian distance between two vec2's\n *\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {Number} squared distance between a and b\n */\nvec2.squaredDistance = function(a, b) {\n var x = b[0] - a[0],\n y = b[1] - a[1];\n return x*x + y*y;\n};\n\n/**\n * Alias for {@link vec2.squaredDistance}\n * @function\n */\nvec2.sqrDist = vec2.squaredDistance;\n\n/**\n * Calculates the length of a vec2\n *\n * @param {vec2} a vector to calculate length of\n * @returns {Number} length of a\n */\nvec2.length = function (a) {\n var x = a[0],\n y = a[1];\n return Math.sqrt(x*x + y*y);\n};\n\n/**\n * Alias for {@link vec2.length}\n * @function\n */\nvec2.len = vec2.length;\n\n/**\n * Calculates the squared length of a vec2\n *\n * @param {vec2} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\nvec2.squaredLength = function (a) {\n var x = a[0],\n y = a[1];\n return x*x + y*y;\n};\n\n/**\n * Alias for {@link vec2.squaredLength}\n * @function\n */\nvec2.sqrLen = vec2.squaredLength;\n\n/**\n * Negates the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a vector to negate\n * @returns {vec2} out\n */\nvec2.negate = function(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n return out;\n};\n\n/**\n * Normalize a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a vector to normalize\n * @returns {vec2} out\n */\nvec2.normalize = function(out, a) {\n var x = a[0],\n y = a[1];\n var len = x*x + y*y;\n if (len > 0) {\n //TODO: evaluate use of glm_invsqrt here?\n len = 1 / Math.sqrt(len);\n out[0] = a[0] * len;\n out[1] = a[1] * len;\n }\n return out;\n};\n\n/**\n * Calculates the dot product of two vec2's\n *\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {Number} dot product of a and b\n */\nvec2.dot = function (a, b) {\n return a[0] * b[0] + a[1] * b[1];\n};\n\n/**\n * Computes the cross product of two vec2's\n * Note that the cross product must by definition produce a 3D vector\n *\n * @param {vec3} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec3} out\n */\nvec2.cross = function(out, a, b) {\n var z = a[0] * b[1] - a[1] * b[0];\n out[0] = out[1] = 0;\n out[2] = z;\n return out;\n};\n\n/**\n * Performs a linear interpolation between two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {vec2} out\n */\nvec2.lerp = function (out, a, b, t) {\n var ax = a[0],\n ay = a[1];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n return out;\n};\n\n/**\n * Transforms the vec2 with a mat2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the vector to transform\n * @param {mat2} m matrix to transform with\n * @returns {vec2} out\n */\nvec2.transformMat2 = function(out, a, m) {\n var x = a[0],\n y = a[1];\n out[0] = m[0] * x + m[2] * y;\n out[1] = m[1] * x + m[3] * y;\n return out;\n};\n\n/**\n * Transforms the vec2 with a mat2d\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the vector to transform\n * @param {mat2d} m matrix to transform with\n * @returns {vec2} out\n */\nvec2.transformMat2d = function(out, a, m) {\n var x = a[0],\n y = a[1];\n out[0] = m[0] * x + m[2] * y + m[4];\n out[1] = m[1] * x + m[3] * y + m[5];\n return out;\n};\n\n/**\n * Transforms the vec2 with a mat3\n * 3rd vector component is implicitly '1'\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the vector to transform\n * @param {mat3} m matrix to transform with\n * @returns {vec2} out\n */\nvec2.transformMat3 = function(out, a, m) {\n var x = a[0],\n y = a[1];\n out[0] = m[0] * x + m[3] * y + m[6];\n out[1] = m[1] * x + m[4] * y + m[7];\n return out;\n};\n\n/**\n * Transforms the vec2 with a mat4\n * 3rd vector component is implicitly '0'\n * 4th vector component is implicitly '1'\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the vector to transform\n * @param {mat4} m matrix to transform with\n * @returns {vec2} out\n */\nvec2.transformMat4 = function(out, a, m) {\n var x = a[0], \n y = a[1];\n out[0] = m[0] * x + m[4] * y + m[12];\n out[1] = m[1] * x + m[5] * y + m[13];\n return out;\n};\n\n/**\n * Perform some operation over an array of vec2s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec2. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec2s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\nvec2.forEach = (function() {\n var vec = vec2.create();\n\n return function(a, stride, offset, count, fn, arg) {\n var i, l;\n if(!stride) {\n stride = 2;\n }\n\n if(!offset) {\n offset = 0;\n }\n \n if(count) {\n l = Math.min((count * stride) + offset, a.length);\n } else {\n l = a.length;\n }\n\n for(i = offset; i < l; i += stride) {\n vec[0] = a[i]; vec[1] = a[i+1];\n fn(vec, vec, arg);\n a[i] = vec[0]; a[i+1] = vec[1];\n }\n \n return a;\n };\n})();\n\n/**\n * Returns a string representation of a vector\n *\n * @param {vec2} vec vector to represent as a string\n * @returns {String} string representation of the vector\n */\nvec2.str = function (a) {\n return 'vec2(' + a[0] + ', ' + a[1] + ')';\n};\n\nif(typeof(exports) !== 'undefined') {\n exports.vec2 = vec2;\n}\n;\n/* Copyright (c) 2013, Brandon Jones, Colin MacKenzie IV. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation \n and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE \nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */\n\n/**\n * @class 3 Dimensional Vector\n * @name vec3\n */\n\nvar vec3 = {};\n\n/**\n * Creates a new, empty vec3\n *\n * @returns {vec3} a new 3D vector\n */\nvec3.create = function() {\n var out = new GLMAT_ARRAY_TYPE(3);\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n return out;\n};\n\n/**\n * Creates a new vec3 initialized with values from an existing vector\n *\n * @param {vec3} a vector to clone\n * @returns {vec3} a new 3D vector\n */\nvec3.clone = function(a) {\n var out = new GLMAT_ARRAY_TYPE(3);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n};\n\n/**\n * Creates a new vec3 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} a new 3D vector\n */\nvec3.fromValues = function(x, y, z) {\n var out = new GLMAT_ARRAY_TYPE(3);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n};\n\n/**\n * Copy the values from one vec3 to another\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the source vector\n * @returns {vec3} out\n */\nvec3.copy = function(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n};\n\n/**\n * Set the components of a vec3 to the given values\n *\n * @param {vec3} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} out\n */\nvec3.set = function(out, x, y, z) {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n};\n\n/**\n * Adds two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\nvec3.add = function(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n return out;\n};\n\n/**\n * Subtracts two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\nvec3.subtract = function(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n return out;\n};\n\n/**\n * Alias for {@link vec3.subtract}\n * @function\n */\nvec3.sub = vec3.subtract;\n\n/**\n * Multiplies two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\nvec3.multiply = function(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n out[2] = a[2] * b[2];\n return out;\n};\n\n/**\n * Alias for {@link vec3.multiply}\n * @function\n */\nvec3.mul = vec3.multiply;\n\n/**\n * Divides two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\nvec3.divide = function(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n out[2] = a[2] / b[2];\n return out;\n};\n\n/**\n * Alias for {@link vec3.divide}\n * @function\n */\nvec3.div = vec3.divide;\n\n/**\n * Returns the minimum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\nvec3.min = function(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n out[2] = Math.min(a[2], b[2]);\n return out;\n};\n\n/**\n * Returns the maximum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\nvec3.max = function(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n out[2] = Math.max(a[2], b[2]);\n return out;\n};\n\n/**\n * Scales a vec3 by a scalar number\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec3} out\n */\nvec3.scale = function(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n return out;\n};\n\n/**\n * Calculates the euclidian distance between two vec3's\n *\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {Number} distance between a and b\n */\nvec3.distance = function(a, b) {\n var x = b[0] - a[0],\n y = b[1] - a[1],\n z = b[2] - a[2];\n return Math.sqrt(x*x + y*y + z*z);\n};\n\n/**\n * Alias for {@link vec3.distance}\n * @function\n */\nvec3.dist = vec3.distance;\n\n/**\n * Calculates the squared euclidian distance between two vec3's\n *\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {Number} squared distance between a and b\n */\nvec3.squaredDistance = function(a, b) {\n var x = b[0] - a[0],\n y = b[1] - a[1],\n z = b[2] - a[2];\n return x*x + y*y + z*z;\n};\n\n/**\n * Alias for {@link vec3.squaredDistance}\n * @function\n */\nvec3.sqrDist = vec3.squaredDistance;\n\n/**\n * Calculates the length of a vec3\n *\n * @param {vec3} a vector to calculate length of\n * @returns {Number} length of a\n */\nvec3.length = function (a) {\n var x = a[0],\n y = a[1],\n z = a[2];\n return Math.sqrt(x*x + y*y + z*z);\n};\n\n/**\n * Alias for {@link vec3.length}\n * @function\n */\nvec3.len = vec3.length;\n\n/**\n * Calculates the squared length of a vec3\n *\n * @param {vec3} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\nvec3.squaredLength = function (a) {\n var x = a[0],\n y = a[1],\n z = a[2];\n return x*x + y*y + z*z;\n};\n\n/**\n * Alias for {@link vec3.squaredLength}\n * @function\n */\nvec3.sqrLen = vec3.squaredLength;\n\n/**\n * Negates the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a vector to negate\n * @returns {vec3} out\n */\nvec3.negate = function(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n return out;\n};\n\n/**\n * Normalize a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a vector to normalize\n * @returns {vec3} out\n */\nvec3.normalize = function(out, a) {\n var x = a[0],\n y = a[1],\n z = a[2];\n var len = x*x + y*y + z*z;\n if (len > 0) {\n //TODO: evaluate use of glm_invsqrt here?\n len = 1 / Math.sqrt(len);\n out[0] = a[0] * len;\n out[1] = a[1] * len;\n out[2] = a[2] * len;\n }\n return out;\n};\n\n/**\n * Calculates the dot product of two vec3's\n *\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {Number} dot product of a and b\n */\nvec3.dot = function (a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n};\n\n/**\n * Computes the cross product of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\nvec3.cross = function(out, a, b) {\n var ax = a[0], ay = a[1], az = a[2],\n bx = b[0], by = b[1], bz = b[2];\n\n out[0] = ay * bz - az * by;\n out[1] = az * bx - ax * bz;\n out[2] = ax * by - ay * bx;\n return out;\n};\n\n/**\n * Performs a linear interpolation between two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {vec3} out\n */\nvec3.lerp = function (out, a, b, t) {\n var ax = a[0],\n ay = a[1],\n az = a[2];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n out[2] = az + t * (b[2] - az);\n return out;\n};\n\n/**\n * Transforms the vec3 with a mat4.\n * 4th vector component is implicitly '1'\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the vector to transform\n * @param {mat4} m matrix to transform with\n * @returns {vec3} out\n */\nvec3.transformMat4 = function(out, a, m) {\n var x = a[0], y = a[1], z = a[2];\n out[0] = m[0] * x + m[4] * y + m[8] * z + m[12];\n out[1] = m[1] * x + m[5] * y + m[9] * z + m[13];\n out[2] = m[2] * x + m[6] * y + m[10] * z + m[14];\n return out;\n};\n\n/**\n * Transforms the vec3 with a quat\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the vector to transform\n * @param {quat} q quaternion to transform with\n * @returns {vec3} out\n */\nvec3.transformQuat = function(out, a, q) {\n var x = a[0], y = a[1], z = a[2],\n qx = q[0], qy = q[1], qz = q[2], qw = q[3],\n\n // calculate quat * vec\n ix = qw * x + qy * z - qz * y,\n iy = qw * y + qz * x - qx * z,\n iz = qw * z + qx * y - qy * x,\n iw = -qx * x - qy * y - qz * z;\n\n // calculate result * inverse quat\n out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;\n out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;\n out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;\n return out;\n};\n\n/**\n * Perform some operation over an array of vec3s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\nvec3.forEach = (function() {\n var vec = vec3.create();\n\n return function(a, stride, offset, count, fn, arg) {\n var i, l;\n if(!stride) {\n stride = 3;\n }\n\n if(!offset) {\n offset = 0;\n }\n \n if(count) {\n l = Math.min((count * stride) + offset, a.length);\n } else {\n l = a.length;\n }\n\n for(i = offset; i < l; i += stride) {\n vec[0] = a[i]; vec[1] = a[i+1]; vec[2] = a[i+2];\n fn(vec, vec, arg);\n a[i] = vec[0]; a[i+1] = vec[1]; a[i+2] = vec[2];\n }\n \n return a;\n };\n})();\n\n/**\n * Returns a string representation of a vector\n *\n * @param {vec3} vec vector to represent as a string\n * @returns {String} string representation of the vector\n */\nvec3.str = function (a) {\n return 'vec3(' + a[0] + ', ' + a[1] + ', ' + a[2] + ')';\n};\n\nif(typeof(exports) !== 'undefined') {\n exports.vec3 = vec3;\n}\n;\n/* Copyright (c) 2013, Brandon Jones, Colin MacKenzie IV. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation \n and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE \nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */\n\n/**\n * @class 4 Dimensional Vector\n * @name vec4\n */\n\nvar vec4 = {};\n\n/**\n * Creates a new, empty vec4\n *\n * @returns {vec4} a new 4D vector\n */\nvec4.create = function() {\n var out = new GLMAT_ARRAY_TYPE(4);\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n return out;\n};\n\n/**\n * Creates a new vec4 initialized with values from an existing vector\n *\n * @param {vec4} a vector to clone\n * @returns {vec4} a new 4D vector\n */\nvec4.clone = function(a) {\n var out = new GLMAT_ARRAY_TYPE(4);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n};\n\n/**\n * Creates a new vec4 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {vec4} a new 4D vector\n */\nvec4.fromValues = function(x, y, z, w) {\n var out = new GLMAT_ARRAY_TYPE(4);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = w;\n return out;\n};\n\n/**\n * Copy the values from one vec4 to another\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the source vector\n * @returns {vec4} out\n */\nvec4.copy = function(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n};\n\n/**\n * Set the components of a vec4 to the given values\n *\n * @param {vec4} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {vec4} out\n */\nvec4.set = function(out, x, y, z, w) {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = w;\n return out;\n};\n\n/**\n * Adds two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {vec4} out\n */\nvec4.add = function(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n return out;\n};\n\n/**\n * Subtracts two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {vec4} out\n */\nvec4.subtract = function(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n return out;\n};\n\n/**\n * Alias for {@link vec4.subtract}\n * @function\n */\nvec4.sub = vec4.subtract;\n\n/**\n * Multiplies two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {vec4} out\n */\nvec4.multiply = function(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n out[2] = a[2] * b[2];\n out[3] = a[3] * b[3];\n return out;\n};\n\n/**\n * Alias for {@link vec4.multiply}\n * @function\n */\nvec4.mul = vec4.multiply;\n\n/**\n * Divides two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {vec4} out\n */\nvec4.divide = function(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n out[2] = a[2] / b[2];\n out[3] = a[3] / b[3];\n return out;\n};\n\n/**\n * Alias for {@link vec4.divide}\n * @function\n */\nvec4.div = vec4.divide;\n\n/**\n * Returns the minimum of two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {vec4} out\n */\nvec4.min = function(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n out[2] = Math.min(a[2], b[2]);\n out[3] = Math.min(a[3], b[3]);\n return out;\n};\n\n/**\n * Returns the maximum of two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {vec4} out\n */\nvec4.max = function(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n out[2] = Math.max(a[2], b[2]);\n out[3] = Math.max(a[3], b[3]);\n return out;\n};\n\n/**\n * Scales a vec4 by a scalar number\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec4} out\n */\nvec4.scale = function(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n return out;\n};\n\n/**\n * Calculates the euclidian distance between two vec4's\n *\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {Number} distance between a and b\n */\nvec4.distance = function(a, b) {\n var x = b[0] - a[0],\n y = b[1] - a[1],\n z = b[2] - a[2],\n w = b[3] - a[3];\n return Math.sqrt(x*x + y*y + z*z + w*w);\n};\n\n/**\n * Alias for {@link vec4.distance}\n * @function\n */\nvec4.dist = vec4.distance;\n\n/**\n * Calculates the squared euclidian distance between two vec4's\n *\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {Number} squared distance between a and b\n */\nvec4.squaredDistance = function(a, b) {\n var x = b[0] - a[0],\n y = b[1] - a[1],\n z = b[2] - a[2],\n w = b[3] - a[3];\n return x*x + y*y + z*z + w*w;\n};\n\n/**\n * Alias for {@link vec4.squaredDistance}\n * @function\n */\nvec4.sqrDist = vec4.squaredDistance;\n\n/**\n * Calculates the length of a vec4\n *\n * @param {vec4} a vector to calculate length of\n * @returns {Number} length of a\n */\nvec4.length = function (a) {\n var x = a[0],\n y = a[1],\n z = a[2],\n w = a[3];\n return Math.sqrt(x*x + y*y + z*z + w*w);\n};\n\n/**\n * Alias for {@link vec4.length}\n * @function\n */\nvec4.len = vec4.length;\n\n/**\n * Calculates the squared length of a vec4\n *\n * @param {vec4} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\nvec4.squaredLength = function (a) {\n var x = a[0],\n y = a[1],\n z = a[2],\n w = a[3];\n return x*x + y*y + z*z + w*w;\n};\n\n/**\n * Alias for {@link vec4.squaredLength}\n * @function\n */\nvec4.sqrLen = vec4.squaredLength;\n\n/**\n * Negates the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a vector to negate\n * @returns {vec4} out\n */\nvec4.negate = function(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n out[3] = -a[3];\n return out;\n};\n\n/**\n * Normalize a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a vector to normalize\n * @returns {vec4} out\n */\nvec4.normalize = function(out, a) {\n var x = a[0],\n y = a[1],\n z = a[2],\n w = a[3];\n var len = x*x + y*y + z*z + w*w;\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n out[0] = a[0] * len;\n out[1] = a[1] * len;\n out[2] = a[2] * len;\n out[3] = a[3] * len;\n }\n return out;\n};\n\n/**\n * Calculates the dot product of two vec4's\n *\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {Number} dot product of a and b\n */\nvec4.dot = function (a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];\n};\n\n/**\n * Performs a linear interpolation between two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {vec4} out\n */\nvec4.lerp = function (out, a, b, t) {\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n out[2] = az + t * (b[2] - az);\n out[3] = aw + t * (b[3] - aw);\n return out;\n};\n\n/**\n * Transforms the vec4 with a mat4.\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the vector to transform\n * @param {mat4} m matrix to transform with\n * @returns {vec4} out\n */\nvec4.transformMat4 = function(out, a, m) {\n var x = a[0], y = a[1], z = a[2], w = a[3];\n out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w;\n out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w;\n out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w;\n out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w;\n return out;\n};\n\n/**\n * Transforms the vec4 with a quat\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the vector to transform\n * @param {quat} q quaternion to transform with\n * @returns {vec4} out\n */\nvec4.transformQuat = function(out, a, q) {\n var x = a[0], y = a[1], z = a[2],\n qx = q[0], qy = q[1], qz = q[2], qw = q[3],\n\n // calculate quat * vec\n ix = qw * x + qy * z - qz * y,\n iy = qw * y + qz * x - qx * z,\n iz = qw * z + qx * y - qy * x,\n iw = -qx * x - qy * y - qz * z;\n\n // calculate result * inverse quat\n out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;\n out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;\n out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;\n return out;\n};\n\n/**\n * Perform some operation over an array of vec4s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec4. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec2s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\nvec4.forEach = (function() {\n var vec = vec4.create();\n\n return function(a, stride, offset, count, fn, arg) {\n var i, l;\n if(!stride) {\n stride = 4;\n }\n\n if(!offset) {\n offset = 0;\n }\n \n if(count) {\n l = Math.min((count * stride) + offset, a.length);\n } else {\n l = a.length;\n }\n\n for(i = offset; i < l; i += stride) {\n vec[0] = a[i]; vec[1] = a[i+1]; vec[2] = a[i+2]; vec[3] = a[i+3];\n fn(vec, vec, arg);\n a[i] = vec[0]; a[i+1] = vec[1]; a[i+2] = vec[2]; a[i+3] = vec[3];\n }\n \n return a;\n };\n})();\n\n/**\n * Returns a string representation of a vector\n *\n * @param {vec4} vec vector to represent as a string\n * @returns {String} string representation of the vector\n */\nvec4.str = function (a) {\n return 'vec4(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ')';\n};\n\nif(typeof(exports) !== 'undefined') {\n exports.vec4 = vec4;\n}\n;\n/* Copyright (c) 2013, Brandon Jones, Colin MacKenzie IV. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation \n and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE \nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */\n\n/**\n * @class 2x2 Matrix\n * @name mat2\n */\n\nvar mat2 = {};\n\nvar mat2Identity = new Float32Array([\n 1, 0,\n 0, 1\n]);\n\n/**\n * Creates a new identity mat2\n *\n * @returns {mat2} a new 2x2 matrix\n */\nmat2.create = function() {\n var out = new GLMAT_ARRAY_TYPE(4);\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n return out;\n};\n\n/**\n * Creates a new mat2 initialized with values from an existing matrix\n *\n * @param {mat2} a matrix to clone\n * @returns {mat2} a new 2x2 matrix\n */\nmat2.clone = function(a) {\n var out = new GLMAT_ARRAY_TYPE(4);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n};\n\n/**\n * Copy the values from one mat2 to another\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the source matrix\n * @returns {mat2} out\n */\nmat2.copy = function(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n};\n\n/**\n * Set a mat2 to the identity matrix\n *\n * @param {mat2} out the receiving matrix\n * @returns {mat2} out\n */\nmat2.identity = function(out) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n return out;\n};\n\n/**\n * Transpose the values of a mat2\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the source matrix\n * @returns {mat2} out\n */\nmat2.transpose = function(out, a) {\n // If we are transposing ourselves we can skip a few steps but have to cache some values\n if (out === a) {\n var a1 = a[1];\n out[1] = a[2];\n out[2] = a1;\n } else {\n out[0] = a[0];\n out[1] = a[2];\n out[2] = a[1];\n out[3] = a[3];\n }\n \n return out;\n};\n\n/**\n * Inverts a mat2\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the source matrix\n * @returns {mat2} out\n */\nmat2.invert = function(out, a) {\n var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3],\n\n // Calculate the determinant\n det = a0 * a3 - a2 * a1;\n\n if (!det) {\n return null;\n }\n det = 1.0 / det;\n \n out[0] = a3 * det;\n out[1] = -a1 * det;\n out[2] = -a2 * det;\n out[3] = a0 * det;\n\n return out;\n};\n\n/**\n * Calculates the adjugate of a mat2\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the source matrix\n * @returns {mat2} out\n */\nmat2.adjoint = function(out, a) {\n // Caching this value is nessecary if out == a\n var a0 = a[0];\n out[0] = a[3];\n out[1] = -a[1];\n out[2] = -a[2];\n out[3] = a0;\n\n return out;\n};\n\n/**\n * Calculates the determinant of a mat2\n *\n * @param {mat2} a the source matrix\n * @returns {Number} determinant of a\n */\nmat2.determinant = function (a) {\n return a[0] * a[3] - a[2] * a[1];\n};\n\n/**\n * Multiplies two mat2's\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the first operand\n * @param {mat2} b the second operand\n * @returns {mat2} out\n */\nmat2.multiply = function (out, a, b) {\n var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3];\n var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3];\n out[0] = a0 * b0 + a1 * b2;\n out[1] = a0 * b1 + a1 * b3;\n out[2] = a2 * b0 + a3 * b2;\n out[3] = a2 * b1 + a3 * b3;\n return out;\n};\n\n/**\n * Alias for {@link mat2.multiply}\n * @function\n */\nmat2.mul = mat2.multiply;\n\n/**\n * Rotates a mat2 by the given angle\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat2} out\n */\nmat2.rotate = function (out, a, rad) {\n var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3],\n s = Math.sin(rad),\n c = Math.cos(rad);\n out[0] = a0 * c + a1 * s;\n out[1] = a0 * -s + a1 * c;\n out[2] = a2 * c + a3 * s;\n out[3] = a2 * -s + a3 * c;\n return out;\n};\n\n/**\n * Scales the mat2 by the dimensions in the given vec2\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the matrix to rotate\n * @param {vec2} v the vec2 to scale the matrix by\n * @returns {mat2} out\n **/\nmat2.scale = function(out, a, v) {\n var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3],\n v0 = v[0], v1 = v[1];\n out[0] = a0 * v0;\n out[1] = a1 * v1;\n out[2] = a2 * v0;\n out[3] = a3 * v1;\n return out;\n};\n\n/**\n * Returns a string representation of a mat2\n *\n * @param {mat2} mat matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\nmat2.str = function (a) {\n return 'mat2(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ')';\n};\n\nif(typeof(exports) !== 'undefined') {\n exports.mat2 = mat2;\n}\n;\n/* Copyright (c) 2013, Brandon Jones, Colin MacKenzie IV. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation \n and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE \nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */\n\n/**\n * @class 2x3 Matrix\n * @name mat2d\n * \n * @description \n * A mat2d contains six elements defined as:\n * <pre>\n * [a, b,\n * c, d,\n * tx,ty]\n * </pre>\n * This is a short form for the 3x3 matrix:\n * <pre>\n * [a, b, 0\n * c, d, 0\n * tx,ty,1]\n * </pre>\n * The last column is ignored so the array is shorter and operations are faster.\n */\n\nvar mat2d = {};\n\nvar mat2dIdentity = new Float32Array([\n 1, 0,\n 0, 1,\n 0, 0\n]);\n\n/**\n * Creates a new identity mat2d\n *\n * @returns {mat2d} a new 2x3 matrix\n */\nmat2d.create = function() {\n var out = new GLMAT_ARRAY_TYPE(6);\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n out[4] = 0;\n out[5] = 0;\n return out;\n};\n\n/**\n * Creates a new mat2d initialized with values from an existing matrix\n *\n * @param {mat2d} a matrix to clone\n * @returns {mat2d} a new 2x3 matrix\n */\nmat2d.clone = function(a) {\n var out = new GLMAT_ARRAY_TYPE(6);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n return out;\n};\n\n/**\n * Copy the values from one mat2d to another\n *\n * @param {mat2d} out the receiving matrix\n * @param {mat2d} a the source matrix\n * @returns {mat2d} out\n */\nmat2d.copy = function(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n return out;\n};\n\n/**\n * Set a mat2d to the identity matrix\n *\n * @param {mat2d} out the receiving matrix\n * @returns {mat2d} out\n */\nmat2d.identity = function(out) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n out[4] = 0;\n out[5] = 0;\n return out;\n};\n\n/**\n * Inverts a mat2d\n *\n * @param {mat2d} out the receiving matrix\n * @param {mat2d} a the source matrix\n * @returns {mat2d} out\n */\nmat2d.invert = function(out, a) {\n var aa = a[0], ab = a[1], ac = a[2], ad = a[3],\n atx = a[4], aty = a[5];\n\n var det = aa * ad - ab * ac;\n if(!det){\n return null;\n }\n det = 1.0 / det;\n\n out[0] = ad * det;\n out[1] = -ab * det;\n out[2] = -ac * det;\n out[3] = aa * det;\n out[4] = (ac * aty - ad * atx) * det;\n out[5] = (ab * atx - aa * aty) * det;\n return out;\n};\n\n/**\n * Calculates the determinant of a mat2d\n *\n * @param {mat2d} a the source matrix\n * @returns {Number} determinant of a\n */\nmat2d.determinant = function (a) {\n return a[0] * a[3] - a[1] * a[2];\n};\n\n/**\n * Multiplies two mat2d's\n *\n * @param {mat2d} out the receiving matrix\n * @param {mat2d} a the first operand\n * @param {mat2d} b the second operand\n * @returns {mat2d} out\n */\nmat2d.multiply = function (out, a, b) {\n var aa = a[0], ab = a[1], ac = a[2], ad = a[3],\n atx = a[4], aty = a[5],\n ba = b[0], bb = b[1], bc = b[2], bd = b[3],\n btx = b[4], bty = b[5];\n\n out[0] = aa*ba + ab*bc;\n out[1] = aa*bb + ab*bd;\n out[2] = ac*ba + ad*bc;\n out[3] = ac*bb + ad*bd;\n out[4] = ba*atx + bc*aty + btx;\n out[5] = bb*atx + bd*aty + bty;\n return out;\n};\n\n/**\n * Alias for {@link mat2d.multiply}\n * @function\n */\nmat2d.mul = mat2d.multiply;\n\n\n/**\n * Rotates a mat2d by the given angle\n *\n * @param {mat2d} out the receiving matrix\n * @param {mat2d} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat2d} out\n */\nmat2d.rotate = function (out, a, rad) {\n var aa = a[0],\n ab = a[1],\n ac = a[2],\n ad = a[3],\n atx = a[4],\n aty = a[5],\n st = Math.sin(rad),\n ct = Math.cos(rad);\n\n out[0] = aa*ct + ab*st;\n out[1] = -aa*st + ab*ct;\n out[2] = ac*ct + ad*st;\n out[3] = -ac*st + ct*ad;\n out[4] = ct*atx + st*aty;\n out[5] = ct*aty - st*atx;\n return out;\n};\n\n/**\n * Scales the mat2d by the dimensions in the given vec2\n *\n * @param {mat2d} out the receiving matrix\n * @param {mat2d} a the matrix to translate\n * @param {mat2d} v the vec2 to scale the matrix by\n * @returns {mat2d} out\n **/\nmat2d.scale = function(out, a, v) {\n var vx = v[0], vy = v[1];\n out[0] = a[0] * vx;\n out[1] = a[1] * vy;\n out[2] = a[2] * vx;\n out[3] = a[3] * vy;\n out[4] = a[4] * vx;\n out[5] = a[5] * vy;\n return out;\n};\n\n/**\n * Translates the mat2d by the dimensions in the given vec2\n *\n * @param {mat2d} out the receiving matrix\n * @param {mat2d} a the matrix to translate\n * @param {mat2d} v the vec2 to translate the matrix by\n * @returns {mat2d} out\n **/\nmat2d.translate = function(out, a, v) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4] + v[0];\n out[5] = a[5] + v[1];\n return out;\n};\n\n/**\n * Returns a string representation of a mat2d\n *\n * @param {mat2d} a matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\nmat2d.str = function (a) {\n return 'mat2d(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + \n a[3] + ', ' + a[4] + ', ' + a[5] + ')';\n};\n\nif(typeof(exports) !== 'undefined') {\n exports.mat2d = mat2d;\n}\n;\n/* Copyright (c) 2013, Brandon Jones, Colin MacKenzie IV. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation \n and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE \nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */\n\n/**\n * @class 3x3 Matrix\n * @name mat3\n */\n\nvar mat3 = {};\n\nvar mat3Identity = new Float32Array([\n 1, 0, 0,\n 0, 1, 0,\n 0, 0, 1\n]);\n\n/**\n * Creates a new identity mat3\n *\n * @returns {mat3} a new 3x3 matrix\n */\nmat3.create = function() {\n var out = new GLMAT_ARRAY_TYPE(9);\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 1;\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 1;\n return out;\n};\n\n/**\n * Creates a new mat3 initialized with values from an existing matrix\n *\n * @param {mat3} a matrix to clone\n * @returns {mat3} a new 3x3 matrix\n */\nmat3.clone = function(a) {\n var out = new GLMAT_ARRAY_TYPE(9);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n return out;\n};\n\n/**\n * Copy the values from one mat3 to another\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the source matrix\n * @returns {mat3} out\n */\nmat3.copy = function(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n return out;\n};\n\n/**\n * Set a mat3 to the identity matrix\n *\n * @param {mat3} out the receiving matrix\n * @returns {mat3} out\n */\nmat3.identity = function(out) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 1;\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 1;\n return out;\n};\n\n/**\n * Transpose the values of a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the source matrix\n * @returns {mat3} out\n */\nmat3.transpose = function(out, a) {\n // If we are transposing ourselves we can skip a few steps but have to cache some values\n if (out === a) {\n var a01 = a[1], a02 = a[2], a12 = a[5];\n out[1] = a[3];\n out[2] = a[6];\n out[3] = a01;\n out[5] = a[7];\n out[6] = a02;\n out[7] = a12;\n } else {\n out[0] = a[0];\n out[1] = a[3];\n out[2] = a[6];\n out[3] = a[1];\n out[4] = a[4];\n out[5] = a[7];\n out[6] = a[2];\n out[7] = a[5];\n out[8] = a[8];\n }\n \n return out;\n};\n\n/**\n * Inverts a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the source matrix\n * @returns {mat3} out\n */\nmat3.invert = function(out, a) {\n var a00 = a[0], a01 = a[1], a02 = a[2],\n a10 = a[3], a11 = a[4], a12 = a[5],\n a20 = a[6], a21 = a[7], a22 = a[8],\n\n b01 = a22 * a11 - a12 * a21,\n b11 = -a22 * a10 + a12 * a20,\n b21 = a21 * a10 - a11 * a20,\n\n // Calculate the determinant\n det = a00 * b01 + a01 * b11 + a02 * b21;\n\n if (!det) { \n return null; \n }\n det = 1.0 / det;\n\n out[0] = b01 * det;\n out[1] = (-a22 * a01 + a02 * a21) * det;\n out[2] = (a12 * a01 - a02 * a11) * det;\n out[3] = b11 * det;\n out[4] = (a22 * a00 - a02 * a20) * det;\n out[5] = (-a12 * a00 + a02 * a10) * det;\n out[6] = b21 * det;\n out[7] = (-a21 * a00 + a01 * a20) * det;\n out[8] = (a11 * a00 - a01 * a10) * det;\n return out;\n};\n\n/**\n * Calculates the adjugate of a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the source matrix\n * @returns {mat3} out\n */\nmat3.adjoint = function(out, a) {\n var a00 = a[0], a01 = a[1], a02 = a[2],\n a10 = a[3], a11 = a[4], a12 = a[5],\n a20 = a[6], a21 = a[7], a22 = a[8];\n\n out[0] = (a11 * a22 - a12 * a21);\n out[1] = (a02 * a21 - a01 * a22);\n out[2] = (a01 * a12 - a02 * a11);\n out[3] = (a12 * a20 - a10 * a22);\n out[4] = (a00 * a22 - a02 * a20);\n out[5] = (a02 * a10 - a00 * a12);\n out[6] = (a10 * a21 - a11 * a20);\n out[7] = (a01 * a20 - a00 * a21);\n out[8] = (a00 * a11 - a01 * a10);\n return out;\n};\n\n/**\n * Calculates the determinant of a mat3\n *\n * @param {mat3} a the source matrix\n * @returns {Number} determinant of a\n */\nmat3.determinant = function (a) {\n var a00 = a[0], a01 = a[1], a02 = a[2],\n a10 = a[3], a11 = a[4], a12 = a[5],\n a20 = a[6], a21 = a[7], a22 = a[8];\n\n return a00 * (a22 * a11 - a12 * a21) + a01 * (-a22 * a10 + a12 * a20) + a02 * (a21 * a10 - a11 * a20);\n};\n\n/**\n * Multiplies two mat3's\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the first operand\n * @param {mat3} b the second operand\n * @returns {mat3} out\n */\nmat3.multiply = function (out, a, b) {\n var a00 = a[0], a01 = a[1], a02 = a[2],\n a10 = a[3], a11 = a[4], a12 = a[5],\n a20 = a[6], a21 = a[7], a22 = a[8],\n\n b00 = b[0], b01 = b[1], b02 = b[2],\n b10 = b[3], b11 = b[4], b12 = b[5],\n b20 = b[6], b21 = b[7], b22 = b[8];\n\n out[0] = b00 * a00 + b01 * a10 + b02 * a20;\n out[1] = b00 * a01 + b01 * a11 + b02 * a21;\n out[2] = b00 * a02 + b01 * a12 + b02 * a22;\n\n out[3] = b10 * a00 + b11 * a10 + b12 * a20;\n out[4] = b10 * a01 + b11 * a11 + b12 * a21;\n out[5] = b10 * a02 + b11 * a12 + b12 * a22;\n\n out[6] = b20 * a00 + b21 * a10 + b22 * a20;\n out[7] = b20 * a01 + b21 * a11 + b22 * a21;\n out[8] = b20 * a02 + b21 * a12 + b22 * a22;\n return out;\n};\n\n/**\n * Alias for {@link mat3.multiply}\n * @function\n */\nmat3.mul = mat3.multiply;\n\n/**\n * Translate a mat3 by the given vector\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the matrix to translate\n * @param {vec2} v vector to translate by\n * @returns {mat3} out\n */\nmat3.translate = function(out, a, v) {\n var a00 = a[0], a01 = a[1], a02 = a[2],\n a10 = a[3], a11 = a[4], a12 = a[5],\n a20 = a[6], a21 = a[7], a22 = a[8],\n x = v[0], y = v[1];\n\n out[0] = a00;\n out[1] = a01;\n out[2] = a02;\n\n out[3] = a10;\n out[4] = a11;\n out[5] = a12;\n\n out[6] = x * a00 + y * a10 + a20;\n out[7] = x * a01 + y * a11 + a21;\n out[8] = x * a02 + y * a12 + a22;\n return out;\n};\n\n/**\n * Rotates a mat3 by the given angle\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat3} out\n */\nmat3.rotate = function (out, a, rad) {\n var a00 = a[0], a01 = a[1], a02 = a[2],\n a10 = a[3], a11 = a[4], a12 = a[5],\n a20 = a[6], a21 = a[7], a22 = a[8],\n\n s = Math.sin(rad),\n c = Math.cos(rad);\n\n out[0] = c * a00 + s * a10;\n out[1] = c * a01 + s * a11;\n out[2] = c * a02 + s * a12;\n\n out[3] = c * a10 - s * a00;\n out[4] = c * a11 - s * a01;\n out[5] = c * a12 - s * a02;\n\n out[6] = a20;\n out[7] = a21;\n out[8] = a22;\n return out;\n};\n\n/**\n * Scales the mat3 by the dimensions in the given vec2\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the matrix to rotate\n * @param {vec2} v the vec2 to scale the matrix by\n * @returns {mat3} out\n **/\nmat3.scale = function(out, a, v) {\n var x = v[0], y = v[2];\n\n out[0] = x * a[0];\n out[1] = x * a[1];\n out[2] = x * a[2];\n\n out[3] = y * a[3];\n out[4] = y * a[4];\n out[5] = y * a[5];\n\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n return out;\n};\n\n/**\n * Copies the values from a mat2d into a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the matrix to rotate\n * @param {vec2} v the vec2 to scale the matrix by\n * @returns {mat3} out\n **/\nmat3.fromMat2d = function(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = 0;\n\n out[3] = a[2];\n out[4] = a[3];\n out[5] = 0;\n\n out[6] = a[4];\n out[7] = a[5];\n out[8] = 1;\n return out;\n};\n\n/**\n* Calculates a 3x3 matrix from the given quaternion\n*\n* @param {mat3} out mat3 receiving operation result\n* @param {quat} q Quaternion to create matrix from\n*\n* @returns {mat3} out\n*/\nmat3.fromQuat = function (out, q) {\n var x = q[0], y = q[1], z = q[2], w = q[3],\n x2 = x + x,\n y2 = y + y,\n z2 = z + z,\n\n xx = x * x2,\n xy = x * y2,\n xz = x * z2,\n yy = y * y2,\n yz = y * z2,\n zz = z * z2,\n wx = w * x2,\n wy = w * y2,\n wz = w * z2;\n\n out[0] = 1 - (yy + zz);\n out[1] = xy + wz;\n out[2] = xz - wy;\n\n out[3] = xy - wz;\n out[4] = 1 - (xx + zz);\n out[5] = yz + wx;\n\n out[6] = xz + wy;\n out[7] = yz - wx;\n out[8] = 1 - (xx + yy);\n\n return out;\n};\n\n/**\n * Returns a string representation of a mat3\n *\n * @param {mat3} mat matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\nmat3.str = function (a) {\n return 'mat3(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + \n a[3] + ', ' + a[4] + ', ' + a[5] + ', ' + \n a[6] + ', ' + a[7] + ', ' + a[8] + ')';\n};\n\nif(typeof(exports) !== 'undefined') {\n exports.mat3 = mat3;\n}\n;\n/* Copyright (c) 2013, Brandon Jones, Colin MacKenzie IV. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation \n and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE \nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */\n\n/**\n * @class 4x4 Matrix\n * @name mat4\n */\n\nvar mat4 = {};\n\nvar mat4Identity = new Float32Array([\n 1, 0, 0, 0,\n 0, 1, 0, 0,\n 0, 0, 1, 0,\n 0, 0, 0, 1\n]);\n\n/**\n * Creates a new identity mat4\n *\n * @returns {mat4} a new 4x4 matrix\n */\nmat4.create = function() {\n var out = new GLMAT_ARRAY_TYPE(16);\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n};\n\n/**\n * Creates a new mat4 initialized with values from an existing matrix\n *\n * @param {mat4} a matrix to clone\n * @returns {mat4} a new 4x4 matrix\n */\nmat4.clone = function(a) {\n var out = new GLMAT_ARRAY_TYPE(16);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n};\n\n/**\n * Copy the values from one mat4 to another\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\nmat4.copy = function(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n};\n\n/**\n * Set a mat4 to the identity matrix\n *\n * @param {mat4} out the receiving matrix\n * @returns {mat4} out\n */\nmat4.identity = function(out) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n};\n\n/**\n * Transpose the values of a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\nmat4.transpose = function(out, a) {\n // If we are transposing ourselves we can skip a few steps but have to cache some values\n if (out === a) {\n var a01 = a[1], a02 = a[2], a03 = a[3],\n a12 = a[6], a13 = a[7],\n a23 = a[11];\n\n out[1] = a[4];\n out[2] = a[8];\n out[3] = a[12];\n out[4] = a01;\n out[6] = a[9];\n out[7] = a[13];\n out[8] = a02;\n out[9] = a12;\n out[11] = a[14];\n out[12] = a03;\n out[13] = a13;\n out[14] = a23;\n } else {\n out[0] = a[0];\n out[1] = a[4];\n out[2] = a[8];\n out[3] = a[12];\n out[4] = a[1];\n out[5] = a[5];\n out[6] = a[9];\n out[7] = a[13];\n out[8] = a[2];\n out[9] = a[6];\n out[10] = a[10];\n out[11] = a[14];\n out[12] = a[3];\n out[13] = a[7];\n out[14] = a[11];\n out[15] = a[15];\n }\n \n return out;\n};\n\n/**\n * Inverts a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\nmat4.invert = function(out, a) {\n var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3],\n a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7],\n a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11],\n a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15],\n\n b00 = a00 * a11 - a01 * a10,\n b01 = a00 * a12 - a02 * a10,\n b02 = a00 * a13 - a03 * a10,\n b03 = a01 * a12 - a02 * a11,\n b04 = a01 * a13 - a03 * a11,\n b05 = a02 * a13 - a03 * a12,\n b06 = a20 * a31 - a21 * a30,\n b07 = a20 * a32 - a22 * a30,\n b08 = a20 * a33 - a23 * a30,\n b09 = a21 * a32 - a22 * a31,\n b10 = a21 * a33 - a23 * a31,\n b11 = a22 * a33 - a23 * a32,\n\n // Calculate the determinant\n det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n if (!det) { \n return null; \n }\n det = 1.0 / det;\n\n out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;\n out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;\n out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;\n out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;\n out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;\n out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;\n out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;\n\n return out;\n};\n\n/**\n * Calculates the adjugate of a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\nmat4.adjoint = function(out, a) {\n var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3],\n a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7],\n a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11],\n a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];\n\n out[0] = (a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22));\n out[1] = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) + a31 * (a02 * a23 - a03 * a22));\n out[2] = (a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12));\n out[3] = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) + a21 * (a02 * a13 - a03 * a12));\n out[4] = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) + a30 * (a12 * a23 - a13 * a22));\n out[5] = (a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22));\n out[6] = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) + a30 * (a02 * a13 - a03 * a12));\n out[7] = (a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12));\n out[8] = (a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21));\n out[9] = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) + a30 * (a01 * a23 - a03 * a21));\n out[10] = (a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11));\n out[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) + a20 * (a01 * a13 - a03 * a11));\n out[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) + a30 * (a11 * a22 - a12 * a21));\n out[13] = (a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21));\n out[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) + a30 * (a01 * a12 - a02 * a11));\n out[15] = (a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11));\n return out;\n};\n\n/**\n * Calculates the determinant of a mat4\n *\n * @param {mat4} a the source matrix\n * @returns {Number} determinant of a\n */\nmat4.determinant = function (a) {\n var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3],\n a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7],\n a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11],\n a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15],\n\n b00 = a00 * a11 - a01 * a10,\n b01 = a00 * a12 - a02 * a10,\n b02 = a00 * a13 - a03 * a10,\n b03 = a01 * a12 - a02 * a11,\n b04 = a01 * a13 - a03 * a11,\n b05 = a02 * a13 - a03 * a12,\n b06 = a20 * a31 - a21 * a30,\n b07 = a20 * a32 - a22 * a30,\n b08 = a20 * a33 - a23 * a30,\n b09 = a21 * a32 - a22 * a31,\n b10 = a21 * a33 - a23 * a31,\n b11 = a22 * a33 - a23 * a32;\n\n // Calculate the determinant\n return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n};\n\n/**\n * Multiplies two mat4's\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the first operand\n * @param {mat4} b the second operand\n * @returns {mat4} out\n */\nmat4.multiply = function (out, a, b) {\n var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3],\n a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7],\n a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11],\n a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];\n\n // Cache only the current line of the second matrix\n var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3]; \n out[0] = b0*a00 + b1*a10 + b2*a20 + b3*a30;\n out[1] = b0*a01 + b1*a11 + b2*a21 + b3*a31;\n out[2] = b0*a02 + b1*a12 + b2*a22 + b3*a32;\n out[3] = b0*a03 + b1*a13 + b2*a23 + b3*a33;\n\n b0 = b[4]; b1 = b[5]; b2 = b[6]; b3 = b[7];\n out[4] = b0*a00 + b1*a10 + b2*a20 + b3*a30;\n out[5] = b0*a01 + b1*a11 + b2*a21 + b3*a31;\n out[6] = b0*a02 + b1*a12 + b2*a22 + b3*a32;\n out[7] = b0*a03 + b1*a13 + b2*a23 + b3*a33;\n\n b0 = b[8]; b1 = b[9]; b2 = b[10]; b3 = b[11];\n out[8] = b0*a00 + b1*a10 + b2*a20 + b3*a30;\n out[9] = b0*a01 + b1*a11 + b2*a21 + b3*a31;\n out[10] = b0*a02 + b1*a12 + b2*a22 + b3*a32;\n out[11] = b0*a03 + b1*a13 + b2*a23 + b3*a33;\n\n b0 = b[12]; b1 = b[13]; b2 = b[14]; b3 = b[15];\n out[12] = b0*a00 + b1*a10 + b2*a20 + b3*a30;\n out[13] = b0*a01 + b1*a11 + b2*a21 + b3*a31;\n out[14] = b0*a02 + b1*a12 + b2*a22 + b3*a32;\n out[15] = b0*a03 + b1*a13 + b2*a23 + b3*a33;\n return out;\n};\n\n/**\n * Alias for {@link mat4.multiply}\n * @function\n */\nmat4.mul = mat4.multiply;\n\n/**\n * Translate a mat4 by the given vector\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to translate\n * @param {vec3} v vector to translate by\n * @returns {mat4} out\n */\nmat4.translate = function (out, a, v) {\n var x = v[0], y = v[1], z = v[2],\n a00, a01, a02, a03,\n a10, a11, a12, a13,\n a20, a21, a22, a23;\n\n if (a === out) {\n out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];\n out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];\n out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];\n out[15] = a[3] * x + a[7] * y + a[11] * z + a[15];\n } else {\n a00 = a[0]; a01 = a[1]; a02 = a[2]; a03 = a[3];\n a10 = a[4]; a11 = a[5]; a12 = a[6]; a13 = a[7];\n a20 = a[8]; a21 = a[9]; a22 = a[10]; a23 = a[11];\n\n out[0] = a00; out[1] = a01; out[2] = a02; out[3] = a03;\n out[4] = a10; out[5] = a11; out[6] = a12; out[7] = a13;\n out[8] = a20; out[9] = a21; out[10] = a22; out[11] = a23;\n\n out[12] = a00 * x + a10 * y + a20 * z + a[12];\n out[13] = a01 * x + a11 * y + a21 * z + a[13];\n out[14] = a02 * x + a12 * y + a22 * z + a[14];\n out[15] = a03 * x + a13 * y + a23 * z + a[15];\n }\n\n return out;\n};\n\n/**\n * Scales the mat4 by the dimensions in the given vec3\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to scale\n * @param {vec3} v the vec3 to scale the matrix by\n * @returns {mat4} out\n **/\nmat4.scale = function(out, a, v) {\n var x = v[0], y = v[1], z = v[2];\n\n out[0] = a[0] * x;\n out[1] = a[1] * x;\n out[2] = a[2] * x;\n out[3] = a[3] * x;\n out[4] = a[4] * y;\n out[5] = a[5] * y;\n out[6] = a[6] * y;\n out[7] = a[7] * y;\n out[8] = a[8] * z;\n out[9] = a[9] * z;\n out[10] = a[10] * z;\n out[11] = a[11] * z;\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n};\n\n/**\n * Rotates a mat4 by the given angle\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @param {vec3} axis the axis to rotate around\n * @returns {mat4} out\n */\nmat4.rotate = function (out, a, rad, axis) {\n var x = axis[0], y = axis[1], z = axis[2],\n len = Math.sqrt(x * x + y * y + z * z),\n s, c, t,\n a00, a01, a02, a03,\n a10, a11, a12, a13,\n a20, a21, a22, a23,\n b00, b01, b02,\n b10, b11, b12,\n b20, b21, b22;\n\n if (Math.abs(len) < GLMAT_EPSILON) { return null; }\n \n len = 1 / len;\n x *= len;\n y *= len;\n z *= len;\n\n s = Math.sin(rad);\n c = Math.cos(rad);\n t = 1 - c;\n\n a00 = a[0]; a01 = a[1]; a02 = a[2]; a03 = a[3];\n a10 = a[4]; a11 = a[5]; a12 = a[6]; a13 = a[7];\n a20 = a[8]; a21 = a[9]; a22 = a[10]; a23 = a[11];\n\n // Construct the elements of the rotation matrix\n b00 = x * x * t + c; b01 = y * x * t + z * s; b02 = z * x * t - y * s;\n b10 = x * y * t - z * s; b11 = y * y * t + c; b12 = z * y * t + x * s;\n b20 = x * z * t + y * s; b21 = y * z * t - x * s; b22 = z * z * t + c;\n\n // Perform rotation-specific matrix multiplication\n out[0] = a00 * b00 + a10 * b01 + a20 * b02;\n out[1] = a01 * b00 + a11 * b01 + a21 * b02;\n out[2] = a02 * b00 + a12 * b01 + a22 * b02;\n out[3] = a03 * b00 + a13 * b01 + a23 * b02;\n out[4] = a00 * b10 + a10 * b11 + a20 * b12;\n out[5] = a01 * b10 + a11 * b11 + a21 * b12;\n out[6] = a02 * b10 + a12 * b11 + a22 * b12;\n out[7] = a03 * b10 + a13 * b11 + a23 * b12;\n out[8] = a00 * b20 + a10 * b21 + a20 * b22;\n out[9] = a01 * b20 + a11 * b21 + a21 * b22;\n out[10] = a02 * b20 + a12 * b21 + a22 * b22;\n out[11] = a03 * b20 + a13 * b21 + a23 * b22;\n\n if (a !== out) { // If the source and destination differ, copy the unchanged last row\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n }\n return out;\n};\n\n/**\n * Rotates a matrix by the given angle around the X axis\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nmat4.rotateX = function (out, a, rad) {\n var s = Math.sin(rad),\n c = Math.cos(rad),\n a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7],\n a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n\n if (a !== out) { // If the source and destination differ, copy the unchanged rows\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n }\n\n // Perform axis-specific matrix multiplication\n out[4] = a10 * c + a20 * s;\n out[5] = a11 * c + a21 * s;\n out[6] = a12 * c + a22 * s;\n out[7] = a13 * c + a23 * s;\n out[8] = a20 * c - a10 * s;\n out[9] = a21 * c - a11 * s;\n out[10] = a22 * c - a12 * s;\n out[11] = a23 * c - a13 * s;\n return out;\n};\n\n/**\n * Rotates a matrix by the given angle around the Y axis\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nmat4.rotateY = function (out, a, rad) {\n var s = Math.sin(rad),\n c = Math.cos(rad),\n a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3],\n a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n\n if (a !== out) { // If the source and destination differ, copy the unchanged rows\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n }\n\n // Perform axis-specific matrix multiplication\n out[0] = a00 * c - a20 * s;\n out[1] = a01 * c - a21 * s;\n out[2] = a02 * c - a22 * s;\n out[3] = a03 * c - a23 * s;\n out[8] = a00 * s + a20 * c;\n out[9] = a01 * s + a21 * c;\n out[10] = a02 * s + a22 * c;\n out[11] = a03 * s + a23 * c;\n return out;\n};\n\n/**\n * Rotates a matrix by the given angle around the Z axis\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nmat4.rotateZ = function (out, a, rad) {\n var s = Math.sin(rad),\n c = Math.cos(rad),\n a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3],\n a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n\n if (a !== out) { // If the source and destination differ, copy the unchanged last row\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n }\n\n // Perform axis-specific matrix multiplication\n out[0] = a00 * c + a10 * s;\n out[1] = a01 * c + a11 * s;\n out[2] = a02 * c + a12 * s;\n out[3] = a03 * c + a13 * s;\n out[4] = a10 * c - a00 * s;\n out[5] = a11 * c - a01 * s;\n out[6] = a12 * c - a02 * s;\n out[7] = a13 * c - a03 * s;\n return out;\n};\n\n/**\n * Creates a matrix from a quaternion rotation and vector translation\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, vec);\n * var quatMat = mat4.create();\n * quat4.toMat4(quat, quatMat);\n * mat4.multiply(dest, quatMat);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {vec3} v Translation vector\n * @returns {mat4} out\n */\nmat4.fromRotationTranslation = function (out, q, v) {\n // Quaternion math\n var x = q[0], y = q[1], z = q[2], w = q[3],\n x2 = x + x,\n y2 = y + y,\n z2 = z + z,\n\n xx = x * x2,\n xy = x * y2,\n xz = x * z2,\n yy = y * y2,\n yz = y * z2,\n zz = z * z2,\n wx = w * x2,\n wy = w * y2,\n wz = w * z2;\n\n out[0] = 1 - (yy + zz);\n out[1] = xy + wz;\n out[2] = xz - wy;\n out[3] = 0;\n out[4] = xy - wz;\n out[5] = 1 - (xx + zz);\n out[6] = yz + wx;\n out[7] = 0;\n out[8] = xz + wy;\n out[9] = yz - wx;\n out[10] = 1 - (xx + yy);\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n \n return out;\n};\n\n/**\n* Calculates a 4x4 matrix from the given quaternion\n*\n* @param {mat4} out mat4 receiving operation result\n* @param {quat} q Quaternion to create matrix from\n*\n* @returns {mat4} out\n*/\nmat4.fromQuat = function (out, q) {\n var x = q[0], y = q[1], z = q[2], w = q[3],\n x2 = x + x,\n y2 = y + y,\n z2 = z + z,\n\n xx = x * x2,\n xy = x * y2,\n xz = x * z2,\n yy = y * y2,\n yz = y * z2,\n zz = z * z2,\n wx = w * x2,\n wy = w * y2,\n wz = w * z2;\n\n out[0] = 1 - (yy + zz);\n out[1] = xy + wz;\n out[2] = xz - wy;\n out[3] = 0;\n\n out[4] = xy - wz;\n out[5] = 1 - (xx + zz);\n out[6] = yz + wx;\n out[7] = 0;\n\n out[8] = xz + wy;\n out[9] = yz - wx;\n out[10] = 1 - (xx + yy);\n out[11] = 0;\n\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n\n return out;\n};\n\n/**\n * Generates a frustum matrix with the given bounds\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {Number} left Left bound of the frustum\n * @param {Number} right Right bound of the frustum\n * @param {Number} bottom Bottom bound of the frustum\n * @param {Number} top Top bound of the frustum\n * @param {Number} near Near bound of the frustum\n * @param {Number} far Far bound of the frustum\n * @returns {mat4} out\n */\nmat4.frustum = function (out, left, right, bottom, top, near, far) {\n var rl = 1 / (right - left),\n tb = 1 / (top - bottom),\n nf = 1 / (near - far);\n out[0] = (near * 2) * rl;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = (near * 2) * tb;\n out[6] = 0;\n out[7] = 0;\n out[8] = (right + left) * rl;\n out[9] = (top + bottom) * tb;\n out[10] = (far + near) * nf;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[14] = (far * near * 2) * nf;\n out[15] = 0;\n return out;\n};\n\n/**\n * Generates a perspective projection matrix with the given bounds\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} fovy Vertical field of view in radians\n * @param {number} aspect Aspect ratio. typically viewport width/height\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\nmat4.perspective = function (out, fovy, aspect, near, far) {\n var f = 1.0 / Math.tan(fovy / 2),\n nf = 1 / (near - far);\n out[0] = f / aspect;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = f;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = (far + near) * nf;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[14] = (2 * far * near) * nf;\n out[15] = 0;\n return out;\n};\n\n/**\n * Generates a orthogonal projection matrix with the given bounds\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} left Left bound of the frustum\n * @param {number} right Right bound of the frustum\n * @param {number} bottom Bottom bound of the frustum\n * @param {number} top Top bound of the frustum\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\nmat4.ortho = function (out, left, right, bottom, top, near, far) {\n var lr = 1 / (left - right),\n bt = 1 / (bottom - top),\n nf = 1 / (near - far);\n out[0] = -2 * lr;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = -2 * bt;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 2 * nf;\n out[11] = 0;\n out[12] = (left + right) * lr;\n out[13] = (top + bottom) * bt;\n out[14] = (far + near) * nf;\n out[15] = 1;\n return out;\n};\n\n/**\n * Generates a look-at matrix with the given eye position, focal point, and up axis\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {vec3} eye Position of the viewer\n * @param {vec3} center Point the viewer is looking at\n * @param {vec3} up vec3 pointing up\n * @returns {mat4} out\n */\nmat4.lookAt = function (out, eye, center, up) {\n var x0, x1, x2, y0, y1, y2, z0, z1, z2, len,\n eyex = eye[0],\n eyey = eye[1],\n eyez = eye[2],\n upx = up[0],\n upy = up[1],\n upz = up[2],\n centerx = center[0],\n centery = center[1],\n centerz = center[2];\n\n if (Math.abs(eyex - centerx) < GLMAT_EPSILON &&\n Math.abs(eyey - centery) < GLMAT_EPSILON &&\n Math.abs(eyez - centerz) < GLMAT_EPSILON) {\n return mat4.identity(out);\n }\n\n z0 = eyex - centerx;\n z1 = eyey - centery;\n z2 = eyez - centerz;\n\n len = 1 / Math.sqrt(z0 * z0 + z1 * z1 + z2 * z2);\n z0 *= len;\n z1 *= len;\n z2 *= len;\n\n x0 = upy * z2 - upz * z1;\n x1 = upz * z0 - upx * z2;\n x2 = upx * z1 - upy * z0;\n len = Math.sqrt(x0 * x0 + x1 * x1 + x2 * x2);\n if (!len) {\n x0 = 0;\n x1 = 0;\n x2 = 0;\n } else {\n len = 1 / len;\n x0 *= len;\n x1 *= len;\n x2 *= len;\n }\n\n y0 = z1 * x2 - z2 * x1;\n y1 = z2 * x0 - z0 * x2;\n y2 = z0 * x1 - z1 * x0;\n\n len = Math.sqrt(y0 * y0 + y1 * y1 + y2 * y2);\n if (!len) {\n y0 = 0;\n y1 = 0;\n y2 = 0;\n } else {\n len = 1 / len;\n y0 *= len;\n y1 *= len;\n y2 *= len;\n }\n\n out[0] = x0;\n out[1] = y0;\n out[2] = z0;\n out[3] = 0;\n out[4] = x1;\n out[5] = y1;\n out[6] = z1;\n out[7] = 0;\n out[8] = x2;\n out[9] = y2;\n out[10] = z2;\n out[11] = 0;\n out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez);\n out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez);\n out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez);\n out[15] = 1;\n\n return out;\n};\n\n/**\n * Returns a string representation of a mat4\n *\n * @param {mat4} mat matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\nmat4.str = function (a) {\n return 'mat4(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ', ' +\n a[4] + ', ' + a[5] + ', ' + a[6] + ', ' + a[7] + ', ' +\n a[8] + ', ' + a[9] + ', ' + a[10] + ', ' + a[11] + ', ' + \n a[12] + ', ' + a[13] + ', ' + a[14] + ', ' + a[15] + ')';\n};\n\nif(typeof(exports) !== 'undefined') {\n exports.mat4 = mat4;\n}\n;\n/* Copyright (c) 2013, Brandon Jones, Colin MacKenzie IV. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation \n and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE \nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */\n\n/**\n * @class Quaternion\n * @name quat\n */\n\nvar quat = {};\n\nvar quatIdentity = new Float32Array([0, 0, 0, 1]);\n\n/**\n * Creates a new identity quat\n *\n * @returns {quat} a new quaternion\n */\nquat.create = function() {\n var out = new GLMAT_ARRAY_TYPE(4);\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n return out;\n};\n\n/**\n * Creates a new quat initialized with values from an existing quaternion\n *\n * @param {quat} a quaternion to clone\n * @returns {quat} a new quaternion\n * @function\n */\nquat.clone = vec4.clone;\n\n/**\n * Creates a new quat initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {quat} a new quaternion\n * @function\n */\nquat.fromValues = vec4.fromValues;\n\n/**\n * Copy the values from one quat to another\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a the source quaternion\n * @returns {quat} out\n * @function\n */\nquat.copy = vec4.copy;\n\n/**\n * Set the components of a quat to the given values\n *\n * @param {quat} out the receiving quaternion\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {quat} out\n * @function\n */\nquat.set = vec4.set;\n\n/**\n * Set a quat to the identity quaternion\n *\n * @param {quat} out the receiving quaternion\n * @returns {quat} out\n */\nquat.identity = function(out) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n return out;\n};\n\n/**\n * Sets a quat from the given angle and rotation axis,\n * then returns it.\n *\n * @param {quat} out the receiving quaternion\n * @param {vec3} axis the axis around which to rotate\n * @param {Number} rad the angle in radians\n * @returns {quat} out\n **/\nquat.setAxisAngle = function(out, axis, rad) {\n rad = rad * 0.5;\n var s = Math.sin(rad);\n out[0] = s * axis[0];\n out[1] = s * axis[1];\n out[2] = s * axis[2];\n out[3] = Math.cos(rad);\n return out;\n};\n\n/**\n * Adds two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a the first operand\n * @param {quat} b the second operand\n * @returns {quat} out\n * @function\n */\nquat.add = vec4.add;\n\n/**\n * Multiplies two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a the first operand\n * @param {quat} b the second operand\n * @returns {quat} out\n */\nquat.multiply = function(out, a, b) {\n var ax = a[0], ay = a[1], az = a[2], aw = a[3],\n bx = b[0], by = b[1], bz = b[2], bw = b[3];\n\n out[0] = ax * bw + aw * bx + ay * bz - az * by;\n out[1] = ay * bw + aw * by + az * bx - ax * bz;\n out[2] = az * bw + aw * bz + ax * by - ay * bx;\n out[3] = aw * bw - ax * bx - ay * by - az * bz;\n return out;\n};\n\n/**\n * Alias for {@link quat.multiply}\n * @function\n */\nquat.mul = quat.multiply;\n\n/**\n * Scales a quat by a scalar number\n *\n * @param {quat} out the receiving vector\n * @param {quat} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {quat} out\n * @function\n */\nquat.scale = vec4.scale;\n\n/**\n * Rotates a quaternion by the given angle around the X axis\n *\n * @param {quat} out quat receiving operation result\n * @param {quat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\nquat.rotateX = function (out, a, rad) {\n rad *= 0.5; \n\n var ax = a[0], ay = a[1], az = a[2], aw = a[3],\n bx = Math.sin(rad), bw = Math.cos(rad);\n\n out[0] = ax * bw + aw * bx;\n out[1] = ay * bw + az * bx;\n out[2] = az * bw - ay * bx;\n out[3] = aw * bw - ax * bx;\n return out;\n};\n\n/**\n * Rotates a quaternion by the given angle around the Y axis\n *\n * @param {quat} out quat receiving operation result\n * @param {quat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\nquat.rotateY = function (out, a, rad) {\n rad *= 0.5; \n\n var ax = a[0], ay = a[1], az = a[2], aw = a[3],\n by = Math.sin(rad), bw = Math.cos(rad);\n\n out[0] = ax * bw - az * by;\n out[1] = ay * bw + aw * by;\n out[2] = az * bw + ax * by;\n out[3] = aw * bw - ay * by;\n return out;\n};\n\n/**\n * Rotates a quaternion by the given angle around the Z axis\n *\n * @param {quat} out quat receiving operation result\n * @param {quat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\nquat.rotateZ = function (out, a, rad) {\n rad *= 0.5; \n\n var ax = a[0], ay = a[1], az = a[2], aw = a[3],\n bz = Math.sin(rad), bw = Math.cos(rad);\n\n out[0] = ax * bw + ay * bz;\n out[1] = ay * bw - ax * bz;\n out[2] = az * bw + aw * bz;\n out[3] = aw * bw - az * bz;\n return out;\n};\n\n/**\n * Calculates the W component of a quat from the X, Y, and Z components.\n * Assumes that quaternion is 1 unit in length.\n * Any existing W component will be ignored.\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a quat to calculate W component of\n * @returns {quat} out\n */\nquat.calculateW = function (out, a) {\n var x = a[0], y = a[1], z = a[2];\n\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = -Math.sqrt(Math.abs(1.0 - x * x - y * y - z * z));\n return out;\n};\n\n/**\n * Calculates the dot product of two quat's\n *\n * @param {quat} a the first operand\n * @param {quat} b the second operand\n * @returns {Number} dot product of a and b\n * @function\n */\nquat.dot = vec4.dot;\n\n/**\n * Performs a linear interpolation between two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a the first operand\n * @param {quat} b the second operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {quat} out\n * @function\n */\nquat.lerp = vec4.lerp;\n\n/**\n * Performs a spherical linear interpolation between two quat\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a the first operand\n * @param {quat} b the second operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {quat} out\n */\nquat.slerp = function (out, a, b, t) {\n var ax = a[0], ay = a[1], az = a[2], aw = a[3],\n bx = b[0], by = b[1], bz = b[2], bw = b[3];\n\n var cosHalfTheta = ax * bx + ay * by + az * bz + aw * bw,\n halfTheta,\n sinHalfTheta,\n ratioA,\n ratioB;\n\n if (Math.abs(cosHalfTheta) >= 1.0) {\n if (out !== a) {\n out[0] = ax;\n out[1] = ay;\n out[2] = az;\n out[3] = aw;\n }\n return out;\n }\n\n halfTheta = Math.acos(cosHalfTheta);\n sinHalfTheta = Math.sqrt(1.0 - cosHalfTheta * cosHalfTheta);\n\n if (Math.abs(sinHalfTheta) < 0.001) {\n out[0] = (ax * 0.5 + bx * 0.5);\n out[1] = (ay * 0.5 + by * 0.5);\n out[2] = (az * 0.5 + bz * 0.5);\n out[3] = (aw * 0.5 + bw * 0.5);\n return out;\n }\n\n ratioA = Math.sin((1 - t) * halfTheta) / sinHalfTheta;\n ratioB = Math.sin(t * halfTheta) / sinHalfTheta;\n\n out[0] = (ax * ratioA + bx * ratioB);\n out[1] = (ay * ratioA + by * ratioB);\n out[2] = (az * ratioA + bz * ratioB);\n out[3] = (aw * ratioA + bw * ratioB);\n\n return out;\n};\n\n/**\n * Calculates the inverse of a quat\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a quat to calculate inverse of\n * @returns {quat} out\n */\nquat.invert = function(out, a) {\n var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3],\n dot = a0*a0 + a1*a1 + a2*a2 + a3*a3,\n invDot = dot ? 1.0/dot : 0;\n \n // TODO: Would be faster to return [0,0,0,0] immediately if dot == 0\n\n out[0] = -a0*invDot;\n out[1] = -a1*invDot;\n out[2] = -a2*invDot;\n out[3] = a3*invDot;\n return out;\n};\n\n/**\n * Calculates the conjugate of a quat\n * If the quaternion is normalized, this function is faster than quat.inverse and produces the same result.\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a quat to calculate conjugate of\n * @returns {quat} out\n */\nquat.conjugate = function (out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n out[3] = a[3];\n return out;\n};\n\n/**\n * Calculates the length of a quat\n *\n * @param {quat} a vector to calculate length of\n * @returns {Number} length of a\n * @function\n */\nquat.length = vec4.length;\n\n/**\n * Alias for {@link quat.length}\n * @function\n */\nquat.len = quat.length;\n\n/**\n * Calculates the squared length of a quat\n *\n * @param {quat} a vector to calculate squared length of\n * @returns {Number} squared length of a\n * @function\n */\nquat.squaredLength = vec4.squaredLength;\n\n/**\n * Alias for {@link quat.squaredLength}\n * @function\n */\nquat.sqrLen = quat.squaredLength;\n\n/**\n * Normalize a quat\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a quaternion to normalize\n * @returns {quat} out\n * @function\n */\nquat.normalize = vec4.normalize;\n\n/**\n * Creates a quaternion from the given 3x3 rotation matrix.\n *\n * @param {quat} out the receiving quaternion\n * @param {mat3} m rotation matrix\n * @returns {quat} out\n * @function\n */\nquat.fromMat3 = (function() {\n var s_iNext = [1,2,0];\n return function(out, m) {\n // Algorithm in Ken Shoemake's article in 1987 SIGGRAPH course notes\n // article \"Quaternion Calculus and Fast Animation\".\n var fTrace = m[0] + m[4] + m[8];\n var fRoot;\n\n if ( fTrace > 0.0 ) {\n // |w| > 1/2, may as well choose w > 1/2\n fRoot = Math.sqrt(fTrace + 1.0); // 2w\n out[3] = 0.5 * fRoot;\n fRoot = 0.5/fRoot; // 1/(4w)\n out[0] = (m[7]-m[5])*fRoot;\n out[1] = (m[2]-m[6])*fRoot;\n out[2] = (m[3]-m[1])*fRoot;\n } else {\n // |w| <= 1/2\n var i = 0;\n if ( m[4] > m[0] )\n i = 1;\n if ( m[8] > m[i*3+i] )\n i = 2;\n var j = s_iNext[i];\n var k = s_iNext[j];\n \n fRoot = Math.sqrt(m[i*3+i]-m[j*3+j]-m[k*3+k] + 1.0);\n out[i] = 0.5 * fRoot;\n fRoot = 0.5 / fRoot;\n out[3] = (m[k*3+j] - m[j*3+k]) * fRoot;\n out[j] = (m[j*3+i] + m[i*3+j]) * fRoot;\n out[k] = (m[k*3+i] + m[i*3+k]) * fRoot;\n }\n \n return out;\n };\n})();\n\n/**\n * Returns a string representation of a quatenion\n *\n * @param {quat} vec vector to represent as a string\n * @returns {String} string representation of the vector\n */\nquat.str = function (a) {\n return 'quat(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ')';\n};\n\nif(typeof(exports) !== 'undefined') {\n exports.quat = quat;\n}\n;\n\n\n\n\n\n\n\n\n\n\n\n\n\n })(shim.exports);\n})();\n",
"(function() {\n var slice = [].slice;\n\n function queue(parallelism) {\n var q,\n tasks = [],\n started = 0, // number of tasks that have been started (and perhaps finished)\n active = 0, // number of tasks currently being executed (started but not finished)\n remaining = 0, // number of tasks not yet finished\n popping, // inside a synchronous task callback?\n error = null,\n await = noop,\n all;\n\n if (!parallelism) parallelism = Infinity;\n\n function pop() {\n while (popping = started < tasks.length && active < parallelism) {\n var i = started++,\n t = tasks[i],\n a = slice.call(t, 1);\n a.push(callback(i));\n ++active;\n t[0].apply(null, a);\n }\n }\n\n function callback(i) {\n return function(e, r) {\n --active;\n if (error != null) return;\n if (e != null) {\n error = e; // ignore new tasks and squelch active callbacks\n started = remaining = NaN; // stop queued tasks from starting\n notify();\n } else {\n tasks[i] = r;\n if (--remaining) popping || pop();\n else notify();\n }\n };\n }\n\n function notify() {\n if (error != null) await(error);\n else if (all) await(error, tasks);\n else await.apply(null, [error].concat(tasks));\n }\n\n return q = {\n defer: function() {\n if (!error) {\n tasks.push(arguments);\n ++remaining;\n pop();\n }\n return q;\n },\n await: function(f) {\n await = f;\n all = false;\n if (!remaining) notify();\n return q;\n },\n awaitAll: function(f) {\n await = f;\n all = true;\n if (!remaining) notify();\n return q;\n }\n };\n }\n\n function noop() {}\n\n queue.version = \"1.0.7\";\n if (typeof define === \"function\" && define.amd) define(function() { return queue; });\n else if (typeof module === \"object\" && module.exports) module.exports = queue;\n else this.queue = queue;\n})();\n",
"// Miscellaneous geo functions\nimport Point from './point';\n\nexport var Geo = {};\n\n// Projection constants\nGeo.tile_size = 256;\nGeo.half_circumference_meters = 20037508.342789244;\nGeo.map_origin_meters = Point(-Geo.half_circumference_meters, Geo.half_circumference_meters);\nGeo.min_zoom_meters_per_pixel = Geo.half_circumference_meters * 2 / Geo.tile_size; // min zoom draws world as 2 tiles wide\nGeo.meters_per_pixel = [];\nGeo.max_zoom = 20;\nfor (var z=0; z <= Geo.max_zoom; z++) {\n Geo.meters_per_pixel[z] = Geo.min_zoom_meters_per_pixel / Math.pow(2, z);\n}\n\n// Conversion functions based on an defined tile scale\nGeo.units_per_meter = [];\nGeo.setTileScale = function(scale)\n{\n Geo.tile_scale = scale;\n Geo.units_per_pixel = Geo.tile_scale / Geo.tile_size;\n\n for (var z=0; z <= Geo.max_zoom; z++) {\n Geo.units_per_meter[z] = Geo.tile_scale / (Geo.tile_size * Geo.meters_per_pixel[z]);\n }\n};\n\n// Convert tile location to mercator meters - multiply by pixels per tile, then by meters per pixel, adjust for map origin\nGeo.metersForTile = function (tile)\n{\n return Point(\n (tile.x * Geo.tile_size * Geo.meters_per_pixel[tile.z]) + Geo.map_origin_meters.x,\n ((tile.y * Geo.tile_size * Geo.meters_per_pixel[tile.z]) * -1) + Geo.map_origin_meters.y\n );\n};\n\n// Convert mercator meters to lat-lng\nGeo.metersToLatLng = function (meters)\n{\n var c = Point.copy(meters);\n\n c.x /= Geo.half_circumference_meters;\n c.y /= Geo.half_circumference_meters;\n\n c.y = (2 * Math.atan(Math.exp(c.y * Math.PI)) - (Math.PI / 2)) / Math.PI;\n\n c.x *= 180;\n c.y *= 180;\n\n return c;\n};\n\n// Convert lat-lng to mercator meters\nGeo.latLngToMeters = function(latlng)\n{\n var c = Point.copy(latlng);\n\n // Latitude\n c.y = Math.log(Math.tan((c.y + 90) * Math.PI / 360)) / (Math.PI / 180);\n c.y = c.y * Geo.half_circumference_meters / 180;\n\n // Longitude\n c.x = c.x * Geo.half_circumference_meters / 180;\n\n return c;\n};\n\n// Run a transform function on each cooordinate in a GeoJSON geometry\nGeo.transformGeometry = function (geometry, transform)\n{\n if (geometry.type == 'Point') {\n return transform(geometry.coordinates);\n }\n else if (geometry.type == 'LineString' || geometry.type == 'MultiPoint') {\n return geometry.coordinates.map(transform);\n }\n else if (geometry.type == 'Polygon' || geometry.type == 'MultiLineString') {\n return geometry.coordinates.map(function (coordinates) {\n return coordinates.map(transform);\n });\n }\n else if (geometry.type == 'MultiPolygon') {\n return geometry.coordinates.map(function (polygon) {\n return polygon.map(function (coordinates) {\n return coordinates.map(transform);\n });\n });\n }\n // TODO: support GeometryCollection\n return {};\n};\n\nGeo.boxIntersect = function (b1, b2)\n{\n return !(\n b2.sw.x > b1.ne.x ||\n b2.ne.x < b1.sw.x ||\n b2.sw.y > b1.ne.y ||\n b2.ne.y < b1.sw.y\n );\n};\n\n// Split the lines of a feature wherever two points are farther apart than a given tolerance\nGeo.splitFeatureLines = function (feature, tolerance) {\n var tolerance = tolerance || 0.001;\n var tolerance_sq = tolerance * tolerance;\n var geom = feature.geometry;\n var lines;\n\n if (geom.type == 'MultiLineString') {\n lines = geom.coordinates;\n }\n else if (geom.type =='LineString') {\n lines = [geom.coordinates];\n }\n else {\n return feature;\n }\n\n var split_lines = [];\n\n for (var s=0; s < lines.length; s++) {\n var seg = lines[s];\n var split_seg = [];\n var last_coord = null;\n var keep;\n\n for (var c=0; c < seg.length; c++) {\n var coord = seg[c];\n keep = true;\n\n if (last_coord != null) {\n var dist = (coord[0] - last_coord[0]) * (coord[0] - last_coord[0]) + (coord[1] - last_coord[1]) * (coord[1] - last_coord[1]);\n if (dist > tolerance_sq) {\n // console.log(\"split lines at (\" + coord[0] + \", \" + coord[1] + \"), \" + Math.sqrt(dist) + \" apart\");\n keep = false;\n }\n }\n\n if (keep == false) {\n split_lines.push(split_seg);\n split_seg = [];\n }\n split_seg.push(coord);\n\n last_coord = coord;\n }\n\n split_lines.push(split_seg);\n split_seg = [];\n }\n\n if (split_lines.length == 1) {\n geom.type = 'LineString';\n geom.coordinates = split_lines[0];\n }\n else {\n geom.type = 'MultiLineString';\n geom.coordinates = split_lines;\n }\n\n return feature;\n};\n",
"// WebGL management and rendering functions\n\nexport var GL = {};\n\n// Setup a WebGL context\n// If no canvas element is provided, one is created and added to the document body\nGL.getContext = function getContext (canvas)\n{\n\n var fullscreen = false;\n if (canvas == null) {\n canvas = document.createElement('canvas');\n canvas.style.position = 'absolute';\n canvas.style.top = 0;\n canvas.style.left = 0;\n canvas.style.zIndex = -1;\n document.body.appendChild(canvas);\n fullscreen = true;\n }\n\n var gl = canvas.getContext('experimental-webgl');\n if (!gl) {\n alert(\"Couldn't create WebGL context. Your browser probably doesn't support WebGL or it's turned off?\");\n throw \"Couldn't create WebGL context\";\n }\n\n GL.resizeCanvas(gl, window.innerWidth, window.innerHeight);\n if (fullscreen == true) {\n window.addEventListener('resize', function () {\n GL.resizeCanvas(gl, window.innerWidth, window.innerHeight);\n });\n }\n\n // GLVertexArrayObject.init(gl); // TODO: this pattern doesn't support multiple active GL contexts, should that even be supported?\n\n return gl;\n};\n\nGL.resizeCanvas = function (gl, width, height)\n{\n var device_pixel_ratio = window.devicePixelRatio || 1;\n gl.canvas.style.width = width + 'px';\n gl.canvas.style.height = height + 'px';\n gl.canvas.width = Math.round(gl.canvas.style.width * device_pixel_ratio);\n gl.canvas.height = Math.round(gl.canvas.style.width * device_pixel_ratio);\n gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);\n};\n\n// Compile & link a WebGL program from provided vertex and fragment shader sources\n// update a program if one is passed in. Create one if not. Alert and don't update anything if the shaders don't compile.\nGL.updateProgram = function GLupdateProgram (gl, program, vertex_shader_source, fragment_shader_source)\n{\n try {\n var vertex_shader = GL.createShader(gl, vertex_shader_source, gl.VERTEX_SHADER);\n var fragment_shader = GL.createShader(gl, '#ifdef GL_ES\\nprecision highp float;\\n#endif\\n\\n' + fragment_shader_source, gl.FRAGMENT_SHADER);\n }\n catch(err) {\n // alert(err);\n console.log(err);\n return program;\n }\n\n gl.useProgram(null);\n if (program != null) {\n var old_shaders = gl.getAttachedShaders(program);\n for(var i = 0; i < old_shaders.length; i++) {\n gl.detachShader(program, old_shaders[i]);\n }\n } else {\n program = gl.createProgram();\n }\n\n if (vertex_shader == null || fragment_shader == null) {\n return program;\n }\n\n gl.attachShader(program, vertex_shader);\n gl.attachShader(program, fragment_shader);\n\n gl.deleteShader(vertex_shader);\n gl.deleteShader(fragment_shader);\n\n gl.linkProgram(program);\n\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n var program_error =\n \"WebGL program error:\\n\" +\n \"VALIDATE_STATUS: \" + gl.getProgramParameter(program, gl.VALIDATE_STATUS) + \"\\n\" +\n \"ERROR: \" + gl.getError() + \"\\n\\n\" +\n \"--- Vertex Shader ---\\n\" + vertex_shader_source + \"\\n\\n\" +\n \"--- Fragment Shader ---\\n\" + fragment_shader_source;\n console.log(program_error);\n throw program_error;\n }\n\n return program;\n};\n\n// Compile a vertex or fragment shader from provided source\nGL.createShader = function GLcreateShader (gl, source, type)\n{\n var shader = gl.createShader(type);\n\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n var shader_error =\n \"WebGL shader error:\\n\" +\n (type == gl.VERTEX_SHADER ? \"VERTEX\" : \"FRAGMENT\") + \" SHADER:\\n\" +\n gl.getShaderInfoLog(shader);\n throw shader_error;\n }\n\n return shader;\n};\n\n// Triangulation using libtess.js port of gluTesselator\n// https://github.com/brendankenny/libtess.js\ntry {\n GL.tesselator = (function initTesselator() {\n var tesselator = new libtess.GluTesselator();\n\n // Called for each vertex of tesselator output\n function vertexCallback(data, polyVertArray) {\n if (tesselator.z != null) {\n polyVertArray.push([data[0], data[1], tesselator.z]);\n }\n else {\n polyVertArray.push([data[0], data[1]]);\n }\n }\n\n // Called when segments intersect and must be split\n function combineCallback(coords, data, weight) {\n return coords;\n }\n\n // Called when a vertex starts or stops a boundary edge of a polygon\n function edgeCallback(flag) {\n // No-op callback to force simple triangle primitives (no triangle strips or fans).\n // See: http://www.glprogramming.com/red/chapter11.html\n // \"Since edge flags make no sense in a triangle fan or triangle strip, if there is a callback\n // associated with GLU_TESS_EDGE_FLAG that enables edge flags, the GLU_TESS_BEGIN callback is\n // called only with GL_TRIANGLES.\"\n // console.log('GL.tesselator: edge flag: ' + flag);\n }\n\n tesselator.gluTessCallback(libtess.gluEnum.GLU_TESS_VERTEX_DATA, vertexCallback);\n tesselator.gluTessCallback(libtess.gluEnum.GLU_TESS_COMBINE, combineCallback);\n tesselator.gluTessCallback(libtess.gluEnum.GLU_TESS_EDGE_FLAG, edgeCallback);\n\n // Brendan Kenny:\n // libtess will take 3d verts and flatten to a plane for tesselation\n // since only doing 2d tesselation here, provide z=1 normal to skip\n // iterating over verts only to get the same answer.\n // comment out to test normal-generation code\n tesselator.gluTessNormal(0, 0, 1);\n\n return tesselator;\n })();\n\n GL.triangulatePolygon = function GLTriangulate (contours, z)\n {\n var triangleVerts = [];\n GL.tesselator.z = z;\n GL.tesselator.gluTessBeginPolygon(triangleVerts);\n\n for (var i = 0; i < contours.length; i++) {\n GL.tesselator.gluTessBeginContour();\n var contour = contours[i];\n for (var j = 0; j < contour.length; j ++) {\n var coords = [contour[j][0], contour[j][1], 0];\n GL.tesselator.gluTessVertex(coords, coords);\n }\n GL.tesselator.gluTessEndContour();\n }\n\n GL.tesselator.gluTessEndPolygon();\n return triangleVerts;\n };\n}\ncatch (e) {\n // console.log(\"libtess not defined!\");\n // skip if libtess not defined\n}\n\n// Add vertices to an array (destined to be used as a GL buffer), 'striping' each vertex with constant data\n// Per-vertex attributes must be pre-packed into the vertices array\n// Used for adding values that are often constant per geometry or polygon, like colors, normals (for polys sitting flat on map), layer and material info, etc.\nGL.addVertices = function (vertices, vertex_constants, vertex_data)\n{\n if (vertices == null) {\n return vertex_data;\n }\n vertex_constants = vertex_constants || [];\n\n for (var v=0, vlen = vertices.length; v < vlen; v++) {\n vertex_data.push.apply(vertex_data, vertices[v]);\n vertex_data.push.apply(vertex_data, vertex_constants);\n }\n\n return vertex_data;\n};\n\n// Add vertices to an array, 'striping' each vertex with constant data\n// Multiple, un-packed attribute arrays can be provided\nGL.addVerticesMultipleAttributes = function (dynamics, constants, vertex_data)\n{\n var dlen = dynamics.length;\n var vlen = dynamics[0].length;\n constants = constants || [];\n\n for (var v=0; v < vlen; v++) {\n for (var d=0; d < dlen; d++) {\n vertex_data.push.apply(vertex_data, dynamics[d][v]);\n }\n vertex_data.push.apply(vertex_data, constants);\n }\n\n return vertex_data;\n};\n\n// Add vertices to an array, with a variable layout (both per-vertex dynamic and constant attribs)\n// GL.addVerticesByAttributeLayout = function (attribs, vertex_data)\n// {\n// var max_length = 0;\n// for (var a=0; a < attribs.length; a++) {\n// // console.log(attribs[a].name);\n// // console.log(\"a \" + typeof attribs[a].data);\n// if (typeof attribs[a].data == 'object') {\n// // console.log(\"a[0] \" + typeof attribs[a].data[0]);\n// // Per-vertex list - array of array\n// if (typeof attribs[a].data[0] == 'object') {\n// attribs[a].cursor = 0;\n// if (attribs[a].data.length > max_length) {\n// max_length = attribs[a].data.length;\n// }\n// }\n// // Static array for all vertices\n// else {\n// attribs[a].next_vertex = attribs[a].data;\n// }\n// }\n// else {\n// // Static single value for all vertices, convert to array\n// attribs[a].next_vertex = [attribs[a].data];\n// }\n// }\n\n// for (var v=0; v < max_length; v++) {\n// for (var a=0; a < attribs.length; a++) {\n// if (attribs[a].cursor != null) {\n// // Next value in list\n// attribs[a].next_vertex = attribs[a].data[attribs[a].cursor];\n\n// // TODO: repeats if one list is shorter than others - desired behavior, or enforce same length?\n// if (attribs[a].cursor < attribs[a].data.length) {\n// attribs[a].cursor++;\n// }\n// }\n// vertex_data.push.apply(vertex_data, attribs[a].next_vertex);\n// }\n// }\n// return vertex_data;\n// };\n",
"import Point from '../point';\nimport {Vector} from '../vector';\nimport {GL} from './gl';\n\nexport var GLBuilders = {};\n\nGLBuilders.debug = false;\n\n// Tesselate a flat 2D polygon with fixed height and add to GL vertex buffer\nGLBuilders.buildPolygons = function GLBuildersBuildPolygons (polygons, z, vertex_data, options)\n{\n options = options || {};\n\n var vertex_constants = [];\n if (z != null) {\n vertex_constants.push(z); // provided z\n }\n if (options.normals) {\n vertex_constants.push(0, 0, 1); // upwards-facing normal\n }\n if (options.vertex_constants) {\n vertex_constants.push.apply(vertex_constants, options.vertex_constants);\n }\n if (vertex_constants.length == 0) {\n vertex_constants = null;\n }\n\n var num_polygons = polygons.length;\n for (var p=0; p < num_polygons; p++) {\n var vertices = GL.triangulatePolygon(polygons[p]);\n GL.addVertices(vertices, vertex_constants, vertex_data);\n }\n\n return vertex_data;\n};\n\n// Callback-base builder (for future exploration)\n// Tesselate a flat 2D polygon with fixed height and add to GL vertex buffer\n// GLBuilders.buildPolygons2 = function GLBuildersBuildPolygon2 (polygons, z, addGeometry, options)\n// {\n// options = options || {};\n\n// var num_polygons = polygons.length;\n// for (var p=0; p < num_polygons; p++) {\n// var vertices = {\n// positions: GL.triangulatePolygon(polygons[p], z),\n// normals: (options.normals ? [0, 0, 1] : null)\n// };\n\n// addGeometry(vertices);\n// }\n// };\n\n// Tesselate and extrude a flat 2D polygon into a simple 3D model with fixed height and add to GL vertex buffer\nGLBuilders.buildExtrudedPolygons = function GLBuildersBuildExtrudedPolygon (polygons, z, height, min_height, vertex_data, options)\n{\n options = options || {};\n var min_z = z + (min_height || 0);\n var max_z = z + height;\n\n // Top\n GLBuilders.buildPolygons(polygons, max_z, vertex_data, { normals: true, vertex_constants: options.vertex_constants });\n // var top_vertex_constants = [0, 0, 1];\n // if (options.vertex_constants != null) {\n // top_vertex_constants.push.apply(top_vertex_constants, options.vertex_constants);\n // }\n // GLBuilders.buildPolygons2(\n // polygons,\n // max_z,\n // function (vertices) {\n // GL.addVertices(vertices.positions, top_vertex_constants, vertex_data);\n // }\n // );\n\n // Walls\n var wall_vertex_constants = [null, null, null]; // normals will be calculated below\n if (options.vertex_constants) {\n wall_vertex_constants.push.apply(wall_vertex_constants, options.vertex_constants);\n }\n\n var num_polygons = polygons.length;\n for (var p=0; p < num_polygons; p++) {\n var polygon = polygons[p];\n\n for (var q=0; q < polygon.length; q++) {\n var contour = polygon[q];\n\n for (var w=0; w < contour.length - 1; w++) {\n var wall_vertices = [];\n\n // Two triangles for the quad formed by each vertex pair, going from bottom to top height\n wall_vertices.push(\n // Triangle\n [contour[w+1][0], contour[w+1][1], max_z],\n [contour[w+1][0], contour[w+1][1], min_z],\n [contour[w][0], contour[w][1], min_z],\n // Triangle\n [contour[w][0], contour[w][1], min_z],\n [contour[w][0], contour[w][1], max_z],\n [contour[w+1][0], contour[w+1][1], max_z]\n );\n\n // Calc the normal of the wall from up vector and one segment of the wall triangles\n var normal = Vector.cross(\n [0, 0, 1],\n Vector.normalize([contour[w+1][0] - contour[w][0], contour[w+1][1] - contour[w][1], 0])\n );\n\n wall_vertex_constants[0] = normal[0];\n wall_vertex_constants[1] = normal[1];\n wall_vertex_constants[2] = normal[2];\n\n GL.addVertices(wall_vertices, wall_vertex_constants, vertex_data);\n }\n }\n }\n\n return vertex_data;\n};\n\n// Build tessellated triangles for a polyline\n// Basically following the method described here for miter joints:\n// http://artgrammer.blogspot.co.uk/2011/07/drawing-polylines-by-tessellation.html\nGLBuilders.buildPolylines = function GLBuildersBuildPolylines (lines, z, width, vertex_data, options)\n{\n options = options || {};\n options.closed_polygon = options.closed_polygon || false;\n options.remove_tile_edges = options.remove_tile_edges || false;\n\n var vertex_constants = [z, 0, 0, 1]; // provided z, and upwards-facing normal\n if (options.vertex_constants) {\n vertex_constants.push.apply(vertex_constants, options.vertex_constants);\n }\n\n // Line center - debugging\n if (GLBuilders.debug && options.vertex_lines) {\n var num_lines = lines.length;\n for (var ln=0; ln < num_lines; ln++) {\n var line = lines[ln];\n\n for (var p=0; p < line.length - 1; p++) {\n // Point A to B\n var pa = line[p];\n var pb = line[p+1];\n\n options.vertex_lines.push(\n pa[0], pa[1], z + 0.001, 0, 0, 1, 1.0, 0, 0,\n pb[0], pb[1], z + 0.001, 0, 0, 1, 1.0, 0, 0\n );\n }\n };\n }\n\n // Build triangles\n var vertices = [];\n var num_lines = lines.length;\n for (var ln=0; ln < num_lines; ln++) {\n var line = lines[ln];\n // Multiple line segments\n if (line.length > 2) {\n // Build anchors for line segments:\n // anchors are 3 points, each connecting 2 line segments that share a joint (start point, joint point, end point)\n\n var anchors = [];\n\n if (line.length > 3) {\n // Find midpoints of each line segment\n // For closed polygons, calculate all midpoints since segments will wrap around to first midpoint\n var mid = [];\n var p, pmax;\n if (options.closed_polygon == true) {\n p = 0; // start on first point\n pmax = line.length - 1;\n }\n // For open polygons, skip first midpoint and use line start instead\n else {\n p = 1; // start on second point\n pmax = line.length - 2;\n mid.push(line[0]); // use line start instead of first midpoint\n }\n\n // Calc midpoints\n for (; p < pmax; p++) {\n var pa = line[p];\n var pb = line[p+1];\n mid.push([(pa[0] + pb[0]) / 2, (pa[1] + pb[1]) / 2]);\n }\n\n // Same closed/open polygon logic as above: keep last midpoint for closed, skip for open\n var mmax;\n if (options.closed_polygon == true) {\n mmax = mid.length;\n }\n else {\n mid.push(line[line.length-1]); // use line end instead of last midpoint\n mmax = mid.length - 1;\n }\n\n // Make anchors by connecting midpoints to line joints\n for (p=0; p < mmax; p++) {\n anchors.push([mid[p], line[(p+1) % line.length], mid[(p+1) % mid.length]]);\n }\n }\n else {\n // Degenerate case, a 3-point line is just a single anchor\n anchors = [[line[0], line[1], line[2]]];\n }\n\n for (var p=0; p < anchors.length; p++) {\n if (!options.remove_tile_edges) {\n buildAnchor(anchors[p][0], anchors[p][1], anchors[p][2]);\n // buildSegment(anchors[p][0], anchors[p][1]); // use these to draw extruded segments w/o join, for debugging\n // buildSegment(anchors[p][1], anchors[p][2]);\n }\n else {\n var edge1 = GLBuilders.isOnTileEdge(anchors[p][0], anchors[p][1]);\n var edge2 = GLBuilders.isOnTileEdge(anchors[p][1], anchors[p][2]);\n if (!edge1 && !edge2) {\n buildAnchor(anchors[p][0], anchors[p][1], anchors[p][2]);\n }\n else if (!edge1) {\n buildSegment(anchors[p][0], anchors[p][1]);\n }\n else if (!edge2) {\n buildSegment(anchors[p][1], anchors[p][2]);\n }\n }\n }\n }\n // Single 2-point segment\n else if (line.length == 2) {\n buildSegment(line[0], line[1]); // TODO: replace buildSegment with a degenerate form of buildAnchor? buildSegment is still useful for debugging\n }\n };\n\n GL.addVertices(vertices, vertex_constants, vertex_data);\n\n // Build triangles for a single line segment, extruded by the provided width\n function buildSegment (pa, pb) {\n var slope = Vector.normalize([(pb[1] - pa[1]) * -1, pb[0] - pa[0]]);\n\n var pa_outer = [pa[0] + slope[0] * width/2, pa[1] + slope[1] * width/2];\n var pa_inner = [pa[0] - slope[0] * width/2, pa[1] - slope[1] * width/2];\n\n var pb_outer = [pb[0] + slope[0] * width/2, pb[1] + slope[1] * width/2];\n var pb_inner = [pb[0] - slope[0] * width/2, pb[1] - slope[1] * width/2];\n\n vertices.push(\n pb_inner, pb_outer, pa_inner,\n pa_inner, pb_outer, pa_outer\n );\n }\n\n // Build triangles for a 3-point 'anchor' shape, consisting of two line segments with a joint\n // TODO: move these functions out of closures?\n function buildAnchor (pa, joint, pb) {\n // Inner and outer line segments for [pa, joint] and [joint, pb]\n var pa_slope = Vector.normalize([(joint[1] - pa[1]) * -1, joint[0] - pa[0]]);\n var pa_outer = [\n [pa[0] + pa_slope[0] * width/2, pa[1] + pa_slope[1] * width/2],\n [joint[0] + pa_slope[0] * width/2, joint[1] + pa_slope[1] * width/2]\n ];\n var pa_inner = [\n [pa[0] - pa_slope[0] * width/2, pa[1] - pa_slope[1] * width/2],\n [joint[0] - pa_slope[0] * width/2, joint[1] - pa_slope[1] * width/2]\n ];\n\n var pb_slope = Vector.normalize([(pb[1] - joint[1]) * -1, pb[0] - joint[0]]);\n var pb_outer = [\n [joint[0] + pb_slope[0] * width/2, joint[1] + pb_slope[1] * width/2],\n [pb[0] + pb_slope[0] * width/2, pb[1] + pb_slope[1] * width/2]\n ];\n var pb_inner = [\n [joint[0] - pb_slope[0] * width/2, joint[1] - pb_slope[1] * width/2],\n [pb[0] - pb_slope[0] * width/2, pb[1] - pb_slope[1] * width/2]\n ];\n\n // Miter join - solve for the intersection between the two outer line segments\n var intersection = Vector.lineIntersection(pa_outer[0], pa_outer[1], pb_outer[0], pb_outer[1]);\n var line_debug = null;\n if (intersection != null) {\n var intersect_outer = intersection;\n\n // Cap the intersection point to a reasonable distance (as join angle becomes sharper, miter joint distance would approach infinity)\n var len_sq = Vector.lengthSq([intersect_outer[0] - joint[0], intersect_outer[1] - joint[1]]);\n var miter_len_max = 3; // multiplier on line width for max distance miter join can be from joint\n if (len_sq > (width * width * miter_len_max * miter_len_max)) {\n line_debug = 'distance';\n intersect_outer = Vector.normalize([intersect_outer[0] - joint[0], intersect_outer[1] - joint[1]]);\n intersect_outer = [\n joint[0] + intersect_outer[0] * miter_len_max,\n joint[1] + intersect_outer[1] * miter_len_max\n ]\n }\n\n var intersect_inner = [\n (joint[0] - intersect_outer[0]) + joint[0],\n (joint[1] - intersect_outer[1]) + joint[1]\n ];\n\n vertices.push(\n intersect_inner, intersect_outer, pa_inner[0],\n pa_inner[0], intersect_outer, pa_outer[0],\n\n pb_inner[1], pb_outer[1], intersect_inner,\n intersect_inner, pb_outer[1], intersect_outer\n );\n }\n else {\n // Line segments are parallel, use the first outer line segment as join instead\n line_debug = 'parallel';\n pa_inner[1] = pb_inner[0];\n pa_outer[1] = pb_outer[0];\n\n vertices.push(\n pa_inner[1], pa_outer[1], pa_inner[0],\n pa_inner[0], pa_outer[1], pa_outer[0],\n\n pb_inner[1], pb_outer[1], pb_inner[0],\n pb_inner[0], pb_outer[1], pb_outer[0]\n );\n }\n\n // Extruded inner/outer edges - debugging\n if (GLBuilders.debug && options.vertex_lines) {\n options.vertex_lines.push(\n pa_inner[0][0], pa_inner[0][1], z + 0.001, 0, 0, 1, 0, 1.0, 0,\n pa_inner[1][0], pa_inner[1][1], z + 0.001, 0, 0, 1, 0, 1.0, 0,\n\n pb_inner[0][0], pb_inner[0][1], z + 0.001, 0, 0, 1, 0, 1.0, 0,\n pb_inner[1][0], pb_inner[1][1], z + 0.001, 0, 0, 1, 0, 1.0, 0,\n\n pa_outer[0][0], pa_outer[0][1], z + 0.001, 0, 0, 1, 0, 1.0, 0,\n pa_outer[1][0], pa_outer[1][1], z + 0.001, 0, 0, 1, 0, 1.0, 0,\n\n pb_outer[0][0], pb_outer[0][1], z + 0.001, 0, 0, 1, 0, 1.0, 0,\n pb_outer[1][0], pb_outer[1][1], z + 0.001, 0, 0, 1, 0, 1.0, 0,\n\n pa_inner[0][0], pa_inner[0][1], z + 0.001, 0, 0, 1, 0, 1.0, 0,\n pa_outer[0][0], pa_outer[0][1], z + 0.001, 0, 0, 1, 0, 1.0, 0,\n\n pa_inner[1][0], pa_inner[1][1], z + 0.001, 0, 0, 1, 0, 1.0, 0,\n pa_outer[1][0], pa_outer[1][1], z + 0.001, 0, 0, 1, 0, 1.0, 0,\n\n pb_inner[0][0], pb_inner[0][1], z + 0.001, 0, 0, 1, 0, 1.0, 0,\n pb_outer[0][0], pb_outer[0][1], z + 0.001, 0, 0, 1, 0, 1.0, 0,\n\n pb_inner[1][0], pb_inner[1][1], z + 0.001, 0, 0, 1, 0, 1.0, 0,\n pb_outer[1][0], pb_outer[1][1], z + 0.001, 0, 0, 1, 0, 1.0, 0\n );\n }\n\n if (GLBuilders.debug && line_debug && options.vertex_lines) {\n var dcolor;\n if (line_debug == 'parallel') {\n // console.log(\"!!! lines are parallel !!!\");\n dcolor = [0, 1, 0];\n }\n else if (line_debug == 'distance') {\n // console.log(\"!!! miter intersection point exceeded allowed distance from joint !!!\");\n dcolor = [1, 0, 0];\n }\n // console.log('OSM id: ' + feature.id); // TODO: if this function is moved out of a closure, this feature debug info won't be available\n // console.log([pa, joint, pb]);\n // console.log(feature);\n options.vertex_lines.push(\n pa[0], pa[1], z + 0.002,\n 0, 0, 1, dcolor[0], dcolor[1], dcolor[2],\n joint[0], joint[1], z + 0.002,\n 0, 0, 1, dcolor[0], dcolor[1], dcolor[2],\n joint[0], joint[1], z + 0.002,\n 0, 0, 1, dcolor[0], dcolor[1], dcolor[2],\n pb[0], pb[1], z + 0.002,\n 0, 0, 1, dcolor[0], dcolor[1], dcolor[2]\n );\n\n var num_lines = lines.length;\n for (var ln=0; ln < num_lines; ln++) {\n var line2 = lines[ln];\n\n for (var p=0; p < line2.length - 1; p++) {\n // Point A to B\n var pa = line2[p];\n var pb = line2[p+1];\n\n options.vertex_lines.push(\n pa[0], pa[1], z + 0.0005,\n 0, 0, 1, 0, 0, 1.0,\n pb[0], pb[1], z + 0.0005,\n 0, 0, 1, 0, 0, 1.0\n );\n }\n };\n }\n }\n\n return vertex_data;\n};\n\n// Build a quad centered on a point\n// Z coord, normals, and texcoords are optional\n// Layout order is:\n// position (2 or 3 components)\n// texcoord (optional, 2 components)\n// normal (optional, 3 components)\n// constants (optional)\nGLBuilders.buildQuadsForPoints = function (points, width, height, z, vertex_data, options)\n{\n var options = options || {};\n\n var vertex_constants = [];\n if (options.normals) {\n vertex_constants.push(0, 0, 1); // upwards-facing normal\n }\n if (options.vertex_constants) {\n vertex_constants.push.apply(vertex_constants, options.vertex_constants);\n }\n if (vertex_constants.length == 0) {\n vertex_constants = null;\n }\n\n var num_points = points.length;\n for (var p=0; p < num_points; p++) {\n var point = points[p];\n\n var positions = [\n [point[0] - width/2, point[1] - height/2],\n [point[0] + width/2, point[1] - height/2],\n [point[0] + width/2, point[1] + height/2],\n\n [point[0] - width/2, point[1] - height/2],\n [point[0] + width/2, point[1] + height/2],\n [point[0] - width/2, point[1] + height/2],\n ];\n\n // Add provided z\n if (z != null) {\n positions[0][2] = z;\n positions[1][2] = z;\n positions[2][2] = z;\n positions[3][2] = z;\n positions[4][2] = z;\n positions[5][2] = z;\n }\n\n if (options.texcoords == true) {\n var texcoords = [\n [-1, -1],\n [1, -1],\n [1, 1],\n\n [-1, -1],\n [1, 1],\n [-1, 1]\n ];\n\n GL.addVerticesMultipleAttributes([positions, texcoords], vertex_constants, vertex_data);\n }\n else {\n GL.addVertices(positions, vertex_constants, vertex_data);\n }\n }\n\n return vertex_data;\n};\n\n// Callback-base builder (for future exploration)\n// GLBuilders.buildQuadsForPoints2 = function GLBuildersBuildQuadsForPoints (points, width, height, addGeometry, options)\n// {\n// var options = options || {};\n\n// var num_points = points.length;\n// for (var p=0; p < num_points; p++) {\n// var point = points[p];\n\n// var positions = [\n// [point[0] - width/2, point[1] - height/2],\n// [point[0] + width/2, point[1] - height/2],\n// [point[0] + width/2, point[1] + height/2],\n\n// [point[0] - width/2, point[1] - height/2],\n// [point[0] + width/2, point[1] + height/2],\n// [point[0] - width/2, point[1] + height/2],\n// ];\n\n// if (options.texcoords == true) {\n// var texcoords = [\n// [-1, -1],\n// [1, -1],\n// [1, 1],\n\n// [-1, -1],\n// [1, 1],\n// [-1, 1]\n// ];\n// }\n\n// var vertices = {\n// positions: positions,\n// normals: (options.normals ? [0, 0, 1] : null),\n// texcoords: (options.texcoords && texcoords)\n// };\n// addGeometry(vertices);\n// }\n// };\n\n// Build native GL lines for a polyline\nGLBuilders.buildLines = function GLBuildersBuildLines (lines, feature, layer, style, tile, z, vertex_data, options)\n{\n options = options || {};\n\n var color = style.color;\n var width = style.width;\n\n var num_lines = lines.length;\n for (var ln=0; ln < num_lines; ln++) {\n var line = lines[ln];\n\n for (var p=0; p < line.length - 1; p++) {\n // Point A to B\n var pa = line[p];\n var pb = line[p+1];\n\n vertex_data.push(\n // Point A\n pa[0], pa[1], z,\n 0, 0, 1, // flat surfaces point straight up\n color[0], color[1], color[2],\n // Point B\n pb[0], pb[1], z,\n 0, 0, 1, // flat surfaces point straight up\n color[0], color[1], color[2]\n );\n }\n };\n\n return vertex_data;\n};\n\n/* Utility functions */\n\n// Tests if a line segment (from point A to B) is nearly coincident with the edge of a tile\nGLBuilders.isOnTileEdge = function (pa, pb, options)\n{\n options = options || {};\n\n var tolerance_function = options.tolerance_function || GLBuilders.valuesWithinTolerance;\n var tolerance = options.tolerance || 1; // tweak this adjust if catching too few/many line segments near tile edges\n var tile_min = GLBuilders.tile_bounds[0];\n var tile_max = GLBuilders.tile_bounds[1];\n var edge = null;\n\n if (tolerance_function(pa[0], tile_min.x, tolerance) && tolerance_function(pb[0], tile_min.x, tolerance)) {\n edge = 'left';\n }\n else if (tolerance_function(pa[0], tile_max.x, tolerance) && tolerance_function(pb[0], tile_max.x, tolerance)) {\n edge = 'right';\n }\n else if (tolerance_function(pa[1], tile_min.y, tolerance) && tolerance_function(pb[1], tile_min.y, tolerance)) {\n edge = 'top';\n }\n else if (tolerance_function(pa[1], tile_max.y, tolerance) && tolerance_function(pb[1], tile_max.y, tolerance)) {\n edge = 'bottom';\n }\n return edge;\n};\n\nGLBuilders.setTileScale = function (scale)\n{\n GLBuilders.tile_bounds = [\n Point(0, 0),\n Point(scale, -scale) // TODO: correct for flipped y-axis?\n ];\n};\n\nGLBuilders.valuesWithinTolerance = function (a, b, tolerance)\n{\n tolerance = tolerance || 1;\n return (Math.abs(a - b) < tolerance);\n};\n\n// Build a zigzag line pattern for testing joins and caps\nGLBuilders.buildZigzagLineTestPattern = function ()\n{\n var min = Point(0, 0); // tile.min;\n var max = Point(4096, 4096); // tile.max;\n var g = {\n id: 123,\n geometry: {\n type: 'LineString',\n coordinates: [\n [min.x * 0.75 + max.x * 0.25, min.y * 0.75 + max.y * 0.25],\n [min.x * 0.75 + max.x * 0.25, min.y * 0.5 + max.y * 0.5],\n [min.x * 0.25 + max.x * 0.75, min.y * 0.75 + max.y * 0.25],\n [min.x * 0.25 + max.x * 0.75, min.y * 0.25 + max.y * 0.75],\n [min.x * 0.4 + max.x * 0.6, min.y * 0.5 + max.y * 0.5],\n [min.x * 0.5 + max.x * 0.5, min.y * 0.25 + max.y * 0.75],\n [min.x * 0.75 + max.x * 0.25, min.y * 0.25 + max.y * 0.75],\n [min.x * 0.75 + max.x * 0.25, min.y * 0.4 + max.y * 0.6]\n ]\n },\n properties: {\n kind: 'debug'\n }\n };\n // console.log(g.geometry.coordinates);\n return g;\n};\n",
"/*** Manage rendering for primitives ***/\nimport {GL} from './gl';\nimport GLVertexLayout from './gl_vertex_layout';\nimport GLProgram from './gl_program';\n\n// A single mesh/VBO, described by a vertex layout, that can be drawn with one or more programs\nexport default function GLGeometry (gl, vertex_data, vertex_layout, options)\n{\n options = options || {};\n\n this.gl = gl;\n this.vertex_data = vertex_data; // Float32Array\n this.vertex_layout = vertex_layout;\n this.buffer = this.gl.createBuffer();\n this.draw_mode = options.draw_mode || this.gl.TRIANGLES;\n this.data_usage = options.data_usage || this.gl.STATIC_DRAW;\n this.vertices_per_geometry = 3; // TODO: support lines, strip, fan, etc.\n\n this.vertex_count = this.vertex_data.byteLength / this.vertex_layout.stride;\n this.geometry_count = this.vertex_count / this.vertices_per_geometry;\n\n // TODO: disabling VAOs for now because we need to support different vertex layout + program combinations,\n // where not all programs will recognize all attributes (e.g. feature selection shaders include extra attrib).\n // To support VAOs here, would need to support multiple per geometry, keyed by GL program?\n // this.vao = GLVertexArrayObject.create(function() {\n // this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.buffer);\n // this.setup();\n // }.bind(this));\n\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.buffer);\n this.gl.bufferData(this.gl.ARRAY_BUFFER, this.vertex_data, this.data_usage);\n}\n\n// Render, by default with currently bound program, or otherwise with optionally provided one\nGLGeometry.prototype.render = function (options)\n{\n options = options || {};\n\n // GLVertexArrayObject.bind(this.vao);\n\n if (typeof this._render_setup == 'function') {\n this._render_setup();\n }\n\n var gl_program = options.gl_program || GLProgram.current;\n gl_program.use();\n\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.buffer);\n this.vertex_layout.enable(this.gl, gl_program);\n\n // TODO: support element array mode\n this.gl.drawArrays(this.draw_mode, 0, this.vertex_count);\n // GLVertexArrayObject.bind(null);\n};\n\nGLGeometry.prototype.destroy = function ()\n{\n console.log(\"GLGeometry.destroy: delete buffer of size \" + this.vertex_data.byteLength);\n this.gl.deleteBuffer(this.buffer);\n delete this.vertex_data;\n};\n",
"// Rendering modes\nimport {GL} from './gl';\nimport GLVertexLayout from './gl_vertex_layout';\nimport {GLBuilders} from './gl_builders';\nimport GLProgram from './gl_program';\nimport GLGeometry from './gl_geom';\n\nvar shader_sources = require('./gl_shaders'); // built-in shaders\n\nimport Queue from 'queue-async';\n\nexport var Modes = {};\nexport var ModeManager = {};\n\n\n// Base\n\nvar RenderMode = {\n init: function (gl) {\n this.gl = gl;\n this.makeGLProgram();\n\n if (typeof this._init == 'function') {\n this._init();\n }\n },\n refresh: function () { // TODO: should this be async/non-blocking?\n this.makeGLProgram();\n },\n defines: {},\n selection: false,\n buildPolygons: function(){}, // build functions are no-ops until overriden\n buildLines: function(){},\n buildPoints: function(){},\n makeGLGeometry: function (vertex_data) {\n return new GLGeometry(this.gl, vertex_data, this.vertex_layout);\n }\n};\n\nRenderMode.makeGLProgram = function ()\n{\n // console.log(this.name + \": \" + \"start building\");\n var queue = Queue();\n\n // Build defines & for selection (need to create a new object since the first is stored as a reference by the program)\n var defines = this.buildDefineList();\n if (this.selection) {\n var selection_defines = Object.create(defines);\n selection_defines['FEATURE_SELECTION'] = true;\n }\n\n // Get any custom code transforms\n var transforms = (this.shaders && this.shaders.transforms);\n\n // Create shaders - programs may point to inherited parent properties, but should be replaced by subclass version\n var program = (this.hasOwnProperty('gl_program') && this.gl_program);\n var selection_program = (this.hasOwnProperty('selection_gl_program') && this.selection_gl_program);\n\n queue.defer(complete => {\n if (!program) {\n // console.log(this.name + \": \" + \"instantiate\");\n program = new GLProgram(\n this.gl,\n shader_sources[this.vertex_shader_key],\n shader_sources[this.fragment_shader_key],\n {\n defines: defines,\n transforms: transforms,\n name: this.name,\n callback: complete\n }\n );\n }\n else {\n // console.log(this.name + \": \" + \"re-compile\");\n program.defines = defines;\n program.transforms = transforms;\n program.compile(complete);\n }\n });\n\n if (this.selection) {\n queue.defer(complete => {\n if (!selection_program) {\n // console.log(this.name + \": \" + \"selection instantiate\");\n selection_program = new GLProgram(\n this.gl,\n shader_sources[this.vertex_shader_key],\n shader_sources['selection_fragment'],\n {\n defines: selection_defines,\n transforms: transforms,\n name: (this.name + ' (selection)'),\n callback: complete\n }\n );\n }\n else {\n // console.log(this.name + \": \" + \"selection re-compile\");\n selection_program.defines = selection_defines;\n selection_program.transforms = transforms;\n selection_program.compile(complete);\n }\n });\n }\n\n // Wait for program(s) to compile before replacing them\n // TODO: should this entire method offer a callback for when compilation completes?\n queue.await(() => {\n if (program) {\n this.gl_program = program;\n }\n\n if (selection_program) {\n this.selection_gl_program = selection_program;\n }\n\n // console.log(this.name + \": \" + \"finished building\");\n });\n}\n\n// TODO: could probably combine and generalize this with similar method in GLProgram\n// (list of define objects that inherit from each other)\nRenderMode.buildDefineList = function ()\n{\n // Add any custom defines to built-in mode defines\n var defines = {}; // create a new object to avoid mutating a prototype value that may be shared with other modes\n if (this.defines != null) {\n for (var d in this.defines) {\n defines[d] = this.defines[d];\n }\n }\n if (this.shaders != null && this.shaders.defines != null) {\n for (var d in this.shaders.defines) {\n defines[d] = this.shaders.defines[d];\n }\n }\n return defines;\n};\n\n// Set mode uniforms on currently bound program\nRenderMode.setUniforms = function ()\n{\n var gl_program = GLProgram.current;\n if (gl_program != null && this.shaders != null && this.shaders.uniforms != null) {\n gl_program.setUniforms(this.shaders.uniforms);\n }\n};\n\nRenderMode.update = function ()\n{\n // Mode-specific animation\n if (typeof this.animation == 'function') {\n this.animation();\n }\n};\n\n// Update built-in mode or create a new one\nModeManager.configureMode = function (name, settings)\n{\n Modes[name] = Modes[name] || Object.create(Modes[settings.extends] || RenderMode);\n if (Modes[settings.extends]) {\n Modes[name].parent = Modes[settings.extends]; // explicit 'super' class access\n }\n\n for (var s in settings) {\n Modes[name][s] = settings[s];\n }\n\n Modes[name].name = name;\n return Modes[name];\n};\n\n\n// Built-in rendering modes\n\n/*** Plain polygons ***/\n\nModes.polygons = Object.create(RenderMode);\nModes.polygons.name = 'polygons';\n\nModes.polygons.vertex_shader_key = 'polygon_vertex';\nModes.polygons.fragment_shader_key = 'polygon_fragment';\n\nModes.polygons.defines = {\n 'WORLD_POSITION_WRAP': 100000 // default world coords to wrap every 100,000 meters, can turn off by setting this to 'false'\n};\n\nModes.polygons.selection = true;\n\nModes.polygons._init = function () {\n this.vertex_layout = new GLVertexLayout(this.gl, [\n { name: 'a_position', size: 3, type: this.gl.FLOAT, normalized: false },\n { name: 'a_normal', size: 3, type: this.gl.FLOAT, normalized: false },\n { name: 'a_color', size: 3, type: this.gl.FLOAT, normalized: false },\n { name: 'a_selection_color', size: 4, type: this.gl.FLOAT, normalized: false },\n { name: 'a_layer', size: 1, type: this.gl.FLOAT, normalized: false }\n ]);\n};\n\nModes.polygons.buildPolygons = function (polygons, style, vertex_data)\n{\n // Color and layer number are currently constant across vertices\n var vertex_constants = [\n style.color[0], style.color[1], style.color[2],\n style.selection.color[0], style.selection.color[1], style.selection.color[2], style.selection.color[3],\n style.layer_num\n ];\n\n // Outlines have a slightly different set of constants, because the layer number is modified\n if (style.outline.color) {\n var outline_vertex_constants = [\n style.outline.color[0], style.outline.color[1], style.outline.color[2],\n style.selection.color[0], style.selection.color[1], style.selection.color[2], style.selection.color[3],\n style.layer_num - 0.5 // outlines sit between layers, underneath current layer but above the one below\n ];\n }\n\n // Extruded polygons (e.g. 3D buildings)\n if (style.extrude && style.height) {\n GLBuilders.buildExtrudedPolygons(\n polygons,\n style.z,\n style.height,\n style.min_height,\n vertex_data,\n {\n vertex_constants: vertex_constants\n }\n );\n }\n // Regular polygons\n else {\n GLBuilders.buildPolygons(\n polygons,\n style.z,\n vertex_data,\n {\n normals: true,\n vertex_constants: vertex_constants\n }\n );\n\n // Callback-base builder (for future exploration)\n // var normal_vertex_constants = [0, 0, 1].concat(vertex_constants);\n // GLBuilders.buildPolygons2(\n // polygons,\n // z,\n // function (vertices) {\n // // var vs = vertices.positions;\n // // for (var v in vs) {\n // // // var bc = [(v % 3) ? 0 : 1, ((v + 1) % 3) ? 0 : 1, ((v + 2) % 3) ? 0 : 1];\n // // // var bc = [centroid.x, centroid.y, 0];\n // // // vs[v] = vertices.positions[v].concat(z, 0, 0, 1, bc);\n\n // // // vs[v] = vertices.positions[v].concat(z, 0, 0, 1);\n // // vs[v] = vertices.positions[v].concat(0, 0, 1);\n // // }\n\n // GL.addVertices(vertices.positions, normal_vertex_constants, vertex_data);\n\n // // GL.addVerticesByAttributeLayout(\n // // [\n // // { name: 'a_position', data: vertices.positions },\n // // { name: 'a_normal', data: [0, 0, 1] },\n // // { name: 'a_color', data: [style.color[0], style.color[1], style.color[2]] },\n // // { name: 'a_layer', data: style.layer_num }\n // // ],\n // // vertex_data\n // // );\n\n // // GL.addVerticesMultipleAttributes([vertices.positions], normal_vertex_constants, vertex_data);\n // }\n // );\n }\n\n // Polygon outlines\n if (style.outline.color && style.outline.width) {\n for (var mpc=0; mpc < polygons.length; mpc++) {\n GLBuilders.buildPolylines(\n polygons[mpc],\n style.z,\n style.outline.width,\n vertex_data,\n {\n closed_polygon: true,\n remove_tile_edges: true,\n vertex_constants: outline_vertex_constants\n }\n );\n }\n }\n};\n\nModes.polygons.buildLines = function (lines, style, vertex_data)\n{\n // TOOD: reduce redundancy of constant calc between builders\n // Color and layer number are currently constant across vertices\n var vertex_constants = [\n style.color[0], style.color[1], style.color[2],\n style.selection.color[0], style.selection.color[1], style.selection.color[2], style.selection.color[3],\n style.layer_num\n ];\n\n // Outlines have a slightly different set of constants, because the layer number is modified\n if (style.outline.color) {\n var outline_vertex_constants = [\n style.outline.color[0], style.outline.color[1], style.outline.color[2],\n style.selection.color[0], style.selection.color[1], style.selection.color[2], style.selection.color[3],\n style.layer_num - 0.5 // outlines sit between layers, underneath current layer but above the one below\n ];\n }\n\n // Main lines\n GLBuilders.buildPolylines(\n lines,\n style.z,\n style.width,\n vertex_data,\n {\n vertex_constants: vertex_constants\n }\n );\n\n // Line outlines\n if (style.outline.color && style.outline.width) {\n GLBuilders.buildPolylines(\n lines,\n style.z,\n style.width + 2 * style.outline.width,\n vertex_data,\n {\n vertex_constants: outline_vertex_constants\n }\n );\n }\n};\n\nModes.polygons.buildPoints = function (points, style, vertex_data)\n{\n // TOOD: reduce redundancy of constant calc between builders\n // Color and layer number are currently constant across vertices\n var vertex_constants = [\n style.color[0], style.color[1], style.color[2],\n style.selection.color[0], style.selection.color[1], style.selection.color[2], style.selection.color[3],\n style.layer_num\n ];\n\n GLBuilders.buildQuadsForPoints(\n points,\n style.size * 2,\n style.size * 2,\n style.z,\n vertex_data,\n {\n normals: true,\n texcoords: false,\n vertex_constants: vertex_constants\n }\n );\n};\n\n\n/*** Points w/simple distance field rendering ***/\n\nModes.points = Object.create(RenderMode);\nModes.points.name = 'points';\n\nModes.points.vertex_shader_key = 'point_vertex';\nModes.points.fragment_shader_key = 'point_fragment';\n\nModes.points.defines = {\n 'EFFECT_SCREEN_COLOR': true\n};\n\nModes.points.selection = true;\n\nModes.points._init = function () {\n this.vertex_layout = new GLVertexLayout(this.gl, [\n { name: 'a_position', size: 3, type: this.gl.FLOAT, normalized: false },\n { name: 'a_texcoord', size: 2, type: this.gl.FLOAT, normalized: false },\n { name: 'a_color', size: 3, type: this.gl.FLOAT, normalized: false },\n { name: 'a_selection_color', size: 4, type: this.gl.FLOAT, normalized: false },\n { name: 'a_layer', size: 1, type: this.gl.FLOAT, normalized: false }\n ]);\n};\n\nModes.points.buildPoints = function (points, style, vertex_data)\n{\n // TOOD: reduce redundancy of constant calc between builders\n // Color and layer number are currently constant across vertices\n var vertex_constants = [\n style.color[0], style.color[1], style.color[2],\n style.selection.color[0], style.selection.color[1], style.selection.color[2], style.selection.color[3],\n style.layer_num\n ];\n\n GLBuilders.buildQuadsForPoints(\n points,\n style.size * 2,\n style.size * 2,\n style.z,\n vertex_data,\n {\n normals: false,\n texcoords: true,\n vertex_constants: vertex_constants\n }\n );\n};\n",
"// Thin GL program wrapp to cache uniform locations/values, do compile-time pre-processing\n// (injecting #defines and #pragma transforms into shaders), etc.\nimport * as Utils from '../utils';\nimport {GL} from './gl';\nimport GLTexture from './gl_texture';\nimport Queue from 'queue-async';\n\nGLProgram.id = 0; // assign each program a unique id\nGLProgram.programs = {}; // programs, by id\n\nexport default function GLProgram (gl, vertex_shader, fragment_shader, options)\n{\n options = options || {};\n\n this.gl = gl;\n this.program = null;\n this.compiled = false;\n this.defines = options.defines || {}; // key/values inserted as #defines into shaders at compile-time\n this.transforms = options.transforms; // key/values for URLs of blocks that can be injected into shaders at compile-time\n this.uniforms = {}; // program locations of uniforms, set/updated at compile-time\n this.attribs = {}; // program locations of vertex attributes\n\n this.vertex_shader = vertex_shader;\n this.fragment_shader = fragment_shader;\n\n this.id = GLProgram.id++;\n GLProgram.programs[this.id] = this;\n this.name = options.name; // can provide a program name (useful for debugging)\n\n this.compile(options.callback);\n};\n\n// Use program wrapper with simple state cache\nGLProgram.prototype.use = function ()\n{\n if (!this.compiled) {\n return;\n }\n\n if (GLProgram.current != this) {\n this.gl.useProgram(this.program);\n }\n GLProgram.current = this;\n};\nGLProgram.current = null;\n\n// Global defines applied to all programs (duplicate properties for a specific program will take precedence)\nGLProgram.defines = {};\n\nGLProgram.prototype.compile = function (callback)\n{\n var queue = Queue();\n\n // Copy sources from pre-modified template\n this.computed_vertex_shader = this.vertex_shader;\n this.computed_fragment_shader = this.fragment_shader;\n\n // Make list of defines to be injected later\n var defines = this.buildDefineList();\n\n // Inject user-defined transforms (arbitrary code points matching named #pragmas)\n // Replace according to this pattern:\n // #pragma tangram: [key]\n // e.g. #pragma tangram: globals\n\n // TODO: flag to avoid re-retrieving transform URLs over network when rebuilding?\n // TODO: support glslify #pragma export names for better compatibility? (e.g. rename main() functions)\n // TODO: auto-insert uniforms referenced in mode definition, but not in shader base or transforms? (problem: don't have access to uniform list/type here)\n\n // Gather all transform code snippets (can be either inline in the style file, or over the network via URL)\n // This is an async process, since code may be retrieved remotely\n var regexp;\n var loaded_transforms = {}; // master list of transforms, with an ordered list for each (since we want to guarantee order of transforms)\n if (this.transforms != null) {\n\n for (var key in this.transforms) {\n var transform = this.transforms[key];\n if (transform == null) {\n continue;\n }\n\n // Each code point can be a single item (string or hash object) or a list (array object with non-zero length)\n if (typeof transform == 'string' || (typeof transform == 'object' && transform.length == null)) {\n transform = [transform];\n }\n\n // First find code replace points in shaders\n var regexp = new RegExp('^\\\\s*#pragma\\\\s+tangram:\\\\s+' + key + '\\\\s*$', 'm');\n var inject_vertex = this.computed_vertex_shader.match(regexp);\n var inject_fragment = this.computed_fragment_shader.match(regexp);\n\n // Avoid network request if nothing to replace\n if (inject_vertex == null && inject_fragment == null) {\n continue;\n }\n\n // Collect all transforms for this type\n loaded_transforms[key] = {};\n loaded_transforms[key].regexp = new RegExp(regexp); // save regexp so we can inject later without having to recreate it\n loaded_transforms[key].inject_vertex = (inject_vertex != null); // save regexp code point matches so we don't have to do them again\n loaded_transforms[key].inject_fragment = (inject_fragment != null);\n loaded_transforms[key].list = [];\n\n // Get the code (possibly over the network, so needs to be async)\n for (var u=0; u < transform.length; u++) {\n queue.defer(GLProgram.loadTransform, loaded_transforms, transform[u], key, u);\n }\n\n // Add a #define for this injection point\n defines['TANGRAM_TRANSFORM_' + key.replace(' ', '_').toUpperCase()] = true;\n }\n }\n\n // When all transform code snippets are collected, combine and inject them\n queue.await(error => {\n if (error) {\n console.log(\"error loading transforms: \" + error);\n return;\n }\n\n // Do the code injection with the collected sources\n for (var t in loaded_transforms) {\n // Concatenate\n var combined_source = \"\";\n for (var s=0; s < loaded_transforms[t].list.length; s++) {\n combined_source += loaded_transforms[t].list[s] + '\\n';\n }\n\n // Inject\n if (loaded_transforms[t].inject_vertex != null) {\n this.computed_vertex_shader = this.computed_vertex_shader.replace(loaded_transforms[t].regexp, combined_source);\n }\n if (loaded_transforms[t].inject_fragment != null) {\n this.computed_fragment_shader = this.computed_fragment_shader.replace(loaded_transforms[t].regexp, combined_source);\n }\n }\n\n // Clean-up any #pragmas that weren't replaced (to prevent compiler warnings)\n var regexp = new RegExp('^\\\\s*#pragma\\\\s+tangram:\\\\s+\\\\w+\\\\s*$', 'gm');\n this.computed_vertex_shader = this.computed_vertex_shader.replace(regexp, '');\n this.computed_fragment_shader = this.computed_fragment_shader.replace(regexp, '');\n\n // Build & inject defines\n // This is done *after* code injection so that we can add defines for which code points were injected\n var define_str = GLProgram.buildDefineString(defines);\n this.computed_vertex_shader = define_str + this.computed_vertex_shader;\n this.computed_fragment_shader = define_str + this.computed_fragment_shader;\n\n // Include program info useful for debugging\n var info = (this.name ? (this.name + ' / id ' + this.id) : ('id ' + this.id));\n this.computed_vertex_shader = '// Program: ' + info + '\\n' + this.computed_vertex_shader;\n this.computed_fragment_shader = '// Program: ' + info + '\\n' + this.computed_fragment_shader;\n\n // Compile & set uniforms to cached values\n try {\n this.program = GL.updateProgram(this.gl, this.program, this.computed_vertex_shader, this.computed_fragment_shader);\n // this.program = GL.updateProgram(this.gl, null, this.computed_vertex_shader, this.computed_fragment_shader);\n this.compiled = true;\n }\n catch (e) {\n this.program = null;\n this.compiled = false;\n }\n\n this.use();\n this.refreshUniforms();\n this.refreshAttributes();\n\n // Notify caller\n if (typeof callback == 'function') {\n callback();\n }\n });\n};\n\n// Retrieve a single transform, for a given injection point, at a certain index (to preserve original order)\n// Can be async, calls 'complete' callback when done\nGLProgram.loadTransform = function (transforms, block, key, index, complete) {\n // Can be an inline block of GLSL, or a URL to retrieve GLSL block from\n var type, value, source;\n\n // Inline code\n if (typeof block == 'string') {\n transforms[key].list[index] = block;\n complete();\n }\n // Remote code\n else if (typeof block == 'object' && block.url) {\n var req = new XMLHttpRequest();\n\n req.onload = function () {\n source = req.response;\n transforms[key].list[index] = source;\n complete();\n };\n req.open('GET', Utils.urlForPath(block.url) + '?' + (+new Date()), true /* async flag */);\n req.responseType = 'text';\n req.send();\n }\n};\n\n// Make list of defines (global, then program-specific)\nGLProgram.prototype.buildDefineList = function () {\n var defines = {};\n for (var d in GLProgram.defines) {\n defines[d] = GLProgram.defines[d];\n }\n for (var d in this.defines) {\n defines[d] = this.defines[d];\n }\n return defines;\n};\n\n// Turn #defines into a combined string\nGLProgram.buildDefineString = function (defines) {\n var define_str = \"\";\n for (var d in defines) {\n if (defines[d] == false) {\n continue;\n }\n else if (typeof defines[d] == 'boolean' && defines[d] == true) { // booleans are simple defines with no value\n define_str += \"#define \" + d + \"\\n\";\n }\n else if (typeof defines[d] == 'number' && Math.floor(defines[d]) == defines[d]) { // int to float conversion to satisfy GLSL floats\n define_str += \"#define \" + d + \" \" + defines[d].toFixed(1) + \"\\n\";\n }\n else { // any other float or string value\n define_str += \"#define \" + d + \" \" + defines[d] + \"\\n\";\n }\n }\n return define_str;\n};\n\n// Set uniforms from a JS object, with inferred types\nGLProgram.prototype.setUniforms = function (uniforms)\n{\n // TODO: only update uniforms when changed\n var texture_unit = 0;\n\n for (var u in uniforms) {\n var uniform = uniforms[u];\n\n // Single float\n if (typeof uniform == 'number') {\n this.uniform('1f', u, uniform);\n }\n // Multiple floats - vector or array\n else if (typeof uniform == 'object') {\n // float vectors (vec2, vec3, vec4)\n if (uniform.length >= 2 && uniform.length <= 4) {\n this.uniform(uniform.length + 'fv', u, uniform);\n }\n // float array\n else if (uniform.length > 4) {\n this.uniform('1fv', u + '[0]', uniform);\n }\n // TODO: assume matrix for (typeof == Float32Array && length == 16)?\n }\n // Boolean\n else if (typeof uniform == 'boolean') {\n this.uniform('1i', u, uniform);\n }\n // Texture\n else if (typeof uniform == 'string') {\n var texture = GLTexture.textures[uniform];\n if (texture == null) {\n texture = new GLTexture(this.gl, uniform);\n texture.load(uniform);\n }\n\n texture.bind(texture_unit);\n this.uniform('1i', u, texture_unit);\n texture_unit++;\n }\n // TODO: support other non-float types? (int, etc.)\n }\n};\n\n// ex: program.uniform('3f', 'position', x, y, z);\n// TODO: only update uniforms when changed\nGLProgram.prototype.uniform = function (method, name) // method-appropriate arguments follow\n{\n if (!this.compiled) {\n return;\n }\n\n var uniform = (this.uniforms[name] = this.uniforms[name] || {});\n uniform.name = name;\n uniform.location = uniform.location || this.gl.getUniformLocation(this.program, name);\n uniform.method = 'uniform' + method;\n uniform.values = Array.prototype.slice.call(arguments, 2);\n this.updateUniform(name);\n};\n\n// Set a single uniform\nGLProgram.prototype.updateUniform = function (name)\n{\n if (!this.compiled) {\n return;\n }\n\n var uniform = this.uniforms[name];\n if (uniform == null || uniform.location == null) {\n return;\n }\n\n this.use();\n this.gl[uniform.method].apply(this.gl, [uniform.location].concat(uniform.values)); // call appropriate GL uniform method and pass through arguments\n};\n\n// Refresh uniform locations and set to last cached values\nGLProgram.prototype.refreshUniforms = function ()\n{\n if (!this.compiled) {\n return;\n }\n\n for (var u in this.uniforms) {\n this.uniforms[u].location = this.gl.getUniformLocation(this.program, u);\n this.updateUniform(u);\n }\n};\n\nGLProgram.prototype.refreshAttributes = function ()\n{\n // var len = this.gl.getProgramParameter(this.program, this.gl.ACTIVE_ATTRIBUTES);\n // for (var i=0; i < len; i++) {\n // var a = this.gl.getActiveAttrib(this.program, i);\n // console.log(a);\n // }\n this.attribs = {};\n};\n\n// Get the location of a vertex attribute\nGLProgram.prototype.attribute = function (name)\n{\n if (!this.compiled) {\n return;\n }\n\n var attrib = (this.attribs[name] = this.attribs[name] || {});\n if (attrib.location != null) {\n return attrib;\n }\n\n attrib.name = name;\n attrib.location = this.gl.getAttribLocation(this.program, name);\n\n // var info = this.gl.getActiveAttrib(this.program, attrib.location);\n // attrib.type = info.type;\n // attrib.size = info.size;\n\n return attrib;\n};\n",
"// Generated from GLSL files, don't edit!\nvar shader_sources = {};\n\nshader_sources['point_fragment'] =\n\"\\n\" +\n\"#define GLSLIFY 1\\n\" +\n\"\\n\" +\n\"uniform vec2 u_resolution;\\n\" +\n\"varying vec3 v_color;\\n\" +\n\"varying vec2 v_texcoord;\\n\" +\n\"void main(void) {\\n\" +\n\" vec3 color = v_color;\\n\" +\n\" vec3 lighting = vec3(1.);\\n\" +\n\" float len = length(v_texcoord);\\n\" +\n\" if(len > 1.) {\\n\" +\n\" discard;\\n\" +\n\" }\\n\" +\n\" color *= (1. - smoothstep(.25, 1., len)) + 0.5;\\n\" +\n\" #pragma tangram: fragment\\n\" +\n\" gl_FragColor = vec4(color, 1.);\\n\" +\n\"}\\n\" +\"\";\n\nshader_sources['point_vertex'] =\n\"\\n\" +\n\"#define GLSLIFY 1\\n\" +\n\"\\n\" +\n\"uniform mat4 u_tile_view;\\n\" +\n\"uniform mat4 u_meter_view;\\n\" +\n\"uniform float u_num_layers;\\n\" +\n\"attribute vec3 a_position;\\n\" +\n\"attribute vec2 a_texcoord;\\n\" +\n\"attribute vec3 a_color;\\n\" +\n\"attribute float a_layer;\\n\" +\n\"varying vec3 v_color;\\n\" +\n\"varying vec2 v_texcoord;\\n\" +\n\"#if defined(FEATURE_SELECTION)\\n\" +\n\"\\n\" +\n\"attribute vec4 a_selection_color;\\n\" +\n\"varying vec4 v_selection_color;\\n\" +\n\"#endif\\n\" +\n\"\\n\" +\n\"float a_x_calculateZ(float z, float layer, const float num_layers, const float z_layer_scale) {\\n\" +\n\" float z_layer_range = (num_layers + 1.) * z_layer_scale;\\n\" +\n\" float z_layer = (layer + 1.) * z_layer_scale;\\n\" +\n\" z = z_layer + clamp(z, 0., z_layer_scale);\\n\" +\n\" z = (z_layer_range - z) / z_layer_range;\\n\" +\n\" return z;\\n\" +\n\"}\\n\" +\n\"#pragma tangram: globals\\n\" +\n\"\\n\" +\n\"void main() {\\n\" +\n\" \\n\" +\n\" #if defined(FEATURE_SELECTION)\\n\" +\n\" if(a_selection_color.xyz == vec3(0.)) {\\n\" +\n\" gl_Position = vec4(0.);\\n\" +\n\" return;\\n\" +\n\" }\\n\" +\n\" v_selection_color = a_selection_color;\\n\" +\n\" #endif\\n\" +\n\" vec4 position = u_meter_view * u_tile_view * vec4(a_position, 1.);\\n\" +\n\" #pragma tangram: vertex\\n\" +\n\" v_color = a_color;\\n\" +\n\" v_texcoord = a_texcoord;\\n\" +\n\" position.z = a_x_calculateZ(position.z, a_layer, u_num_layers, 256.);\\n\" +\n\" gl_Position = position;\\n\" +\n\"}\\n\" +\"\";\n\nshader_sources['polygon_fragment'] =\n\"\\n\" +\n\"#define GLSLIFY 1\\n\" +\n\"\\n\" +\n\"uniform vec2 u_resolution;\\n\" +\n\"uniform vec2 u_aspect;\\n\" +\n\"uniform mat4 u_meter_view;\\n\" +\n\"uniform float u_meters_per_pixel;\\n\" +\n\"uniform float u_time;\\n\" +\n\"uniform float u_map_zoom;\\n\" +\n\"uniform vec2 u_map_center;\\n\" +\n\"uniform vec2 u_tile_origin;\\n\" +\n\"uniform float u_test;\\n\" +\n\"uniform float u_test2;\\n\" +\n\"varying vec3 v_color;\\n\" +\n\"varying vec4 v_world_position;\\n\" +\n\"#if defined(WORLD_POSITION_WRAP)\\n\" +\n\"\\n\" +\n\"vec2 world_position_anchor = vec2(floor(u_tile_origin / WORLD_POSITION_WRAP) * WORLD_POSITION_WRAP);\\n\" +\n\"vec4 absoluteWorldPosition() {\\n\" +\n\" return vec4(v_world_position.xy + world_position_anchor, v_world_position.z, v_world_position.w);\\n\" +\n\"}\\n\" +\n\"#else\\n\" +\n\"\\n\" +\n\"vec4 absoluteWorldPosition() {\\n\" +\n\" return v_world_position;\\n\" +\n\"}\\n\" +\n\"#endif\\n\" +\n\"\\n\" +\n\"#if defined(LIGHTING_ENVIRONMENT)\\n\" +\n\"\\n\" +\n\"uniform sampler2D u_env_map;\\n\" +\n\"#endif\\n\" +\n\"\\n\" +\n\"#if !defined(LIGHTING_VERTEX)\\n\" +\n\"\\n\" +\n\"varying vec4 v_position;\\n\" +\n\"varying vec3 v_normal;\\n\" +\n\"#else\\n\" +\n\"\\n\" +\n\"varying vec3 v_lighting;\\n\" +\n\"#endif\\n\" +\n\"\\n\" +\n\"const float light_ambient = 0.5;\\n\" +\n\"vec3 b_x_pointLight(vec4 position, vec3 normal, vec3 color, vec4 light_pos, float light_ambient, const bool backlight) {\\n\" +\n\" vec3 light_dir = normalize(position.xyz - light_pos.xyz);\\n\" +\n\" color *= abs(max(float(backlight) * -1., dot(normal, light_dir * -1.0))) + light_ambient;\\n\" +\n\" return color;\\n\" +\n\"}\\n\" +\n\"vec3 c_x_specularLight(vec4 position, vec3 normal, vec3 color, vec4 light_pos, float light_ambient, const bool backlight) {\\n\" +\n\" vec3 light_dir = normalize(position.xyz - light_pos.xyz);\\n\" +\n\" vec3 view_pos = vec3(0., 0., 500.);\\n\" +\n\" vec3 view_dir = normalize(position.xyz - view_pos.xyz);\\n\" +\n\" vec3 specularReflection;\\n\" +\n\" if(dot(normal, -light_dir) < 0.0) {\\n\" +\n\" specularReflection = vec3(0.0, 0.0, 0.0);\\n\" +\n\" } else {\\n\" +\n\" float attenuation = 1.0;\\n\" +\n\" float lightSpecularTerm = 1.0;\\n\" +\n\" float materialSpecularTerm = 10.0;\\n\" +\n\" float materialShininessTerm = 10.0;\\n\" +\n\" specularReflection = attenuation * vec3(lightSpecularTerm) * vec3(materialSpecularTerm) * pow(max(0.0, dot(reflect(-light_dir, normal), view_dir)), materialShininessTerm);\\n\" +\n\" }\\n\" +\n\" float diffuse = abs(max(float(backlight) * -1., dot(normal, light_dir * -1.0)));\\n\" +\n\" color *= diffuse + specularReflection + light_ambient;\\n\" +\n\" return color;\\n\" +\n\"}\\n\" +\n\"vec3 d_x_directionalLight(vec3 normal, vec3 color, vec3 light_dir, float light_ambient) {\\n\" +\n\" light_dir = normalize(light_dir);\\n\" +\n\" color *= dot(normal, light_dir * -1.0) + light_ambient;\\n\" +\n\" return color;\\n\" +\n\"}\\n\" +\n\"vec3 a_x_lighting(vec4 position, vec3 normal, vec3 color, vec4 light_pos, vec4 night_light_pos, vec3 light_dir, float light_ambient) {\\n\" +\n\" \\n\" +\n\" #if defined(LIGHTING_POINT)\\n\" +\n\" color = b_x_pointLight(position, normal, color, light_pos, light_ambient, true);\\n\" +\n\" #elif defined(LIGHTING_POINT_SPECULAR)\\n\" +\n\" color = c_x_specularLight(position, normal, color, light_pos, light_ambient, true);\\n\" +\n\" #elif defined(LIGHTING_NIGHT)\\n\" +\n\" color = b_x_pointLight(position, normal, color, night_light_pos, 0., false);\\n\" +\n\" #elif defined(LIGHTING_DIRECTION)\\n\" +\n\" color = d_x_directionalLight(normal, color, light_dir, light_ambient);\\n\" +\n\" #else\\n\" +\n\" color = color;\\n\" +\n\" #endif\\n\" +\n\" return color;\\n\" +\n\"}\\n\" +\n\"vec4 e_x_sphericalEnvironmentMap(vec3 view_pos, vec3 position, vec3 normal, sampler2D envmap) {\\n\" +\n\" vec3 eye = normalize(position.xyz - view_pos.xyz);\\n\" +\n\" if(eye.z > 0.01) {\\n\" +\n\" eye.z = 0.01;\\n\" +\n\" }\\n\" +\n\" vec3 r = reflect(eye, normal);\\n\" +\n\" float m = 2. * sqrt(pow(r.x, 2.) + pow(r.y, 2.) + pow(r.z + 1., 2.));\\n\" +\n\" vec2 uv = r.xy / m + .5;\\n\" +\n\" return texture2D(envmap, uv);\\n\" +\n\"}\\n\" +\n\"#pragma tangram: globals\\n\" +\n\"\\n\" +\n\"void main(void) {\\n\" +\n\" vec3 color = v_color;\\n\" +\n\" #if defined(LIGHTING_ENVIRONMENT)\\n\" +\n\" vec3 view_pos = vec3(0., 0., 100. * u_meters_per_pixel);\\n\" +\n\" color = e_x_sphericalEnvironmentMap(view_pos, v_position.xyz, v_normal, u_env_map).rgb;\\n\" +\n\" #endif\\n\" +\n\" \\n\" +\n\" #if !defined(LIGHTING_VERTEX) // default to per-pixel lighting\\n\" +\n\" vec3 lighting = a_x_lighting(v_position, v_normal, vec3(1.), vec4(0., 0., 150. * u_meters_per_pixel, 1.), vec4(0., 0., 50. * u_meters_per_pixel, 1.), vec3(0.2, 0.7, -0.5), light_ambient);\\n\" +\n\" #else\\n\" +\n\" vec3 lighting = v_lighting;\\n\" +\n\" #endif\\n\" +\n\" vec3 color_prelight = color;\\n\" +\n\" color *= lighting;\\n\" +\n\" #pragma tangram: fragment\\n\" +\n\" gl_FragColor = vec4(color, 1.0);\\n\" +\n\"}\\n\" +\"\";\n\nshader_sources['polygon_vertex'] =\n\"\\n\" +\n\"#define GLSLIFY 1\\n\" +\n\"\\n\" +\n\"uniform vec2 u_resolution;\\n\" +\n\"uniform vec2 u_aspect;\\n\" +\n\"uniform float u_time;\\n\" +\n\"uniform float u_map_zoom;\\n\" +\n\"uniform vec2 u_map_center;\\n\" +\n\"uniform vec2 u_tile_origin;\\n\" +\n\"uniform mat4 u_tile_world;\\n\" +\n\"uniform mat4 u_tile_view;\\n\" +\n\"uniform mat4 u_meter_view;\\n\" +\n\"uniform float u_meters_per_pixel;\\n\" +\n\"uniform float u_num_layers;\\n\" +\n\"attribute vec3 a_position;\\n\" +\n\"attribute vec3 a_normal;\\n\" +\n\"attribute vec3 a_color;\\n\" +\n\"attribute float a_layer;\\n\" +\n\"varying vec4 v_world_position;\\n\" +\n\"varying vec3 v_color;\\n\" +\n\"#if defined(WORLD_POSITION_WRAP)\\n\" +\n\"\\n\" +\n\"vec2 world_position_anchor = vec2(floor(u_tile_origin / WORLD_POSITION_WRAP) * WORLD_POSITION_WRAP);\\n\" +\n\"vec4 absoluteWorldPosition() {\\n\" +\n\" return vec4(v_world_position.xy + world_position_anchor, v_world_position.z, v_world_position.w);\\n\" +\n\"}\\n\" +\n\"#else\\n\" +\n\"\\n\" +\n\"vec4 absoluteWorldPosition() {\\n\" +\n\" return v_world_position;\\n\" +\n\"}\\n\" +\n\"#endif\\n\" +\n\"\\n\" +\n\"#if defined(FEATURE_SELECTION)\\n\" +\n\"\\n\" +\n\"attribute vec4 a_selection_color;\\n\" +\n\"varying vec4 v_selection_color;\\n\" +\n\"#endif\\n\" +\n\"\\n\" +\n\"#if !defined(LIGHTING_VERTEX)\\n\" +\n\"\\n\" +\n\"varying vec4 v_position;\\n\" +\n\"varying vec3 v_normal;\\n\" +\n\"#else\\n\" +\n\"\\n\" +\n\"varying vec3 v_lighting;\\n\" +\n\"#endif\\n\" +\n\"\\n\" +\n\"const float light_ambient = 0.5;\\n\" +\n\"vec4 a_x_perspective(vec4 position, const vec2 perspective_offset, const vec2 perspective_factor) {\\n\" +\n\" position.xy += position.z * perspective_factor * (position.xy - perspective_offset);\\n\" +\n\" return position;\\n\" +\n\"}\\n\" +\n\"vec4 b_x_isometric(vec4 position, const vec2 axis, const float multiplier) {\\n\" +\n\" position.xy += position.z * axis * multiplier / u_aspect;\\n\" +\n\" return position;\\n\" +\n\"}\\n\" +\n\"float c_x_calculateZ(float z, float layer, const float num_layers, const float z_layer_scale) {\\n\" +\n\" float z_layer_range = (num_layers + 1.) * z_layer_scale;\\n\" +\n\" float z_layer = (layer + 1.) * z_layer_scale;\\n\" +\n\" z = z_layer + clamp(z, 0., z_layer_scale);\\n\" +\n\" z = (z_layer_range - z) / z_layer_range;\\n\" +\n\" return z;\\n\" +\n\"}\\n\" +\n\"vec3 e_x_pointLight(vec4 position, vec3 normal, vec3 color, vec4 light_pos, float light_ambient, const bool backlight) {\\n\" +\n\" vec3 light_dir = normalize(position.xyz - light_pos.xyz);\\n\" +\n\" color *= abs(max(float(backlight) * -1., dot(normal, light_dir * -1.0))) + light_ambient;\\n\" +\n\" return color;\\n\" +\n\"}\\n\" +\n\"vec3 f_x_specularLight(vec4 position, vec3 normal, vec3 color, vec4 light_pos, float light_ambient, const bool backlight) {\\n\" +\n\" vec3 light_dir = normalize(position.xyz - light_pos.xyz);\\n\" +\n\" vec3 view_pos = vec3(0., 0., 500.);\\n\" +\n\" vec3 view_dir = normalize(position.xyz - view_pos.xyz);\\n\" +\n\" vec3 specularReflection;\\n\" +\n\" if(dot(normal, -light_dir) < 0.0) {\\n\" +\n\" specularReflection = vec3(0.0, 0.0, 0.0);\\n\" +\n\" } else {\\n\" +\n\" float attenuation = 1.0;\\n\" +\n\" float lightSpecularTerm = 1.0;\\n\" +\n\" float materialSpecularTerm = 10.0;\\n\" +\n\" float materialShininessTerm = 10.0;\\n\" +\n\" specularReflection = attenuation * vec3(lightSpecularTerm) * vec3(materialSpecularTerm) * pow(max(0.0, dot(reflect(-light_dir, normal), view_dir)), materialShininessTerm);\\n\" +\n\" }\\n\" +\n\" float diffuse = abs(max(float(backlight) * -1., dot(normal, light_dir * -1.0)));\\n\" +\n\" color *= diffuse + specularReflection + light_ambient;\\n\" +\n\" return color;\\n\" +\n\"}\\n\" +\n\"vec3 g_x_directionalLight(vec3 normal, vec3 color, vec3 light_dir, float light_ambient) {\\n\" +\n\" light_dir = normalize(light_dir);\\n\" +\n\" color *= dot(normal, light_dir * -1.0) + light_ambient;\\n\" +\n\" return color;\\n\" +\n\"}\\n\" +\n\"vec3 d_x_lighting(vec4 position, vec3 normal, vec3 color, vec4 light_pos, vec4 night_light_pos, vec3 light_dir, float light_ambient) {\\n\" +\n\" \\n\" +\n\" #if defined(LIGHTING_POINT)\\n\" +\n\" color = e_x_pointLight(position, normal, color, light_pos, light_ambient, true);\\n\" +\n\" #elif defined(LIGHTING_POINT_SPECULAR)\\n\" +\n\" color = f_x_specularLight(position, normal, color, light_pos, light_ambient, true);\\n\" +\n\" #elif defined(LIGHTING_NIGHT)\\n\" +\n\" color = e_x_pointLight(position, normal, color, night_light_pos, 0., false);\\n\" +\n\" #elif defined(LIGHTING_DIRECTION)\\n\" +\n\" color = g_x_directionalLight(normal, color, light_dir, light_ambient);\\n\" +\n\" #else\\n\" +\n\" color = color;\\n\" +\n\" #endif\\n\" +\n\" return color;\\n\" +\n\"}\\n\" +\n\"#pragma tangram: globals\\n\" +\n\"\\n\" +\n\"void main() {\\n\" +\n\" \\n\" +\n\" #if defined(FEATURE_SELECTION)\\n\" +\n\" if(a_selection_color.xyz == vec3(0.)) {\\n\" +\n\" gl_Position = vec4(0.);\\n\" +\n\" return;\\n\" +\n\" }\\n\" +\n\" v_selection_color = a_selection_color;\\n\" +\n\" #endif\\n\" +\n\" vec4 position = u_tile_view * vec4(a_position, 1.);\\n\" +\n\" v_world_position = u_tile_world * vec4(a_position, 1.);\\n\" +\n\" #if defined(WORLD_POSITION_WRAP)\\n\" +\n\" v_world_position.xy -= world_position_anchor;\\n\" +\n\" #endif\\n\" +\n\" \\n\" +\n\" #pragma tangram: vertex\\n\" +\n\" \\n\" +\n\" #if defined(LIGHTING_VERTEX)\\n\" +\n\" v_color = a_color;\\n\" +\n\" v_lighting = d_x_lighting(position, a_normal, vec3(1.), vec4(0., 0., 150. * u_meters_per_pixel, 1.), vec4(0., 0., 50. * u_meters_per_pixel, 1.), vec3(0.2, 0.7, -0.5), light_ambient);\\n\" +\n\" #else\\n\" +\n\" v_position = position;\\n\" +\n\" v_normal = a_normal;\\n\" +\n\" v_color = a_color;\\n\" +\n\" #endif\\n\" +\n\" position = u_meter_view * position;\\n\" +\n\" #if defined(PROJECTION_PERSPECTIVE)\\n\" +\n\" position = a_x_perspective(position, vec2(0., 0.), vec2(0.6, 0.6));\\n\" +\n\" #elif defined(PROJECTION_ISOMETRIC) // || defined(PROJECTION_POPUP)\\n\" +\n\" position = b_x_isometric(position, vec2(0., 1.), 1.);\\n\" +\n\" #endif\\n\" +\n\" position.z = c_x_calculateZ(position.z, a_layer, u_num_layers, 4096.);\\n\" +\n\" gl_Position = position;\\n\" +\n\"}\\n\" +\"\";\n\nshader_sources['selection_fragment'] =\n\"\\n\" +\n\"#define GLSLIFY 1\\n\" +\n\"\\n\" +\n\"#if defined(FEATURE_SELECTION)\\n\" +\n\"\\n\" +\n\"varying vec4 v_selection_color;\\n\" +\n\"#endif\\n\" +\n\"\\n\" +\n\"void main(void) {\\n\" +\n\" \\n\" +\n\" #if defined(FEATURE_SELECTION)\\n\" +\n\" gl_FragColor = v_selection_color;\\n\" +\n\" #else\\n\" +\n\" gl_FragColor = vec3(0., 0., 0., 1.);\\n\" +\n\" #endif\\n\" +\n\" \\n\" +\n\"}\\n\" +\"\";\n\nshader_sources['simple_polygon_fragment'] =\n\"\\n\" +\n\"#define GLSLIFY 1\\n\" +\n\"\\n\" +\n\"uniform float u_meters_per_pixel;\\n\" +\n\"varying vec3 v_color;\\n\" +\n\"#if !defined(LIGHTING_VERTEX)\\n\" +\n\"\\n\" +\n\"varying vec4 v_position;\\n\" +\n\"varying vec3 v_normal;\\n\" +\n\"#endif\\n\" +\n\"\\n\" +\n\"vec3 a_x_pointLight(vec4 position, vec3 normal, vec3 color, vec4 light_pos, float light_ambient, const bool backlight) {\\n\" +\n\" vec3 light_dir = normalize(position.xyz - light_pos.xyz);\\n\" +\n\" color *= abs(max(float(backlight) * -1., dot(normal, light_dir * -1.0))) + light_ambient;\\n\" +\n\" return color;\\n\" +\n\"}\\n\" +\n\"#pragma tangram: globals\\n\" +\n\"\\n\" +\n\"void main(void) {\\n\" +\n\" vec3 color;\\n\" +\n\" #if !defined(LIGHTING_VERTEX) // default to per-pixel lighting\\n\" +\n\" vec4 light_pos = vec4(0., 0., 150. * u_meters_per_pixel, 1.);\\n\" +\n\" const float light_ambient = 0.5;\\n\" +\n\" const bool backlit = true;\\n\" +\n\" color = a_x_pointLight(v_position, v_normal, v_color, light_pos, light_ambient, backlit);\\n\" +\n\" #else\\n\" +\n\" color = v_color;\\n\" +\n\" #endif\\n\" +\n\" \\n\" +\n\" #pragma tangram: fragment\\n\" +\n\" gl_FragColor = vec4(color, 1.0);\\n\" +\n\"}\\n\" +\"\";\n\nshader_sources['simple_polygon_vertex'] =\n\"\\n\" +\n\"#define GLSLIFY 1\\n\" +\n\"\\n\" +\n\"uniform vec2 u_aspect;\\n\" +\n\"uniform mat4 u_tile_view;\\n\" +\n\"uniform mat4 u_meter_view;\\n\" +\n\"uniform float u_meters_per_pixel;\\n\" +\n\"uniform float u_num_layers;\\n\" +\n\"attribute vec3 a_position;\\n\" +\n\"attribute vec3 a_normal;\\n\" +\n\"attribute vec3 a_color;\\n\" +\n\"attribute float a_layer;\\n\" +\n\"varying vec3 v_color;\\n\" +\n\"#if !defined(LIGHTING_VERTEX)\\n\" +\n\"\\n\" +\n\"varying vec4 v_position;\\n\" +\n\"varying vec3 v_normal;\\n\" +\n\"#endif\\n\" +\n\"\\n\" +\n\"vec4 a_x_perspective(vec4 position, const vec2 perspective_offset, const vec2 perspective_factor) {\\n\" +\n\" position.xy += position.z * perspective_factor * (position.xy - perspective_offset);\\n\" +\n\" return position;\\n\" +\n\"}\\n\" +\n\"vec4 b_x_isometric(vec4 position, const vec2 axis, const float multiplier) {\\n\" +\n\" position.xy += position.z * axis * multiplier / u_aspect;\\n\" +\n\" return position;\\n\" +\n\"}\\n\" +\n\"float c_x_calculateZ(float z, float layer, const float num_layers, const float z_layer_scale) {\\n\" +\n\" float z_layer_range = (num_layers + 1.) * z_layer_scale;\\n\" +\n\" float z_layer = (layer + 1.) * z_layer_scale;\\n\" +\n\" z = z_layer + clamp(z, 0., z_layer_scale);\\n\" +\n\" z = (z_layer_range - z) / z_layer_range;\\n\" +\n\" return z;\\n\" +\n\"}\\n\" +\n\"vec3 d_x_pointLight(vec4 position, vec3 normal, vec3 color, vec4 light_pos, float light_ambient, const bool backlight) {\\n\" +\n\" vec3 light_dir = normalize(position.xyz - light_pos.xyz);\\n\" +\n\" color *= abs(max(float(backlight) * -1., dot(normal, light_dir * -1.0))) + light_ambient;\\n\" +\n\" return color;\\n\" +\n\"}\\n\" +\n\"#pragma tangram: globals\\n\" +\n\"\\n\" +\n\"void main() {\\n\" +\n\" vec4 position = u_tile_view * vec4(a_position, 1.);\\n\" +\n\" #pragma tangram: vertex\\n\" +\n\" \\n\" +\n\" #if defined(LIGHTING_VERTEX)\\n\" +\n\" vec4 light_pos = vec4(0., 0., 150. * u_meters_per_pixel, 1.);\\n\" +\n\" const float light_ambient = 0.5;\\n\" +\n\" const bool backlit = true;\\n\" +\n\" v_color = d_x_pointLight(position, a_normal, a_color, light_pos, light_ambient, backlit);\\n\" +\n\" #else\\n\" +\n\" v_position = position;\\n\" +\n\" v_normal = a_normal;\\n\" +\n\" v_color = a_color;\\n\" +\n\" #endif\\n\" +\n\" position = u_meter_view * position;\\n\" +\n\" #if defined(PROJECTION_PERSPECTIVE)\\n\" +\n\" position = a_x_perspective(position, vec2(-0.25, -0.25), vec2(0.6, 0.6));\\n\" +\n\" #elif defined(PROJECTION_ISOMETRIC)\\n\" +\n\" position = b_x_isometric(position, vec2(0., 1.), 1.);\\n\" +\n\" #endif\\n\" +\n\" position.z = c_x_calculateZ(position.z, a_layer, u_num_layers, 4096.);\\n\" +\n\" gl_Position = position;\\n\" +\n\"}\\n\" +\"\";\n\nmodule.exports = shader_sources; \n\n",
"// Texture management\nimport * as Utils from '../utils';\nimport {GL} from './gl';\n\n\n// Global set of textures, by name\nGLTexture.textures = {};\n\n// GL texture wrapper object for keeping track of a global set of textures, keyed by an arbitrary name\nexport default function GLTexture (gl, name, options) {\n options = options || {};\n this.gl = gl;\n this.texture = gl.createTexture();\n this.bind(0);\n this.image = null;\n\n // Default to a 1-pixel black texture so we can safely render while we wait for an image to load\n // See: http://stackoverflow.com/questions/19722247/webgl-wait-for-texture-to-load\n this.setData(1, 1, new Uint8Array([0, 0, 0, 255]), { filtering: 'nearest' });\n\n // TODO: better support for non-URL sources: canvas/video elements, raw pixel buffers\n\n this.name = name;\n GLTexture.textures[this.name] = this;\n};\n\nGLTexture.prototype.bind = function (unit) {\n this.gl.activeTexture(this.gl.TEXTURE0 + unit);\n this.gl.bindTexture(this.gl.TEXTURE_2D, this.texture);\n};\n\n// Loads a texture from a URL\nGLTexture.prototype.load = function (url, options) {\n options = options || {};\n this.image = new Image();\n this.image.onload = () => {\n this.width = this.image.width;\n this.height = this.image.height;\n this.data = null; // mutually exclusive with direct data buffer textures\n this.update(options);\n this.setTextureFiltering(options);\n };\n this.image.src = url;\n};\n\n// Sets texture to a raw image buffer\nGLTexture.prototype.setData = function (width, height, data, options) {\n this.width = width;\n this.height = height;\n this.data = data;\n this.image = null; // mutually exclusive with image element-based textures\n\n this.update(options);\n this.setTextureFiltering(options);\n};\n\n// Uploads current image or buffer to the GPU (can be used to update animated textures on the fly)\nGLTexture.prototype.update = function (options) {\n options = options || {};\n\n this.bind(0);\n this.gl.pixelStorei(this.gl.UNPACK_FLIP_Y_WEBGL, (options.UNPACK_FLIP_Y_WEBGL === false ? false : true));\n\n // Image element\n if (this.image && this.image.complete) {\n this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA, this.gl.RGBA, this.gl.UNSIGNED_BYTE, this.image);\n }\n // Raw image buffer\n else if (this.width && this.height) { // NOTE: this.data can be null, to zero out texture\n this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA, this.width, this.height, 0, this.gl.RGBA, this.gl.UNSIGNED_BYTE, this.data);\n }\n};\n\n// Determines appropriate filtering mode\n// Assumes texture to be operated on is already bound\nGLTexture.prototype.setTextureFiltering = function (options) {\n options = options || {};\n options.filtering = options.filtering || 'mipmap'; // default to mipmaps for power-of-2 textures\n var gl = this.gl;\n\n // For power-of-2 textures, the following presets are available:\n // mipmap: linear blend from nearest mip\n // linear: linear blend from original image (no mips)\n // nearest: nearest pixel from original image (no mips, 'blocky' look)\n if (Utils.isPowerOf2(this.width) && Utils.isPowerOf2(this.height)) {\n this.power_of_2 = true;\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, options.TEXTURE_WRAP_S || gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, options.TEXTURE_WRAP_T || gl.CLAMP_TO_EDGE);\n\n if (options.filtering == 'mipmap') {\n // console.log(\"power-of-2 MIPMAP\");\n this.filtering = 'mipmap';\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_NEAREST); // TODO: use trilinear filtering by defualt instead?\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.generateMipmap(gl.TEXTURE_2D);\n }\n else if (options.filtering == 'linear') {\n // console.log(\"power-of-2 LINEAR\");\n this.filtering = 'linear';\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n }\n else if (options.filtering == 'nearest') {\n // console.log(\"power-of-2 NEAREST\");\n this.filtering = 'nearest';\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n }\n }\n else {\n // WebGL has strict requirements on non-power-of-2 textures:\n // No mipmaps and must clamp to edge\n this.power_of_2 = false;\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n\n if (options.filtering == 'nearest') {\n // console.log(\"power-of-2 NEAREST\");\n this.filtering = 'nearest';\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n }\n else { // default to linear for non-power-of-2 textures\n // console.log(\"power-of-2 LINEAR\");\n this.filtering = 'linear';\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n }\n }\n};\n",
"// Describes a vertex layout that can be used with many different GL programs.\n// If a given program doesn't include all attributes, it can still use the vertex layout\n// to read those attribs that it does recognize, using the attrib offsets to skip others.\n// Attribs are an array, in layout order, of: name, size, type, normalized\n// ex: { name: 'position', size: 3, type: gl.FLOAT, normalized: false }\nexport default function GLVertexLayout (gl, attribs) {\n this.attribs = attribs;\n\n // Calc vertex stride\n this.stride = 0;\n for (var a=0; a < this.attribs.length; a++) {\n var attrib = this.attribs[a];\n\n attrib.byte_size = attrib.size;\n\n switch (attrib.type) {\n case gl.FLOAT:\n case gl.INT:\n case gl.UNSIGNED_INT:\n attrib.byte_size *= 4;\n break;\n case gl.SHORT:\n case gl.UNSIGNED_SHORT:\n attrib.byte_size *= 2;\n break;\n }\n\n attrib.offset = this.stride;\n this.stride += attrib.byte_size;\n }\n}\n\n// Track currently enabled attribs, by the program they are bound to\nGLVertexLayout.enabled_attribs = {};\n\n// Setup a vertex layout for a specific GL program\n// Assumes that the desired vertex buffer (VBO) is already bound\nGLVertexLayout.prototype.enable = function (gl, gl_program)\n{\n // Enable all attributes for this layout\n for (var a=0; a < this.attribs.length; a++) {\n var attrib = this.attribs[a];\n var location = gl_program.attribute(attrib.name).location;\n\n if (location != -1) {\n gl.enableVertexAttribArray(location);\n gl.vertexAttribPointer(location, attrib.size, attrib.type, attrib.normalized, this.stride, attrib.offset);\n GLVertexLayout.enabled_attribs[location] = gl_program;\n }\n }\n\n // Disable any previously bound attributes that aren't for this layout\n var unusued_attribs = [];\n for (location in GLVertexLayout.enabled_attribs) {\n if (GLVertexLayout.enabled_attribs[location] != gl_program) {\n gl.disableVertexAttribArray(location);\n unusued_attribs.push(location);\n }\n }\n\n // Mark attribs as unused\n for (location in unusued_attribs) {\n delete GLVertexLayout.enabled_attribs[location];\n }\n};\n",
"import Scene from './scene';\n\nexport var LeafletLayer = L.GridLayer.extend({\n\n initialize: function (options) {\n L.setOptions(this, options);\n this.scene = new Scene(\n this.options.vectorTileSource,\n this.options.vectorLayers,\n this.options.vectorStyles,\n { num_workers: this.options.numWorkers }\n );\n\n this.scene.debug = this.options.debug;\n this.scene.continuous_animation = false; // set to true for animatinos, etc. (eventually will be automated)\n },\n\n // Finish initializing scene and setup events when layer is added to map\n onAdd: function (map) {\n\n this.on('tileunload', (event) => {\n var tile = event.tile;\n var key = tile.getAttribute('data-tile-key');\n this.scene.removeTile(key);\n });\n\n this._map.on('resize', () => {\n var size = this._map.getSize();\n this.scene.resizeMap(size.x, size.y);\n this.updateBounds();\n });\n\n this._map.on('move', () => {\n var center = this._map.getCenter();\n this.scene.setCenter(center.lng, center.lat);\n this.updateBounds();\n });\n\n this._map.on('zoomstart', () => {\n console.log(\"map.zoomstart \" + this._map.getZoom());\n this.scene.startZoom();\n });\n\n this._map.on('zoomend', () => {\n console.log(\"map.zoomend \" + this._map.getZoom());\n this.scene.setZoom(this._map.getZoom());\n this.updateBounds();\n });\n\n this._map.on('dragstart', () => {\n this.scene.panning = true;\n });\n\n this._map.on('dragend', () => {\n this.scene.panning = false;\n });\n\n // Canvas element will be inserted after map container (leaflet transforms shouldn't be applied to the GL canvas)\n // TODO: find a better way to deal with this? right now GL map only renders correctly as the bottom layer\n this.scene.container = this._map.getContainer();\n\n var center = this._map.getCenter();\n this.scene.setCenter(center.lng, center.lat);\n console.log(\"zoom: \" + this._map.getZoom());\n this.scene.setZoom(this._map.getZoom());\n this.updateBounds();\n\n L.GridLayer.prototype.onAdd.apply(this, arguments);\n\n // Use leaflet's existing event system as the callback mechanism\n this.scene.init(() => {\n this.fire('init');\n });\n },\n\n onRemove: function (map) {\n L.GridLayer.prototype.onRemove.apply(this, arguments);\n // TODO: remove event handlers, destroy map\n },\n\n createTile: function (coords, done) {\n var div = document.createElement('div');\n this.scene.loadTile(coords, div, done);\n return div;\n },\n\n updateBounds: function () {\n var bounds = this._map.getBounds();\n this.scene.setBounds(bounds.getSouthWest(), bounds.getNorthEast());\n },\n\n render: function () {\n this.scene.render();\n }\n\n});\n\nexport function leafletLayer(options) {\n return new LeafletLayer(options);\n}\n",
"// Modules and dependencies to expose in the public Tangram module\n\n// The leaflet layer plugin is currently the primary means of using the library\n\nimport {LeafletLayer, leafletLayer} from './leaflet_layer';\nimport {GL} from './gl/gl';\n// GL functions included for easier debugging / direct access to setting global defines, reloading programs, etc.\nGL.Program = require('./gl/gl_program.js').default;\nGL.Texture = require('./gl/gl_texture.js');\n\nmodule.exports = {\n LeafletLayer: LeafletLayer,\n leafletLayer: leafletLayer,\n GL: GL\n};\n\n",
"\nexport default class Point {\n constructor(x, y) {\n if (! (this instanceof Point)) {\n return new Point(x, y);\n }\n this.x = x;\n this.y = y;\n }\n\n static copy(other) {\n if (other == null) {\n return null;\n }\n return new Point(other.x, other.y);\n }\n}\n",
"import Point from './point';\nimport {Geo} from './geo';\nimport * as Utils from './utils';\nimport {Style} from './style';\nimport Queue from 'queue-async';\nimport {GL} from './gl/gl';\nimport {GLBuilders} from './gl/gl_builders';\nimport GLProgram from './gl/gl_program';\nimport GLTexture from './gl/gl_texture';\nimport {ModeManager} from './gl/gl_modes';\nimport glMatrix from 'gl-matrix';\n\nvar mat4 = glMatrix.mat4;\nvar vec3 = glMatrix.vec3;\n// Setup that happens on main thread only (skip in web worker)\nvar yaml;\n\nUtils.runIfInMainThread(function() {\n try {\n yaml = require('js-yaml');\n }\n catch (e) {\n console.log(\"no YAML support, js-yaml module not found\");\n }\n\n findBaseLibraryURL();\n});\n\n// Global setup\nScene.tile_scale = 4096; // coordinates are locally scaled to the range [0, tile_scale]\nGeo.setTileScale(Scene.tile_scale);\nGLBuilders.setTileScale(Scene.tile_scale);\nGLProgram.defines.TILE_SCALE = Scene.tile_scale;\nScene.debug = false;\n\n// Layers & styles: pass an object directly, or a URL as string to load remotely\n// TODO, convert this to the class sytnax once we get the runtime\n// working, IW\nexport default function Scene(tile_source, layers, styles, options) {\n var options = options || {};\n this.initialized = false;\n\n this.tile_source = tile_source;\n this.tiles = {};\n this.queued_tiles = [];\n this.num_workers = options.num_workers || 1;\n this.allow_cross_domain_workers = (options.allow_cross_domain_workers === false ? false : true);\n\n this.layers = layers;\n this.styles = styles;\n\n this.dirty = true; // request a redraw\n this.animated = false; // request redraw every frame\n\n this.frame = 0;\n this.zoom = null;\n this.center = null;\n this.device_pixel_ratio = window.devicePixelRatio || 1;\n\n this.zooming = false;\n this.panning = false;\n\n this.container = options.container;\n\n this.resetTime();\n throw {};\n}\n\nScene.prototype.init = function (callback) {\n if (this.initialized) {\n return;\n }\n\n // Load scene definition (layers, styles, etc.), then create modes & workers\n this.loadScene(() => {\n var queue = Queue();\n\n // Create rendering modes\n queue.defer(complete => {\n this.modes = Scene.createModes(this.styles);\n this.updateActiveModes();\n complete();\n });\n\n // Create web workers\n queue.defer(complete => {\n this.createWorkers(complete);\n });\n\n // Then create GL context\n queue.await(() => {\n // Create canvas & GL\n this.container = this.container || document.body;\n this.canvas = document.createElement('canvas');\n this.canvas.style.position = 'absolute';\n this.canvas.style.top = 0;\n this.canvas.style.left = 0;\n this.canvas.style.zIndex = -1;\n this.container.appendChild(this.canvas);\n\n this.gl = GL.getContext(this.canvas);\n this.resizeMap(this.container.clientWidth, this.container.clientHeight);\n\n this.initModes(); // TODO: remove gl context state from modes, and move init to create step above?\n this.initSelectionBuffer();\n\n // this.zoom_step = 0.02; // for fractional zoom user adjustment\n this.last_render_count = null;\n this.initInputHandlers();\n\n this.initialized = true;\n\n if (typeof callback == 'function') {\n callback();\n }\n });\n });\n};\n\nScene.prototype.initModes = function () {\n // Init GL context for modes (compiles programs, etc.)\n for (var m in this.modes) {\n this.modes[m].init(this.gl);\n }\n};\n\nScene.prototype.initSelectionBuffer = function () {\n // Selection state tracking\n this.pixel = new Uint8Array(4);\n this.pixel32 = new Float32Array(this.pixel.buffer);\n this.selection_point = Point(0, 0);\n this.selected_feature = null;\n this.selection_callback = null;\n this.selection_callback_timer = null;\n this.selection_frame_delay = 5; // delay from selection render to framebuffer sample, to avoid CPU/GPU sync lock\n this.update_selection = false;\n\n // Frame buffer for selection\n // TODO: initiate lazily in case we don't need to do any selection\n this.fbo = this.gl.createFramebuffer();\n this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, this.fbo);\n this.fbo_size = { width: 256, height: 256 }; // TODO: make configurable / adaptive based on canvas size\n this.gl.viewport(0, 0, this.fbo_size.width, this.fbo_size.height);\n\n // Texture for the FBO color attachment\n this.fbo_texture = new GLTexture(this.gl, 'selection_fbo');\n this.fbo_texture.setData(this.fbo_size.width, this.fbo_size.height, null, { filtering: 'nearest' });\n this.gl.framebufferTexture2D(this.gl.FRAMEBUFFER, this.gl.COLOR_ATTACHMENT0, this.gl.TEXTURE_2D, this.fbo_texture.texture, 0);\n\n // Renderbuffer for the FBO depth attachment\n this.fbo_depth_rb = this.gl.createRenderbuffer();\n this.gl.bindRenderbuffer(this.gl.RENDERBUFFER, this.fbo_depth_rb);\n this.gl.renderbufferStorage(this.gl.RENDERBUFFER, this.gl.DEPTH_COMPONENT16, this.fbo_size.width, this.fbo_size.height);\n this.gl.framebufferRenderbuffer(this.gl.FRAMEBUFFER, this.gl.DEPTH_ATTACHMENT, this.gl.RENDERBUFFER, this.fbo_depth_rb);\n\n this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, null);\n this.gl.viewport(0, 0, this.canvas.width, this.canvas.height);\n};\n\n// Web workers handle heavy duty tile construction: networking, geometry processing, etc.\nScene.prototype.createWorkers = function (callback) {\n var queue = Queue();\n var worker_url = Scene.library_base_url + 'tangram-worker.debug.js' + '?' + (+new Date());\n\n // Load & instantiate workers\n queue.defer(complete => {\n // Local object URLs supported?\n var createObjectURL = (window.URL && window.URL.createObjectURL) || (window.webkitURL && window.webkitURL.createObjectURL);\n if (createObjectURL && this.allow_cross_domain_workers) {\n // To allow workers to be loaded cross-domain, first load worker source via XHR, then create a local URL via a blob\n var req = new XMLHttpRequest();\n req.onload = () => {\n var worker_local_url = createObjectURL(new Blob([req.response], { type: 'application/javascript' }));\n this.makeWorkers(worker_local_url);\n complete();\n };\n req.open('GET', worker_url, true /* async flag */);\n req.responseType = 'text';\n req.send();\n }\n // Traditional load from remote URL\n else {\n console.log(this);\n this.makeWorkers(worker_url);\n complete();\n }\n });\n\n // Init workers\n queue.await(() => {\n this.workers.forEach(worker => {\n worker.addEventListener('message', this.workerBuildTileCompleted.bind(this));\n worker.addEventListener('message', this.workerGetFeatureSelection.bind(this));\n worker.addEventListener('message', this.workerLogMessage.bind(this));\n });\n\n this.next_worker = 0;\n this.selection_map_worker_size = {};\n\n if (typeof callback == 'function') {\n callback();\n }\n });\n};\n\n// Instantiate workers from URL\nScene.prototype.makeWorkers = function (url) {\n this.workers = [];\n for (var w=0; w < this.num_workers; w++) {\n this.workers.push(new Worker(url));\n this.workers[w].postMessage({\n type: 'init',\n worker_id: w,\n num_workers: this.num_workers\n })\n }\n};\n\n// Post a message about a tile to the next worker (round robbin)\nScene.prototype.workerPostMessageForTile = function (tile, message) {\n if (tile.worker == null) {\n tile.worker = this.next_worker;\n this.next_worker = (tile.worker + 1) % this.workers.length;\n }\n this.workers[tile.worker].postMessage(message);\n};\n\nScene.prototype.setCenter = function (lng, lat) {\n this.center = { lng: lng, lat: lat };\n this.dirty = true;\n};\n\nScene.prototype.startZoom = function () {\n this.last_zoom = this.zoom;\n this.zooming = true;\n};\n\nScene.prototype.preserve_tiles_within_zoom = 2;\nScene.prototype.setZoom = function (zoom) {\n // Schedule GL tiles for removal on zoom\n var below = zoom;\n var above = zoom;\n if (this.last_zoom != null) {\n console.log(\"scene.last_zoom: \" + this.last_zoom);\n if (Math.abs(zoom - this.last_zoom) <= this.preserve_tiles_within_zoom) {\n if (zoom > this.last_zoom) {\n below = zoom - this.preserve_tiles_within_zoom;\n }\n else {\n above = zoom + this.preserve_tiles_within_zoom;\n }\n }\n }\n\n this.last_zoom = this.zoom;\n this.zoom = zoom;\n this.capped_zoom = Math.min(~~this.zoom, this.tile_source.max_zoom || ~~this.zoom);\n this.zooming = false;\n\n this.removeTilesOutsideZoomRange(below, above);\n this.dirty = true;\n};\n\nScene.prototype.removeTilesOutsideZoomRange = function (below, above) {\n below = Math.min(below, this.tile_source.max_zoom || below);\n above = Math.min(above, this.tile_source.max_zoom || above);\n\n console.log(\"removeTilesOutsideZoomRange [\" + below + \", \" + above + \"])\");\n var remove_tiles = [];\n for (var t in this.tiles) {\n var tile = this.tiles[t];\n if (tile.coords.z < below || tile.coords.z > above) {\n remove_tiles.push(t);\n }\n }\n for (var r=0; r < remove_tiles.length; r++) {\n var key = remove_tiles[r];\n console.log(\"removed \" + key + \" (outside range [\" + below + \", \" + above + \"])\");\n this.removeTile(key);\n }\n};\n\nScene.prototype.setBounds = function (sw, ne) {\n this.bounds = {\n sw: { lng: sw.lng, lat: sw.lat },\n ne: { lng: ne.lng, lat: ne.lat }\n };\n\n var buffer = 200 * Geo.meters_per_pixel[~~this.zoom]; // pixels -> meters\n this.buffered_meter_bounds = {\n sw: Geo.latLngToMeters(Point(this.bounds.sw.lng, this.bounds.sw.lat)),\n ne: Geo.latLngToMeters(Point(this.bounds.ne.lng, this.bounds.ne.lat))\n };\n this.buffered_meter_bounds.sw.x -= buffer;\n this.buffered_meter_bounds.sw.y -= buffer;\n this.buffered_meter_bounds.ne.x += buffer;\n this.buffered_meter_bounds.ne.y += buffer;\n\n this.center_meters = Point(\n (this.buffered_meter_bounds.sw.x + this.buffered_meter_bounds.ne.x) / 2,\n (this.buffered_meter_bounds.sw.y + this.buffered_meter_bounds.ne.y) / 2\n );\n\n // console.log(\"set scene bounds to \" + JSON.stringify(this.bounds));\n\n // Mark tiles as visible/invisible\n for (var t in this.tiles) {\n this.updateVisibilityForTile(this.tiles[t]);\n }\n\n this.dirty = true;\n};\n\nScene.prototype.isTileInZoom = function (tile) {\n return (Math.min(tile.coords.z, this.tile_source.max_zoom || tile.coords.z) == this.capped_zoom);\n};\n\n// Update visibility and return true if changed\nScene.prototype.updateVisibilityForTile = function (tile) {\n var visible = tile.visible;\n tile.visible = this.isTileInZoom(tile) && Geo.boxIntersect(tile.bounds, this.buffered_meter_bounds);\n tile.center_dist = Math.abs(this.center_meters.x - tile.min.x) + Math.abs(this.center_meters.y - tile.min.y);\n return (visible != tile.visible);\n};\n\nScene.prototype.resizeMap = function (width, height) {\n this.dirty = true;\n\n this.css_size = { width: width, height: height };\n this.device_size = { width: Math.round(this.css_size.width * this.device_pixel_ratio), height: Math.round(this.css_size.height * this.device_pixel_ratio) };\n\n this.canvas.style.width = this.css_size.width + 'px';\n this.canvas.style.height = this.css_size.height + 'px';\n this.canvas.width = this.device_size.width;\n this.canvas.height = this.device_size.height;\n\n this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, null);\n this.gl.viewport(0, 0, this.canvas.width, this.canvas.height);\n};\n\nScene.prototype.requestRedraw = function () {\n this.dirty = true;\n};\n\n// Determine a Z value that will stack features in a \"painter's algorithm\" style, first by layer, then by draw order within layer\n// Features are assumed to be already sorted in desired draw order by the layer pre-processor\nScene.calculateZ = function (layer, tile, layer_offset, feature_offset) {\n // var layer_offset = layer_offset || 0;\n // var feature_offset = feature_offset || 0;\n var z = 0; // TODO: made this a no-op until revisiting where it should live - one-time calc here, in vertex layout/shader, etc.\n return z;\n};\n\nScene.prototype.render = function () {\n this.loadQueuedTiles();\n\n // Render on demand\n if (this.dirty == false || this.initialized == false) {\n return false;\n }\n this.dirty = false; // subclasses can set this back to true when animation is needed\n\n this.renderGL();\n\n // Redraw every frame if animating\n if (this.animated == true) {\n this.dirty = true;\n }\n\n this.frame++;\n\n // console.log(\"render map\");\n return true;\n};\n\nScene.prototype.resetFrame = function () {\n if (!this.initialized) {\n return;\n }\n\n // Reset frame state\n var gl = this.gl;\n gl.clearColor(0.0, 0.0, 0.0, 1.0);\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n\n // TODO: unnecessary repeat?\n gl.enable(gl.DEPTH_TEST);\n gl.depthFunc(gl.LESS);\n gl.enable(gl.CULL_FACE);\n gl.cullFace(gl.BACK);\n // gl.enable(gl.BLEND);\n // gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n};\n\nScene.prototype.renderGL = function () {\n var gl = this.gl;\n\n this.input();\n this.resetFrame();\n\n // Map transforms\n var center = Geo.latLngToMeters(Point(this.center.lng, this.center.lat));\n var meters_per_pixel = Geo.min_zoom_meters_per_pixel / Math.pow(2, this.zoom);\n var meter_zoom = Point(this.css_size.width / 2 * meters_per_pixel, this.css_size.height / 2 * meters_per_pixel);\n\n // Matrices\n var tile_view_mat = mat4.create();\n var tile_world_mat = mat4.create();\n var meter_view_mat = mat4.create();\n\n // Convert mercator meters to screen space\n mat4.scale(meter_view_mat, meter_view_mat, vec3.fromValues(1 / meter_zoom.x, 1 / meter_zoom.y, 1 / meter_zoom.y));\n\n // Renderable tile list\n var renderable_tiles = [];\n for (var t in this.tiles) {\n var tile = this.tiles[t];\n if (tile.loaded == true && tile.visible == true) {\n renderable_tiles.push(tile);\n }\n }\n this.renderable_tiles_count = renderable_tiles.length;\n\n // Render main pass - tiles grouped by rendering mode (GL program)\n var render_count = 0;\n for (var mode in this.modes) {\n // Per-frame mode updates/animations\n // Called even if the mode isn't rendered by any current tiles, so time-based animations, etc. continue\n this.modes[mode].update();\n\n var gl_program = this.modes[mode].gl_program;\n if (gl_program == null || gl_program.compiled == false) {\n continue;\n }\n\n var first_for_mode = true;\n\n // Render tile GL geometries\n for (var t in renderable_tiles) {\n var tile = renderable_tiles[t];\n\n if (tile.gl_geometry[mode] != null) {\n // Setup mode if encountering for first time this frame\n // (lazy init, not all modes will be used in all screen views; some modes might be defined but never used)\n if (first_for_mode == true) {\n first_for_mode = false;\n\n gl_program.use();\n this.modes[mode].setUniforms();\n\n // TODO: don't set uniforms when they haven't changed\n gl_program.uniform('2f', 'u_resolution', this.device_size.width, this.device_size.height);\n gl_program.uniform('2f', 'u_aspect', this.device_size.width / this.device_size.height, 1.0);\n gl_program.uniform('1f', 'u_time', ((+new Date()) - this.start_time) / 1000);\n gl_program.uniform('1f', 'u_map_zoom', this.zoom); // Math.floor(this.zoom) + (Math.log((this.zoom % 1) + 1) / Math.LN2 // scale fractional zoom by log\n gl_program.uniform('2f', 'u_map_center', center.x, center.y);\n gl_program.uniform('1f', 'u_num_layers', this.layers.length);\n gl_program.uniform('1f', 'u_meters_per_pixel', meters_per_pixel);\n gl_program.uniform('Matrix4fv', 'u_meter_view', false, meter_view_mat);\n }\n\n // TODO: calc these once per tile (currently being needlessly re-calculated per-tile-per-mode)\n\n // Tile origin\n gl_program.uniform('2f', 'u_tile_origin', tile.min.x, tile.min.y);\n\n // Tile view matrix - transform tile space into view space (meters, relative to camera)\n mat4.identity(tile_view_mat);\n mat4.translate(tile_view_mat, tile_view_mat, vec3.fromValues(tile.min.x - center.x, tile.min.y - center.y, 0)); // adjust for tile origin & map center\n mat4.scale(tile_view_mat, tile_view_mat, vec3.fromValues(tile.span.x / Scene.tile_scale, -1 * tile.span.y / Scene.tile_scale, 1)); // scale tile local coords to meters\n gl_program.uniform('Matrix4fv', 'u_tile_view', false, tile_view_mat);\n\n // Tile world matrix - transform tile space into world space (meters, absolute mercator position)\n mat4.identity(tile_world_mat);\n mat4.translate(tile_world_mat, tile_world_mat, vec3.fromValues(tile.min.x, tile.min.y, 0));\n mat4.scale(tile_world_mat, tile_world_mat, vec3.fromValues(tile.span.x / Scene.tile_scale, -1 * tile.span.y / Scene.tile_scale, 1)); // scale tile local coords to meters\n gl_program.uniform('Matrix4fv', 'u_tile_world', false, tile_world_mat);\n\n // Render tile\n tile.gl_geometry[mode].render();\n render_count += tile.gl_geometry[mode].geometry_count;\n }\n }\n }\n\n // Render selection pass (if needed)\n // Slight variations on render pass code above - mostly because we're reusing uniforms from the main\n // mode program, for the selection program\n // TODO: reduce duplicated code w/main render pass above\n if (this.update_selection) {\n this.update_selection = false; // reset selection check\n\n // TODO: queue callback till panning is over? coords where selection was requested are out of date\n if (this.panning) {\n return;\n }\n\n // Switch to FBO\n gl.bindFramebuffer(gl.FRAMEBUFFER, this.fbo);\n gl.viewport(0, 0, this.fbo_size.width, this.fbo_size.height);\n this.resetFrame();\n\n for (mode in this.modes) {\n gl_program = this.modes[mode].selection_gl_program;\n if (gl_program == null || gl_program.compiled == false) {\n continue;\n }\n\n first_for_mode = true;\n\n // Render tile GL geometries\n for (t in renderable_tiles) {\n tile = renderable_tiles[t];\n\n if (tile.gl_geometry[mode] != null) {\n // Setup mode if encountering for first time this frame\n if (first_for_mode == true) {\n first_for_mode = false;\n\n gl_program.use();\n this.modes[mode].setUniforms();\n\n gl_program.uniform('2f', 'u_resolution', this.fbo_size.width, this.fbo_size.height);\n gl_program.uniform('2f', 'u_aspect', this.fbo_size.width / this.fbo_size.height, 1.0);\n gl_program.uniform('1f', 'u_time', ((+new Date()) - this.start_time) / 1000);\n gl_program.uniform('1f', 'u_map_zoom', this.zoom);\n gl_program.uniform('2f', 'u_map_center', center.x, center.y);\n gl_program.uniform('1f', 'u_num_layers', this.layers.length);\n gl_program.uniform('1f', 'u_meters_per_pixel', meters_per_pixel);\n gl_program.uniform('Matrix4fv', 'u_meter_view', false, meter_view_mat);\n }\n\n // Tile origin\n gl_program.uniform('2f', 'u_tile_origin', tile.min.x, tile.min.y);\n\n // Tile view matrix - transform tile space into view space (meters, relative to camera)\n mat4.identity(tile_view_mat);\n mat4.translate(tile_view_mat, tile_view_mat, vec3.fromValues(tile.min.x - center.x, tile.min.y - center.y, 0)); // adjust for tile origin & map center\n mat4.scale(tile_view_mat, tile_view_mat, vec3.fromValues(tile.span.x / Scene.tile_scale, -1 * tile.span.y / Scene.tile_scale, 1)); // scale tile local coords to meters\n gl_program.uniform('Matrix4fv', 'u_tile_view', false, tile_view_mat);\n\n // Tile world matrix - transform tile space into world space (meters, absolute mercator position)\n mat4.identity(tile_world_mat);\n mat4.translate(tile_world_mat, tile_world_mat, vec3.fromValues(tile.min.x, tile.min.y, 0));\n mat4.scale(tile_world_mat, tile_world_mat, vec3.fromValues(tile.span.x / Scene.tile_scale, -1 * tile.span.y / Scene.tile_scale, 1)); // scale tile local coords to meters\n gl_program.uniform('Matrix4fv', 'u_tile_world', false, tile_world_mat);\n\n // Render tile\n tile.gl_geometry[mode].render();\n }\n }\n }\n\n // Delay reading the pixel result from the selection buffer to avoid CPU/GPU sync lock.\n // Calling readPixels synchronously caused a massive performance hit, presumably since it\n // forced this function to wait for the GPU to finish rendering and retrieve the texture contents.\n if (this.selection_callback_timer != null) {\n clearTimeout(this.selection_callback_timer);\n }\n this.selection_callback_timer = setTimeout(\n this.readSelectionBuffer.bind(this),\n this.selection_frame_delay\n );\n\n // Reset to screen buffer\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.viewport(0, 0, this.canvas.width, this.canvas.height);\n }\n\n if (render_count != this.last_render_count) {\n console.log(\"rendered \" + render_count + \" primitives\");\n }\n this.last_render_count = render_count;\n\n return true;\n};\n\n// Request feature selection\n// Runs asynchronously, schedules selection buffer to be updated\nScene.prototype.getFeatureAt = function (pixel, callback) {\n if (!this.initialized) {\n return;\n }\n\n // TODO: queue callbacks while still performing only one selection render pass within X time interval?\n if (this.update_selection == true) {\n return;\n }\n\n this.selection_point = Point(\n pixel.x * this.device_pixel_ratio,\n this.device_size.height - (pixel.y * this.device_pixel_ratio)\n );\n this.selection_callback = callback;\n this.update_selection = true;\n this.dirty = true;\n};\n\nScene.prototype.readSelectionBuffer = function () {\n var gl = this.gl;\n\n gl.bindFramebuffer(gl.FRAMEBUFFER, this.fbo);\n\n // Check selection map against FBO\n gl.readPixels(\n Math.floor(this.selection_point.x * this.fbo_size.width / this.device_size.width),\n Math.floor(this.selection_point.y * this.fbo_size.height / this.device_size.height),\n 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, this.pixel);\n var feature_key = (this.pixel[0] + (this.pixel[1] << 8) + (this.pixel[2] << 16) + (this.pixel[3] << 24)) >>> 0;\n\n // console.log(\n // Math.floor(this.selection_point.x * this.fbo_size.width / this.device_size.width) + \", \" +\n // Math.floor(this.selection_point.y * this.fbo_size.height / this.device_size.height) + \": (\" +\n // this.pixel[0] + \", \" + this.pixel[1] + \", \" + this.pixel[2] + \", \" + this.pixel[3] + \")\");\n\n // If feature found, ask appropriate web worker to lookup feature\n var worker_id = this.pixel[3];\n if (worker_id != 255) { // 255 indicates an empty selection buffer pixel\n // console.log(\"worker_id: \" + worker_id);\n if (this.workers[worker_id] != null) {\n // console.log(\"post message\");\n this.workers[worker_id].postMessage({\n type: 'getFeatureSelection',\n key: feature_key\n });\n }\n }\n\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n};\n\n// Called on main thread when a web worker finds a feature in the selection buffer\nScene.prototype.workerGetFeatureSelection = function (event) {\n if (event.data.type != 'getFeatureSelection') {\n return;\n }\n\n var feature = event.data.feature;\n var changed = false;\n if ((feature != null && this.selected_feature == null) ||\n (feature == null && this.selected_feature != null) ||\n (feature != null && this.selected_feature != null && feature.id != this.selected_feature.id)) {\n changed = true;\n }\n\n this.selected_feature = feature;\n\n if (typeof this.selection_callback == 'function') {\n this.selection_callback({ feature: this.selected_feature, changed: changed });\n }\n};\n\n// Queue a tile for load\nScene.prototype.loadTile = function (coords, div, callback) {\n this.queued_tiles[this.queued_tiles.length] = arguments;\n};\n\n// Load all queued tiles\nScene.prototype.loadQueuedTiles = function () {\n if (!this.initialized) {\n return;\n }\n\n if (this.queued_tiles.length == 0) {\n return;\n }\n\n for (var t=0; t < this.queued_tiles.length; t++) {\n this._loadTile.apply(this, this.queued_tiles[t]);\n }\n\n this.queued_tiles = [];\n};\n\n// Load a single tile\nScene.prototype._loadTile = function (coords, div, callback) {\n // Overzoom?\n if (coords.z > this.tile_source.max_zoom) {\n var zgap = coords.z - this.tile_source.max_zoom;\n // var original_tile = [coords.x, coords.y, coords.z].join('/');\n coords.x = ~~(coords.x / Math.pow(2, zgap));\n coords.y = ~~(coords.y / Math.pow(2, zgap));\n coords.display_z = coords.z; // z without overzoom\n coords.z -= zgap;\n // console.log(\"adjusted for overzoom, tile \" + original_tile + \" -> \" + [coords.x, coords.y, coords.z].join('/'));\n }\n\n this.trackTileSetLoadStart();\n\n var key = [coords.x, coords.y, coords.z].join('/');\n\n // Already loading/loaded?\n if (this.tiles[key]) {\n // if (this.tiles[key].loaded == true) {\n // console.log(\"use loaded tile \" + key + \" from cache\");\n // }\n // if (this.tiles[key].loading == true) {\n // console.log(\"already loading tile \" + key + \", skip\");\n // }\n\n if (callback) {\n callback(null, div);\n }\n return;\n }\n\n var tile = this.tiles[key] = {};\n tile.key = key;\n tile.coords = coords;\n tile.min = Geo.metersForTile(tile.coords);\n tile.max = Geo.metersForTile({ x: tile.coords.x + 1, y: tile.coords.y + 1, z: tile.coords.z });\n tile.span = { x: (tile.max.x - tile.min.x), y: (tile.max.y - tile.min.y) };\n tile.bounds = { sw: { x: tile.min.x, y: tile.max.y }, ne: { x: tile.max.x, y: tile.min.y } };\n tile.debug = {};\n tile.loading = true;\n tile.loaded = false;\n\n this.buildTile(tile.key);\n this.updateTileElement(tile, div);\n this.updateVisibilityForTile(tile);\n\n if (callback) {\n callback(null, div);\n }\n};\n\n// Rebuild all tiles\n// TODO: also rebuild modes? (detect if changed)\nScene.prototype.rebuildTiles = function () {\n if (!this.initialized) {\n return;\n }\n\n // Update layers & styles\n this.layers_serialized = Utils.serializeWithFunctions(this.layers);\n this.styles_serialized = Utils.serializeWithFunctions(this.styles);\n this.selection_map = {};\n\n // Tell workers we're about to rebuild (so they can refresh styles, etc.)\n this.workers.forEach(worker => {\n worker.postMessage({\n type: 'prepareForRebuild',\n layers: this.layers_serialized,\n styles: this.styles_serialized\n });\n });\n\n // Rebuild visible tiles first, from center out\n // console.log(\"find visible\");\n var visible = [], invisible = [];\n for (var t in this.tiles) {\n if (this.tiles[t].visible == true) {\n visible.push(t);\n }\n else {\n invisible.push(t);\n }\n }\n\n // console.log(\"sort visible distance\");\n visible.sort((a, b) => {\n // var ad = Math.abs(this.center_meters.x - this.tiles[b].min.x) + Math.abs(this.center_meters.y - this.tiles[b].min.y);\n // var bd = Math.abs(this.center_meters.x - this.tiles[a].min.x) + Math.abs(this.center_meters.y - this.tiles[a].min.y);\n var ad = this.tiles[a].center_dist;\n var bd = this.tiles[b].center_dist;\n return (bd > ad ? -1 : (bd == ad ? 0 : 1));\n });\n\n // console.log(\"build visible\");\n for (var t in visible) {\n this.buildTile(visible[t]);\n }\n\n // console.log(\"build invisible\");\n for (var t in invisible) {\n // Keep tiles in current zoom but out of visible range, but rebuild as lower priority\n if (this.isTileInZoom(this.tiles[invisible[t]]) == true) {\n this.buildTile(invisible[t]);\n }\n // Drop tiles outside current zoom\n else {\n this.removeTile(invisible[t]);\n }\n }\n\n this.updateActiveModes();\n this.resetTime();\n};\n\nScene.prototype.buildTile = function(key) {\n var tile = this.tiles[key];\n\n this.workerPostMessageForTile(tile, {\n type: 'buildTile',\n tile: {\n key: tile.key,\n coords: tile.coords, // used by style helpers\n min: tile.min, // used by TileSource to scale tile to local extents\n max: tile.max, // used by TileSource to scale tile to local extents\n debug: tile.debug\n },\n tile_source: this.tile_source,\n layers: this.layers_serialized,\n styles: this.styles_serialized\n });\n};\n\n// Process geometry for tile - called by web worker\n// Returns a set of tile keys that should be sent to the main thread (so that we can minimize data exchange between worker and main thread)\nScene.addTile = function (tile, layers, styles, modes) {\n var layer, style, feature, z, mode;\n var vertex_data = {};\n\n // Join line test pattern\n // if (Scene.debug) {\n // tile.layers['roads'].features.push(Scene.buildZigzagLineTestPattern());\n // }\n\n // Build raw geometry arrays\n tile.debug.features = 0;\n for (var layer_num=0; layer_num < layers.length; layer_num++) {\n layer = layers[layer_num];\n\n // Skip layers with no styles defined, or layers set to not be visible\n if (styles.layers[layer.name] == null || styles.layers[layer.name].visible == false) {\n continue;\n }\n\n if (tile.layers[layer.name] != null) {\n var num_features = tile.layers[layer.name].features.length;\n\n // Rendering reverse order aka top to bottom\n for (var f = num_features-1; f >= 0; f--) {\n feature = tile.layers[layer.name].features[f];\n style = Style.parseStyleForFeature(feature, layer.name, styles.layers[layer.name], tile);\n\n // Skip feature?\n if (style == null) {\n continue;\n }\n\n style.layer_num = layer_num;\n style.z = Scene.calculateZ(layer, tile) + style.z;\n\n var points = null,\n lines = null,\n polygons = null;\n\n if (feature.geometry.type == 'Polygon') {\n polygons = [feature.geometry.coordinates];\n }\n else if (feature.geometry.type == 'MultiPolygon') {\n polygons = feature.geometry.coordinates;\n }\n else if (feature.geometry.type == 'LineString') {\n lines = [feature.geometry.coordinates];\n }\n else if (feature.geometry.type == 'MultiLineString') {\n lines = feature.geometry.coordinates;\n }\n else if (feature.geometry.type == 'Point') {\n points = [feature.geometry.coordinates];\n }\n else if (feature.geometry.type == 'MultiPoint') {\n points = feature.geometry.coordinates;\n }\n\n // First feature in this render mode?\n mode = style.mode.name;\n if (vertex_data[mode] == null) {\n vertex_data[mode] = [];\n }\n\n if (polygons != null) {\n modes[mode].buildPolygons(polygons, style, vertex_data[mode]);\n }\n\n if (lines != null) {\n modes[mode].buildLines(lines, style, vertex_data[mode]);\n }\n\n if (points != null) {\n modes[mode].buildPoints(points, style, vertex_data[mode]);\n }\n\n tile.debug.features++;\n }\n }\n }\n\n tile.vertex_data = {};\n for (var s in vertex_data) {\n tile.vertex_data[s] = new Float32Array(vertex_data[s]);\n }\n\n return {\n vertex_data: true\n };\n};\n\n// Called on main thread when a web worker completes processing for a single tile (initial load, or rebuild)\nScene.prototype.workerBuildTileCompleted = function (event) {\n if (event.data.type != 'buildTileCompleted') {\n return;\n }\n\n // Track selection map size (for stats/debug) - update per worker and sum across workers\n this.selection_map_worker_size[event.data.worker_id] = event.data.selection_map_size;\n this.selection_map_size = 0;\n Object\n .keys(this.selection_map_worker_size)\n .forEach(worker => {\n this.selection_map_size += this.selection_map_worker_size[worker];\n });\n console.log(\"selection map: \" + this.selection_map_size + \" features\");\n\n var tile = event.data.tile;\n\n // Removed this tile during load?\n if (this.tiles[tile.key] == null) {\n console.log(\"discarded tile \" + tile.key + \" in Scene.tileWorkerCompleted because previously removed\");\n return;\n }\n\n // Update tile with properties from worker\n tile = this.mergeTile(tile.key, tile);\n\n this.buildGLGeometry(tile);\n\n this.dirty = true;\n this.trackTileSetLoadEnd();\n this.printDebugForTile(tile);\n};\n\n// Called on main thread when a web worker completes processing for a single tile\nScene.prototype.buildGLGeometry = function (tile) {\n var vertex_data = tile.vertex_data;\n\n // Cleanup existing GL geometry objects\n this.freeTileResources(tile);\n tile.gl_geometry = {};\n\n // Create GL geometry objects\n for (var s in vertex_data) {\n tile.gl_geometry[s] = this.modes[s].makeGLGeometry(vertex_data[s]);\n }\n\n tile.debug.geometries = 0;\n tile.debug.buffer_size = 0;\n for (var p in tile.gl_geometry) {\n tile.debug.geometries += tile.gl_geometry[p].geometry_count;\n tile.debug.buffer_size += tile.gl_geometry[p].vertex_data.byteLength;\n }\n tile.debug.geom_ratio = (tile.debug.geometries / tile.debug.features).toFixed(1);\n\n delete tile.vertex_data; // TODO: might want to preserve this for rebuilding geometries when styles/etc. change?\n};\n\nScene.prototype.removeTile = function (key)\n{\n if (!this.initialized) {\n return;\n }\n\n console.log(\"tile unload for \" + key);\n\n if (this.zooming == true) {\n return; // short circuit tile removal, will sweep out tiles by zoom level when zoom ends\n }\n\n var tile = this.tiles[key];\n\n if (tile != null) {\n this.freeTileResources(tile);\n\n // Web worker will cancel XHR requests\n this.workerPostMessageForTile(tile, {\n type: 'removeTile',\n key: tile.key\n });\n }\n\n delete this.tiles[key];\n this.dirty = true;\n};\n\n// Free any GL / owned resources\nScene.prototype.freeTileResources = function (tile)\n{\n if (tile != null && tile.gl_geometry != null) {\n for (var p in tile.gl_geometry) {\n tile.gl_geometry[p].destroy();\n }\n tile.gl_geometry = null;\n }\n};\n\n// Attaches tracking and debug into to the provided tile DOM element\nScene.prototype.updateTileElement = function (tile, div) {\n // Debug info\n div.setAttribute('data-tile-key', tile.key);\n div.style.width = '256px';\n div.style.height = '256px';\n\n if (this.debug) {\n var debug_overlay = document.createElement('div');\n debug_overlay.textContent = tile.key;\n debug_overlay.style.position = 'absolute';\n debug_overlay.style.left = 0;\n debug_overlay.style.top = 0;\n debug_overlay.style.color = 'white';\n debug_overlay.style.fontSize = '16px';\n // debug_overlay.style.textOutline = '1px #000000';\n div.appendChild(debug_overlay);\n\n div.style.borderStyle = 'solid';\n div.style.borderColor = 'white';\n div.style.borderWidth = '1px';\n }\n};\n\n// Merge properties from a provided tile object into the main tile store. Shallow merge (just copies top-level properties)!\n// Used for selectively updating properties of tiles passed between main thread and worker\n// (so we don't have to pass the whole tile, including some properties which cannot be cloned for a worker).\nScene.prototype.mergeTile = function (key, source_tile) {\n var tile = this.tiles[key];\n\n if (tile == null) {\n this.tiles[key] = source_tile;\n return this.tiles[key];\n }\n\n for (var p in source_tile) {\n // console.log(\"merging \" + p + \": \" + source_tile[p]);\n tile[p] = source_tile[p];\n }\n\n return tile;\n};\n\n// Load (or reload) the scene config\nScene.prototype.loadScene = function (callback) {\n var queue = Queue();\n\n // If this is the first time we're loading the scene, copy any URLs\n if (!this.layer_source && typeof(this.layers) == 'string') {\n this.layer_source = Utils.urlForPath(this.layers);\n }\n\n if (!this.style_source && typeof(this.styles) == 'string') {\n this.style_source = Utils.urlForPath(this.styles);\n }\n\n // Layer by URL\n if (this.layer_source) {\n queue.defer(complete => {\n Scene.loadLayers(\n this.layer_source,\n layers => {\n this.layers = layers;\n this.layers_serialized = Utils.serializeWithFunctions(this.layers);\n complete();\n }\n );\n });\n }\n\n // Style by URL\n if (this.style_source) {\n queue.defer(complete => {\n Scene.loadStyles(\n this.style_source,\n styles => {\n this.styles = styles;\n this.styles_serialized = Utils.serializeWithFunctions(this.styles);\n complete();\n }\n );\n });\n }\n // Style object\n else {\n this.styles = Scene.postProcessStyles(this.styles);\n }\n\n // Everything is loaded\n queue.await(function() {\n if (typeof callback == 'function') {\n callback();\n }\n });\n};\n\n// Reload scene config and rebuild tiles\nScene.prototype.reloadScene = function () {\n if (!this.initialized) {\n return;\n }\n\n this.loadScene(() => {\n this.rebuildTiles();\n });\n};\n\n// Called (currently manually) after modes are updated in stylesheet\nScene.prototype.refreshModes = function () {\n if (!this.initialized) {\n return;\n }\n\n this.modes = Scene.refreshModes(this.modes, this.styles);\n};\n\nScene.prototype.updateActiveModes = function () {\n // Make a set of currently active modes (used in a layer)\n this.active_modes = {};\n var animated = false; // is any active mode animated?\n for (var l in this.styles.layers) {\n var mode = this.styles.layers[l].mode.name;\n if (this.styles.layers[l].visible !== false) {\n this.active_modes[mode] = true;\n\n // Check if this mode is animated\n if (animated == false && this.modes[mode].animated == true) {\n animated = true;\n }\n }\n }\n this.animated = animated;\n};\n\n// Reset internal clock, mostly useful for consistent experience when changing modes/debugging\nScene.prototype.resetTime = function () {\n this.start_time = +new Date();\n};\n\n// User input\n// TODO: restore fractional zoom support once leaflet animation refactor pull request is merged\n\nScene.prototype.initInputHandlers = function () {\n // this.key = null;\n\n // document.addEventListener('keydown', function (event) {\n // if (event.keyCode == 37) {\n // this.key = 'left';\n // }\n // else if (event.keyCode == 39) {\n // this.key = 'right';\n // }\n // else if (event.keyCode == 38) {\n // this.key = 'up';\n // }\n // else if (event.keyCode == 40) {\n // this.key = 'down';\n // }\n // else if (event.keyCode == 83) { // s\n // console.log(\"reloading shaders\");\n // for (var mode in this.modes) {\n // this.modes[mode].gl_program.compile();\n // }\n // this.dirty = true;\n // }\n // }.bind(this));\n\n // document.addEventListener('keyup', function (event) {\n // this.key = null;\n // }.bind(this));\n};\n\nScene.prototype.input = function () {\n // // Fractional zoom scaling\n // if (this.key == 'up') {\n // this.setZoom(this.zoom + this.zoom_step);\n // }\n // else if (this.key == 'down') {\n // this.setZoom(this.zoom - this.zoom_step);\n // }\n};\n\n\n// Stats/debug/profiling methods\n\n// Profiling methods used to track when sets of tiles start/stop loading together\n// e.g. initial page load is one set of tiles, new sets of tile loads are then initiated by a map pan or zoom\nScene.prototype.trackTileSetLoadStart = function () {\n // Start tracking new tile set if no other tiles already loading\n if (this.tile_set_loading == null) {\n this.tile_set_loading = +new Date();\n console.log(\"tile set load START\");\n }\n};\n\nScene.prototype.trackTileSetLoadEnd = function () {\n // No more tiles actively loading?\n if (this.tile_set_loading != null) {\n var end_tile_set = true;\n for (var t in this.tiles) {\n if (this.tiles[t].loading == true) {\n end_tile_set = false;\n break;\n }\n }\n\n if (end_tile_set == true) {\n this.last_tile_set_load = (+new Date()) - this.tile_set_loading;\n this.tile_set_loading = null;\n console.log(\"tile set load FINISHED in: \" + this.last_tile_set_load);\n }\n }\n};\n\nScene.prototype.printDebugForTile = function (tile) {\n console.log(\n \"debug for \" + tile.key + ': [ ' +\n Object.keys(tile.debug).map(function (t) { return t + ': ' + tile.debug[t]; }).join(', ') + ' ]'\n );\n};\n\n// Recompile all shaders\nScene.prototype.compileShaders = function () {\n for (var m in this.modes) {\n this.modes[m].gl_program.compile();\n }\n};\n\n// Sum of a debug property across tiles\nScene.prototype.getDebugSum = function (prop, filter) {\n var sum = 0;\n for (var t in this.tiles) {\n if (this.tiles[t].debug[prop] != null && (typeof filter != 'function' || filter(this.tiles[t]) == true)) {\n sum += this.tiles[t].debug[prop];\n }\n }\n return sum;\n};\n\n// Average of a debug property across tiles\nScene.prototype.getDebugAverage = function (prop, filter) {\n return this.getDebugSum(prop, filter) / Object.keys(this.tiles).length;\n};\n\n// Log messages pass through from web workers\nScene.prototype.workerLogMessage = function (event) {\n if (event.data.type != 'log') {\n return;\n }\n\n console.log(\"worker \" + event.data.worker_id + \": \" + event.data.msg);\n};\n\n\n/*** Class methods (stateless) ***/\n\nScene.loadLayers = function (url, callback) {\n var layers;\n var req = new XMLHttpRequest();\n req.onload = function () {\n eval('layers = ' + req.response); // TODO: security!\n\n if (typeof callback == 'function') {\n callback(layers);\n }\n };\n req.open('GET', url + '?' + (+new Date()), true /* async flag */);\n req.responseType = 'text';\n req.send();\n};\n\nScene.loadStyles = function (url, callback) {\n var styles;\n var req = new XMLHttpRequest();\n\n req.onload = function () {\n styles = req.response;\n\n // Try JSON first, then YAML (if available)\n try {\n eval('styles = ' + req.response);\n }\n catch (e) {\n try {\n styles = yaml.safeLoad(req.response);\n }\n catch (e) {\n console.log(\"failed to parse styles!\");\n console.log(styles);\n styles = null;\n }\n }\n\n // Find generic functions & style macros\n Utils.stringsToFunctions(styles);\n Style.expandMacros(styles);\n Scene.postProcessStyles(styles);\n\n if (typeof callback == 'function') {\n callback(styles);\n }\n }\n\n req.open('GET', url + '?' + (+new Date()), true /* async flag */);\n req.responseType = 'text';\n req.send();\n};\n\n// Normalize some style settings that may not have been explicitly specified in the stylesheet\nScene.postProcessStyles = function (styles) {\n // Post-process styles\n for (var m in styles.layers) {\n if (styles.layers[m].visible !== false) {\n styles.layers[m].visible = true;\n }\n\n if ((styles.layers[m].mode && styles.layers[m].mode.name) == null) {\n styles.layers[m].mode = {};\n for (var p in Style.defaults.mode) {\n styles.layers[m].mode[p] = Style.defaults.mode[p];\n }\n }\n }\n\n return styles;\n};\n\n// Processes the tile response to create layers as defined by the scene\n// Can include post-processing to partially filter or re-arrange data, e.g. only including POIs that have names\nScene.processLayersForTile = function (layers, tile) {\n var tile_layers = {};\n for (var t=0; t < layers.length; t++) {\n layers[t].number = t;\n\n if (layers[t] != null) {\n // Just pass through data untouched if no data transform function defined\n if (layers[t].data == null) {\n tile_layers[layers[t].name] = tile.layers[layers[t].name];\n }\n // Pass through data but with different layer name in tile source data\n else if (typeof layers[t].data == 'string') {\n tile_layers[layers[t].name] = tile.layers[layers[t].data];\n }\n // Apply the transform function for post-processing\n else if (typeof layers[t].data == 'function') {\n tile_layers[layers[t].name] = layers[t].data(tile.layers);\n }\n }\n\n // Handle cases where no data was found in tile or returned by post-processor\n tile_layers[layers[t].name] = tile_layers[layers[t].name] || { type: 'FeatureCollection', features: [] };\n }\n tile.layers = tile_layers;\n return tile_layers;\n};\n\n// Called once on instantiation\nScene.createModes = function (styles) {\n var modes = {};\n\n // Built-in modes\n var built_ins = require('./gl/gl_modes').Modes;\n for (var m in built_ins) {\n modes[m] = built_ins[m];\n }\n\n // Stylesheet modes\n for (var m in styles.modes) {\n // if (m != 'all') {\n modes[m] = ModeManager.configureMode(m, styles.modes[m]);\n // }\n }\n\n return modes;\n};\n\nScene.refreshModes = function (modes, styles) {\n // Copy stylesheet modes\n // TODO: is this the best way to copy stylesheet changes to mode instances?\n for (var m in styles.modes) {\n // if (m != 'all') {\n modes[m] = ModeManager.configureMode(m, styles.modes[m]);\n // }\n }\n\n // Refresh all modes\n for (m in modes) {\n modes[m].refresh();\n }\n\n return modes;\n};\n\n\n// Private/internal\n\n// Get base URL from which the library was loaded\n// Used to load additional resources like shaders, textures, etc. in cases where library was loaded from a relative path\nfunction findBaseLibraryURL () {\n Scene.library_base_url = '';\n var scripts = document.getElementsByTagName('script'); // document.querySelectorAll('script[src*=\".js\"]');\n for (var s=0; s < scripts.length; s++) {\n var match = scripts[s].src.indexOf('tangram.debug.js');\n if (match == -1) {\n match = scripts[s].src.indexOf('tangram.min.js');\n }\n if (match >= 0) {\n Scene.library_base_url = scripts[s].src.substr(0, match);\n break;\n }\n }\n};\n",
"/*** Style helpers ***/\nimport {Geo} from './geo';\n\nexport var Style = {};\n\n// Style helpers\n\nStyle.color = {\n pseudoRandomGrayscale: function (f) { var c = Math.max((parseInt(f.id, 16) % 100) / 100, 0.4); return [0.7 * c, 0.7 * c, 0.7 * c]; }, // pseudo-random grayscale by geometry id\n pseudoRandomColor: function (f) { return [0.7 * (parseInt(f.id, 16) / 100 % 1), 0.7 * (parseInt(f.id, 16) / 10000 % 1), 0.7 * (parseInt(f.id, 16) / 1000000 % 1)]; }, // pseudo-random color by geometry id\n randomColor: function (f) { return [0.7 * Math.random(), 0.7 * Math.random(), 0.7 * Math.random()]; } // random color\n};\n\n// Returns a function (that can be used as a dynamic style) that converts pixels to meters for the current zoom level.\n// The provided pixel value ('p') can itself be a function, in which case it is wrapped by this one.\nStyle.pixels = function (p, z) {\n var f;\n eval('f = function(f, t, h) { return ' + (typeof p == 'function' ? '(' + (p.toString() + '(f, t, h))') : p) + ' * h.Geo.meters_per_pixel[h.zoom]; }');\n return f;\n};\n\n// Create a unique 32-bit color to identify a feature\n// Workers independently create/modify selection colors in their own threads, but we also\n// need the main thread to know where each feature color originated. To accomplish this,\n// we partition the map by setting the 4th component (alpha channel) to the worker's id.\nStyle.selection_map = {}; // this will be unique per module instance (so unique per worker)\nStyle.selection_map_current = 1; // start at 1 since 1 will be divided by this\nStyle.selection_map_prefix = 0; // set by worker to worker id #\nStyle.generateSelection = function (color_map)\n{\n // 32-bit color key\n Style.selection_map_current++;\n var ir = Style.selection_map_current & 255;\n var ig = (Style.selection_map_current >> 8) & 255;\n var ib = (Style.selection_map_current >> 16) & 255;\n var ia = Style.selection_map_prefix;\n var r = ir / 255;\n var g = ig / 255;\n var b = ib / 255;\n var a = ia / 255;\n var key = (ir + (ig << 8) + (ib << 16) + (ia << 24)) >>> 0; // need unsigned right shift to convert to positive #\n\n color_map[key] = {\n color: [r, g, b, a],\n };\n\n return color_map[key];\n};\n\nStyle.resetSelectionMap = function ()\n{\n Style.selection_map = {};\n Style.selection_map_current = 1;\n};\n\n// Find and expand style macros\nStyle.macros = [\n 'Style.color.pseudoRandomColor',\n 'Style.pixels'\n];\n\nStyle.expandMacros = function expandMacros (obj) {\n for (var p in obj) {\n var val = obj[p];\n\n // Loop through object properties\n if (typeof val == 'object') {\n obj[p] = expandMacros(val);\n }\n // Convert strings back into functions\n else if (typeof val == 'string') {\n for (var m in Style.macros) {\n if (val.match(Style.macros[m])) {\n var f;\n try {\n eval('f = ' + val);\n obj[p] = f;\n break;\n }\n catch (e) {\n // fall-back to original value if parsing failed\n obj[p] = val;\n }\n }\n }\n }\n }\n\n return obj;\n};\n\n\n// Style defaults\n\n// Determine final style properties (color, width, etc.)\nStyle.defaults = {\n color: [1.0, 0, 0],\n width: 1,\n size: 1,\n extrude: false,\n height: 20,\n min_height: 0,\n outline: {\n // color: [1.0, 0, 0],\n // width: 1,\n // dash: null\n },\n selection: {\n active: false,\n color: [0, 0, 0, 1]\n },\n mode: {\n name: 'polygons'\n }\n};\n\n// Style parsing\n\n// Helper functions passed to dynamic style functions\nStyle.helpers = {\n Style: Style,\n Geo: Geo\n};\n\nStyle.parseStyleForFeature = function (feature, layer_name, layer_style, tile)\n{\n var layer_style = layer_style || {};\n var style = {};\n\n Style.helpers.zoom = tile.coords.z;\n\n // Test whether features should be rendered at all\n if (typeof layer_style.filter == 'function') {\n if (layer_style.filter(feature, tile, Style.helpers) == false) {\n return null;\n }\n }\n\n // Parse styles\n style.color = (layer_style.color && (layer_style.color[feature.properties.kind] || layer_style.color.default)) || Style.defaults.color;\n if (typeof style.color == 'function') {\n style.color = style.color(feature, tile, Style.helpers);\n }\n\n style.width = (layer_style.width && (layer_style.width[feature.properties.kind] || layer_style.width.default)) || Style.defaults.width;\n if (typeof style.width == 'function') {\n style.width = style.width(feature, tile, Style.helpers);\n }\n style.width *= Geo.units_per_meter[tile.coords.z];\n\n style.size = (layer_style.size && (layer_style.size[feature.properties.kind] || layer_style.size.default)) || Style.defaults.size;\n if (typeof style.size == 'function') {\n style.size = style.size(feature, tile, Style.helpers);\n }\n style.size *= Geo.units_per_meter[tile.coords.z];\n\n style.extrude = (layer_style.extrude && (layer_style.extrude[feature.properties.kind] || layer_style.extrude.default)) || Style.defaults.extrude;\n if (typeof style.extrude == 'function') {\n // returning a boolean will extrude with the feature's height, a number will override the feature height (see below)\n style.extrude = style.extrude(feature, tile, Style.helpers);\n }\n\n style.height = (feature.properties && feature.properties.height) || Style.defaults.height;\n style.min_height = (feature.properties && feature.properties.min_height) || Style.defaults.min_height;\n\n // height defaults to feature height, but extrude style can dynamically adjust height by returning a number or array (instead of a boolean)\n if (style.extrude) {\n if (typeof style.extrude == 'number') {\n style.height = style.extrude;\n }\n else if (typeof style.extrude == 'object' && style.extrude.length >= 2) {\n style.min_height = style.extrude[0];\n style.height = style.extrude[1];\n }\n }\n\n style.z = (layer_style.z && (layer_style.z[feature.properties.kind] || layer_style.z.default)) || Style.defaults.z || 0;\n if (typeof style.z == 'function') {\n style.z = style.z(feature, tile, Style.helpers);\n }\n\n style.outline = {};\n layer_style.outline = layer_style.outline || {};\n style.outline.color = (layer_style.outline.color && (layer_style.outline.color[feature.properties.kind] || layer_style.outline.color.default)) || Style.defaults.outline.color;\n if (typeof style.outline.color == 'function') {\n style.outline.color = style.outline.color(feature, tile, Style.helpers);\n }\n\n style.outline.width = (layer_style.outline.width && (layer_style.outline.width[feature.properties.kind] || layer_style.outline.width.default)) || Style.defaults.outline.width;\n if (typeof style.outline.width == 'function') {\n style.outline.width = style.outline.width(feature, tile, Style.helpers);\n }\n style.outline.width *= Geo.units_per_meter[tile.coords.z];\n\n style.outline.dash = (layer_style.outline.dash && (layer_style.outline.dash[feature.properties.kind] || layer_style.outline.dash.default)) || Style.defaults.outline.dash;\n if (typeof style.outline.dash == 'function') {\n style.outline.dash = style.outline.dash(feature, tile, Style.helpers);\n }\n\n // Interactivity (selection map)\n var interactive = false;\n if (typeof layer_style.interactive == 'function') {\n interactive = layer_style.interactive(feature, tile, Style.helpers);\n }\n else {\n interactive = layer_style.interactive;\n }\n\n if (interactive == true) {\n var selector = Style.generateSelection(Style.selection_map);\n\n selector.feature = {\n id: feature.id,\n properties: feature.properties\n };\n selector.feature.properties.layer = layer_name; // add layer name to properties\n\n style.selection = {\n active: true,\n color: selector.color\n };\n }\n else {\n style.selection = Style.defaults.selection;\n }\n\n if (layer_style.mode != null && layer_style.mode.name != null) {\n style.mode = {};\n for (var m in layer_style.mode) {\n style.mode[m] = layer_style.mode[m];\n }\n }\n else {\n style.mode = Style.defaults.mode;\n }\n\n return style;\n};\n\n",
"// Miscellaneous utilities\n\n// Simplistic detection of relative paths, append base if necessary\nexport function urlForPath(path) {\n if (path == null || path == '') {\n return null;\n }\n\n // Can expand a single path, or an array of paths\n if (typeof path == 'object' && path.length > 0) {\n // Array of paths\n for (var p in path) {\n var protocol = path[p].toLowerCase().substr(0, 4);\n if (!(protocol == 'http' || protocol == 'file')) {\n path[p] = window.location.origin + window.location.pathname + path[p];\n }\n }\n }\n else {\n // Single path\n var protocol = path.toLowerCase().substr(0, 4);\n if (!(protocol == 'http' || protocol == 'file')) {\n path = window.location.origin + window.location.pathname + path;\n }\n }\n return path;\n};\n\n// Stringify an object into JSON, but convert functions to strings\nexport function serializeWithFunctions(obj) {\n var serialized = JSON.stringify(obj, function(k, v) {\n // Convert functions to strings\n if (typeof v == 'function') {\n return v.toString();\n }\n return v;\n });\n\n return serialized;\n};\n\n// Parse a JSON string, but convert function-like strings back into functions\nexport function deserializeWithFunctions(serialized) {\n var obj = JSON.parse(serialized);\n obj = stringsToFunctions(obj);\n\n return obj;\n};\n\n// Recursively parse an object, attempting to convert string properties that look like functions back into functions\nexport function stringsToFunctions(obj) {\n for (var p in obj) {\n var val = obj[p];\n\n // Loop through object properties\n if (typeof val == 'object') {\n obj[p] = stringsToFunctions(val);\n }\n // Convert strings back into functions\n else if (typeof val == 'string' && val.match(/^function.*\\(.*\\)/) != null) {\n var f;\n try {\n eval('f = ' + val);\n obj[p] = f;\n }\n catch (e) {\n // fall-back to original value if parsing failed\n obj[p] = val;\n }\n }\n }\n\n return obj;\n};\n\n// Run a block if on the main thread (not in a web worker), with optional error (web worker) block\nexport function runIfInMainThread(block, err) {\n try {\n if (window.document !== undefined) {\n block();\n }\n }\n catch (e) {\n if (typeof err == 'function') {\n err();\n }\n }\n}\n\n// Used for differentiating between power-of-2 and non-power-of-2 textures\n// Via: http://stackoverflow.com/questions/19722247/webgl-wait-for-texture-to-load\nexport function isPowerOf2(value) {\n return (value & (value - 1)) == 0;\n}\n",
"/*** Vector functions - vectors provided as [x, y, z] arrays ***/\n\nexport var Vector = {};\n\n// Vector length squared\nVector.lengthSq = function (v)\n{\n if (v.length == 2) {\n return (v[0]*v[0] + v[1]*v[1]);\n }\n else {\n return (v[0]*v[0] + v[1]*v[1] + v[2]*v[2]);\n }\n};\n\n// Vector length\nVector.length = function (v)\n{\n return Math.sqrt(Vector.lengthSq(v));\n};\n\n// Normalize a vector\nVector.normalize = function (v)\n{\n var d;\n if (v.length == 2) {\n d = v[0]*v[0] + v[1]*v[1];\n d = Math.sqrt(d);\n\n if (d != 0) {\n return [v[0] / d, v[1] / d];\n }\n return [0, 0];\n }\n else {\n var d = v[0]*v[0] + v[1]*v[1] + v[2]*v[2];\n d = Math.sqrt(d);\n\n if (d != 0) {\n return [v[0] / d, v[1] / d, v[2] / d];\n }\n return [0, 0, 0];\n }\n};\n\n// Cross product of two vectors\nVector.cross = function (v1, v2)\n{\n return [\n (v1[1] * v2[2]) - (v1[2] * v2[1]),\n (v1[2] * v2[0]) - (v1[0] * v2[2]),\n (v1[0] * v2[1]) - (v1[1] * v2[0])\n ];\n};\n\n// Find the intersection of two lines specified as segments from points (p1, p2) and (p3, p4)\n// http://en.wikipedia.org/wiki/Line-line_intersection\n// http://en.wikipedia.org/wiki/Cramer's_rule\nVector.lineIntersection = function (p1, p2, p3, p4, parallel_tolerance)\n{\n var parallel_tolerance = parallel_tolerance || 0.01;\n\n // a1*x + b1*y = c1 for line (x1, y1) to (x2, y2)\n // a2*x + b2*y = c2 for line (x3, y3) to (x4, y4)\n var a1 = p1[1] - p2[1]; // y1 - y2\n var b1 = p1[0] - p2[0]; // x1 - x2\n var a2 = p3[1] - p4[1]; // y3 - y4\n var b2 = p3[0] - p4[0]; // x3 - x4\n var c1 = (p1[0] * p2[1]) - (p1[1] * p2[0]); // x1*y2 - y1*x2\n var c2 = (p3[0] * p4[1]) - (p3[1] * p4[0]); // x3*y4 - y3*x4\n var denom = (b1 * a2) - (a1 * b2);\n\n if (Math.abs(denom) > parallel_tolerance) {\n return [\n ((c1 * b2) - (b1 * c2)) / denom,\n ((c1 * a2) - (a1 * c2)) / denom\n ];\n }\n return null; // return null if lines are (close to) parallel\n};\n"
]
}%
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment