summaryrefslogtreecommitdiff
path: root/client/assets/javascripts/rectangles/util
diff options
context:
space:
mode:
Diffstat (limited to 'client/assets/javascripts/rectangles/util')
-rw-r--r--client/assets/javascripts/rectangles/util/colors.js57
-rw-r--r--client/assets/javascripts/rectangles/util/constants.js57
-rw-r--r--client/assets/javascripts/rectangles/util/debug.js8
-rw-r--r--client/assets/javascripts/rectangles/util/keys.js165
-rw-r--r--client/assets/javascripts/rectangles/util/mouse.js165
-rw-r--r--client/assets/javascripts/rectangles/util/sort.js86
-rw-r--r--client/assets/javascripts/rectangles/util/wheel.js62
7 files changed, 600 insertions, 0 deletions
diff --git a/client/assets/javascripts/rectangles/util/colors.js b/client/assets/javascripts/rectangles/util/colors.js
new file mode 100644
index 0000000..e8e60d0
--- /dev/null
+++ b/client/assets/javascripts/rectangles/util/colors.js
@@ -0,0 +1,57 @@
+(function(){
+ var color_palettes = {
+ alpha: [
+ "rgba(0,0,0,0.1)",
+ ],
+ redblue: [
+ "rgba(0,0,0,0.2)",
+ "rgba(255,0,0,0.2)",
+ "rgba(0,0,255,0.2)",
+ "rgba(0,255,0,0.2)",
+ ],
+ gray: [
+ "rgba(0,0,0,0.1)",
+ "rgba(0,0,0,0.2)",
+ "rgba(0,0,0,0.3)",
+ "rgba(0,0,0,0.4)",
+ ],
+ bone: [
+ "hsla(0,0%,90%,0.95)",
+ "hsla(0,0%,80%,0.95)",
+ "hsla(0,0%,85%,0.95)",
+ "hsla(0,0%,75%,0.95)",
+ ],
+ colors: [
+ "rgba(255,0,0,0.5)",
+ "rgba(255,128,0,0.5)",
+ "rgba(128,255,0,0.5)",
+ "rgba(0,255,0,0.5)",
+ "rgba(0,255,128,0.5)",
+ "rgba(0,128,255,0.5)",
+ "rgba(0,0,255,0.5)",
+ "rgba(128,0,255,0.5)",
+ "rgba(255,0,255,0.5)",
+ "rgba(255,0,128,0.5)",
+ ],
+ white: [
+ "rgba(255,255,255,0.9)",
+ ],
+ black: [
+ "rgba(0,0,0,0.9)",
+ ],
+ }
+
+ var select = document.querySelector("#palette")
+ select.addEventListener("change", function(){
+ colors = color_palettes[select.value]
+ Rooms.list.forEach(function(room){
+ room.walls.forEach(function(wall){
+ wall.randomize_colors()
+ })
+ })
+ select.blur()
+ })
+
+ window.colors = color_palettes[select.value]
+ window.palettes = color_palettes
+})()
diff --git a/client/assets/javascripts/rectangles/util/constants.js b/client/assets/javascripts/rectangles/util/constants.js
new file mode 100644
index 0000000..58cb1a5
--- /dev/null
+++ b/client/assets/javascripts/rectangles/util/constants.js
@@ -0,0 +1,57 @@
+var FRONT = 0x1, BACK = 0x2, LEFT = 0x4, RIGHT = 0x8, FLOOR = 0x10, CEILING = 0x20
+ FRONT_BACK = FRONT | BACK, LEFT_RIGHT = LEFT | RIGHT, FLOOR_CEILING = FLOOR | CEILING
+
+var TOP = CEILING, BOTTOM = FLOOR,
+ TOP_LEFT = TOP | LEFT,
+ TOP_RIGHT = TOP | RIGHT,
+ BOTTOM_LEFT = BOTTOM | LEFT,
+ BOTTOM_RIGHT = BOTTOM | RIGHT,
+ TOP_BOTTOM = TOP | BOTTOM
+
+var height_min = 200,
+ height_max = 2000,
+ side_min = 10,
+ side_max = 5000,
+ resize_margin = 8,
+ cursor_amp = 1.5
+
+var painting_distance_from_wall = 8,
+ dot_distance_from_picture = 3
+
+var dot_hide_delay = 50, // ms
+ dot_side = 20
+
+var wall_rotation = {}
+wall_rotation[FRONT] = PI
+wall_rotation[BACK] = 0
+wall_rotation[LEFT] = HALF_PI
+wall_rotation[RIGHT] = -HALF_PI
+
+
+
+function sidesToString(sides){
+ var s = ""
+ if (sides & FRONT) s += "front "
+ if (sides & BACK) s += "back "
+ if (sides & LEFT) s += "left "
+ if (sides & RIGHT) s += "right "
+ if (sides & TOP) s += "top "
+ if (sides & BOTTOM) s += "bottom "
+ return s
+}
+
+function side_direction (a, b) {
+ if (a === b) return 0
+ if ((a | b) === FRONT_BACK) return 0
+ if ((a | b) === LEFT_RIGHT) return 0
+ switch (a) {
+ case FRONT:
+ return b & LEFT ? -1 : 1
+ case BACK:
+ return b & RIGHT ? -1 : 1
+ case LEFT:
+ return b & FRONT ? -1 : 1
+ case RIGHT:
+ return b & BACK ? -1 : 1
+ }
+}
diff --git a/client/assets/javascripts/rectangles/util/debug.js b/client/assets/javascripts/rectangles/util/debug.js
new file mode 100644
index 0000000..924c816
--- /dev/null
+++ b/client/assets/javascripts/rectangles/util/debug.js
@@ -0,0 +1,8 @@
+/*
+ on mousedown, z := true
+
+ if (z) // log stuff
+*/
+
+window.z = true;
+document.body.addEventListener("mousedown", function(){ z = true })
diff --git a/client/assets/javascripts/rectangles/util/keys.js b/client/assets/javascripts/rectangles/util/keys.js
new file mode 100644
index 0000000..5a5c9d2
--- /dev/null
+++ b/client/assets/javascripts/rectangles/util/keys.js
@@ -0,0 +1,165 @@
+var keys = (function(){
+
+ var base = new function(){}
+ base.tube = new Tube ()
+ base.debug = false
+
+ base.on = function(){
+ base.tube.on.apply(base.tube, arguments)
+ }
+
+ base.off = function(){
+ base.tube.off.apply(base.tube, arguments)
+ }
+
+ $(window).keydown(function(e){
+ var key = KEY_NAMES[e.keyCode];
+ switch (key) {
+ case undefined:
+ break;
+ default:
+ if (keys.debug) console.log(key)
+ base.tube(key)
+ break;
+ }
+ })
+ var KEYMAP = {
+ STRG: 17,
+ CTRL: 17,
+ CTRLRIGHT: 18,
+ CTRLR: 18,
+ SHIFT: 16,
+ RETURN: 13,
+ ENTER: 13,
+ BACKSPACE: 8,
+ BCKSP:8,
+ ALT: 18,
+ ALTR: 17,
+ ALTRIGHT: 17,
+ SPACE: 32,
+ WIN: 91,
+ MAC: 91,
+ FN: null,
+ UP: 38,
+ DOWN: 40,
+ LEFT: 37,
+ RIGHT: 39,
+ ESC: 27,
+ DEL: 46,
+ F1: 112,
+ F2: 113,
+ F3: 114,
+ F4: 115,
+ F5: 116,
+ F6: 117,
+ F7: 118,
+ F8: 119,
+ F9: 120,
+ F10: 121,
+ F11: 122,
+ F12: 123
+ },
+ KEYCODES = {
+ 'backspace' : '8',
+ 'tab' : '9',
+ 'enter' : '13',
+ 'shift' : '16',
+ 'ctrl' : '17',
+ 'alt' : '18',
+ 'pause_break' : '19',
+ 'caps_lock' : '20',
+ 'escape' : '27',
+ 'page_up' : '33',
+ 'page down' : '34',
+ 'end' : '35',
+ 'home' : '36',
+ 'left_arrow' : '37',
+ 'up_arrow' : '38',
+ 'right_arrow' : '39',
+ 'down_arrow' : '40',
+ 'insert' : '45',
+ 'delete' : '46',
+ '0' : '48',
+ '1' : '49',
+ '2' : '50',
+ '3' : '51',
+ '4' : '52',
+ '5' : '53',
+ '6' : '54',
+ '7' : '55',
+ '8' : '56',
+ '9' : '57',
+ 'a' : '65',
+ 'b' : '66',
+ 'c' : '67',
+ 'd' : '68',
+ 'e' : '69',
+ 'f' : '70',
+ 'g' : '71',
+ 'h' : '72',
+ 'i' : '73',
+ 'j' : '74',
+ 'k' : '75',
+ 'l' : '76',
+ 'm' : '77',
+ 'n' : '78',
+ 'o' : '79',
+ 'p' : '80',
+ 'q' : '81',
+ 'r' : '82',
+ 's' : '83',
+ 't' : '84',
+ 'u' : '85',
+ 'v' : '86',
+ 'w' : '87',
+ 'x' : '88',
+ 'y' : '89',
+ 'z' : '90',
+ 'left_window key' : '91',
+ 'right_window key' : '92',
+ 'select_key' : '93',
+ 'numpad 0' : '96',
+ 'numpad 1' : '97',
+ 'numpad 2' : '98',
+ 'numpad 3' : '99',
+ 'numpad 4' : '100',
+ 'numpad 5' : '101',
+ 'numpad 6' : '102',
+ 'numpad 7' : '103',
+ 'numpad 8' : '104',
+ 'numpad 9' : '105',
+ 'multiply' : '106',
+ 'add' : '107',
+ 'subtract' : '109',
+ 'decimal point' : '110',
+ 'divide' : '111',
+ 'f1' : '112',
+ 'f2' : '113',
+ 'f3' : '114',
+ 'f4' : '115',
+ 'f5' : '116',
+ 'f6' : '117',
+ 'f7' : '118',
+ 'f8' : '119',
+ 'f9' : '120',
+ 'f10' : '121',
+ 'f11' : '122',
+ 'f12' : '123',
+ 'num_lock' : '144',
+ 'scroll_lock' : '145',
+ 'semi_colon' : '186',
+ 'equal_sign' : '187',
+ 'comma' : '188',
+ 'dash' : '189',
+ 'period' : '190',
+ 'forward_slash' : '191',
+ 'grave_accent' : '192',
+ 'open_bracket' : '219',
+ 'backslash' : '220',
+ 'closebracket' : '221',
+ 'single_quote' : '222'
+ }
+ var KEY_NAMES = invert_hash(KEYCODES)
+
+ return base
+})() \ No newline at end of file
diff --git a/client/assets/javascripts/rectangles/util/mouse.js b/client/assets/javascripts/rectangles/util/mouse.js
new file mode 100644
index 0000000..3aa7cfc
--- /dev/null
+++ b/client/assets/javascripts/rectangles/util/mouse.js
@@ -0,0 +1,165 @@
+/*
+ usage:
+
+ base.mouse = new mouse({
+ el: document.querySelector("#map"),
+ down: function(e, cursor){
+ // do something with val
+ // cursor.x.a
+ // cursor.y.a
+ },
+ move: function(e, cursor, delta){
+ // delta.a (x)
+ // delta.b (y)
+ },
+ up: function(e, cursor, new_cursor){
+ // cursor.x.a
+ // cursor.y.a
+ },
+ })
+
+*/
+
+function mouse (opt) {
+ var base = this
+
+ opt = defaults(opt, {
+ el: null,
+ down: null,
+ move: null,
+ drag: null,
+ enter: null,
+ up: null,
+ rightclick: null,
+ propagate: false,
+ locked: false,
+ use_offset: true,
+ val: 0,
+ })
+
+ base.down = false
+
+ base.creating = false
+ base.dragging = false
+
+ base.cursor = new Rect(0,0,0,0)
+
+ base.tube = new Tube ()
+ opt.down && base.tube.on("down", opt.down)
+ opt.move && base.tube.on("move", opt.move)
+ opt.drag && base.tube.on("drag", opt.drag)
+ opt.enter && base.tube.on("enter", opt.enter)
+ opt.leave && base.tube.on("leave", opt.leave)
+ opt.up && base.tube.on("up", opt.up)
+ opt.rightclick && base.tube.on("rightclick", opt.rightclick)
+
+ var offset = (opt.use_offset && opt.el) ? opt.el.getBoundingClientRect() : null
+
+ base.init = function (){
+ base.bind()
+ }
+
+ base.on = function(){
+ base.tube.on.apply(base.tube, arguments)
+ }
+
+ base.off = function(){
+ base.tube.off.apply(base.tube, arguments)
+ }
+
+ base.bind = function(){
+ if (opt.el) {
+ opt.el.addEventListener("mousedown", base.mousedown)
+ opt.el.addEventListener("contextmenu", base.contextmenu)
+ }
+ window.addEventListener("mousemove", base.mousemove)
+ window.addEventListener("mouseup", base.mouseup)
+ }
+
+ base.bind_el = function(el){
+ el.addEventListener("mousedown", base.mousedown)
+ el.addEventListener("mousemove", base.mousemove)
+ }
+ base.unbind_el = function(el){
+ el.removeEventListener("mousedown", base.mousedown)
+ el.removeEventListener("mousemove", base.mousemove)
+ }
+
+ function positionFromMouse(e) {
+ if (offset) {
+ return new vec2(offset.left - e.pageX, e.pageY - offset.top)
+ }
+ else {
+ return new vec2(e.pageX, e.pageY)
+ }
+ }
+
+ base.mousedown = function(e){
+ e.stopPropagation()
+
+ if (opt.use_offset) {
+ offset = this.getBoundingClientRect()
+ }
+
+ var pos = positionFromMouse(e)
+
+ var x = pos.a, y = pos.b
+ base.cursor = new Rect (x,y, x,y)
+ base.down = true
+
+ base.tube("down", e, base.cursor)
+ }
+ base.mousemove = function(e){
+ e.stopPropagation()
+
+ if (opt.use_offset && ! offset) return
+
+ var pos = positionFromMouse(e)
+
+ if (e.shiftKey) {
+ pos.quantize(10)
+ }
+
+ var x = pos.a, y = pos.b
+
+ if (base.down) {
+ base.cursor.x.b = x
+ base.cursor.y.b = y
+ base.tube("drag", e, base.cursor)
+ }
+ else {
+ base.cursor.x.a = base.cursor.x.b = x
+ base.cursor.y.a = base.cursor.y.b = y
+ base.tube("move", e, base.cursor)
+ }
+ }
+ base.mouseenter = function(e, el){
+ if (! base.down) return
+ if (opt.use_offset && ! offset) return
+ base.tube("enter", e, el, base.cursor)
+ }
+ base.mouseleave = function(e, el){
+ if (! base.down) return
+ if (opt.use_offset && ! offset) return
+ base.tube("leave", e, el, base.cursor)
+ }
+ base.mouseup = function(e){
+ var pos, new_cursor
+
+ if (base.down) {
+ e.stopPropagation()
+ base.down = false
+ pos = positionFromMouse(e)
+ new_cursor = new Rect (pos.a, pos.b)
+ base.tube("up", e, base.cursor, new_cursor)
+ base.cursor = new_cursor
+ }
+ }
+ base.contextmenu = function(e){
+ e.preventDefault()
+ base.tube("rightclick", e, base.cursor)
+ }
+
+ base.init()
+}
+
diff --git a/client/assets/javascripts/rectangles/util/sort.js b/client/assets/javascripts/rectangles/util/sort.js
new file mode 100644
index 0000000..0985b75
--- /dev/null
+++ b/client/assets/javascripts/rectangles/util/sort.js
@@ -0,0 +1,86 @@
+
+
+function compare_rect_position(a,b){
+ if (a[0].x.a < b[0].x.a) {
+ return -1
+ }
+ if (a[0].x.a > b[0].x.a) {
+ return 1
+ }
+ if (a[0].y.a < b[0].y.a) {
+ return -1
+ }
+ if (a[0].y.a > b[0].y.a) {
+ return 1
+ }
+ return 0
+}
+
+function compare_car_reversed (a,b){
+ if (a[0] < b[0]) {
+ return 1
+ }
+ if (a[0] > b[0]) {
+ return -1
+ }
+ return 0
+}
+function compare_car (a,b){
+ if (a[0] < b[0]) {
+ return -1
+ }
+ if (a[0] > b[0]) {
+ return 1
+ }
+ return 0
+}
+
+function room_id_tuple (r){ return [r.id, r] }
+function room_height_tuple (r){ return [r.height, r] }
+function room_area_tuple (r){ return [r.rect.area(), r] }
+function rect_area_tuple (r){ return [r.area(), r] }
+
+function room_rect_tuple (r){ return [r.rect, r] }
+function identity_tuple (r){ return [r, r] }
+function car (r){ return r[0] }
+function cdr (r){ return r[1] }
+
+
+function sort_rooms_by_id(list){
+ return list.map(room_id_tuple)
+ .sort(compare_car)
+ .map(cdr)
+}
+function sort_rooms_by_height(list){
+ return list.map(room_height_tuple)
+ .sort(compare_car_reversed)
+ .map(cdr)
+}
+function sort_rooms_by_position(list){
+ return list.map(room_rect_tuple)
+ .sort(compare_rect_position)
+ .map(cdr)
+}
+function sort_rooms_by_area(list){
+ return list.map(room_area_tuple)
+ .sort(compare_car)
+ .map(cdr)
+}
+
+function sort_rects_by_position(list){
+ return list.map(identity_tuple)
+ .sort(compare_rect_position)
+ .map(cdr)
+}
+function sort_rects_by_area(list){
+ return list.map(rect_area_tuple)
+ .sort(compare_car)
+ .map(cdr)
+}
+
+function compare_z(a,b){
+ return a.rect.y.a < b.rect.y.a ? -1 : a.rect.y.a == b.rect.y.a ? 0 : 1
+}
+function compare_x(a,b){
+ return a.rect.x.a > b.rect.x.a ? -1 : a.rect.x.a == b.rect.x.a ? 0 : 1
+}
diff --git a/client/assets/javascripts/rectangles/util/wheel.js b/client/assets/javascripts/rectangles/util/wheel.js
new file mode 100644
index 0000000..6836772
--- /dev/null
+++ b/client/assets/javascripts/rectangles/util/wheel.js
@@ -0,0 +1,62 @@
+/*
+ usage:
+
+ base.wheel = new wheel({
+ el: document.querySelector("#map"),
+ update: function(e, val, delta){
+ // do something with val
+ },
+ })
+
+*/
+
+function wheel (opt) {
+ opt = defaults(opt, {
+ el: document,
+ fn: function(e, val, delta){},
+ propagate: false,
+ locked: false,
+ reversible: true,
+ ratio: 0.02,
+ val: 0,
+ })
+
+ opt.el.addEventListener('mousewheel', onMouseWheel, false);
+ opt.el.addEventListener('DOMMouseScroll', onMouseWheel, false);
+
+ function onMouseWheel (e) {
+ if (opt.locked) {
+ return
+ }
+ if (! opt.propagate) {
+ e.stopPropagation()
+ e.preventDefault()
+ }
+
+ var delta = 0;
+
+ // WebKit
+ if ( event.wheelDeltaY ) {
+ delta -= event.wheelDeltaY * opt.ratio
+ }
+ // Opera / Explorer 9
+ else if ( event.wheelDelta ) {
+ delta -= event.wheelDelta * opt.ratio
+ }
+ // Firefox
+ else if ( event.detail ) {
+ delta += event.detail * 2
+ }
+ if (! opt.reversible && delta < 0) return;
+
+ opt.val = clamp(opt.val + delta, opt.min, opt.max)
+
+ opt.update(e, opt.val, delta)
+ }
+
+ opt.lock = function(){ opt.locked = true }
+ opt.unlock = function(){ opt.locked = false }
+
+ return opt
+}
+