diff options
Diffstat (limited to 'basicsuite/webengine/content/rubiks')
-rw-r--r-- | basicsuite/webengine/content/rubiks/css/style.css | 36 | ||||
-rw-r--r-- | basicsuite/webengine/content/rubiks/index.html | 25 | ||||
-rw-r--r-- | basicsuite/webengine/content/rubiks/js/css3.oz.js | 28 | ||||
-rw-r--r-- | basicsuite/webengine/content/rubiks/js/oz.js | 334 | ||||
-rw-r--r-- | basicsuite/webengine/content/rubiks/js/quaternion.js | 78 | ||||
-rw-r--r-- | basicsuite/webengine/content/rubiks/js/rubik.js | 492 | ||||
-rw-r--r-- | basicsuite/webengine/content/rubiks/screenshot.png | bin | 7159 -> 0 bytes |
7 files changed, 0 insertions, 993 deletions
diff --git a/basicsuite/webengine/content/rubiks/css/style.css b/basicsuite/webengine/content/rubiks/css/style.css deleted file mode 100644 index a636bb0..0000000 --- a/basicsuite/webengine/content/rubiks/css/style.css +++ /dev/null @@ -1,36 +0,0 @@ -html, body { - height: 100%; - margin: 0px; -} - -body { - background-color: #000; - color: white; - text-shadow: 0px 1px 1px black; - text-align: center; - font-family: sans-serif; -} - -h1 { - text-align: center; - margin-top: 0px; - padding-top: 1em; -} - -footer { - position: fixed; - text-align: center; - width: 100%; - left: 0px; - bottom: 3px; - font-size: 90%; -} - -a { - color: white; -} - -.face { - border: 2px solid black; - border-radius: 10px; -} diff --git a/basicsuite/webengine/content/rubiks/index.html b/basicsuite/webengine/content/rubiks/index.html deleted file mode 100644 index 993b523..0000000 --- a/basicsuite/webengine/content/rubiks/index.html +++ /dev/null @@ -1,25 +0,0 @@ -<!doctype html> -<!-- - -Copyright (c) 2012 Ondřej Žára http://ondras.zarovi.cz -This demo is released under the BSD license: -http://opensource.org/licenses/bsd-license.php - ---> - -<html> - <head> - <meta charset="utf-8" /> - <title>Rubik's cube :: CSS 3D Transformations demo</title> - <script src="js/oz.js"></script> - <script src="js/css3.oz.js"></script> - <script src="js/rubik.js"></script> - <script src="js/quaternion.js"></script> - <link rel="stylesheet" href="css/style.css" /> - <meta name="viewport" content="width=device-width" /> - <meta name="apple-mobile-web-app-capable" content="yes" /> - </head> - <body onload="new Rubik()"> - <h1>CSS 3D Rubik's cube</h1> - </body> -</html> diff --git a/basicsuite/webengine/content/rubiks/js/css3.oz.js b/basicsuite/webengine/content/rubiks/js/css3.oz.js deleted file mode 100644 index d8ad6d9..0000000 --- a/basicsuite/webengine/content/rubiks/js/css3.oz.js +++ /dev/null @@ -1,28 +0,0 @@ -OZ.CSS3 = { - getProperty: function(property) { - var prefix = this.getPrefix(this._normalize(property)); - if (prefix === null) { return null; } - return (prefix ? "-" + prefix.toLowerCase() + "-" : "") + property; - }, - set: function(node, prop, value) { - prop = this._normalize(prop); - var prefix = this.getPrefix(prop); - if (prefix === null) { return false; } - var p = (prefix ? prefix + prop.charAt(0).toUpperCase() + prop.substring(1) : prop); - node.style[p] = value; - return true; - }, - getPrefix: function(property) { - var prefixes = ["", "ms", "Webkit", "O", "Moz"]; - for (var i=0;i<prefixes.length;i++) { - var p = prefixes[i]; - var prop = (p ? p + property.charAt(0).toUpperCase() + property.substring(1) : property); - if (prop in this._node.style) { return p; } - } - return null; - }, - _normalize: function(property) { - return property.replace(/-([a-z])/g, function(match, letter) { return letter.toUpperCase(); }); - }, - _node: OZ.DOM.elm("div") -} diff --git a/basicsuite/webengine/content/rubiks/js/oz.js b/basicsuite/webengine/content/rubiks/js/oz.js deleted file mode 100644 index b821c04..0000000 --- a/basicsuite/webengine/content/rubiks/js/oz.js +++ /dev/null @@ -1,334 +0,0 @@ -/* (c) 2007 - now() Ondrej Zara, 1.7 */ -var OZ = { - $:function(x) { return typeof(x) == "string" ? document.getElementById(x) : x; }, - select: function(x) { return document.querySelectorAll(x); }, - opera:!!window.opera, - ie:!!document.attachEvent && !window.opera, - gecko:!!document.getAnonymousElementByAttribute, - webkit:!!navigator.userAgent.match(/webkit/i), - khtml:!!navigator.userAgent.match(/khtml/i) || !!navigator.userAgent.match(/konqueror/i), - Event:{ - _id:0, - _byName:{}, - _byID:{}, - add:function(elm,event,cb) { - var id = OZ.Event._id++; - var element = OZ.$(elm); - var fnc = (element && element.attachEvent ? function() { return cb.apply(element,arguments); } : cb); - var rec = [element,event,fnc]; - var parts = event.split(" "); - while (parts.length) { - var e = parts.pop(); - if (element) { - if (element.addEventListener) { - element.addEventListener(e,fnc,false); - } else if (element.attachEvent) { - element.attachEvent("on"+e,fnc); - } - } - if (!(e in OZ.Event._byName)) { OZ.Event._byName[e] = {}; } - OZ.Event._byName[e][id] = rec; - } - OZ.Event._byID[id] = rec; - return id; - }, - remove:function(id) { - var rec = OZ.Event._byID[id]; - if (!rec) { return; } - var elm = rec[0]; - var parts = rec[1].split(" "); - while (parts.length) { - var e = parts.pop(); - if (elm) { - if (elm.removeEventListener) { - elm.removeEventListener(e,rec[2],false); - } else if (elm.detachEvent) { - elm.detachEvent("on"+e,rec[2]); - } - } - delete OZ.Event._byName[e][id]; - } - delete OZ.Event._byID[id]; - }, - stop:function(e) { e.stopPropagation ? e.stopPropagation() : e.cancelBubble = true; }, - prevent:function(e) { e.preventDefault ? e.preventDefault() : e.returnValue = false; }, - target:function(e) { return e.target || e.srcElement; } - }, - Class:function() { - var c = function() { - var init = arguments.callee.prototype.init; - if (init) { init.apply(this,arguments); } - }; - c.implement = function(parent) { - for (var p in parent.prototype) { this.prototype[p] = parent.prototype[p]; } - return this; - }; - c.extend = function(parent) { - var tmp = function(){}; - tmp.prototype = parent.prototype; - this.prototype = new tmp(); - this.prototype.constructor = this; - return this; - }; - c.prototype.bind = function(fnc) { return fnc.bind(this); }; - c.prototype.dispatch = function(type, data) { - var obj = { - type:type, - target:this, - timeStamp:(new Date()).getTime(), - data:data - } - var tocall = []; - var list = OZ.Event._byName[type]; - for (var id in list) { - var item = list[id]; - if (!item[0] || item[0] == this) { tocall.push(item[2]); } - } - var len = tocall.length; - for (var i=0;i<len;i++) { tocall[i](obj); } - } - return c; - }, - DOM:{ - elm:function(name, opts) { - var elm = document.createElement(name); - for (var p in opts) { - var val = opts[p]; - if (p == "class") { p = "className"; } - if (p in elm) { elm[p] = val; } - } - OZ.Style.set(elm, opts); - return elm; - }, - text:function(str) { return document.createTextNode(str); }, - clear:function(node) { while (node.firstChild) {node.removeChild(node.firstChild);} }, - pos:function(elm) { /* relative to _viewport_ */ - var cur = OZ.$(elm); - var html = cur.ownerDocument.documentElement; - var parent = cur.parentNode; - var x = y = 0; - if (cur == html) { return [x,y]; } - while (1) { - if (OZ.Style.get(cur,"position") == "fixed") { - x += cur.offsetLeft; - y += cur.offsetTop; - return [x,y]; - } - - if (OZ.opera && (parent == html || OZ.Style.get(cur,"display") != "block")) { } else { - x -= parent.scrollLeft; - y -= parent.scrollTop; - } - if (parent == cur.offsetParent || cur.parentNode == html) { - x += cur.offsetLeft; - y += cur.offsetTop; - cur = parent; - } - - if (parent == html) { return [x,y]; } - parent = parent.parentNode; - } - }, - scroll:function() { - var x = document.documentElement.scrollLeft || document.body.scrollLeft || 0; - var y = document.documentElement.scrollTop || document.body.scrollTop || 0; - return [x,y]; - }, - win:function(avail) { - return (avail ? [window.innerWidth,window.innerHeight] : [document.documentElement.clientWidth,document.documentElement.clientHeight]); - }, - hasClass:function(node, className) { - var cn = OZ.$(node).className; - var arr = (cn ? cn.split(" ") : []); - return (arr.indexOf(className) != -1); - }, - addClass:function(node,className) { - if (OZ.DOM.hasClass(node, className)) { return; } - var cn = OZ.$(node).className; - var arr = (cn ? cn.split(" ") : []); - arr.push(className); - OZ.$(node).className = arr.join(" "); - }, - removeClass:function(node, className) { - if (!OZ.DOM.hasClass(node, className)) { return; } - var cn = OZ.$(node).className; - var arr = (cn ? cn.split(" ") : []); - var arr = arr.filter(function($){ return $ != className; }); - OZ.$(node).className = arr.join(" "); - }, - append:function() { - if (arguments.length == 1) { - var arr = arguments[0]; - var root = OZ.$(arr[0]); - for (var i=1;i<arr.length;i++) { root.appendChild(OZ.$(arr[i])); } - } else for (var i=0;i<arguments.length;i++) { OZ.DOM.append(arguments[i]); } - } - }, - Style:{ - get:function(elm, prop) { - if (document.defaultView && document.defaultView.getComputedStyle) { - try { - var cs = elm.ownerDocument.defaultView.getComputedStyle(elm,""); - } catch(e) { - return false; - } - if (!cs) { return false; } - return cs[prop]; - } else { - return elm.currentStyle[prop]; - } - }, - set:function(elm, obj) { - for (var p in obj) { - var val = obj[p]; - if (p == "opacity" && OZ.ie) { - p = "filter"; - val = "alpha(opacity="+Math.round(100*val)+")"; - elm.style.zoom = 1; - } else if (p == "float") { - p = (OZ.ie ? "styleFloat" : "cssFloat"); - } - if (p in elm.style) { elm.style[p] = val; } - } - } - }, - Request:function(url, callback, options) { - var o = {data:false, method:"get", headers:{}, xml:false} - for (var p in options) { o[p] = options[p]; } - o.method = o.method.toUpperCase(); - - var xhr = false; - if (window.XMLHttpRequest) { xhr = new XMLHttpRequest(); } - else if (window.ActiveXObject) { xhr = new ActiveXObject("Microsoft.XMLHTTP"); } - else { return false; } - xhr.open(o.method, url, true); - xhr.onreadystatechange = function() { - if (xhr.readyState != 4) { return; } - if (!callback) { return; } - var data = (o.xml ? xhr.responseXML : xhr.responseText); - var headers = {}; - var h = xhr.getAllResponseHeaders(); - if (h) { - h = h.split(/[\r\n]/); - for (var i=0;i<h.length;i++) if (h[i]) { - var v = h[i].match(/^([^:]+): *(.*)$/); - headers[v[1]] = v[2]; - } - } - callback(data,xhr.status,headers); - }; - if (o.method == "POST") { xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); } - for (var p in o.headers) { xhr.setRequestHeader(p,o.headers[p]); } - xhr.send(o.data || null); - return xhr; - } -} - -if (!Function.prototype.bind) { - Function.prototype.bind = function(thisObj) { - var fn = this; - var args = Array.prototype.slice.call(arguments, 1); - return function() { - return fn.apply(thisObj, args.concat(Array.prototype.slice.call(arguments))); - } - } -}; - -if (!Array.prototype.indexOf) { - Array.prototype.indexOf = function(item, from) { - var len = this.length; - var i = from || 0; - if (i < 0) { i += len; } - for (;i<len;i++) { - if (i in this && this[i] === item) { return i; } - } - return -1; - } -} -if (!Array.indexOf) { - Array.indexOf = function(obj, item, from) { return Array.prototype.indexOf.call(obj, item, from); } -} - -if (!Array.prototype.lastIndexOf) { - Array.prototype.lastIndexOf = function(item, from) { - var len = this.length; - var i = from || len-1; - if (i < 0) { i += len; } - for (;i>-1;i--) { - if (i in this && this[i] === item) { return i; } - } - return -1; - } -} -if (!Array.lastIndexOf) { - Array.lastIndexOf = function(obj, item, from) { return Array.prototype.lastIndexOf.call(obj, item, from); } -} - -if (!Array.prototype.forEach) { - Array.prototype.forEach = function(cb, _this) { - var len = this.length; - for (var i=0;i<len;i++) { - if (i in this) { cb.call(_this, this[i], i, this); } - } - } -} -if (!Array.forEach) { - Array.forEach = function(obj, cb, _this) { Array.prototype.forEach.call(obj, cb, _this); } -} - -if (!Array.prototype.every) { - Array.prototype.every = function(cb, _this) { - var len = this.length; - for (var i=0;i<len;i++) { - if (i in this && !cb.call(_this, this[i], i, this)) { return false; } - } - return true; - } -} -if (!Array.every) { - Array.every = function(obj, cb, _this) { return Array.prototype.every.call(obj, cb, _this); } -} - -if (!Array.prototype.some) { - Array.prototype.some = function(cb, _this) { - var len = this.length; - for (var i=0;i<len;i++) { - if (i in this && cb.call(_this, this[i], i, this)) { return true; } - } - return false; - } -} -if (!Array.some) { - Array.some = function(obj, cb, _this) { return Array.prototype.some.call(obj, cb, _this); } -} - -if (!Array.prototype.map) { - Array.prototype.map = function(cb, _this) { - var len = this.length; - var res = new Array(len); - for (var i=0;i<len;i++) { - if (i in this) { res[i] = cb.call(_this, this[i], i, this); } - } - return res; - } -} -if (!Array.map) { - Array.map = function(obj, cb, _this) { return Array.prototype.map.call(obj, cb, _this); } -} - -if (!Array.prototype.filter) { - Array.prototype.filter = function(cb, _this) { - var len = this.length; - var res = []; - for (var i=0;i<len;i++) { - if (i in this) { - var val = this[i]; - if (cb.call(_this, val, i, this)) { res.push(val); } - } - } - return res; - } -} -if (!Array.filter) { - Array.filter = function(obj, cb, _this) { return Array.prototype.filter.call(obj, cb, _this); } -} diff --git a/basicsuite/webengine/content/rubiks/js/quaternion.js b/basicsuite/webengine/content/rubiks/js/quaternion.js deleted file mode 100644 index a44cfea..0000000 --- a/basicsuite/webengine/content/rubiks/js/quaternion.js +++ /dev/null @@ -1,78 +0,0 @@ -var Quaternion = OZ.Class(); - -Quaternion.fromRotation = function(axis, angle) { - var DEG2RAD = Math.PI/180; - var a = angle * DEG2RAD; - - var sin = Math.sin(a/2); - var cos = Math.cos(a/2); - - return new this( - axis[0]*sin, axis[1]*sin, axis[2]*sin, - cos - ); -} - -Quaternion.fromUnit = function() { - return new this(0, 0, 0, 1); -} - -Quaternion.prototype.init = function(x, y, z, w) { - this.x = x; - this.y = y; - this.z = z; - this.w = w; -} - -Quaternion.prototype.normalize = function() { - var norm = Math.sqrt(this.x*this.x + this.y*this.y + this.z*this.z + this.w*this.w); - return new this.constructor(this.x/norm, this.y/norm, this.z/norm, this.w/norm); -} - -Quaternion.prototype.conjugate = function() { - return new this.constructor(-this.x, -this.y, -this.z, this.w); -} - -Quaternion.prototype.toString = function() { - return [this.x, this.y, this.z, this.w].toString(", "); -} - -Quaternion.prototype.multiply = function(q) { - var p = this; - - var x = p.w*q.x + p.x*q.w + p.y*q.z - p.z*q.y; - var y = p.w*q.y + p.y*q.w + p.z*q.x - p.x*q.z; - var z = p.w*q.z + p.z*q.w + p.x*q.y - p.y*q.x; - var w = p.w*q.w - p.x*q.x - p.y*q.y - p.z*q.z; - - return new this.constructor(x, y, z, w); -} - -Quaternion.prototype.toAxis = function() { - return [this.x, this.y, this.z]; -} - -Quaternion.prototype.toAngle = function() { - var RAD2DEG = 180/Math.PI; - return RAD2DEG * 2 * Math.acos(this.w); -} - -Quaternion.prototype.toRotation = function() { - var axis = this.toAxis(); - var angle = this.toAngle(); - return "rotate3d(" + axis[0].toFixed(10) + "," + axis[1].toFixed(10) + "," + axis[2].toFixed(10) + "," + angle.toFixed(10) + "deg)"; -} - -Quaternion.prototype.toRotations = function() { - var RAD2DEG = 180/Math.PI; - - var x = RAD2DEG * Math.atan2(2*(this.w*this.x + this.y*this.z), 1 - 2*(this.x*this.x + this.y*this.y)); - var y = RAD2DEG * Math.asin(2*(this.w*this.y - this.x*this.z)); - var z = RAD2DEG * Math.atan2(2*(this.w*this.z + this.x*this.y), 1 - 2*(this.y*this.y + this.z*this.z)); - - if (x < 0) { x += 360; } - if (y < 0) { y += 360; } - if (z < 0) { z += 360; } - - return "rotateX(" + x.toFixed(10) + "deg) rotateY(" + y.toFixed(10) + "deg) rotate(" + z.toFixed(10) + "deg)"; -} diff --git a/basicsuite/webengine/content/rubiks/js/rubik.js b/basicsuite/webengine/content/rubiks/js/rubik.js deleted file mode 100644 index 72dbae7..0000000 --- a/basicsuite/webengine/content/rubiks/js/rubik.js +++ /dev/null @@ -1,492 +0,0 @@ -Array.prototype.clone = function() { - var c = []; - var len = this.length; - for (var i=0;i<len;i++) { c.push(this[i]); } - return c; -} - -Array.prototype.random = function() { - return this[Math.floor(Math.random()*this.length)]; -} - -var Face = OZ.Class(); -Face.SIZE = 100; -Face.LEFT = 0; -Face.RIGHT = 1; -Face.TOP = 2; -Face.BOTTOM = 3; -Face.FRONT = 4; -Face.BACK = 5; - -Face.ROTATION = [ - [Face.TOP, Face.FRONT, Face.BOTTOM, Face.BACK].reverse(), - [Face.LEFT, Face.BACK, Face.RIGHT, Face.FRONT].reverse(), - [Face.LEFT, Face.BOTTOM, Face.RIGHT, Face.TOP].reverse() -]; - -Face.prototype.init = function(cube, type) { - this._cube = cube; - this._type = type; - this._color = null; - this._node = OZ.DOM.elm("div", {className:"face face"+type, width:Face.SIZE+"px", height:Face.SIZE+"px", position:"absolute", left:"0px", top:"0px"}); - OZ.CSS3.set(this._node, "box-sizing", "border-box"); - OZ.CSS3.set(this._node, "backface-visibility", "hidden"); - - switch (type) { - case Face.LEFT: - OZ.CSS3.set(this._node, "transform-origin", "100% 50%"); - OZ.CSS3.set(this._node, "transform", "translate3d(-"+Face.SIZE+"px, 0px, 0px) rotateY(-90deg)"); - break; - case Face.RIGHT: - OZ.CSS3.set(this._node, "transform-origin", "0% 50%"); - OZ.CSS3.set(this._node, "transform", "translate3d("+Face.SIZE+"px, 0px, 0px) rotateY(90deg)"); - break; - case Face.TOP: - OZ.CSS3.set(this._node, "transform-origin", "50% 100%"); - OZ.CSS3.set(this._node, "transform", "translate3d(0px, -"+Face.SIZE+"px, 0px) rotateX(90deg)"); - break; - case Face.BOTTOM: - OZ.CSS3.set(this._node, "transform-origin", "50% 0%"); - OZ.CSS3.set(this._node, "transform", "translate3d(0px, "+Face.SIZE+"px, 0px) rotateX(-90deg)"); - break; - case Face.FRONT: - break; - case Face.BACK: - OZ.CSS3.set(this._node, "transform", "translate3d(0px, 0px, -"+Face.SIZE+"px) rotateY(180deg)"); - break; - } -} - -Face.prototype.getCube = function() { - return this._cube; -} - -Face.prototype.getNode = function() { - return this._node; -} - -Face.prototype.getType = function() { - return this._type; -} - -Face.prototype.setColor = function(color) { - this._color = color; - this._node.style.backgroundColor = color; -} - -Face.prototype.getColor = function() { - return this._color; -} - -var Cube = OZ.Class(); -Cube.prototype.init = function(position) { - this._rotation = null; - this._position = position; - this._node = OZ.DOM.elm("div", {className:"cube", position:"absolute", width:Face.SIZE+"px", height:Face.SIZE+"px"}); - this._faces = {}; - this._tmpFaces = {}; - OZ.CSS3.set(this._node, "transform-style", "preserve-3d"); - - this._update(); -} - -Cube.prototype.getFaces = function() { - return this._faces; -} - -Cube.prototype.setFace = function(type, color) { - if (!(type in this._faces)) { - var face = new Face(this, type); - this._node.appendChild(face.getNode()); - this._faces[type] = face; - } - this._faces[type].setColor(color); -} - -Cube.prototype.setRotation = function(rotation) { - this._rotation = rotation; - this._update(); -} - -Cube.prototype.complete = function() { - for (var i=0;i<6;i++) { - if (i in this._faces) { continue; } - this.addFace(i, "black"); - } -} - -Cube.prototype.prepareColorChange = function(sourceCube, rotation) { - this._tmpFaces = {}; - var sourceFaces = sourceCube.getFaces(); - for (var p in sourceFaces) { - var sourceType = parseInt(p); - var targetType = this._rotateType(sourceType, rotation); - this._tmpFaces[targetType] = sourceFaces[sourceType].getColor(); - } -} - -Cube.prototype.commitColorChange = function() { - var parent = this._node.parentNode; - parent.removeChild(this._node); - - OZ.DOM.clear(this._node); - this._faces = {}; - for (var p in this._tmpFaces) { - var type = parseInt(p); - this.setFace(type, this._tmpFaces[p]); - } - this._tmpFaces = {}; - - this._rotation = null; - this._update(); - parent.appendChild(this._node); -} - -Cube.prototype._rotateType = function(type, rotation) { - for (var i=0;i<3;i++) { - if (!rotation[i]) { continue; } - var faces = Face.ROTATION[i]; - var index = faces.indexOf(type); - if (index == -1) { continue; } /* no rotation available */ - index = (index + rotation[i] + faces.length) % faces.length; - return faces[index]; - } - - return type; -} - -Cube.prototype._update = function() { - var transform = ""; - transform += "translate3d("+(-Face.SIZE/2)+"px, "+(-Face.SIZE/2)+"px, "+(-Face.SIZE/2)+"px) "; - if (this._rotation) { transform += this._rotation + " "; } - - var half = Math.floor(Rubik.SIZE/2); - var x = this._position[0]; - var y = this._position[1]; - var z = -this._position[2]; - x -= half; - y -= half; - z += half + 1/2; - transform += "translate3d("+(x*Face.SIZE)+"px, "+(y*Face.SIZE)+"px, "+(z*Face.SIZE)+"px)"; - - var prop = OZ.CSS3.getProperty("transform"); - var val = this._rotation ? prop + " 300ms" : ""; - OZ.CSS3.set(this._node, "transition", val); - - OZ.CSS3.set(this._node, "transform", transform); -} - -Cube.prototype.getPosition = function() { - return this._position; -} - -Cube.prototype.getNode = function() { - return this._node; -} - -Cube.prototype.getFaces = function() { - return this._faces; -} - -var Rubik = OZ.Class(); -Rubik.SIZE = 3; -Rubik.prototype.init = function() { - this._cubes = []; - this._faces = []; - this._faceNodes = []; - this._help = {}; - this._drag = { - ec: [], - mouse: [], - face: null - }; - - this._rotation = Quaternion.fromRotation([1, 0, 0], -35).multiply(Quaternion.fromRotation([0, 1, 0], 45)); - this._node = OZ.DOM.elm("div", {position:"absolute", left:"50%", top:"55%", width:"0px", height:"0px"}); - document.body.appendChild(this._node); - - OZ.CSS3.set(document.body, "perspective", "460px"); - OZ.CSS3.set(this._node, "transform-style", "preserve-3d"); - - this._build(); - this._update(); - OZ.Event.add(document.body, "mousedown touchstart", this._dragStart.bind(this)); - - setTimeout(this.randomize.bind(this), 500); -} - -Rubik.prototype.randomize = function() { - var remain = 10; - var cb = function() { - remain--; - if (remain > 0) { - this._rotateRandom(); - } else { - OZ.Event.remove(e); - - this._help.a = OZ.DOM.elm("p", {innerHTML:"Drag or swipe the background to rotate the whole cube."}); - this._help.b = OZ.DOM.elm("p", {innerHTML:"Drag or swipe the cube to rotate its layers."}); - document.body.appendChild(this._help.a); - document.body.appendChild(this._help.b); - OZ.CSS3.set(this._help.a, "transition", "opacity 500ms"); - OZ.CSS3.set(this._help.b, "transition", "opacity 500ms"); - - } - } - var e = OZ.Event.add(null, "rotated", cb.bind(this)); - this._rotateRandom(); -} - -Rubik.prototype._rotateRandom = function() { - var method = "_rotate" + ["X", "Y", "Z"].random(); - var dir = [-1, 1].random(); - var layer = Math.floor(Math.random()*Rubik.SIZE); - this[method](dir, layer); -} - -Rubik.prototype._update = function() { - OZ.CSS3.set(this._node, "transform", "translateZ(" + (-Face.SIZE/2 - Face.SIZE) + "px) " + this._rotation.toRotation() + " translateZ("+(Face.SIZE/2)+"px)"); -} - -Rubik.prototype._eventToFace = function(e) { - if (document.elementFromPoint) { - e = (e.touches ? e.touches[0] : e); - var node = document.elementFromPoint(e.clientX, e.clientY); - } else { - var node = OZ.Event.target(e); - } - var index = this._faceNodes.indexOf(node); - if (index == -1) { return null; } - return this._faces[index]; -} - -Rubik.prototype._dragStart = function(e) { - this._faces = []; - this._faceNodes = []; - for (var i=0;i<this._cubes.length;i++) { - var faces = this._cubes[i].getFaces(); - for (var p in faces) { - this._faces.push(faces[p]); - this._faceNodes.push(faces[p].getNode()); - } - } - - OZ.Event.prevent(e); - this._drag.face = this._eventToFace(e); - e = (e.touches ? e.touches[0] : e); - this._drag.mouse = [e.clientX, e.clientY]; - - this._drag.ec.push(OZ.Event.add(document.body, "mousemove touchmove", this._dragMove.bind(this))); - this._drag.ec.push(OZ.Event.add(document.body, "mouseup touchend", this._dragEnd.bind(this))); -} - -Rubik.prototype._dragMove = function(e) { - if (e.touches && e.touches.length > 1) { return; } - - if (this._drag.face) { /* check second face for rotation */ - var thisFace = this._eventToFace(e); - if (!thisFace || thisFace == this._drag.face) { return; } - this._dragEnd(); - this._rotate(this._drag.face, thisFace); - } else { /* rotate cube */ - e = (e.touches ? e.touches[0] : e); - var mouse = [e.clientX, e.clientY]; - var dx = mouse[0] - this._drag.mouse[0]; - var dy = mouse[1] - this._drag.mouse[1]; - var norm = Math.sqrt(dx*dx+dy*dy); - if (!norm) { return; } - var N = [-dy/norm, dx/norm]; - - this._drag.mouse = mouse; - this._rotation = Quaternion.fromRotation([N[0], N[1], 0], norm/2).multiply(this._rotation); - this._update(); - } -} - -Rubik.prototype._dragEnd = function(e) { - while (this._drag.ec.length) { OZ.Event.remove(this._drag.ec.pop()); } - - if (!this._drag.face && this._help.a) { - this._help.a.style.opacity = 0; - this._help.a = null; - } -} - -Rubik.prototype._rotate = function(face1, face2) { - var t1 = face1.getType(); - var t2 = face2.getType(); - var pos1 = face1.getCube().getPosition(); - var pos2 = face2.getCube().getPosition(); - - /* find difference between cubes */ - var diff = 0; - var diffIndex = -1; - for (var i=0;i<3;i++) { - var d = pos1[i]-pos2[i]; - if (d) { - if (diffIndex != -1) { return; } /* different in >1 dimensions */ - diff = (d > 0 ? 1 : -1); - diffIndex = i; - } - } - - if (t1 == t2) { /* same face => diffIndex != -1 */ - switch (t1) { - case Face.FRONT: - case Face.BACK: - var coef = (t1 == Face.FRONT ? 1 : -1); - if (diffIndex == 0) { this._rotateY(coef*diff, pos1[1]); } else { this._rotateX(coef*diff, pos1[0]); } - break; - - case Face.LEFT: - case Face.RIGHT: - var coef = (t1 == Face.LEFT ? 1 : -1); - if (diffIndex == 2) { this._rotateY(-coef*diff, pos1[1]); } else { this._rotateZ(coef*diff, pos1[2]); } - break; - - case Face.TOP: - case Face.BOTTOM: - var coef = (t1 == Face.TOP ? 1 : -1); - if (diffIndex == 0) { this._rotateZ(-coef*diff, pos1[2]); } else { this._rotateX(-coef*diff, pos1[0]); } - break; - } - return; - } - - switch (t1) { /* different face => same cube, diffIndex == 1 */ - case Face.FRONT: - case Face.BACK: - var coef = (t1 == Face.FRONT ? 1 : -1); - if (t2 == Face.LEFT) { this._rotateY(1 * coef, pos1[1]); } - if (t2 == Face.RIGHT) { this._rotateY(-1 * coef, pos1[1]); } - if (t2 == Face.TOP) { this._rotateX(1 * coef, pos1[0]); } - if (t2 == Face.BOTTOM) { this._rotateX(-1 * coef, pos1[0]); } - break; - - case Face.LEFT: - case Face.RIGHT: - var coef = (t1 == Face.LEFT ? 1 : -1); - if (t2 == Face.FRONT) { this._rotateY(-1 * coef, pos1[1]); } - if (t2 == Face.BACK) { this._rotateY(1 * coef, pos1[1]); } - if (t2 == Face.TOP) { this._rotateZ(1 * coef, pos1[2]); } - if (t2 == Face.BOTTOM) { this._rotateZ(-1 * coef, pos1[2]); } - break; - - case Face.TOP: - case Face.BOTTOM: - var coef = (t1 == Face.TOP ? 1 : -1); - if (t2 == Face.FRONT) { this._rotateX(-1 * coef, pos1[0]); } - if (t2 == Face.BACK) { this._rotateX(1 * coef, pos1[0]); } - if (t2 == Face.LEFT) { this._rotateZ(-1 * coef, pos1[2]); } - if (t2 == Face.RIGHT) { this._rotateZ(1 * coef, pos1[2]); } - break; - } - -} - -Rubik.prototype._rotateX = function(dir, layer) { - var cubes = []; - for (var i=0;i<Rubik.SIZE*Rubik.SIZE;i++) { - cubes.push(this._cubes[layer + i*Rubik.SIZE]); - } - this._rotateCubes(cubes, [dir, 0, 0]); -} - -Rubik.prototype._rotateY = function(dir, layer) { - var cubes = []; - for (var i=0;i<Rubik.SIZE;i++) { - for (var j=0;j<Rubik.SIZE;j++) { - cubes.push(this._cubes[j + layer*Rubik.SIZE + i*Rubik.SIZE*Rubik.SIZE]); - } - } - this._rotateCubes(cubes, [0, -dir, 0]); -} - -Rubik.prototype._rotateZ = function(dir, layer) { - var cubes = []; - var offset = layer * Rubik.SIZE * Rubik.SIZE; - for (var i=0;i<Rubik.SIZE*Rubik.SIZE;i++) { - cubes.push(this._cubes[offset+i]); - } - this._rotateCubes(cubes, [0, 0, dir]); -} - -Rubik.prototype._rotateCubes = function(cubes, rotation) { - var suffixes = ["X", "Y", ""]; - - var prefix = OZ.CSS3.getPrefix("transition"); - if (prefix === null) { - this._finalizeRotation(cubes, rotation); - } else { - var cb = function() { - OZ.Event.remove(e); - this._finalizeRotation(cubes, rotation); - } - var e = OZ.Event.add(document.body, "webkitTransitionEnd transitionend MSTransitionEnd oTransitionEnd", cb.bind(this)); - - var str = ""; - for (var i=0;i<3;i++) { - if (!rotation[i]) { continue; } - str = "rotate" + suffixes[i] + "(" + (90*rotation[i]) + "deg)"; - } - for (var i=0;i<cubes.length;i++) { cubes[i].setRotation(str); } - } - -} - -/** - * Remap colors - */ -Rubik.prototype._finalizeRotation = function(cubes, rotation) { - var direction = 0; - for (var i=0;i<3;i++) { - if (rotation[i]) { direction = rotation[i]; } - } - - if (rotation[0]) { direction *= -1; } /* FIXME wtf */ - - var half = Math.floor(Rubik.SIZE/2); - - for (var i=0;i<cubes.length;i++) { - var x = i % Rubik.SIZE - half; - var y = Math.floor(i / Rubik.SIZE) - half; - - var source = [y*direction + half, -x*direction + half]; - var sourceIndex = source[0] + Rubik.SIZE*source[1]; - - cubes[i].prepareColorChange(cubes[sourceIndex], rotation); - } - - for (var i=0;i<cubes.length;i++) { cubes[i].commitColorChange(); } - - setTimeout(function() { - if (this._help.b) { - this._help.b.style.opacity = 0; - this._help.b = null; - } - - this.dispatch("rotated"); - }.bind(this), 100); -} - -Rubik.prototype._build = function() { - for (var z=0;z<Rubik.SIZE;z++) { - for (var y=0;y<Rubik.SIZE;y++) { - for (var x=0;x<Rubik.SIZE;x++) { - var cube = new Cube([x, y, z]); - this._cubes.push(cube); - - if (z == 0) { cube.setFace(Face.FRONT, "red"); } - if (z == 2) { cube.setFace(Face.BACK, "blue"); } - - if (x == 0) { cube.setFace(Face.LEFT, "green"); } - if (x == 2) { cube.setFace(Face.RIGHT, "yellow"); } - - if (y == 0) { cube.setFace(Face.TOP, "cyan"); } - if (y == 2) { cube.setFace(Face.BOTTOM, "teal"); } - this._node.appendChild(cube.getNode()); - } - } - } - -} diff --git a/basicsuite/webengine/content/rubiks/screenshot.png b/basicsuite/webengine/content/rubiks/screenshot.png Binary files differdeleted file mode 100644 index 45b0e37..0000000 --- a/basicsuite/webengine/content/rubiks/screenshot.png +++ /dev/null |