diff options
Diffstat (limited to 'public/assets/javascripts/rectangles/util')
| -rw-r--r-- | public/assets/javascripts/rectangles/util/colors.js | 57 | ||||
| -rw-r--r-- | public/assets/javascripts/rectangles/util/constants.js | 57 | ||||
| -rw-r--r-- | public/assets/javascripts/rectangles/util/debug.js | 8 | ||||
| -rw-r--r-- | public/assets/javascripts/rectangles/util/keys.js | 165 | ||||
| -rw-r--r-- | public/assets/javascripts/rectangles/util/mouse.js | 165 | ||||
| -rw-r--r-- | public/assets/javascripts/rectangles/util/sort.js | 86 | ||||
| -rw-r--r-- | public/assets/javascripts/rectangles/util/wheel.js | 62 |
7 files changed, 600 insertions, 0 deletions
diff --git a/public/assets/javascripts/rectangles/util/colors.js b/public/assets/javascripts/rectangles/util/colors.js new file mode 100644 index 0000000..e8e60d0 --- /dev/null +++ b/public/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/public/assets/javascripts/rectangles/util/constants.js b/public/assets/javascripts/rectangles/util/constants.js new file mode 100644 index 0000000..58cb1a5 --- /dev/null +++ b/public/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/public/assets/javascripts/rectangles/util/debug.js b/public/assets/javascripts/rectangles/util/debug.js new file mode 100644 index 0000000..924c816 --- /dev/null +++ b/public/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/public/assets/javascripts/rectangles/util/keys.js b/public/assets/javascripts/rectangles/util/keys.js new file mode 100644 index 0000000..5a5c9d2 --- /dev/null +++ b/public/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/public/assets/javascripts/rectangles/util/mouse.js b/public/assets/javascripts/rectangles/util/mouse.js new file mode 100644 index 0000000..3aa7cfc --- /dev/null +++ b/public/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/public/assets/javascripts/rectangles/util/sort.js b/public/assets/javascripts/rectangles/util/sort.js new file mode 100644 index 0000000..0985b75 --- /dev/null +++ b/public/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/public/assets/javascripts/rectangles/util/wheel.js b/public/assets/javascripts/rectangles/util/wheel.js new file mode 100644 index 0000000..6836772 --- /dev/null +++ b/public/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 +} + |
