summaryrefslogtreecommitdiff
path: root/site/public/assets/javascripts/mx
diff options
context:
space:
mode:
Diffstat (limited to 'site/public/assets/javascripts/mx')
-rw-r--r--site/public/assets/javascripts/mx/extensions/mx.movements.js367
-rw-r--r--site/public/assets/javascripts/mx/extensions/mx.movementsMobile.js237
-rw-r--r--site/public/assets/javascripts/mx/extensions/mx.orbitCamera.js102
-rw-r--r--site/public/assets/javascripts/mx/extensions/mx.rotationControl.js265
-rw-r--r--site/public/assets/javascripts/mx/extensions/mx.scene.js165
-rw-r--r--site/public/assets/javascripts/mx/extensions/mx.scrubber.js191
-rw-r--r--site/public/assets/javascripts/mx/extensions/mx.unclampedOrbitCamera.js130
-rw-r--r--site/public/assets/javascripts/mx/extensions/mx.unclampedOrbitCameraMobile.js225
-rw-r--r--site/public/assets/javascripts/mx/mx.js593
-rw-r--r--site/public/assets/javascripts/mx/mx.min.js1
-rw-r--r--site/public/assets/javascripts/mx/mx.quaternion.js414
-rw-r--r--site/public/assets/javascripts/mx/mx.skew.js610
-rw-r--r--site/public/assets/javascripts/mx/primitives/mx.image.js50
-rw-r--r--site/public/assets/javascripts/mx/primitives/mx.soundcloud.js125
-rw-r--r--site/public/assets/javascripts/mx/primitives/mx.text.js59
-rw-r--r--site/public/assets/javascripts/mx/primitives/mx.video.js110
-rw-r--r--site/public/assets/javascripts/mx/primitives/mx.vimeo.js162
-rw-r--r--site/public/assets/javascripts/mx/primitives/mx.youtube.js196
18 files changed, 0 insertions, 4002 deletions
diff --git a/site/public/assets/javascripts/mx/extensions/mx.movements.js b/site/public/assets/javascripts/mx/extensions/mx.movements.js
deleted file mode 100644
index 9af2c8d..0000000
--- a/site/public/assets/javascripts/mx/extensions/mx.movements.js
+++ /dev/null
@@ -1,367 +0,0 @@
-
-
-MX.Movements = function (cam) {
-
- var moveForward,
- moveLeft,
- moveBackward,
- moveRight,
- moveUp,
- moveDown,
- turnLeft,
- turnRight,
- turnUp,
- turnDown,
- jumping = false,
- creeping = false,
- locked = false,
- gravity = false,
- rotationX_min = PI/-4,
- rotationX_max = PI/6
-
- var v = 12,
- vr = Math.PI * 0.012,
- jumpV = 23,
- vx = vy = vz = 0,
- creepFactor = 0.3
-
- var mouseX, mouseY, dx, dy, rotX, rotY, dragging = false
-
- var trackpad
-
- var DEFAULT_SCALE = 1.0, scale = DEFAULT_SCALE
-
- var pos = { x: 0, y: 0, z: 0, rotationX: 0, rotationY: 0 }
-
- $(document).one("keydown", function(){
- $("#keyhint").fadeOut(250);
- $('.reader #minimap').addClass('active');
- })
-
- function clampRotation( vr ) {
- if (Rooms.mover.noclip) {
- return clamp(vr, PI/-2, PI/2 )
- }
- else {
- return clamp(vr, PI/-4, PI/6 )
- }
- }
-
- var exports = {
-
- init: function () {
-
- trackpad = new wheel ({
- el: scene.el,
- update: exports.mousewheel,
- })
-
- document.addEventListener('keydown', exports.keydown)
- document.addEventListener('keyup', exports.keyup)
- document.addEventListener('mousedown', exports.mousedown)
- document.addEventListener('mousemove', exports.mousemove)
- document.addEventListener('mouseup', exports.mouseup)
- window.addEventListener('blur', exports.reset)
- window.addEventListener('focus', exports.reset)
- },
-
- keydown: function (e) {
- // console.log(e.keyCode)
- if (locked || e.altKey || e.metaKey || e.ctrlKey) {
- return
- }
- switch ( e.keyCode ) {
-
- case 16: // shift
- creeping = true
- break
-
- case 38: // up
- case 87: // w
- moveForward = true
- break
-
- case 65: // a
- moveLeft = true
- break
-
- case 40: // down
- case 83: // s
- moveBackward = true
- break
-
- case 68: // d
- moveRight = true
- break
-
- case 37: // left
- case 81: // q
- turnLeft = true
- break
-
- case 39: // right
- case 69: // e
- turnRight = true
- break
-
- case 82: // r
- turnUp = true
- break
-
- case 70: // f
- turnDown = true
- break
-
- case 32: // space
- if (gravity) {
- jumping = true
- vy = abs(vy) + jumpV * scale
- if (e.shiftKey) {
- vy *= -1
- }
- }
- else {
- if (e.shiftKey) {
- moveDown = true
- }
- else {
- moveUp = true
- }
- }
- break
-
- case 27: // esc
- if (Scenery.nextMedia) {
- Scenery.nextMedia = null
- app.tube('cancel-scenery')
- }
- else if (Scenery.nextWallpaper) {
- Scenery.nextWallpaper = null
- app.tube('cancel-wallpaper')
- }
- else if (app.controller.mediaViewer && app.controller.mediaViewer.$el.hasClass("active")) {
- app.controller.mediaViewer.hide()
- $(".inuse").removeClass("inuse")
- }
- else if (app.controller.colorControl && app.controller.colorControl.$el.hasClass('active')) {
- app.controller.colorControl.hide()
- $(".inuse").removeClass("inuse")
- }
- else if (app.controller.wallpaperPicker && app.controller.wallpaperPicker.$el.hasClass('active')) {
- app.controller.wallpaperPicker.hide()
- $(".inuse").removeClass("inuse")
- }
- else if (app.controller.presets && app.controller.presets.$el.hasClass('active')) {
- app.controller.presets.hide()
- $(".inuse").removeClass("inuse")
- }
- else {
- app.controller.toolbar.toggleMap()
- }
- break
-
- case 8: // backspace
- e.preventDefault()
- if (app.controller.mediaEditor.scenery) {
- app.controller.mediaEditor.scenery.remove()
- }
- else if (app.controller.textEditor.scenery) {
- app.controller.textEditor.scenery.remove()
- }
- }
- },
-
- keyup: function (e) {
- if (locked) return;
- switch ( e.keyCode ) {
-
- case 16: // shift
- creeping = false
- break
-
- case 38: // up
- case 87: // w
- moveForward = false
- break
-
- case 65: // a
- moveLeft = false
- break
-
- case 40: // down
- case 83: // s
- moveBackward = false
- break
-
- case 68: // d
- moveRight = false
- break
-
- case 37: // left
- case 81: // q
- turnLeft = false
- break
-
- case 39: // right
- case 69: // e
- turnRight = false
- break
-
- case 82: // r
- turnUp = false
- break
-
- case 70: // f
- turnDown = false
- break
-
- case 32: // space
- moveUp = moveDown = false
- break
-
-/*
- case 48: // 0
- cam.rotationX = 0
- cam.rotationY = 0
- cam.x = 0
- cam.y = viewHeight
- cam.z = 0
- break
-*/
- }
- },
-
- mousedown: function (e) {
- if (locked) return;
- mouseX = e.pageX
- mouseY = e.pageY
- rotX = cam.rotationX
- rotY = cam.rotationY
- dragging = true
- },
-
- mousemove: function (e) {
- if (locked || ! dragging) return
- var dx = (e.pageX - mouseX) / window.innerWidth * Math.PI/3
- var dy = (e.pageY - mouseY) / window.innerHeight * Math.PI/3
- cam.rotationY = rotY + dx
- cam.rotationX = clampRotation( rotX - dy )
- },
-
- mouseup: function (e) {
- dragging = false
- },
-
- reset: function(){
- moveForward = moveLeft = moveBackward = moveRight = moveUp = moveDown = turnLeft = turnRight = jumping = dragging = creeping = false
- },
-
- mousewheel: function (e, deltaY, deltaX) {
- if (e.shiftKey) {
- cam.rotationY -= deltaY / 150
- }
- else {
- pos.x += deltaY * Math.cos(cam.rotationY + Math.PI / 2) * 10
- pos.z += deltaY * Math.sin(cam.rotationY + Math.PI / 2) * 10
- app.tube("move", pos)
- }
- },
-
- update: function (dt) {
-
- if (locked) { return }
-
- var ry = cam.rotationY
- var s = creeping ? scale * creepFactor : scale
- var vrrrr = creeping ? vr * creepFactor * 5 : vr * 0.5
- var moving = moveForward || moveBackward || moveRight || moveLeft || moveUp || moveDown || turnLeft || turnRight || turnUp || turnDown
- vx = vz = 0
-
- var vv = v
-// vv *= dt / 100 * 8
-// s *= dt / 100 * 8
-// console.log(dt / 100 * 8)
-
- pos.x = cam.x
- pos.z = cam.z
-
- if (moving) {
-
- if (moveForward) {
- vx += vv * Math.cos(ry + Math.PI / 2) * s
- vz += vv * Math.sin(ry + Math.PI / 2) * s
- }
- if (moveBackward) {
- vx -= vv * Math.cos(ry + Math.PI / 2) * s
- vz -= vv * Math.sin(ry + Math.PI / 2) * s
- }
- if (moveLeft) {
- vx -= vv * Math.cos(ry) * s
- vz -= vv * Math.sin(ry) * s
- }
- if (moveRight) {
- vx += vv * Math.cos(ry) * s
- vz += vv * Math.sin(ry) * s
- }
- if (moveUp) {
- pos.y += vv * scale
- }
- if (moveDown) {
- pos.y -= vv * scale
- }
-
- if (turnUp) {
- cam.rotationX = clampRotation( cam.rotationX - vrrrr*s )
- }
- if (turnDown) {
- cam.rotationX = clampRotation( cam.rotationX + vrrrr*s )
- }
- if (turnLeft) {
- cam.rotationY += vrrrr*s
- }
- if (turnRight) {
- cam.rotationY -= vrrrr*s
- }
-
- pos.x += vx
- pos.z += vz
- }
-
- if (gravity) {
- vy -= 1 * scale
-
- pos.y += vy
-
- if (vy) {
- moving = true
- }
- if (pos.y <= viewHeight) {
- pos.y = viewHeight
- vy = 0
- jumping = false
- }
-
- var ceiling = (Rooms.mover.room ? Rooms.mover.room.height : 5000)
-
- if (pos.y >= ceiling-5) {
- vy = 0
- pos.y = ceiling-5
- }
- }
-
- if (moving) {
- app.tube("move", pos)
- }
- },
-
- lock: function(){ locked = true },
- unlock: function(){ locked = false },
- scale: function(n){ if (n) scale = n; return scale },
- resetScale: function(n){ scale = DEFAULT_SCALE },
- gravity: function(g){ return typeof g == "boolean" ? gravity = g : gravity },
- velocity: function(n){ v = clamp(n, 1, 50) },
- jumpVelocity: function(n){ jumpV = clamp(n, 1, 50) },
- }
-
- return exports
-}
diff --git a/site/public/assets/javascripts/mx/extensions/mx.movementsMobile.js b/site/public/assets/javascripts/mx/extensions/mx.movementsMobile.js
deleted file mode 100644
index 95b61d1..0000000
--- a/site/public/assets/javascripts/mx/extensions/mx.movementsMobile.js
+++ /dev/null
@@ -1,237 +0,0 @@
-
-MX.MobileMovements = function (cam) {
-
- var touching = true,
- moving = false,
- startTime = null,
- v = 12,
- vr = Math.PI * 0.012,
- vx = vy = vz = 0;
-
- var directionLocked = false,
- directionLockThreshold = 5
-
- var pos = { x: 0, y: viewHeight, z: 0, rotationX: 0, rotationY: 0 }
-
- var pointX, pointY, deltaX, deltaY, distX = 0, distY = 0, absDistX = 0, absDistY = 0, startTime
-
- var rotationX = 0, rotationY = 0, destRotationX = 0, destRotationY = 0
- var rotationSum = 0
- var rotationMedian = 0
- var orientationMax = 0
- var samples = 0
- var sampleThreshold = 120
- var lastAlpha
-
- var is_portrait
-
- var exports = {
-
- init: function () {
- exports.orientationchange()
-
- document.addEventListener("touchstart", exports.touchstart)
- document.addEventListener("touchmove", exports.touchmove)
- document.addEventListener("touchend", exports.touchend)
- window.addEventListener('orientationchange', exports.orientationchange)
- window.addEventListener("devicemotion", exports.devicemotion)
- window.addEventListener("deviceorientation", exports.deviceorientation)
- },
- touchstart: function(e){
- if (e.touches.length == 1) {
- touching = true
-
- startTime = Date.now()
-
- var point = event.touches[0]
- pointX = point.pageX
- pointY = point.pageY
- distX = distY = 0
- pos.x = cam.x
- pos.z = cam.z
- pos.rotationY = cam.rotationY
- }
- },
- touchmove: function(e){
- e.preventDefault()
- if (e.touches.length == 1) {
-
- var timestamp = Date.now()
- var point = event.touches[0]
- deltaX = point.pageX - pointX
- deltaY = point.pageY - pointY
-
- pointX = point.pageX
- pointY = point.pageY
-
- distX += deltaX
- distY += deltaY
- absDistX = abs(distX)
- absDistY = abs(distY)
- }
- },
- touchend: function(e){
- e.preventDefault()
- if (e.touches.length == 0) {
- touching = directionLocked = false
- var timestamp = Date.now()
- var duration = startTime - timestamp
- if (duration < 300) {
- }
- }
- },
- orientationchange: function(e){
- is_portrait = window.innerWidth < window.innerHeight
- if (is_portrait) {
- lastAlpha = 0
- }
- },
- devicemotion: function(e) {
- if (! is_portrait) return;
- var rotationBeta = e.rotationRate.alpha; // weird!
- rotationSum += rotationBeta;
- samples += 1;
- },
- deviceorientation: function (e) {
- if (! lastAlpha) { lastAlpha = e.alpha }
- is_portrait ? exports.portraitorientation(e) : exports.landscapeorientation(e)
- },
- portraitorientation: function(e) {
- // compass gives most accurate orientation in portrait mode
- var alpha, dx = 0, dy = 0
-
- if (e.webkitCompassHeading) {
- alpha = 180 - e.webkitCompassHeading;
- }
- else {
- alpha = 180 - e.alpha;
- }
-
- // android rotates in reverse
- if (is_android) {
- alpha = 360 - alpha
- }
-
- // use rotationRate to gauge if we've tilted the screen past vertical
- // for looking at ceiling
- if (e.beta > orientationMax) {
- orientationMax = e.beta
- rotationMedian = rotationSum
- }
-
- // this number was only going to 83 max.. not 90.. weird
- var beta = e.beta + 7;
-
- // if we've got enough motion data, we should be able to determine
- // if we've tilted backwards. otherwise, lock to the horizon.
- if (! is_android && samples > sampleThreshold) {
- dx = rotationSum > rotationMedian ? e.beta - 90 : 90 - e.beta
- }
- else {
- dx = 0
- }
-
- // avoid jumping around in a circle
- if (Math.abs(alpha - lastAlpha) < 100 || Math.abs(alpha - lastAlpha) > 300) {
- dy = alpha - lastAlpha
- lastAlpha = alpha
- }
-
- // avoid jumping around in a circle #2
- if (dy > 300) {
- dy -= 360
- } else if (dy < -300) {
- dy += 360
- }
-
- destRotationX = MX.toRad(dx)
- destRotationY += MX.toRad(dy)
- },
-
- landscapeorientation: function (e) {
- var dx, dy
-
- dx = e.gamma > 0 ? 90 - e.gamma : 90 + e.gamma
- dy = e.alpha - lastAlpha
- lastAlpha = e.alpha
-
- // avoid the sudden jump from 0 to -360
- if (dy > 300) {
- dy -= 360
- }
- else if (dy < -300) {
- dy += 360
- }
-
- destRotationX = dx > 45 ? 0 : MX.toRad(dx)
- destRotationY += MX.toRad(dy)
- },
-
- update: function () {
- var drx, dry
-
- dry = (destRotationY - rotationY) / 6
- drx = (destRotationX - rotationX) / 6
- rotationY += dry
- rotationX += drx
- cam.rotationY = pos.rotationY += dry
- cam.rotationX = pos.rotationX += drx
-
- if (distX || distY) {
- var oldDistY = absDistY, oldDistX = absDistX
- absDistY = avg(absDistY, 0, 5)
- var dy = (oldDistY - absDistY) * sign(distY) * 2
-
- absDistX = avg(absDistX, 0, 5)
- var dx = (oldDistX - absDistX) * sign(distX) * 2
-
- distY = sign(distY) * absDistY
- distX = sign(distX) * absDistX
-
- pos.x -= dy * Math.cos(pos.rotationY + Math.PI / 2)
- pos.z -= dy * Math.sin(pos.rotationY + Math.PI / 2)
- cam.rotationY = pos.rotationY += dx / (window.innerWidth) * Math.PI / 2
-
- app.tube("move", pos)
- }
- },
-
- lock: function(){ locked = true },
- unlock: function(){ locked = false },
- scale: function(n){ if (n) scale = n; return scale },
- resetScale: function(n){ scale = DEFAULT_SCALE },
- gravity: function(g){ return typeof g == "boolean" ? gravity = g : gravity },
- velocity: function(n){ v = clamp(n, 1, 50) },
- jumpVelocity: function(n){ jumpV = clamp(n, 1, 50) },
- }
-
- return exports
-}
-
-
-// function momentum (current, start, time, lowerMargin, wrapperSize, deceleration) {
-// var distance = current - start,
-// speed = Math.abs(distance) / time,
-// destination,
-// duration;
-//
-// deceleration = deceleration === undefined ? 0.0006 : deceleration;
-//
-// destination = current + ( speed * speed ) / ( 2 * deceleration ) * ( distance < 0 ? -1 : 1 );
-// duration = speed / deceleration;
-//
-// if ( destination < lowerMargin ) {
-// destination = wrapperSize ? lowerMargin - ( wrapperSize / 2.5 * ( speed / 8 ) ) : lowerMargin;
-// distance = Math.abs(destination - current);
-// duration = distance / speed;
-// } else if ( destination > 0 ) {
-// destination = wrapperSize ? wrapperSize / 2.5 * ( speed / 8 ) : 0;
-// distance = Math.abs(current) + destination;
-// duration = distance / speed;
-// }
-//
-// return {
-// destination: Math.round(destination),
-// duration: duration
-// };
-// }
diff --git a/site/public/assets/javascripts/mx/extensions/mx.orbitCamera.js b/site/public/assets/javascripts/mx/extensions/mx.orbitCamera.js
deleted file mode 100644
index 6603ff4..0000000
--- a/site/public/assets/javascripts/mx/extensions/mx.orbitCamera.js
+++ /dev/null
@@ -1,102 +0,0 @@
-MX.OrbitCamera = function(opt){
- var exports = {}, bound = false
- exports.opt = opt = defaults(opt, {
- el: window, // object to bind events on
- camera: scene.camera, // camera object we'll be moving
- radius: 100,
- radiusRange: [ 10, 1000 ],
- rotationX: PI/2,
- rotationY: 0,
- center: { x: 0, y: 0, z: 0 },
- sensitivity: 10, // moving 1 pixel is like moving N radians
- wheelSensitivity: 10,
- ease: 10,
- })
- var rx, ry, radius, px, py, epsilon = 1e-10, dragging = false
- exports.init = function(){
- ry = opt.rotationY
- rx = opt.rotationX
- radius = opt.radius
- exports.wheel = new wheel({
- el: opt.el,
- update: function(e, delta){
- opt.radius = clamp( opt.radius + delta * opt.wheelSensitivity, opt.radiusRange[0], opt.radiusRange[1] )
- },
- })
- exports.bind()
- }
- exports.toggle = function(state){
- if (state) exports.bind()
- else exports.unbind()
- }
- exports.bind = function(){
- if (bound) return;
- bound = true
- opt.el.addEventListener("mousedown", down)
- window.addEventListener("mousemove", move)
- window.addEventListener("mouseup", up)
- exports.wheel.unlock()
- }
- exports.unbind = function(){
- if (! bound) return;
- bound = false
- opt.el.removeEventListener("mousedown", down)
- window.removeEventListener("mousemove", move)
- window.removeEventListener("mouseup", up)
- exports.wheel.lock()
- }
- function down (e) {
- px = e.pageX
- py = e.pageY
- dragging = true
- }
- function move (e) {
- if (! dragging) return
- exports.delta(px- e.pageX, py - e.pageY)
- px = e.pageX
- py = e.pageY
- }
- function up (e) {
- dragging = false
- }
- exports.delta = function(x,y){
- opt.rotationY += x/window.innerWidth * opt.sensitivity
- opt.rotationX = clamp( opt.rotationX + y/window.innerHeight * opt.sensitivity, 0, PI)
- }
- exports.zoom = function(r){
- opt.radius = r
- }
- exports.zoomDelta = function(r){
- opt.radius += r
- }
- exports.move = function(y, x){
- opt.rotationY = y
- if (typeof x == "number") { opt.rotationX = x }
- }
- exports.update = function(){
- if (abs(ry - opt.rotationY) > epsilon) {
- ry = avg(ry, opt.rotationY, opt.ease)
- }
- else {
- ry = opt.rotationY
- }
- if (abs(rx - opt.rotationX) > epsilon) {
- rx = avg(rx, opt.rotationX, opt.ease)
- }
- else {
- rx = opt.rotationX
- }
- if (abs(radius - opt.radius) > epsilon) {
- radius = avg(radius, opt.radius, opt.ease)
- }
- else {
- radius = opt.radius
- }
- opt.camera.x = opt.center.x + radius * sin(rx) * cos(ry)
- opt.camera.z = opt.center.y + radius * sin(rx) * sin(ry)
- opt.camera.y = opt.center.z + radius * cos(rx)
- opt.camera.rotationX = PI/2 - rx
- opt.camera.rotationY = ry + PI/2
- }
- return exports
-}
diff --git a/site/public/assets/javascripts/mx/extensions/mx.rotationControl.js b/site/public/assets/javascripts/mx/extensions/mx.rotationControl.js
deleted file mode 100644
index 9adb627..0000000
--- a/site/public/assets/javascripts/mx/extensions/mx.rotationControl.js
+++ /dev/null
@@ -1,265 +0,0 @@
-// Usage:
-//
-// var control = new MX.RotationControl()
-// control.init( object{MX.Object3D} [, listener{HTMLElement}] )
-//
-// In animation loop:
-//
-// control.update()
-//
-// The above code will register handler functions on `listener`
-// and will be updating `object`s rotationX and rotationY
-// If no `listener` is provided, will default to `object`s el.
-
-MX.RotationControl = function () {
-
- var object,
- locked = false
-
- var down = false,
- active = false,
- lastX,
- lastY
-
- var pointerLockPrefix =
- 'pointerLockElement' in document ? '' :
- 'mozPointerLockElement' in document ? 'moz' :
- 'webkitPointerLockElement' in document ? 'webkit' : null,
- hasPointerLock = !(pointerLockPrefix === null)
- pointerLockEnabled = false
-
- var pub = {
-
- sensitivity : .5,
- ease : 10,
- drag : true,
-
- inverseX : false,
- inverseY : false,
-
- disableX : false,
- disableY : false,
-
- rotationX : 0,
- rotationY : 0,
-
- upperBoundX : undefined,
- lowerBoundX : undefined,
-
- upperBoundY : undefined,
- lowerBoundY : undefined,
-
- usePreset: function (name) {
- var ops = presets[name]
- if (ops) {
- if (currentPreset && presets[currentPreset].teardown) {
- presets[currentPreset].teardown()
- }
- for (var op in ops) {
- if (op !== 'setup' && op !== 'teardown') {
- pub[op] = ops[op]
- }
- }
- if (op.setup) ops.setup()
- }
- }
- }
-
- var currentPreset
- var presets = {
- firstPerson: {
- drag: false,
- ease: 2,
- sensitivity: .18,
- inverseX: true,
- inverseY: true,
- upperBoundX: MX.rotationUnit === 'deg' ? 90 : Math.PI / 2,
- lowerBoundX: MX.rotationUnit === 'deg' ? -90 : -Math.PI / 2
- },
- skybox: {
- sensitivity: .18,
- inverseX: true,
- inverseY: true,
- upperBoundX: MX.rotationUnit === 'deg' ? 90 : Math.PI / 2,
- lowerBoundX: MX.rotationUnit === 'deg' ? -90 : -Math.PI / 2
- }
- }
-
- function init (obj, lis) {
- if (active) return
-
- object = obj
- pub.rotationX = object.rotationX
- pub.rotationY = object.rotationY
-
- if (lis instanceof HTMLElement) {
- listener = lis
- } else if (lis instanceof MX.Object3D) {
- listener = lis.el
- } else {
- listener = window.document
- }
-
- listener.addEventListener('mousedown', onDown)
- listener.addEventListener('mousemove', onMove)
- listener.addEventListener('mouseup', onUp)
- listener.addEventListener('touchstart', onDown)
- listener.addEventListener('touchmove', onMove)
- listener.addEventListener('touchend', onUp)
-
- active = true
- }
-
- function changeObject (obj) {
- object = obj
- pub.rotationX = object.rotationX
- pub.rotationY = object.rotationY
- }
-
- function changeListener (lis) {
- remove()
- active = false
- init(object, lis)
- if (pointerLockEnabled) {
- initPointerLock()
- }
- }
-
- function remove () {
- if (!active) return
- listener.removeEventListener('mousedown', onDown)
- listener.removeEventListener('mousemove', onMove)
- listener.removeEventListener('mouseup', onUp)
- listener.removeEventListener('touchstart', onDown)
- listener.removeEventListener('touchmove', onMove)
- listener.removeEventListener('touchend', onUp)
-
- if (hasPointerLock) {
- document.removeEventListener(pointerLockPrefix + 'pointerlockchange', onPointerLockChange)
- document.removeEventListener('mousemove', onPointerLockMove)
- document.body[pointerLockPrefix + (pointerLockPrefix ? 'E' : 'e') + 'xitPointerLock']()
- }
- active = false
- }
-
- function onDown (e) {
- e = normalizeEvent(e)
- if (!e) return
- down = true
- lastX = e.pageX
- lastY = e.pageY
- }
-
- function onMove (e) {
- if (e.type = 'touchmove') {
- e.preventDefault()
- }
- if (pub.drag && !down) return
- e = normalizeEvent(e)
- if (!e) return
- lastX = lastX || e.pageX
- lastY = lastY || e.pageY
- var dx = e.pageX - lastX,
- dy = e.pageY - lastY
- lastX = e.pageX
- lastY = e.pageY
- updateTarget(dx, dy)
- }
-
- function onUp () {
- down = false
- }
-
- function initPointerLock () {
-
- if (pointerLockEnabled) return
-
- document.addEventListener(pointerLockPrefix + 'pointerlockchange', onPointerLockChange)
- document.addEventListener('mousemove', onPointerLockMove)
-
- document.body[pointerLockPrefix + (pointerLockPrefix ? 'R' : 'r') + 'equestPointerLock']()
- }
-
- function onPointerLockChange () {
- var el = document.body
- if (document[pointerLockPrefix + (pointerLockPrefix ? 'P' : 'p') + 'ointerLockElement'] === el) {
- pointerLockEnabled = true
- } else {
- pointerLockEnabled = false
- }
- }
-
- function onPointerLockMove (e) {
- if (!pointerLockEnabled) return
- var dx = e[pointerLockPrefix + (pointerLockPrefix ? 'M' : 'm') + 'ovementX'],
- dy = e[pointerLockPrefix + (pointerLockPrefix ? 'M' : 'm') + 'ovementY']
- updateTarget(dx, dy)
- }
-
- function normalizeEvent (e) {
- if (e.touches) {
- return e.touches.length > 1 ? false : e.touches[0]
- } else {
- return e
- }
- }
-
- function updateTarget (dx, dy) {
- if (pub.inverseX) dx = -dx
- if (pub.inverseY) dy = -dy
- if (MX.rotationUnit !== 'deg') {
- dx = MX.toRad(dx)
- dy = MX.toRad(dy)
- }
-
- if (!pub.disableX) {
- pub.rotationX -= dy * pub.sensitivity
- if (pub.upperBoundX) pub.rotationX = Math.min(pub.rotationX, pub.upperBoundX)
- if (pub.lowerBoundX) pub.rotationX = Math.max(pub.rotationX, pub.lowerBoundX)
- }
-
- if (!pub.disableY) {
- pub.rotationY += dx * pub.sensitivity
- if (pub.upperBoundY) pub.rotationY = Math.min(pub.rotationY, pub.upperBoundY)
- if (pub.lowerBoundY) pub.rotationY = Math.max(pub.rotationY, pub.lowerBoundY)
- }
- }
-
- function update () {
- if (!object || locked) return
- var dx = pub.rotationX - object.rotationX,
- dy = pub.rotationY - object.rotationY
- if (Math.abs(dx) < 0.0001) {
- object.rotationX = pub.rotationX
- } else {
- object.rotationX += dx / pub.ease
- }
- if (Math.abs(dy) < 0.0001) {
- object.rotationY = pub.rotationY
- } else {
- object.rotationY += dy / pub.ease
- }
- }
-
- function lock () {
- locked = true
- }
-
- function unlock () {
- pub.rotationX = object.rotationX
- pub.rotationY = object.rotationY
- locked = false
- }
-
- pub.init = init
- pub.remove = remove
- pub.update = update
- pub.lock = lock
- pub.unlock = unlock
- pub.initPointerLock = initPointerLock
- pub.changeObject = changeObject
- pub.changeListener = changeListener
-
- return pub
-
-} \ No newline at end of file
diff --git a/site/public/assets/javascripts/mx/extensions/mx.scene.js b/site/public/assets/javascripts/mx/extensions/mx.scene.js
deleted file mode 100644
index 8f11fb0..0000000
--- a/site/public/assets/javascripts/mx/extensions/mx.scene.js
+++ /dev/null
@@ -1,165 +0,0 @@
-// NOTE
-//
-// This is not a fully functional 3d scene as you might expect.
-// The camera can only do pitch (rotationX) and yaw (rotationY), but no roll (rotationZ)
-// because I haven't implemented alternative euler orders or quaternions.
-//
-// For serious 3D scenes with more functionalities you should use
-// THREE.js with CSS3D Renderer.
-
-MX.Camera = MX.Object3D.extend({
-
- init: function(){
- this.el = null
- this.type = "Camera"
- },
-
- move: function(s){
- for (var i in s) {
- this[i] = s[i]
- }
- },
-
- toString: function(){
- var params = "x y z rotationX rotationY".split(" ")
- return this.__toString(params, "scene.camera.move")
- },
-
- getCameraEuler: function (target) {
- var dx = target.x - this.x,
- dy = target.y - this.y,
- dz = target.z - this.z
- r = {}
- r.y = Math.atan2(-dx, dz)
- r.x = Math.atan2(-dy, Math.sqrt(dx*dx + dz*dz))
- r.z = 0
- if (MX.rotationUnit === 'deg') {
- r.x = MX.toDeg(r.x)
- r.y = MX.toDeg(r.y)
- }
- return r
- }
-
-})
-
-MX.Scene = (function () {
-
- var add = MX.Object3D.prototype.add,
- remove = MX.Object3D.prototype.remove
-
- function Scene () {
-
- this.el = document.createElement('div')
- this.el.classList.add('mx-scene')
-
- var s = this.el.style
-
- s[MX.transformProp] = 'preserve-3d'
-
- s.webkitPerspectiveOrigin = '50% 50%'
- s.mozPerspectiveOrigin = '50% 50%'
- s.perspectiveOrigin = '50% 50%'
-
- s.webkitUserSelect = 'none'
- s.mozUserSelect = 'none'
- s.userSelect = 'none'
-
- s.overflow = 'hidden'
-
- this.inner = new MX.Object3D().addTo(this.el)
- this.inner.el.style.width = '0'
- this.inner.el.style.height = '0'
-
- var self = this
- var width, height, perspective
-
- Object.defineProperty(this, 'width', {
- get: function () {
- return width
- },
- set: function (val) {
- width = val
- self.el.style.width = val + 'px'
- }
- })
-
- Object.defineProperty(this, 'height', {
- get: function () {
- return height
- },
- set: function (val) {
- height = val
- self.el.style.height = val + 'px'
- }
- })
-
- Object.defineProperty(this, 'perspective', {
- get: function () {
- return perspective
- },
- set: function (val) {
- perspective = val
- self.el.style[MX.perspectiveProp] = val + 'px'
- self.inner.z = -val - self.camera.z
- self.inner.rotationOrigin.z = -val
- }
- })
-
- var cam = this.camera = new MX.Camera()
-
- this.inner.rotationOrigin = { x:0, y:0, z:0 }
-
- this.perspective = 0
- }
-
- Scene.prototype = {
-
- constructor: Scene,
-
- add: function () {
- add.apply(this.inner, arguments)
- return this
- },
-
- remove: function () {
- remove.apply(this.inner, arguments)
- return this
- },
-
- addTo: function (target) {
- if (typeof target === 'string') {
- target = document.querySelector(target)
- }
- if (target instanceof HTMLElement && target.appendChild) {
- target.appendChild(this.el)
- } else {
- console.warn('You can only add a Scene to an HTML element.')
- }
- return this
- },
-
- update: function () {
- // update inner based on camera
-
- var i = this.inner,
- c = this.camera
-
- c.update()
-
- i.z = -this.perspective - c.z
- i.x = -c.x
- i.y = -c.y
-
- i.rotationX = -c.rotationX
- i.rotationY = -c.rotationY
- //i.rotationZ = -c.rotationZ
-
- i.update()
- return this
- },
-
- }
-
- return Scene
-
-})() \ No newline at end of file
diff --git a/site/public/assets/javascripts/mx/extensions/mx.scrubber.js b/site/public/assets/javascripts/mx/extensions/mx.scrubber.js
deleted file mode 100644
index 54612f2..0000000
--- a/site/public/assets/javascripts/mx/extensions/mx.scrubber.js
+++ /dev/null
@@ -1,191 +0,0 @@
-/*
- Use the scrollwheel to tween between different points and orientations
-
- scrubber = new MX.Scrubber(cam, [
- {
- position: [0, viewHeight, -1000],
- rotation: [0, 0]
- },
- {
- position: [0, 1000, 1000],
- rotation: [0, Math.PI]
- },
- {
- position: [0, viewHeight, -1000],
- rotation: [0, 2*Math.PI]
- },
- {
- position: [0, viewHeight, -2000],
- rotation: [0, 0]
- }
- ])
-
- // in your animate function:
- scrubber.update()
-
-*/
-
-MX.Scrubber = function (obj, points) {
-
- obj = obj || {}
- points = points || {}
-
- var reversible = true, loop = false;
-
- var total = points.length * 100,
- distance = 0
- destination = 0,
- last_index = -1,
- last_name = null,
- locked = false,
- point_count = points.length + (loop+0)
-
- var avg_speed = scroll_avg_speed = 5,
- click_avg_speed = 20,
- webkit_ratio = 0.02
-
- if (points[0].position) {
- points.forEach(function(p){
- p.x = p.position[0]
- p.y = p.position[1]
- p.z = p.position[2]
- p.rotationX = p.rotation[0]
- p.rotationY = p.rotation[1]
- })
- }
-
- document.addEventListener('touchstart', next, false);
- document.addEventListener('mousedown', next, false);
- document.addEventListener('mousewheel', onDocumentMouseWheel, false);
- document.addEventListener('DOMMouseScroll', onDocumentMouseWheel, false);
- function onDocumentMouseWheel (e) {
-
- if (locked) return
-
- var delta = 0;
-
- // WebKit
- if ( event.wheelDeltaY ) {
- delta -= event.wheelDeltaY * webkit_ratio
- }
- // Opera / Explorer 9
- else if ( event.wheelDelta ) {
- delta -= event.wheelDelta * webkit_ratio
- }
- // Firefox
- else if ( event.detail ) {
- delta += event.detail * 2
- }
- if (! reversible && delta < 0) return;
-
- if (destination < total-100 || delta < 0) {
- e.preventDefault()
- }
- else {
- return
- }
-
- destination += delta
-
- avg_speed = scroll_avg_speed
- }
-
- function add_point(point){
- if (point.type == "Camera") {
- point = {
- position: [ point.x, point.y, point.z ],
- rotation: [ point.rotationX, point.rotationY ],
- callback: noop
- }
- }
- points.push(point)
- total = points.length * 100
- }
-
- function reset(){
- distance = destination = 0
- last_index = -1
- last_name = null
- }
-
- function next(){
- destination = ~~(destination/100) * 100
- destination += 100
- avg_speed = click_avg_speed
- }
-
- function update(){
- if (locked) return
-
- if (destination > total-100) destination = total-100
-
- distance = avg(distance, destination, avg_speed)
- var ratio = distance / total
-
- if (! loop) {
- if (ratio < 0) {
- destination = 0
- ratio = 0
- }
- else if (ratio > 1) {
- destination = total
- ratio = 1
- }
- }
-
- var diff = ratio * point_count
- var step = (distance % 100) / 100
- var src = ~~clamp(diff, 0, point_count-1)
- var halfway = ~~clamp(diff + 0.5, 0, point_count-1)
- var dest = ~~clamp(diff + 1, 0, point_count-1)
-
- if (halfway != last_index) {
- last_index = halfway
- if (points[last_index].name != last_name) {
- last_name = points[last_index].name
- }
- $("#info .active").removeClass("active")
- $("#info div[data-name='" + last_name + "']").addClass("active")
- points[halfway].callback && points[halfway].callback()
- }
-
- var ry0 = points[src].rotationY
- var ry1 = points[dest].rotationY
- if (abs(ry0 - ry1) == TWO_PI) {
- ry0 = ry1
- }
-
- obj.x = lerp(step, points[src].x, points[dest].x)
- obj.y = lerp(step, points[src].y, points[dest].y)
- obj.z = lerp(step, points[src].z, points[dest].z)
- obj.rotationX = lerp(step, points[src].rotationX, points[dest].rotationX)
- obj.rotationY = lerp(step, ry0, ry1)
- if (obj.rotationY > PI) { obj.rotationY -= TWO_PI }
- }
-
- var scrubber = {
- init: function(){
- app && app.movements && app.movements.lock()
- },
- lock: function(){
- app && app.movements && app.movements.unlock()
- locked = true
- },
- unlock: function(){
- app && app.movements && app.movements.lock()
- locked = false
- },
- step: function(n){
- distance = destination = n * 100
- },
- add_point: add_point,
- reset: reset,
- next: next,
- update: update,
-
- obj: obj,
- points: points
- }
-
- return scrubber;
-}
diff --git a/site/public/assets/javascripts/mx/extensions/mx.unclampedOrbitCamera.js b/site/public/assets/javascripts/mx/extensions/mx.unclampedOrbitCamera.js
deleted file mode 100644
index 28b1aac..0000000
--- a/site/public/assets/javascripts/mx/extensions/mx.unclampedOrbitCamera.js
+++ /dev/null
@@ -1,130 +0,0 @@
-MX.OrbitCamera = function(opt){
- var exports = {}, bound = false
- exports.opt = opt = defaults(opt, {
- el: window, // object to bind events on
- camera: scene.camera, // camera object we'll be moving
- radius: 100,
- radiusRange: [ 10, 1000 ],
- rotationX: PI/2,
- rotationY: 0,
- center: { x: 0, y: 0, z: 0 },
- sensitivity: 10, // moving 1 pixel is like moving N radians
- wheelSensitivity: 10,
- ease: 10,
- wheelEase: 10,
- })
- var rx, ry, radius, px, py, epsilon = 1e-10
- exports.dragging = false
- exports.init = function(){
- ry = opt.rotationY
- rx = opt.rotationX
- radius = opt.radius
- exports.wheel = new wheel({
- el: opt.el,
- update: function(e, delta){
- opt.radius = clamp( opt.radius + delta * opt.wheelSensitivity, opt.radiusRange[0], opt.radiusRange[1] )
- },
- })
- exports.bind()
- }
- exports.toggle = function(state){
- if (state) exports.bind()
- else exports.unbind()
- }
- exports.bind = function(){
- if (bound) return;
- bound = true
- opt.el.addEventListener("mousedown", down)
- window.addEventListener("mousemove", move)
- window.addEventListener("mouseup", up)
- opt.el.addEventListener("touchstart", touch(down))
- window.addEventListener("touchmove", touch(move))
- window.addEventListener("touchend", touch(up))
- exports.wheel.unlock()
- }
- exports.unbind = function(){
- if (! bound) return;
- bound = false
- opt.el.removeEventListener("mousedown", down)
- window.removeEventListener("mousemove", move)
- window.removeEventListener("mouseup", up)
- exports.wheel.lock()
- }
- function cancelable (fn) {
- return function(e){
- e.preventDefault()
- fn(e)
- }
- }
- function touch (fn){
- return function(e){
- fn(e.touches[0])
- }
- }
- function down (e) {
- px = e.pageX
- py = e.pageY
- exports.dragging = true
- }
- function move (e) {
- if (! exports.dragging) return
- exports.delta(px- e.pageX, py - e.pageY)
- px = e.pageX
- py = e.pageY
- }
- function up (e) {
- exports.dragging = false
- }
- exports.delta = function(x,y){
- opt.rotationY += x/window.innerWidth * opt.sensitivity
- opt.rotationX = opt.rotationX + y/window.innerHeight * opt.sensitivity
- }
- exports.move = function(y, x){
- opt.rotationY = y
- if (typeof x == "number") { opt.rotationX = x }
- }
- exports.zoom = function(r){
- opt.radius = r
- }
- exports.setZoom = function(r){
- radius = opt.radius = r
- }
- exports.zoomPercent = function(n){
- opt.radius = lerp(n, opt.radiusRange[0], opt.radiusRange[1])
- }
- exports.zoomDelta = function(r){
- opt.radius += r
- }
- exports.pause = function(){
- var sy = sign(opt.rotationY-ry)
- var sx = sign(opt.rotationX-rx)
- opt.rotationY = ry + sy * 0.1
- opt.rotationX = rx + sx * 0.1
- }
- exports.update = function(){
- if (abs(ry - opt.rotationY) > epsilon) {
- ry = avg(ry, opt.rotationY, opt.ease)
- }
- else {
- ry = opt.rotationY
- }
- if (abs(rx - opt.rotationX) > epsilon) {
- rx = avg(rx, opt.rotationX, opt.ease)
- }
- else {
- rx = opt.rotationX
- }
- if (abs(radius - opt.radius) > epsilon) {
- radius = avg(radius, opt.radius, opt.wheelEase)
- }
- else {
- radius = opt.radius
- }
- opt.camera.x = opt.center.x + radius * sin(rx) * cos(ry)
- opt.camera.z = opt.center.y + radius * sin(rx) * sin(ry)
- opt.camera.y = opt.center.z + radius * cos(rx)
- opt.camera.rotationX = PI/2 - rx
- opt.camera.rotationY = ry + PI/2
- }
- return exports
-}
diff --git a/site/public/assets/javascripts/mx/extensions/mx.unclampedOrbitCameraMobile.js b/site/public/assets/javascripts/mx/extensions/mx.unclampedOrbitCameraMobile.js
deleted file mode 100644
index 510a002..0000000
--- a/site/public/assets/javascripts/mx/extensions/mx.unclampedOrbitCameraMobile.js
+++ /dev/null
@@ -1,225 +0,0 @@
-MX.OrbitCameraMobile = function(opt){
- var exports = {}, bound = false
- exports.opt = opt = defaults(opt, {
- el: window, // object to bind events on
- camera: scene.camera, // camera object we'll be moving
- radius: 100,
- radiusRange: [ 10, 1000 ],
- rotationX: PI/2,
- rotationY: 0,
- center: { x: 0, y: 0, z: 0 },
- sensitivity: 10, // moving 1 pixel is like moving N radians
- wheelSensitivity: 10,
- ease: 10,
- wheelEase: 10,
- })
- var rx, ry, radius, px, py, epsilon = 1e-10
- var rotationSum = 0
- var rotationMedian = 0
- var orientationMax = 0
- var samples = 0
- var sampleThreshold = 20
- var lastAlpha
-
- exports.dragging = false
- exports.init = function(){
- ry = opt.rotationY
- rx = opt.rotationX
- radius = opt.radius
- exports.wheel = new wheel({
- el: opt.el,
- update: function(e, delta){
- opt.radius = clamp( opt.radius + delta * opt.wheelSensitivity, opt.radiusRange[0], opt.radiusRange[1] )
- },
- })
- exports.bind()
-
- exports.orientationchange()
- }
- exports.toggle = function(state){
- if (state) exports.bind()
- else exports.unbind()
- }
- exports.bind = function(){
- if (bound) return;
- bound = true
- opt.el.addEventListener("touchstart", touch(down))
- window.addEventListener("touchmove", touch(move))
- window.addEventListener("touchend", touch(up))
-
- window.addEventListener('orientationchange', exports.orientationchange)
- window.addEventListener("devicemotion", exports.devicemotion)
- window.addEventListener("deviceorientation", exports.deviceorientation)
-
- exports.wheel.unlock()
- }
- exports.unbind = function(){
- if (! bound) return;
- bound = false
- exports.wheel.lock()
- }
- function cancelable (fn) {
- return function(e){
- e.preventDefault()
- fn(e)
- }
- }
- function touch (fn){
- return function(e){
- fn(e.touches[0])
- }
- }
- function down (e) {
- px = e.pageX
- py = e.pageY
- exports.dragging = true
- }
- function move (e) {
- if (! exports.dragging) return
- exports.delta(px- e.pageX, py - e.pageY)
- px = e.pageX
- py = e.pageY
- }
- function up (e) {
- exports.dragging = false
- }
-
- exports.orientationchange = function(e){
- is_portrait = window.innerWidth < window.innerHeight
- if (is_portrait) {
- lastAlpha = 0
- }
- }
- exports.devicemotion = function(e) {
- if (! is_portrait) return;
- var rotationBeta = e.rotationRate.alpha; // weird!
- rotationSum += rotationBeta;
- samples += 1;
- }
- exports.deviceorientation = function (e) {
- if (! lastAlpha) { lastAlpha = e.alpha }
- is_portrait ? exports.portraitorientation(e) : exports.landscapeorientation(e)
- }
- exports.portraitorientation = function(e) {
- // compass gives most accurate orientation in portrait mode
- var alpha, dx = 0, dy = 0
-
- if (e.webkitCompassHeading) {
- alpha = 180 - e.webkitCompassHeading;
- }
- else {
- alpha = 180 - e.alpha;
- }
-
- // android rotates in reverse
- if (is_android) {
- alpha = 360 - alpha
- }
-
- // use rotationRate to gauge if we've tilted the screen past vertical
- // for looking at ceiling
- if (e.beta > orientationMax) {
- orientationMax = e.beta
- rotationMedian = rotationSum
- }
-
- // this number was only going to 83 max.. not 90.. weird
- var beta = e.beta + 7;
-
- // if we've got enough motion data, we should be able to determine
- // if we've tilted backwards. otherwise, lock to the horizon.
- if (! is_android && samples > sampleThreshold) {
- dx = rotationSum > rotationMedian ? e.beta - 90 : 90 - e.beta
- }
- else {
- dx = 0
- }
-
- // avoid jumping around in a circle
- if (Math.abs(alpha - lastAlpha) < 100 || Math.abs(alpha - lastAlpha) > 300) {
- dy = alpha - lastAlpha
- lastAlpha = alpha
- }
-
- // avoid jumping around in a circle #2
- if (dy > 300) {
- dy -= 360
- } else if (dy < -300) {
- dy += 360
- }
- opt.rotationX = MX.toRad(dx * -5)
- opt.rotationY += MX.toRad(dy * 10)
- }
- exports.landscapeorientation = function (e) {
- var dx, dy
-
- dx = e.gamma > 0 ? 90 - e.gamma : 90 + e.gamma
- dy = e.alpha - lastAlpha
- lastAlpha = e.alpha
-
- // avoid the sudden jump from 0 to -360
- if (dy > 300) {
- dy -= 360
- }
- else if (dy < -300) {
- dy += 360
- }
-
- opt.rotationX = dx > 45 ? 0 : MX.toRad(dx)
- opt.rotationY += MX.toRad(dy)
- }
-
-
- exports.delta = function(x,y){
- opt.rotationY += x/window.innerWidth * opt.sensitivity
- opt.rotationX = opt.rotationX + y/window.innerHeight * opt.sensitivity
- }
- exports.move = function(y, x){
- opt.rotationY = y
- if (typeof x == "number") { opt.rotationX = x }
- }
- exports.zoom = function(r){
- opt.radius = r
- }
- exports.setZoom = function(r){
- radius = opt.radius = r
- }
- exports.zoomPercent = function(n){
- opt.radius = lerp(n, opt.radiusRange[0], opt.radiusRange[1])
- }
- exports.zoomDelta = function(r){
- opt.radius += r
- }
- exports.pause = function(){
- var sy = sign(opt.rotationY-ry)
- var sx = sign(opt.rotationX-rx)
- opt.rotationY = ry + sy * 0.1
- opt.rotationX = rx + sx * 0.1
- }
- exports.update = function(){
- if (abs(ry - opt.rotationY) > epsilon) {
- ry = avg(ry, opt.rotationY, opt.ease)
- }
- else {
- ry = opt.rotationY
- }
- if (abs(rx - opt.rotationX) > epsilon) {
- rx = avg(rx, opt.rotationX, opt.ease)
- }
- else {
- rx = opt.rotationX
- }
- if (abs(radius - opt.radius) > epsilon) {
- radius = avg(radius, opt.radius, opt.wheelEase)
- }
- else {
- radius = opt.radius
- }
- opt.camera.x = opt.center.x + radius * sin(rx) * cos(ry)
- opt.camera.z = opt.center.y + radius * sin(rx) * sin(ry)
- opt.camera.y = opt.center.z + radius * cos(rx)
- opt.camera.rotationX = PI/2 - rx
- opt.camera.rotationY = ry + PI/2
- }
- return exports
-}
diff --git a/site/public/assets/javascripts/mx/mx.js b/site/public/assets/javascripts/mx/mx.js
deleted file mode 100644
index 1ce7cda..0000000
--- a/site/public/assets/javascripts/mx/mx.js
+++ /dev/null
@@ -1,593 +0,0 @@
-/**
- * Copyright (C) 2013 by Evan You
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-var MX = MX || (function (undefined) {
-
- var MX = {
- version: '0.1.0',
- prefix: undefined,
- rotationUnit: 'rad',
- }
-
- var floatPrecision = 5
-
- // ========================================================================
- // Setup & Compatibility
- // ========================================================================
-
- var transformProp,
- transitionProp,
- transformOriginProp,
- transformStyleProp,
- perspectiveProp,
- transitionEndEvent
-
- var positionAtCenter = true, // whether to auto center objects
- centeringCSS // styles to inject for center positioning
-
- document.addEventListener('DOMContentLoaded', setup)
-
- function setup () {
-
- // sniff prefix
-
- var s = document.body.style
-
- MX.prefix =
- 'webkitTransform' in s ? 'webkit' :
- 'mozTransform' in s ? 'moz' :
- 'msTransform' in s ? 'ms' : ''
-
- transformProp = MX.transformProp = addPrefix('transform')
- transitionProp = MX.transitionProp = addPrefix('transition')
- transformOriginProp = MX.transformOriginProp = addPrefix('transformOrigin')
- transformStyleProp = MX.transformStyleProp = addPrefix('transformStyle')
- perspectiveProp = MX.perspectiveProp = addPrefix('perspective')
- transitionEndEvent = MX.transitionEndEvent = MX.prefix === 'webkit' ? 'webkitTransitionEnd' : 'transitionend'
-
- // shiv rAF
-
- var vendors = ['webkit', 'moz', 'ms']
- for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
- window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame']
- window.cancelAnimationFrame =
- window[vendors[x]+'CancelAnimationFrame'] ||
- window[vendors[x]+'CancelRequestAnimationFrame']
- }
-
- // inject centering css
-
- centeringCSS = document.createElement('style')
- centeringCSS.type = 'text/css'
- centeringCSS.innerHTML =
- '.mx-object3d {'
- + 'position: absolute;'
- + 'top: 50%;'
- + 'left: 50%;}'
- injectCenteringCSS()
-
- window.scrollTo(0,0)
- }
-
- function injectCenteringCSS () {
- document.head.appendChild(centeringCSS)
- }
-
- function removeCenteringCSS () {
- document.head.removeChild(centeringCSS)
- }
-
- // ========================================================================
- // Utils
- // ========================================================================
-
- function toDeg (rad) {
- return rad / Math.PI * 180
- }
-
- function toRad (deg) {
- return deg / 180 * Math.PI
- }
-
- function buildRotationTranslation (obj) {
-
- // used when rotationOrigin is set
-
- var origin = obj.rotationOrigin
- if (!origin) {
- return
- } else {
- var dx = origin.x - obj.x,
- dy = -(origin.y - obj.y),
- dz = -(origin.z - obj.z)
- return {
- before: 'translate3d(' + dx.toFixed(floatPrecision) +'px,' + dy.toFixed(floatPrecision) + 'px,' + dz.toFixed(floatPrecision) + 'px) ',
- after: 'translate3d(' + (-dx).toFixed(floatPrecision) + 'px,' + (-dy).toFixed(floatPrecision) + 'px,' + (-dz).toFixed(floatPrecision) + 'px) '
- }
- }
- }
-
- function addPrefix (string) {
- if (MX.prefix) {
- string = MX.prefix + string.charAt(0).toUpperCase() + string.slice(1)
- }
- return string
- }
-
- // ========================================================================
- // Base Object3D
- // ========================================================================
-
- function Object3D (el) {
-
- this.setupDomElement(el)
- this.setCSSTransformStyle('preserve-3d')
- this.el.classList.add('mx-object3d')
-
- this.parent = undefined
- this.children = []
- this.updateChildren = true
-
- this.inverseLookAt = false
-
- this.persisted = true
-
- this.reset()
-
-// this.quaternion = new MX.Quaternion ()
-// this.quaternion._euler = this
-
- var width, height,
- self = this
-
- Object.defineProperty(this, 'width', {
- get: function () {
- return width
- || parseInt(self.el.style.width, 10) * app_devicePixelRatio
- || 0
- },
- set: function (val) {
- width = val
- this.el.style.width = (width/app_devicePixelRatio) + 'px'
- }
- })
-
- Object.defineProperty(this, 'height', {
- get: function () {
- return height
- || parseInt(self.el.style.height, 10) * app_devicePixelRatio
- || 0
- },
- set: function (val) {
- height = val
- this.el.style.height = (height/app_devicePixelRatio) + 'px'
- }
- })
- }
-
- Object3D.prototype = {
-
- constructor: Object3D,
-
- reset: function () {
- this.x = this.__x = 0
- this.y = this.__y = 0
- this.z = this.__z = 0
- this.rotationX = this.__rotationX = 0
- this.rotationY = this.__rotationY = 0
- this.rotationZ = this.__rotationZ = 0
- this.scaleX = this.__scaleX = 1
- this.scaleY = this.__scaleY = 1
- this.scaleZ = this.__scaleZ = 1
- this.scale = this.__scale = 1
- this.perspective = this.__perspective = 0
- this.rotationOrigin = undefined
- this.followTarget = undefined
-// this.quaternion = new MX.Quaternion()
- this.dirty = true
- this.update()
- },
-
- setupDomElement: function (el) {
- this.el = undefined
- if (el instanceof HTMLElement) {
- this.el = el
- } else if (typeof el === 'string') {
- var tag = el.match(/^[^.#\s]*/)[1],
- id = el.match(/#[^.#\s]*/),
- classes = el.match(/\.[^.#\s]*/g)
- this.el = document.createElement(tag || 'div')
- if (id) {
- this.el.id = id[0].slice(1)
- }
- if (classes) {
- var i = classes.length
- while (i--) {
- this.el.classList.add(classes[i].slice(1))
- }
- }
- } else {
- this.el = document.createElement('div')
- }
- },
-
- update: function () {
-
- if (this.updateChildren) {
- var i = this.children.length
- while (i--) {
- this.children[i].update()
- }
- }
-
- if (this.followTarget) {
- this.lookAt(this.followTarget, false)
- }
-
- if (this.scaleX !== this.__scaleX ||
- this.scaleY !== this.__scaleY ||
- this.scaleZ !== this.__scaleZ) {
- this.__scaleX = this.scaleX
- this.__scaleY = this.scaleY
- this.__scaleZ = this.scaleZ
- this.dirty = true
- }
-
- if (this.scale !== this.__scale) {
- this.scaleX =
- this.scaleY =
- this.scaleZ =
- this.__scaleX =
- this.__scaleY =
- this.__scaleZ =
- this.__scale =
- this.scale
- this.dirty = true
- }
-
- if (this.rotationX !== this.__rotationX ||
- this.rotationY !== this.__rotationY ||
- this.rotationZ !== this.__rotationZ) {
- this.__rotationX = this.rotationX
- this.__rotationY = this.rotationY
- this.__rotationZ = this.rotationZ
- this.dirty = true
- }
-
- if (this.x !== this.__x ||
- this.y !== this.__y ||
- this.z !== this.__z) {
- this.__x = this.x
- this.__y = this.y
- this.__z = this.z
- this.dirty = true
- }
-
- if (this.perspective !== this.__perspective) {
- this.__perspective = this.perspective
- this.dirty = true
- }
-
- if (this.dirty && this.el) {
-
- var rotationTranslation = buildRotationTranslation(this),
- rotation = 'rotateX(' + this.rotationX.toFixed(floatPrecision) + MX.rotationUnit + ') '
- + 'rotateY(' + this.rotationY.toFixed(floatPrecision) + MX.rotationUnit + ') '
- + 'rotateZ(' + this.rotationZ.toFixed(floatPrecision) + MX.rotationUnit + ') '
-
- var transformString =
- (MX.positionAtCenter ? 'translate3d(-50%, -50%, 0) ' : '')
- + (this.perspective ? 'perspective(' + this.perspective + 'px) ' : '')
- + 'translate3d('
- + this.x.toFixed(floatPrecision || 0) + 'px,'
- + (-this.y).toFixed(floatPrecision) + 'px,'
- + (-this.z).toFixed(floatPrecision) + 'px) '
- + 'scale3d('
- + (app_devicePixelRatio * this.scaleX).toFixed(floatPrecision) + ','
- + (app_devicePixelRatio * this.scaleY).toFixed(floatPrecision) + ','
- + (app_devicePixelRatio * this.scaleZ).toFixed(floatPrecision) + ') '
-
- if (rotationTranslation) {
- transformString += rotationTranslation.before
- + rotation
- + rotationTranslation.after
-
- } else {
- transformString += rotation
- }
-
- this.el.style[transformProp] = transformString
- this.dirty = false
- }
-
- return this
-
- },
-
- // taken from three.js
- setFromQuaternion: function ( q, order, update ) {
- // q is assumed to be normalized
-
- // http://www.mathworks.com/matlabcentral/fileexchange/20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/content/SpinCalc.m
-
- var sqx = q.x * q.x;
- var sqy = q.y * q.y;
- var sqz = q.z * q.z;
- var sqw = q.w * q.w;
-
- this.rotationX = Math.atan2( 2 * ( q.x * q.w - q.y * q.z ), ( sqw - sqx - sqy + sqz ) );
- this.rotationY = Math.asin( clamp( 2 * ( q.x * q.z + q.y * q.w ), -1, 1 ) );
- this.rotationZ = Math.atan2( 2 * ( q.z * q.w - q.x * q.y ), ( sqw + sqx - sqy - sqz ) );
- },
-
- lookAt: function (target, update) {
- var r = this.getLookAtEuler(target)
- this.setRotation(r)
- if (update !== false) this.update()
- return this
- },
-
- getLookAtEuler: function (target) {
- // euler order XYZ
- var r = {},
- dx = target.x - this.x,
- dy = target.y - this.y,
- dz = target.z - this.z
- if (this.inverseLookAt) {
- dx = -dx
- dy = -dy
- dz = -dz
- }
- if (dz === 0) dz = 0.001
- r.x = -Math.atan2(dy, dz)
- var flip = dz > 0 ? 1 : -1
- r.y = flip * Math.atan2(dx * Math.cos(r.x), dz * -flip)
- r.z = Math.atan2(Math.cos(r.x), Math.sin(r.x) * Math.sin(r.y)) - Math.PI / 2
- if (MX.rotationUnit === 'deg') {
- r.x = toDeg(r.x)
- r.y = toDeg(r.y)
- r.z = toDeg(r.z)
- }
- return r
- },
-
- add: function () {
- if (!this.el) return
- var parent = this
- Array.prototype.forEach.call(arguments, function (child) {
- if (!child instanceof Object3D) return
- parent.el.appendChild(child.el)
- if (!parent.children) parent.children = []
- parent.children.push(child)
- child.parent = parent
- })
- return this
- },
-
- remove: function () {
- var parent = this
- Array.prototype.forEach.call(arguments, function (child) {
- var index = parent.children.indexOf(child)
- if (index !== -1) {
- parent.children.splice(index, 1)
- parent.el.removeChild(child.el)
- child.parent = undefined
- }
- })
- return this
- },
-
- addTo: function (target) {
- if (typeof target === 'string') {
- target = document.querySelector(target)
- }
- if (target instanceof HTMLElement && target.appendChild) {
- target.appendChild(this.el)
- } else if (target instanceof Object3D || target instanceof MX.Scene) {
- target.add(this)
- }
- return this
- },
-
- removeElement: function () {
- if (this.el.parentNode) {
- this.el.parentNode.removeChild(this.el)
- }
- },
-
- setPosition: function (tar) {
- this.x = (tar.x || tar.x === 0) ? tar.x : this.x
- this.y = (tar.y || tar.y === 0) ? tar.y : this.y
- this.z = (tar.z || tar.z === 0) ? tar.z : this.z
- },
-
- setRotation: function (tar) {
- this.rotationX = (tar.x || tar.x === 0) ? tar.x : this.rotationX
- this.rotationY = (tar.y || tar.y === 0) ? tar.y : this.rotationY
- this.rotationZ = (tar.z || tar.z === 0) ? tar.z : this.rotationZ
- },
-
- setScale: function (tar) {
- this.scaleX = (tar.x || tar.x === 0) ? tar.x : this.scaleX
- this.scaleY = (tar.y || tar.y === 0) ? tar.y : this.scaleY
- this.scaleZ = (tar.z || tar.z === 0) ? tar.z : this.scaleZ
- },
-
- setCSSTransformOrigin: function (origin) {
- this.el && (this.el.style[transformOriginProp] = origin)
- return this
- },
-
- setCSSTransformStyle: function (style) {
- this.el && (this.el.style[transformStyleProp] = style)
- return this
- },
-
- setCSSTransition: function (trans) {
- this.el && (this.el.style[transitionProp] = trans)
- return this
- },
-
- setCSSPerspective: function (pers) {
- this.el && (this.el.style[perspectiveProp] = pers)
- return this
- },
-
- move: function(ops){
- var layer = this
- layer.ops = defaults(ops, layer.ops)
- for (var i in ops) {
- layer[i] = ops[i]
- }
- layer.dirty = true
- layer.update()
- },
-
- onTransitionEnd: function (callback) {
- this.cancelTransitionEnd()
- var el = this.el
- el.addEventListener(transitionEndEvent, onEnd)
- function onEnd () {
- el.removeEventListener(transitionEndEvent, onEnd)
- callback()
- }
- },
-
- cancelTransitionEnd: function () {
- this.el.removeEventListener(transitionEndEvent)
- },
-
- toString: function(params){
- params = params || "id width height depth x y z rotationX rotationY rotationZ scale".split(" ")
- return this.__toString(params)
- },
-
- __toString: function(params, func){
- this.id = this.id || 'undef' // _.uniqueId()
- var list = [],
- obj = {},
- type = this.type || "Object3d",
- name = type.toLowerCase(),
- val,
- param
- for (var i in params) {
- param = params[i]
- val = this[param]
- if (val === 0 && ! func) continue;
- if (typeof val == "number") {
- if (param.indexOf("rotation") != -1) {
- obj[param] = Number(val.toFixed(3))
- }
- else {
- obj[param] = ~~val
- }
- }
- else {
- obj[param] = val
- }
- }
-
- return (func || "var " + name + " = new MX." + type ) + "(" +
- JSON.stringify(obj, undefined, 2) +
- ")\n" + (func ? "" : "scene.add(" + name + ")")
- },
-
- contains: function(x,y,z){
- var containsX = false,
- containsY = false,
- containsZ = false
-
- if (x === null) {
- containsX = true
- }
- else {
- containsX = abs(this.x - x) <= this.width/2
- }
-
- if (y === null) {
- containsY = true
- }
- else {
- containsY = abs(this.y - y) <= this.height/2
- }
-
- if (z === null) {
- containsZ = true
- }
- else {
- containsZ = abs(this.z - z) <= this.depth/2
- }
-
- return (containsX && containsY && containsZ)
- }
-
- }
-
- // ========================================================================
- // Inheritance
- // ========================================================================
-
- Object3D.extend = extend.bind(Object3D)
-
- function extend (props) {
- var Super = this
- var ExtendedObject3D = function () {
- Super.call(this)
- props.init && props.init.apply(this, arguments)
- }
- ExtendedObject3D.prototype = Object.create(Super.prototype)
- for (var prop in props) {
- if (props.hasOwnProperty(prop) && prop !== 'init') {
- ExtendedObject3D.prototype[prop] = props[prop]
- }
- }
- ExtendedObject3D.extend = extend.bind(ExtendedObject3D)
- return ExtendedObject3D
- }
-
- // ========================================================================
- // Expose API
- // ========================================================================
-
- MX.Object3D = Object3D
- MX.toRad = toRad
- MX.toDeg = toDeg
-
- // center positioning getter setter
- Object.defineProperty(MX, 'positionAtCenter', {
- get: function () {
- return positionAtCenter
- },
- set: function (val) {
- if (typeof val !== 'boolean') return
- positionAtCenter = val
- if (positionAtCenter) {
- injectCenteringCSS()
- } else {
- removeCenteringCSS()
- }
- }
- })
-
- return MX
-
-})() \ No newline at end of file
diff --git a/site/public/assets/javascripts/mx/mx.min.js b/site/public/assets/javascripts/mx/mx.min.js
deleted file mode 100644
index b0f0cdd..0000000
--- a/site/public/assets/javascripts/mx/mx.min.js
+++ /dev/null
@@ -1 +0,0 @@
-var MX=MX||function(undefined){var MX={prefix:undefined,rotationUnit:"rad"};var floatPrecision=5;var transformProp,transitionProp,transformOriginProp,transformStyleProp,perspectiveProp;var positionAtCenter=true,centeringCSS;document.addEventListener("DOMContentLoaded",setup);function setup(){var s=document.body.style;MX.prefix="webkitTransform"in s?"webkit":"mozTransform"in s?"moz":"msTransform"in s?"ms":"";transformProp=MX.transformProp=addPrefix("transform");transitionProp=MX.transitionProp=addPrefix("transition");transformOriginProp=MX.transformOriginProp=addPrefix("transformOrigin");transformStyleProp=MX.transformStyleProp=addPrefix("transformStyle");perspectiveProp=MX.perspectiveProp=addPrefix("perspective");var vendors=["webkit","moz","ms"];for(var x=0;x<vendors.length&&!window.requestAnimationFrame;++x){window.requestAnimationFrame=window[vendors[x]+"RequestAnimationFrame"];window.cancelAnimationFrame=window[vendors[x]+"CancelAnimationFrame"]||window[vendors[x]+"CancelRequestAnimationFrame"]}centeringCSS=document.createElement("style");centeringCSS.type="text/css";centeringCSS.innerHTML=".mx-object3d {"+"position: absolute;"+"top: 50%;"+"left: 50%;}";injectCenteringCSS()}function injectCenteringCSS(){document.head.appendChild(centeringCSS)}function removeCenteringCSS(){document.head.removeChild(centeringCSS)}function toDeg(rad){return rad/Math.PI*180}function toRad(deg){return deg/180*Math.PI}function buildRotationTranslation(obj){var origin=obj.rotationOrigin;if(!origin){return}else{var dx=origin.x-obj.x,dy=-(origin.y-obj.y),dz=-(origin.z-obj.z);return{before:"translate3d("+dx+"px,"+dy+"px,"+dz+"px) ",after:"translate3d("+-dx+"px,"+-dy+"px,"+-dz+"px) "}}}function addPrefix(string){if(MX.prefix){string=MX.prefix+string.charAt(0).toUpperCase()+string.slice(1)}return string}function Object3D(el){this.setupDomElement(el);this.setCSSTransformStyle("preserve-3d");this.el.classList.add("mx-object3d");this.parent=undefined;this.children=[];this.updateChildren=true;this.inverseLookAt=false;this.reset();var width,height,self=this;Object.defineProperty(this,"width",{get:function(){return width||parseInt(self.el.style.width,10)||0},set:function(val){width=val;this.el.style.width=width+"px"}});Object.defineProperty(this,"height",{get:function(){return height||parseInt(self.el.style.height,10)||0},set:function(val){height=val;this.el.style.height=height+"px"}})}Object3D.prototype={constructor:Object3D,reset:function(){this.x=this.__x=0;this.y=this.__y=0;this.z=this.__z=0;this.rotationX=this.__rotationX=0;this.rotationY=this.__rotationY=0;this.rotationZ=this.__rotationZ=0;this.scaleX=this.__scaleX=1;this.scaleY=this.__scaleY=1;this.scaleZ=this.__scaleZ=1;this.scale=this.__scale=1;this.rotationOrigin=undefined;this.followTarget=undefined;this.dirty=true;this.update()},setupDomElement:function(el){this.el=undefined;if(el instanceof HTMLElement){this.el=el}else if(typeof el==="string"){var tag=el.match(/^[^.#\s]*/)[1],id=el.match(/#[^.#\s]*/),classes=el.match(/\.[^.#\s]*/g);this.el=document.createElement(tag||"div");if(id){this.el.id=id[0].slice(1)}if(classes){var i=classes.length;while(i--){this.el.classList.add(classes[i].slice(1))}}}else{this.el=document.createElement("div")}},update:function(){if(this.updateChildren){var i=this.children.length;while(i--){this.children[i].update()}}if(this.followTarget){this.lookAt(this.followTarget,false)}if(this.scaleX!==this.__scaleX||this.scaleY!==this.__scaleY||this.scaleZ!==this.__scaleZ){this.__scaleX=this.scaleX;this.__scaleY=this.scaleY;this.__scaleZ=this.scaleZ;this.dirty=true}if(this.scale!==this.__scale){this.scaleX=this.scaleY=this.scaleZ=this.__scaleX=this.__scaleY=this.__scaleZ=this.__scale=this.scale;this.dirty=true}if(this.rotationX!==this.__rotationX||this.rotationY!==this.__rotationY||this.rotationZ!==this.__rotationZ){this.__rotationX=this.rotationX;this.__rotationY=this.rotationY;this.__rotationZ=this.rotationZ;this.dirty=true}if(this.x!==this.__x||this.y!==this.__y||this.z!==this.__z){this.__x=this.x;this.__y=this.y;this.__z=this.z;this.dirty=true}if(this.dirty&&this.el){var rotationTranslation=buildRotationTranslation(this),rotation="rotateX("+this.rotationX.toFixed(floatPrecision)+MX.rotationUnit+") "+"rotateY("+this.rotationY.toFixed(floatPrecision)+MX.rotationUnit+") "+"rotateZ("+this.rotationZ.toFixed(floatPrecision)+MX.rotationUnit+") ";var transformString=(MX.positionAtCenter?"translate3d(-50%, -50%, 0) ":"")+"translate3d("+this.x.toFixed(floatPrecision)+"px,"+(-this.y).toFixed(floatPrecision)+"px,"+(-this.z).toFixed(floatPrecision)+"px) "+"scale3d("+this.scaleX.toFixed(floatPrecision)+","+this.scaleY.toFixed(floatPrecision)+","+this.scaleZ.toFixed(floatPrecision)+") ";if(rotationTranslation){transformString+=rotationTranslation.before+rotation+rotationTranslation.after}else{transformString+=rotation}this.el.style[transformProp]=transformString;this.dirty=false}return this},lookAt:function(target,update){var r=this.getLookAtEuler(target);this.setRotation(r);if(update!==false)this.update();return this},getLookAtEuler:function(target){var r={},dx=target.x-this.x,dy=target.y-this.y,dz=target.z-this.z;if(this.inverseLookAt){dx=-dx;dy=-dy;dz=-dz}if(dz===0)dz=.001;r.x=-Math.atan2(dy,dz);var flip=dz>0?1:-1;r.y=flip*Math.atan2(dx*Math.cos(r.x),dz*-flip);r.z=Math.atan2(Math.cos(r.x),Math.sin(r.x)*Math.sin(r.y))-Math.PI/2;if(MX.rotationUnit==="deg"){r.x=toDeg(r.x);r.y=toDeg(r.y);r.z=toDeg(r.z)}return r},add:function(){if(!this.el)return;var parent=this;Array.prototype.forEach.call(arguments,function(child){if(!child instanceof Object3D)return;parent.el.appendChild(child.el);if(!parent.children)parent.children=[];parent.children.push(child);child.parent=parent});return this},remove:function(){var parent=this;Array.prototype.forEach.call(arguments,function(child){var index=parent.children.indexOf(child);if(index!==-1){parent.children.splice(index,1);child.parent=undefined}});return this},addTo:function(target){if(typeof target==="string"){target=document.querySelector(target)}if(target instanceof HTMLElement&&target.appendChild){target.appendChild(this.el)}else if(target instanceof Object3D||target instanceof Scene){target.add(this)}return this},removeElement:function(){if(this.el.parentNode){this.el.parentNode.removeChild(this.el)}},setPosition:function(tar){this.x=tar.x||tar.x===0?tar.x:this.x;this.y=tar.y||tar.y===0?tar.y:this.y;this.z=tar.z||tar.z===0?tar.z:this.z},setRotation:function(tar){this.rotationX=tar.x||tar.x===0?tar.x:this.rotationX;this.rotationY=tar.y||tar.y===0?tar.y:this.rotationY;this.rotationZ=tar.z||tar.z===0?tar.z:this.rotationZ},setScale:function(tar){this.scaleX=tar.x||tar.x===0?tar.x:this.scaleX;this.scaleY=tar.y||tar.y===0?tar.y:this.scaleY;this.scaleZ=tar.z||tar.z===0?tar.z:this.scaleZ},setCSSTransformOrigin:function(origin){this.el&&(this.el.style[transformOriginProp]=addPrefix(origin));return this},setCSSTransformStyle:function(style){this.el&&(this.el.style[transformStyleProp]=addPrefix(style));return this},setCSSTransition:function(trans){this.el&&(this.el.style[transitionProp]=addPrefix(trans));return this},setCSSPerspective:function(pers){this.el&&(this.el.style[perspectiveProp]=addPrefix(pers));return this}};Object3D.extend=extend.bind(Object3D);function extend(props){var Super=this;var ExtendedObject3D=function(){Super.call(this);props.init&&props.init.apply(this,arguments)};ExtendedObject3D.prototype=Object.create(Super.prototype);for(var prop in props){if(props.hasOwnProperty(prop)&&prop!=="init"){ExtendedObject3D.prototype[prop]=props[prop]}}ExtendedObject3D.extend=extend.bind(ExtendedObject3D);return ExtendedObject3D}MX.Object3D=Object3D;MX.toRad=toRad;MX.toDeg=toDeg;Object.defineProperty(MX,"positionAtCenter",{get:function(){return positionAtCenter},set:function(val){if(typeof val!=="boolean")return;positionAtCenter=val;if(positionAtCenter){injectCenteringCSS()}else{removeCenteringCSS()}}});return MX}(); \ No newline at end of file
diff --git a/site/public/assets/javascripts/mx/mx.quaternion.js b/site/public/assets/javascripts/mx/mx.quaternion.js
deleted file mode 100644
index 783f887..0000000
--- a/site/public/assets/javascripts/mx/mx.quaternion.js
+++ /dev/null
@@ -1,414 +0,0 @@
-/**
- * quaternion taken from three.js
- * @author mikael emtinger / http://gomo.se/
- * @author alteredq / http://alteredqualia.com/
- * @author WestLangley / http://github.com/WestLangley
- * @author bhouston / http://exocortex.com
- */
-
-MX.Quaternion = function ( x, y, z, w ) {
-
- this._x = x || 0;
- this._y = y || 0;
- this._z = z || 0;
- this._w = ( w !== undefined ) ? w : 1;
-
-};
-
-MX.Quaternion.prototype = {
-
- constructor: MX.Quaternion,
-
- _x: 0,_y: 0, _z: 0, _w: 0,
-
- _euler: undefined,
-
- _updateEuler: function ( callback ) {
-
- if ( this._euler !== undefined ) {
-
- this._euler.setFromQuaternion( this, undefined, false );
-
- }
-
- },
-
- get x () {
-
- return this._x;
-
- },
-
- set x ( value ) {
-
- this._x = value;
- this._updateEuler();
-
- },
-
- get y () {
-
- return this._y;
-
- },
-
- set y ( value ) {
-
- this._y = value;
- this._updateEuler();
-
- },
-
- get z () {
-
- return this._z;
-
- },
-
- set z ( value ) {
-
- this._z = value;
- this._updateEuler();
-
- },
-
- get w () {
-
- return this._w;
-
- },
-
- set w ( value ) {
-
- this._w = value;
- this._updateEuler();
-
- },
-
- set: function ( x, y, z, w ) {
-
- this._x = x;
- this._y = y;
- this._z = z;
- this._w = w;
-
- this._updateEuler();
-
- return this;
-
- },
-
- copy: function ( quaternion ) {
-
- this._x = quaternion._x;
- this._y = quaternion._y;
- this._z = quaternion._z;
- this._w = quaternion._w;
-
- this._updateEuler();
-
- return this;
-
- },
-
- setFromEuler: function ( euler, update ) {
-
- if ( euler instanceof MX.Euler === false ) {
- throw new Error( 'ERROR: Quaternion\'s .setFromEuler() now expects a Euler rotation rather than a Vector3 and order. Please update your code.' );
- }
-
- // http://www.mathworks.com/matlabcentral/fileexchange/
- // 20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/
- // content/SpinCalc.m
-
- var c1 = Math.cos( euler._x / 2 );
- var c2 = Math.cos( euler._y / 2 );
- var c3 = Math.cos( euler._z / 2 );
- var s1 = Math.sin( euler._x / 2 );
- var s2 = Math.sin( euler._y / 2 );
- var s3 = Math.sin( euler._z / 2 );
-
- this._x = s1 * c2 * c3 + c1 * s2 * s3;
- this._y = c1 * s2 * c3 - s1 * c2 * s3;
- this._z = c1 * c2 * s3 + s1 * s2 * c3;
- this._w = c1 * c2 * c3 - s1 * s2 * s3;
-
- if ( update !== false ) this._updateEuler();
-
- return this;
-
- },
-
- setFromAxisAngle: function ( axis, angle ) {
-
- // from http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm
- // axis have to be normalized
-
- var halfAngle = angle / 2, s = Math.sin( halfAngle );
-
- this._x = axis.x * s;
- this._y = axis.y * s;
- this._z = axis.z * s;
- this._w = Math.cos( halfAngle );
-
- this._updateEuler();
-
- return this;
-
- },
-
- setFromRotationMatrix: function ( m ) {
-
- // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm
-
- // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)
-
- var te = m.elements,
-
- m11 = te[0], m12 = te[4], m13 = te[8],
- m21 = te[1], m22 = te[5], m23 = te[9],
- m31 = te[2], m32 = te[6], m33 = te[10],
-
- trace = m11 + m22 + m33,
- s;
-
- if ( trace > 0 ) {
-
- s = 0.5 / Math.sqrt( trace + 1.0 );
-
- this._w = 0.25 / s;
- this._x = ( m32 - m23 ) * s;
- this._y = ( m13 - m31 ) * s;
- this._z = ( m21 - m12 ) * s;
-
- } else if ( m11 > m22 && m11 > m33 ) {
-
- s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );
-
- this._w = (m32 - m23 ) / s;
- this._x = 0.25 * s;
- this._y = (m12 + m21 ) / s;
- this._z = (m13 + m31 ) / s;
-
- } else if ( m22 > m33 ) {
-
- s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );
-
- this._w = (m13 - m31 ) / s;
- this._x = (m12 + m21 ) / s;
- this._y = 0.25 * s;
- this._z = (m23 + m32 ) / s;
-
- } else {
-
- s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );
-
- this._w = ( m21 - m12 ) / s;
- this._x = ( m13 + m31 ) / s;
- this._y = ( m23 + m32 ) / s;
- this._z = 0.25 * s;
-
- }
-
- this._updateEuler();
-
- return this;
-
- },
-
- inverse: function () {
-
- this.conjugate().normalize();
-
- return this;
-
- },
-
- conjugate: function () {
-
- this._x *= -1;
- this._y *= -1;
- this._z *= -1;
-
- this._updateEuler();
-
- return this;
-
- },
-
- lengthSq: function () {
-
- return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;
-
- },
-
- length: function () {
-
- return Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w );
-
- },
-
- normalize: function () {
-
- var l = this.length();
-
- if ( l === 0 ) {
-
- this._x = 0;
- this._y = 0;
- this._z = 0;
- this._w = 1;
-
- } else {
-
- l = 1 / l;
-
- this._x = this._x * l;
- this._y = this._y * l;
- this._z = this._z * l;
- this._w = this._w * l;
-
- }
-
- return this;
-
- },
-
- multiply: function ( q, p ) {
-
- if ( p !== undefined ) {
-
- console.warn( 'DEPRECATED: Quaternion\'s .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' );
- return this.multiplyQuaternions( q, p );
-
- }
-
- return this.multiplyQuaternions( this, q );
-
- },
-
- multiplyQuaternions: function ( a, b ) {
-
- // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm
-
- var qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;
- var qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;
-
- this._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;
- this._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;
- this._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;
- this._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;
-
- this._updateEuler();
-
- return this;
-
- },
-
- multiplyVector3: function ( vector ) {
-
- console.warn( 'DEPRECATED: Quaternion\'s .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' );
- return vector.applyQuaternion( this );
-
- },
-
- slerp: function ( qb, t ) {
-
- var x = this._x, y = this._y, z = this._z, w = this._w;
-
- // http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/
-
- var cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z;
-
- if ( cosHalfTheta < 0 ) {
-
- this._w = -qb._w;
- this._x = -qb._x;
- this._y = -qb._y;
- this._z = -qb._z;
-
- cosHalfTheta = -cosHalfTheta;
-
- } else {
-
- this.copy( qb );
-
- }
-
- if ( cosHalfTheta >= 1.0 ) {
-
- this._w = w;
- this._x = x;
- this._y = y;
- this._z = z;
-
- return this;
-
- }
-
- var halfTheta = Math.acos( cosHalfTheta );
- var sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta );
-
- if ( Math.abs( sinHalfTheta ) < 0.001 ) {
-
- this._w = 0.5 * ( w + this._w );
- this._x = 0.5 * ( x + this._x );
- this._y = 0.5 * ( y + this._y );
- this._z = 0.5 * ( z + this._z );
-
- return this;
-
- }
-
- var ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,
- ratioB = Math.sin( t * halfTheta ) / sinHalfTheta;
-
- this._w = ( w * ratioA + this._w * ratioB );
- this._x = ( x * ratioA + this._x * ratioB );
- this._y = ( y * ratioA + this._y * ratioB );
- this._z = ( z * ratioA + this._z * ratioB );
-
- this._updateEuler();
-
- return this;
-
- },
-
- equals: function ( quaternion ) {
-
- return ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w );
-
- },
-
- fromArray: function ( array ) {
-
- this._x = array[ 0 ];
- this._y = array[ 1 ];
- this._z = array[ 2 ];
- this._w = array[ 3 ];
-
- this._updateEuler();
-
- return this;
-
- },
-
- toArray: function () {
-
- return [ this._x, this._y, this._z, this._w ];
-
- },
-
- clone: function () {
-
- return new MX.Quaternion( this._x, this._y, this._z, this._w );
-
- }
-
-};
-
-MX.Quaternion.slerp = function ( qa, qb, qm, t ) {
-
- return qm.copy( qa ).slerp( qb, t );
-
-}
diff --git a/site/public/assets/javascripts/mx/mx.skew.js b/site/public/assets/javascripts/mx/mx.skew.js
deleted file mode 100644
index 73296bd..0000000
--- a/site/public/assets/javascripts/mx/mx.skew.js
+++ /dev/null
@@ -1,610 +0,0 @@
-/**
- * Copyright (C) 2013 by Evan You
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-var MX = MX || (function (undefined) {
-
- var MX = {
- version: '0.1.0',
- prefix: undefined,
- rotationUnit: 'rad',
- }
-
- var floatPrecision = 5
-
- // ========================================================================
- // Setup & Compatibility
- // ========================================================================
-
- var transformProp,
- transitionProp,
- transformOriginProp,
- transformStyleProp,
- perspectiveProp,
- transitionEndEvent
-
- var positionAtCenter = true, // whether to auto center objects
- centeringCSS // styles to inject for center positioning
-
- document.addEventListener('DOMContentLoaded', setup)
-
- function setup () {
-
- // sniff prefix
-
- var s = document.body.style
-
- MX.prefix =
- 'webkitTransform' in s ? 'webkit' :
- 'mozTransform' in s ? 'moz' :
- 'msTransform' in s ? 'ms' : ''
-
- transformProp = MX.transformProp = addPrefix('transform')
- transitionProp = MX.transitionProp = addPrefix('transition')
- transformOriginProp = MX.transformOriginProp = addPrefix('transformOrigin')
- transformStyleProp = MX.transformStyleProp = addPrefix('transformStyle')
- perspectiveProp = MX.perspectiveProp = addPrefix('perspective')
- transitionEndEvent = MX.transitionEndEvent = MX.prefix === 'webkit' ? 'webkitTransitionEnd' : 'transitionend'
-
- // shiv rAF
-
- var vendors = ['webkit', 'moz', 'ms']
- for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
- window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame']
- window.cancelAnimationFrame =
- window[vendors[x]+'CancelAnimationFrame'] ||
- window[vendors[x]+'CancelRequestAnimationFrame']
- }
-
- // inject centering css
-
- centeringCSS = document.createElement('style')
- centeringCSS.type = 'text/css'
- centeringCSS.innerHTML =
- '.mx-object3d {'
- + 'position: absolute;'
- + 'top: 50%;'
- + 'left: 50%;}'
- injectCenteringCSS()
-
- window.scrollTo(0,0)
- }
-
- function injectCenteringCSS () {
- document.head.appendChild(centeringCSS)
- }
-
- function removeCenteringCSS () {
- document.head.removeChild(centeringCSS)
- }
-
- // ========================================================================
- // Utils
- // ========================================================================
-
- function toDeg (rad) {
- return rad / Math.PI * 180
- }
-
- function toRad (deg) {
- return deg / 180 * Math.PI
- }
-
- function buildRotationTranslation (obj) {
-
- // used when rotationOrigin is set
-
- var origin = obj.rotationOrigin
- if (!origin) {
- return
- } else {
- var dx = origin.x - obj.x,
- dy = -(origin.y - obj.y),
- dz = -(origin.z - obj.z)
- return {
- before: 'translate3d(' + dx.toFixed(floatPrecision) +'px,' + dy.toFixed(floatPrecision) + 'px,' + dz.toFixed(floatPrecision) + 'px) ',
- after: 'translate3d(' + (-dx).toFixed(floatPrecision) + 'px,' + (-dy).toFixed(floatPrecision) + 'px,' + (-dz).toFixed(floatPrecision) + 'px) '
- }
- }
- }
-
- function addPrefix (string) {
- if (MX.prefix) {
- string = MX.prefix + string.charAt(0).toUpperCase() + string.slice(1)
- }
- return string
- }
-
- // ========================================================================
- // Base Object3D
- // ========================================================================
-
- function Object3D (el) {
-
- this.setupDomElement(el)
- this.setCSSTransformStyle('preserve-3d')
- this.el.classList.add('mx-object3d')
-
- this.parent = undefined
- this.children = []
- this.updateChildren = true
-
- this.inverseLookAt = false
-
- this.persisted = true
-
- this.reset()
-
-// this.quaternion = new MX.Quaternion ()
-// this.quaternion._euler = this
-
- var width, height,
- self = this
-
- Object.defineProperty(this, 'width', {
- get: function () {
- return width
- || parseInt(self.el.style.width, 10) * app_devicePixelRatio
- || 0
- },
- set: function (val) {
- width = val
- this.el.style.width = (width/app_devicePixelRatio) + 'px'
- }
- })
-
- Object.defineProperty(this, 'height', {
- get: function () {
- return height
- || parseInt(self.el.style.height, 10) * app_devicePixelRatio
- || 0
- },
- set: function (val) {
- height = val
- this.el.style.height = (height/app_devicePixelRatio) + 'px'
- }
- })
- }
-
- Object3D.prototype = {
-
- constructor: Object3D,
-
- reset: function () {
- this.x = this.__x = 0
- this.y = this.__y = 0
- this.z = this.__z = 0
- this.rotationX = this.__rotationX = 0
- this.rotationY = this.__rotationY = 0
- this.rotationZ = this.__rotationZ = 0
- this.scaleX = this.__scaleX = 1
- this.scaleY = this.__scaleY = 1
- this.scaleZ = this.__scaleZ = 1
- this.skewX = this.__skewX = 0
- this.skewY = this.__skewY = 0
- this.scale = this.__scale = 1
- this.perspective = this.__perspective = 0
- this.rotationOrigin = undefined
- this.followTarget = undefined
-// this.quaternion = new MX.Quaternion()
- this.dirty = true
- this.update()
- },
-
- setupDomElement: function (el) {
- this.el = undefined
- if (el instanceof HTMLElement) {
- this.el = el
- } else if (typeof el === 'string') {
- var tag = el.match(/^[^.#\s]*/)[1],
- id = el.match(/#[^.#\s]*/),
- classes = el.match(/\.[^.#\s]*/g)
- this.el = document.createElement(tag || 'div')
- if (id) {
- this.el.id = id[0].slice(1)
- }
- if (classes) {
- var i = classes.length
- while (i--) {
- this.el.classList.add(classes[i].slice(1))
- }
- }
- } else {
- this.el = document.createElement('div')
- }
- },
-
- update: function () {
-
- if (this.updateChildren) {
- var i = this.children.length
- while (i--) {
- this.children[i].update()
- }
- }
-
- if (this.followTarget) {
- this.lookAt(this.followTarget, false)
- }
-
- if (this.scaleX !== this.__scaleX ||
- this.scaleY !== this.__scaleY ||
- this.scaleZ !== this.__scaleZ) {
- this.__scaleX = this.scaleX
- this.__scaleY = this.scaleY
- this.__scaleZ = this.scaleZ
- this.dirty = true
- }
-
- if (this.skewX !== this.__skewX ||
- this.skewY !== this.__skewY) {
- this.__skewX = this.skewX
- this.__skewY = this.skewY
- this.dirty = true
- }
-
- if (this.scale !== this.__scale) {
- this.scaleX =
- this.scaleY =
- this.scaleZ =
- this.__scaleX =
- this.__scaleY =
- this.__scaleZ =
- this.__scale =
- this.scale
- this.dirty = true
- }
-
- if (this.rotationX !== this.__rotationX ||
- this.rotationY !== this.__rotationY ||
- this.rotationZ !== this.__rotationZ) {
- this.__rotationX = this.rotationX
- this.__rotationY = this.rotationY
- this.__rotationZ = this.rotationZ
- this.dirty = true
- }
-
- if (this.x !== this.__x ||
- this.y !== this.__y ||
- this.z !== this.__z) {
- this.__x = this.x
- this.__y = this.y
- this.__z = this.z
- this.dirty = true
- }
-
- if (this.perspective !== this.__perspective) {
- this.__perspective = this.perspective
- this.dirty = true
- }
-
- if (this.dirty && this.el) {
-
- var rotationTranslation = buildRotationTranslation(this),
- rotation = 'rotateX(' + this.rotationX.toFixed(floatPrecision) + MX.rotationUnit + ') '
- + 'rotateY(' + this.rotationY.toFixed(floatPrecision) + MX.rotationUnit + ') '
- + 'rotateZ(' + this.rotationZ.toFixed(floatPrecision) + MX.rotationUnit + ') '
-
- var transformString =
- (MX.positionAtCenter ? 'translate3d(-50%, -50%, 0) ' : '')
- + (this.perspective ? 'perspective(' + this.perspective + 'px) ' : '')
- + 'translate3d('
- + this.x.toFixed(floatPrecision || 0) + 'px,'
- + (-this.y).toFixed(floatPrecision) + 'px,'
- + (-this.z).toFixed(floatPrecision) + 'px) '
- + 'scale3d('
- + (app_devicePixelRatio * this.scaleX).toFixed(floatPrecision) + ','
- + (app_devicePixelRatio * this.scaleY).toFixed(floatPrecision) + ','
- + (app_devicePixelRatio * this.scaleZ).toFixed(floatPrecision) + ') '
- + 'skew('
- + (app_devicePixelRatio * this.skewX).toFixed(floatPrecision) + 'rad,'
- + (app_devicePixelRatio * this.skewY).toFixed(floatPrecision) + 'rad) '
-
- if (rotationTranslation) {
- transformString += rotationTranslation.before
- + rotation
- + rotationTranslation.after
-
- } else {
- transformString += rotation
- }
-
- this.el.style[transformProp] = transformString
- this.dirty = false
- }
-
- return this
-
- },
-
- // taken from three.js
- setFromQuaternion: function ( q, order, update ) {
- // q is assumed to be normalized
-
- // http://www.mathworks.com/matlabcentral/fileexchange/20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/content/SpinCalc.m
-
- var sqx = q.x * q.x;
- var sqy = q.y * q.y;
- var sqz = q.z * q.z;
- var sqw = q.w * q.w;
-
- this.rotationX = Math.atan2( 2 * ( q.x * q.w - q.y * q.z ), ( sqw - sqx - sqy + sqz ) );
- this.rotationY = Math.asin( clamp( 2 * ( q.x * q.z + q.y * q.w ), -1, 1 ) );
- this.rotationZ = Math.atan2( 2 * ( q.z * q.w - q.x * q.y ), ( sqw + sqx - sqy - sqz ) );
- },
-
- lookAt: function (target, update) {
- var r = this.getLookAtEuler(target)
- this.setRotation(r)
- if (update !== false) this.update()
- return this
- },
-
- getLookAtEuler: function (target) {
- // euler order XYZ
- var r = {},
- dx = target.x - this.x,
- dy = target.y - this.y,
- dz = target.z - this.z
- if (this.inverseLookAt) {
- dx = -dx
- dy = -dy
- dz = -dz
- }
- if (dz === 0) dz = 0.001
- r.x = -Math.atan2(dy, dz)
- var flip = dz > 0 ? 1 : -1
- r.y = flip * Math.atan2(dx * Math.cos(r.x), dz * -flip)
- r.z = Math.atan2(Math.cos(r.x), Math.sin(r.x) * Math.sin(r.y)) - Math.PI / 2
- if (MX.rotationUnit === 'deg') {
- r.x = toDeg(r.x)
- r.y = toDeg(r.y)
- r.z = toDeg(r.z)
- }
- return r
- },
-
- add: function () {
- if (!this.el) return
- var parent = this
- Array.prototype.forEach.call(arguments, function (child) {
- if (!child instanceof Object3D) return
- parent.el.appendChild(child.el)
- if (!parent.children) parent.children = []
- parent.children.push(child)
- child.parent = parent
- })
- return this
- },
-
- remove: function () {
- var parent = this
- Array.prototype.forEach.call(arguments, function (child) {
- var index = parent.children.indexOf(child)
- if (index !== -1) {
- parent.children.splice(index, 1)
- parent.el.removeChild(child.el)
- child.parent = undefined
- }
- })
- return this
- },
-
- addTo: function (target) {
- if (typeof target === 'string') {
- target = document.querySelector(target)
- }
- if (target instanceof HTMLElement && target.appendChild) {
- target.appendChild(this.el)
- } else if (target instanceof Object3D || target instanceof MX.Scene) {
- target.add(this)
- }
- return this
- },
-
- removeElement: function () {
- if (this.el.parentNode) {
- this.el.parentNode.removeChild(this.el)
- }
- },
-
- setPosition: function (tar) {
- this.x = (tar.x || tar.x === 0) ? tar.x : this.x
- this.y = (tar.y || tar.y === 0) ? tar.y : this.y
- this.z = (tar.z || tar.z === 0) ? tar.z : this.z
- },
-
- setRotation: function (tar) {
- this.rotationX = (tar.x || tar.x === 0) ? tar.x : this.rotationX
- this.rotationY = (tar.y || tar.y === 0) ? tar.y : this.rotationY
- this.rotationZ = (tar.z || tar.z === 0) ? tar.z : this.rotationZ
- },
-
- setScale: function (tar) {
- this.scaleX = (tar.x || tar.x === 0) ? tar.x : this.scaleX
- this.scaleY = (tar.y || tar.y === 0) ? tar.y : this.scaleY
- this.scaleZ = (tar.z || tar.z === 0) ? tar.z : this.scaleZ
- },
-
- setSkew: function (tar) {
- this.skewX = (tar.x || tar.x === 0) ? tar.x : this.skewX
- this.skewY = (tar.y || tar.y === 0) ? tar.y : this.skewY
- },
-
- setCSSTransformOrigin: function (origin) {
- this.el && (this.el.style[transformOriginProp] = origin)
- return this
- },
-
- setCSSTransformStyle: function (style) {
- this.el && (this.el.style[transformStyleProp] = style)
- return this
- },
-
- setCSSTransition: function (trans) {
- this.el && (this.el.style[transitionProp] = trans)
- return this
- },
-
- setCSSPerspective: function (pers) {
- this.el && (this.el.style[perspectiveProp] = pers)
- return this
- },
-
- move: function(ops){
- var layer = this
- layer.ops = defaults(ops, layer.ops)
- for (var i in ops) {
- layer[i] = ops[i]
- }
- layer.dirty = true
- layer.update()
- },
-
- onTransitionEnd: function (callback) {
- this.cancelTransitionEnd()
- var el = this.el
- el.addEventListener(transitionEndEvent, onEnd)
- function onEnd () {
- el.removeEventListener(transitionEndEvent, onEnd)
- callback()
- }
- },
-
- cancelTransitionEnd: function () {
- this.el.removeEventListener(transitionEndEvent)
- },
-
- toString: function(params){
- params = params || "id width height depth x y z rotationX rotationY rotationZ scale".split(" ")
- return this.__toString(params)
- },
-
- __toString: function(params, func){
- this.id = this.id || 'undef' // _.uniqueId()
- var list = [],
- obj = {},
- type = this.type || "Object3d",
- name = type.toLowerCase(),
- val,
- param
- for (var i in params) {
- param = params[i]
- val = this[param]
- if (val === 0 && ! func) continue;
- if (typeof val == "number") {
- if (param.indexOf("rotation") != -1) {
- obj[param] = Number(val.toFixed(3))
- }
- else {
- obj[param] = ~~val
- }
- }
- else {
- obj[param] = val
- }
- }
-
- return (func || "var " + name + " = new MX." + type ) + "(" +
- JSON.stringify(obj, undefined, 2) +
- ")\n" + (func ? "" : "scene.add(" + name + ")")
- },
-
- contains: function(x,y,z){
- var containsX = false,
- containsY = false,
- containsZ = false
-
- if (x === null) {
- containsX = true
- }
- else {
- containsX = abs(this.x - x) <= this.width/2
- }
-
- if (y === null) {
- containsY = true
- }
- else {
- containsY = abs(this.y - y) <= this.height/2
- }
-
- if (z === null) {
- containsZ = true
- }
- else {
- containsZ = abs(this.z - z) <= this.depth/2
- }
-
- return (containsX && containsY && containsZ)
- }
-
- }
-
- // ========================================================================
- // Inheritance
- // ========================================================================
-
- Object3D.extend = extend.bind(Object3D)
-
- function extend (props) {
- var Super = this
- var ExtendedObject3D = function () {
- Super.call(this)
- props.init && props.init.apply(this, arguments)
- }
- ExtendedObject3D.prototype = Object.create(Super.prototype)
- for (var prop in props) {
- if (props.hasOwnProperty(prop) && prop !== 'init') {
- ExtendedObject3D.prototype[prop] = props[prop]
- }
- }
- ExtendedObject3D.extend = extend.bind(ExtendedObject3D)
- return ExtendedObject3D
- }
-
- // ========================================================================
- // Expose API
- // ========================================================================
-
- MX.Object3D = Object3D
- MX.toRad = toRad
- MX.toDeg = toDeg
-
- // center positioning getter setter
- Object.defineProperty(MX, 'positionAtCenter', {
- get: function () {
- return positionAtCenter
- },
- set: function (val) {
- if (typeof val !== 'boolean') return
- positionAtCenter = val
- if (positionAtCenter) {
- injectCenteringCSS()
- } else {
- removeCenteringCSS()
- }
- }
- })
-
- return MX
-
-})() \ No newline at end of file
diff --git a/site/public/assets/javascripts/mx/primitives/mx.image.js b/site/public/assets/javascripts/mx/primitives/mx.image.js
deleted file mode 100644
index 39bb0b5..0000000
--- a/site/public/assets/javascripts/mx/primitives/mx.image.js
+++ /dev/null
@@ -1,50 +0,0 @@
-MX.Image = MX.Object3D.extend({
- init: function (ops) {
-
- this.type = "Image"
- this.media = ops.media
- this.width = 0
- this.height = 0
- this.x = ops.x || 0
- this.y = ops.y || 0
- this.z = ops.z || 0
- this.scale = ops.scale || 1
- this.backface = ops.backface || false
-
- ops.className && this.el.classList.add(ops.className)
- this.backface && this.el.classList.add("backface-visible")
- this.el.classList.add("image")
- this.el.classList.add("mx-scenery")
-
- this.el.style.backgroundRepeat = 'no-repeat'
-
- this.load(ops)
- },
-
- load: function(ops){
- var layer = this
- layer.ops = defaults(ops, layer.ops)
-
- var image = new Image()
- image.onload = function(){
- if (! layer.ops) return
- layer.scale = layer.ops.scale || 1
- layer.width = layer.ops.width || image.naturalWidth
- layer.height = layer.ops.height || image.naturalHeight
-// layer.x = layer.ops.x || 0
-// layer.y = layer.ops.y || 0
-// layer.z = layer.ops.z || 0
-// layer.rotationX = layer.ops.rotationX || 0
-// layer.rotationY = layer.ops.rotationY || 0
-// layer.rotationZ = layer.ops.rotationZ || 0
- layer.el.style.backgroundImage = "url(" + image.src + ")"
- layer.el.classList.add('image')
- layer.dirty = true
- layer.ops.onload && layer.ops.onload( image )
- layer.update()
- }
- image.src = ops.src;
- if (image.complete) setTimeout(image.onload)
- },
-
-})
diff --git a/site/public/assets/javascripts/mx/primitives/mx.soundcloud.js b/site/public/assets/javascripts/mx/primitives/mx.soundcloud.js
deleted file mode 100644
index 75286d9..0000000
--- a/site/public/assets/javascripts/mx/primitives/mx.soundcloud.js
+++ /dev/null
@@ -1,125 +0,0 @@
-MX.Soundcloud = MX.Object3D.extend({
- init: function (ops) {
-
- this.type = "Soundcloud"
- this.media = ops.media
- this.width = 0
- this.height = 0
- this.x = ops.x || 0
- this.y = ops.y || 0
- this.z = ops.z || 0
- this.scale = ops.scale || 1
- this.backface = ops.backface || false
-
- ops.className && this.el.classList.add(ops.className)
- this.backface && this.el.classList.add("backface-visible")
- this.el.classList.add("audio")
- this.el.classList.add("mx-scenery")
-
- this.el.style.backgroundRepeat = 'no-repeat'
- this.paused = true
-
- this.ops = ops
- },
-
- load: function(ops){
- if (ops) {
- ops = this.ops = defaults(ops, this.ops)
- }
- else {
- ops = this.ops
- }
-
- this.width = ops.media.width
- this.height = ops.media.height
-
- var tag = Parser.lookup.soundcloud.tag(ops.media)
- var $iframe = $(tag)
- var iframe = $iframe[0]
- $iframe.css('z-index', '-1')
- this.el.appendChild( iframe )
-
- var overlay = this.overlay = document.createElement("div")
- overlay.style.width = "100%"
- overlay.style.height = "100%"
- overlay.style.position = "absolute"
- overlay.style.top = "0"
- overlay.style.left = "0"
- overlay.style.zIndex = "2"
- overlay.className = "overlay"
- this.el.appendChild(overlay)
-
- this.player = SC.Widget( iframe )
- this.player.setVolume(80)
-
- this.duration = 0
-
- this.player.bind(SC.Widget.Events.READY, this.ready.bind(this))
-// this.player.bind(SC.Widget.Events.LOAD_PROGRESS, this.loadProgress.bind(this))
-// this.player.bind(SC.Widget.Events.PLAY_PROGRESS, this.playProgress.bind(this))
- this.player.bind(SC.Widget.Events.PLAY, this.didPlay.bind(this))
- this.player.bind(SC.Widget.Events.PAUSE, this.didPause.bind(this))
- this.player.bind(SC.Widget.Events.FINISH, this.finished.bind(this))
- },
-
- ready: function(){
- this.seek( this.media.keyframe || 0 )
-
- if (this.media.autoplay) {
- this.play()
- }
-
- this.player.getDuration(function(duration){
- this.duration = duration
- }.bind(this))
- },
-
- play: function(){
- this.player.play()
- },
-
- pause: function(){
- this.player.pause()
- },
-
- toggle: function(state){
- if (typeof state === "boolean") {
- if (state) this.play()
- else this.pause()
- }
- else {
- this.player.toggle()
- }
- },
-
- seek: function(n){
- if (n < 1) {
- n = n * this.duration
- }
- this.player.seekTo(n)
- },
-
- setLoop: function(state){
- this.media.loop = state
- },
-
- didPlay: function(){
- this.paused = false
- },
-
- didPause: function(){
- this.paused = true
- },
-
- finished: function(){
- console.log("soundcloud finished")
- if (this.media.loop) {
- this.seek(0)
- this.play()
- }
- else if (this.bound) {
- $(".playButton").removeClass('playing')
- }
- },
-
-})
diff --git a/site/public/assets/javascripts/mx/primitives/mx.text.js b/site/public/assets/javascripts/mx/primitives/mx.text.js
deleted file mode 100644
index 6b5681b..0000000
--- a/site/public/assets/javascripts/mx/primitives/mx.text.js
+++ /dev/null
@@ -1,59 +0,0 @@
-MX.Text = MX.Object3D.extend({
-
- init: function (ops) {
-
- this.type = "Text"
-
- this.type = "Image"
- this.media = ops.media
- this.width = 0
- this.height = 0
- this.x = ops.x || 0
- this.y = ops.y || 0
- this.z = ops.z || 0
- this.scale = ops.scale || 1
- this.backface = ops.backface || false
-
- this.scale = ops.scale || 1
- this.width = ops.media.width
- this.height = ops.media.height
- this.x = ops.x || 0
- this.y = ops.y || 0
- this.z = ops.z || 0
- this.rotationX = ops.rotationX || 0
- this.rotationY = ops.rotationY || 0
- this.rotationZ = ops.rotationZ || 0
-
- ops.className && this.el.classList.add(ops.className)
- this.backface && this.el.classList.add("backface-visible")
- this.el.classList.add("mx-text")
- this.el.classList.add("mx-scenery")
-
- this.inner = document.createElement("div")
- this.inner.classList.add("inner")
- this.el.appendChild(this.inner)
-
- this.load(ops)
- },
-
- load: function(ops){
- var media = ops.media
- if (media.font) this.setFont(media.font)
-
- this.setText( media.description )
- },
-
- setFont: function(font){
- if (! font.color || font.color[0] == "#") { font.color = [0,0,0] }
-
- this.inner.style.fontFamily = "'" + font.family + "',sans-serif"
- this.el.style.fontSize = (2 * font.size / devicePixelRatio) + "pt"
- this.el.style.textAlign = font.align
- this.el.style.color = rgb_string(font.color)
- },
-
- setText: function(text){
- this.inner.innerHTML = marked( text || "" )
- },
-
-})
diff --git a/site/public/assets/javascripts/mx/primitives/mx.video.js b/site/public/assets/javascripts/mx/primitives/mx.video.js
deleted file mode 100644
index c281f02..0000000
--- a/site/public/assets/javascripts/mx/primitives/mx.video.js
+++ /dev/null
@@ -1,110 +0,0 @@
-MX.Video = MX.Object3D.extend({
-
- init: function (ops) {
-
- this.type = "Video"
-
- this.media = ops.media
- this.width = ops.media.width
- this.height = ops.media.height
- this.x = ops.x || 0
- this.y = ops.y || 0
- this.z = ops.z || 0
- this.rotationX = ops.rotationX || 0
- this.rotationY = ops.rotationY || 0
- this.rotationZ = ops.rotationZ || 0
- this.scale = ops.scale || 1
- this.backface = ops.backface || false
-
- ops.className && this.el.classList.add(ops.className)
- this.backface && this.el.classList.add("backface-visible")
- this.el.classList.add("video")
- this.el.classList.add("mx-scenery")
- this.paused = !! this.media.autoplay
- this.muted = app.muted || !! this.media.mute
- },
-
- load: function(ops){
- this.paused = true
-
- this.player = document.createElement('video')
- this.player.addEventListener("loadedmetadata", this.ready.bind(this))
- this.player.addEventListener("error", this.error.bind(this))
- this.player.addEventListener("ended", this.finished.bind(this))
- this.player.width = "100%"
- this.player.height = "100%"
- this.player.src = this.media.url
- this.player.load()
-
- this.el.appendChild(this.player)
- },
-
- ready: function(){
- this.seek( this.media.keyframe || 0 )
-
- if (this.media.mute) {
- this.mute()
- }
- else {
- this.unmute()
- }
-
- if (this.media.autoplay) {
- this.play()
- }
- },
-
- error: function(err){
- console.log("video error", err)
- },
-
- play: function(){
- this.paused = false
- this.player.play()
- },
-
- pause: function(){
- this.paused = true
- this.player.pause()
- },
-
- seek: function(n){
- if (n < 1) {
- n = n * this.duration()
- }
- this.player.currentTime = n
- },
-
- mute: function(){
- this.player.muted = true
- this.player.volume = 0
- this.muted = true
- },
-
- unmute: function(){
- this.player.muted = false
- this.player.volume = 0.8
- this.muted = false
- },
-
- setLoop: function(state){
- this.media.loop = state
- },
-
- duration: function(){
- return this.player.duration
- },
-
- finished: function(){
- console.log("video finished")
- if (this.media.loop) {
- this.seek(0)
- this.play()
- }
- else if (this.bound) {
- $(".playButton").removeClass('playing')
- }
- },
-
-
-})
diff --git a/site/public/assets/javascripts/mx/primitives/mx.vimeo.js b/site/public/assets/javascripts/mx/primitives/mx.vimeo.js
deleted file mode 100644
index fe5ce86..0000000
--- a/site/public/assets/javascripts/mx/primitives/mx.vimeo.js
+++ /dev/null
@@ -1,162 +0,0 @@
-MX.Vimeo = MX.Object3D.extend({
-
- init: function (ops) {
-
- this.type = "Vimeo"
-
- this.media = ops.media
- this.width = ops.media.width
- this.height = ops.media.height
- this.x = ops.x || 0
- this.y = ops.y || 0
- this.z = ops.z || 0
- this.rotationX = ops.rotationX || 0
- this.rotationY = ops.rotationY || 0
- this.rotationZ = ops.rotationZ || 0
- this.scale = ops.scale || 1
- this.backface = ops.backface || false
-
- ops.className && this.el.classList.add(ops.className)
- this.backface && this.el.classList.add("backface-visible")
- this.el.classList.add("video")
- this.el.classList.add("mx-scenery")
- this.paused = !! this.media.autoplay
- this.muted = app.muted || !! this.media.mute
- this.started = false
- },
-
- load: function (ops) {
- var uid = 'player-' + Uid ()
- var loop = this.media.loop ? 'loop=1' : ""
- var preload = document.createElement("iframe")
- preload.id = uid
- preload.setAttribute("src", "//player.vimeo.com/video/" + this.media.token + "?api=1&badge=0&controls=0branding=0&byline=0&portrait=0&title=0&" + loop + "&player_id=" + uid)
- preload.style.backgroundImage = "url(" + this.media.thumbnail + ")"
- preload.style.width = "100%"
- preload.style.height = "100%"
- preload.style.border = "0"
- preload.style.pointerEvents = "none"
- preload.className = "preload"
- this.el.appendChild(preload)
- this.player = $f(preload)
-
- this.player.addEvent('ready', $.proxy(this.ready, this))
- },
-
- ready: function(){
- console.log("vimeo ready")
-
- this.started = true
-
- // wait until ready before binding events. other events: play, pause
- this.player.addEvent('play', $.proxy(this.onPlay, this))
- this.player.addEvent('pause', $.proxy(this.onPause, this))
- this.player.addEvent('finish', $.proxy(this.finished, this))
-
- // this is async on vimeo so call it asap
- this.player.api('getDuration', $.proxy(function(n){
- console.log("vimeo duration", n)
- this.player.duration = n
- }, this))
-
- if (this.media.mute) {
- this.mute()
- }
- else {
- this.unmute()
- }
-
- this.seek( this.media.keyframe || 0 )
-
- if (this.media.autoplay) {
- this.play()
- }
- else {
- this.pause()
- }
- },
-
- error: function(err){
- console.log("vimeo error", err)
- },
-
- play: function(){
- this.paused = false
- this.player.api('play')
- },
-
- pause: function(){
- this.paused = true
- this.player.api('pause')
- },
-
- seek: function(n){
- // defer seek until we have duration
- if (! this.duration()) {
- setTimeout($.proxy(function(){
- this.seek(n)
- }, this), 300)
- return
- }
-
- if (! this.started || n === 0) {
- return
- }
-
- if (n < 1) {
- n = n * this.duration()
- }
- this.player.api('seekTo', max(0, n-1))
- if (this.paused) {
- this.paused = false
- this.play()
- this.pause()
- setTimeout($.proxy(function(){
- this.pause()
- }, this), 100)
- }
- },
-
- duration: function(){
- return this.player.duration
- },
-
- mute: function(){
- this.player.api('setVolume', 0.0)
- this.muted = true
- },
-
- unmute: function(){
- this.player.api('setVolume', 0.8)
- this.muted = false
- },
-
- setLoop: function(state){
- this.media.loop = state
- this.player.api('setLoop', state)
- },
-
- onPlay: function(){
- if (this.paused) {
- this.pause()
- }
- },
-
- onPause: function(){
- if (! this.paused) {
- this.play()
- }
- },
-
- finished: function(){
-// if (this.media.loop) {
-// this.seek(0)
-// this.play()
-// }
-// else if (this.bound) {
- if (! this.media.loop && this.bound) {
- $(".playButton").removeClass('playing')
- }
- }
-
-})
diff --git a/site/public/assets/javascripts/mx/primitives/mx.youtube.js b/site/public/assets/javascripts/mx/primitives/mx.youtube.js
deleted file mode 100644
index 5c92378..0000000
--- a/site/public/assets/javascripts/mx/primitives/mx.youtube.js
+++ /dev/null
@@ -1,196 +0,0 @@
-MX.Youtube = MX.Object3D.extend({
-
- init: function (ops) {
-
- this.type = "Youtube"
-
- this.media = ops.media
- this.width = ops.media.width
- this.height = ops.media.height
- this.x = ops.x || 0
- this.y = ops.y || 0
- this.z = ops.z || 0
- this.rotationX = ops.rotationX || 0
- this.rotationY = ops.rotationY || 0
- this.rotationZ = ops.rotationZ || 0
- this.scale = ops.scale || 1
- this.backface = ops.backface || false
-
- ops.className && this.el.classList.add(ops.className)
- this.backface && this.el.classList.add("backface-visible")
- this.el.classList.add("video")
- this.el.classList.add("mx-scenery")
- this.paused = !! this.media.autoplay
- this.muted = app.muted || !! this.media.mute
- },
-
- load: function (ops) {
- var base = this
- var uid = 'player-' + Uid ()
- var preload = document.createElement("div")
- preload.id = uid
- preload.style.backgroundImage = "url(" + this.media.thumbnail + ")"
- preload.style.backgroundSize = "cover"
- preload.style.width = "100%"
- preload.style.height = "100%"
- preload.style.pointerEvents = "none"
- preload.style.position = "absolute"
- preload.style.top = "0"
- preload.style.left = "0"
- preload.style.zIndex = "1"
- preload.className = "preload"
- this.el.appendChild(preload)
-
- var overlay = this.overlay = document.createElement("div")
- overlay.style.width = "100%"
- overlay.style.height = "100%"
- overlay.style.position = "absolute"
- overlay.style.top = "0"
- overlay.style.left = "0"
- overlay.style.zIndex = "2"
- overlay.className = "overlay"
- this.el.appendChild(overlay)
- this.defer(uid)
- },
-
- defer: function (uid){
- if (! YT || ! YT.loaded) {
- setTimeout(function(){
- this.defer(uid)
- }.bind(this), 300)
- }
- else {
- // not sure why i need to delay here..
- // stopped working until i added the setTimeout
- setTimeout(function(){
- this.build(uid)
- }.bind(this), 20)
- }
- },
-
- build: function(uid){
- this.player = new YT.Player(uid, {
- videoId: this.media.token,
- width: this.width,
- height: this.height,
- events: {
- onReady: this.ready.bind(this),
- onError: this.error.bind(this),
- onStateChange: this.statechange.bind(this),
- },
- playerVars: {
- autohide: 1,
- autoplay: 0,
- disablekb: 1,
- controls: 0,
- enablejsapi: 1,
- origin: window.location.origin,
- fs: 0,
- modestbranding: 1,
- iv_load_policy: 3, // no annotations
- loop: 0,
- showinfo: 0,
- rel: 0,
- wmode: 'opaque',
- },
- })
- },
-
- ready: function(){
- console.log("youtube ready")
-
- if (this.media.autoplay) {
- this.play()
- }
- else {
- this.pause()
- }
-
- if (this.media.mute) {
- this.mute()
- }
- else {
- this.unmute()
- }
-
- this.seek( this.media.keyframe || 0 )
- },
-
- error: function(err){
- console.log("youtube error", err)
- },
-
- statechange: function(e){
- switch (e.data) {
- case -1: // unstarted
- break
- case 0: // finished
- this.finished()
- break
- case 1: // play
- if (this.paused) {
- this.pause()
- }
- break
- case 2: // pause
- break
- case 3: // buffering
- break
- case 5: // cued
- break
- }
- },
-
- play: function(){
- this.paused = false
- this.player.playVideo()
- },
-
- pause: function(){
- this.paused = true
- this.player.pauseVideo()
- },
-
- seek: function(n, allowSeekAhead){
- if (n < 1) {
- n = n * this.duration()
- }
- allowSeekAhead = typeof allowSeekAhead == "boolean" ? allowSeekAhead : true
- this.player.seekTo(n, true) // set to false if seeking manually
- },
-
- duration: function(){
- return this.player.getDuration()
- },
-
- mute: function(){
- this.player.mute()
- this.muted = true
- },
-
- unmute: function(){
- this.player.unMute()
- this.player.setVolume(80)
- this.muted = false
- },
-
- setLoop: function(state){
- this.media.loop = state
- },
-
- finished: function(){
- console.log("youtube finished")
- if (this.media.loop) {
- this.seek(0)
- this.play()
- }
- else if (this.bound) {
- $(".playButton").removeClass('playing')
- }
- }
-
-})
-
-window.onYouTubePlayerAPIReady = function(){
- // console.log("youtube api ready")
-}