Files
Tessellate/src/tessellate.js
Gavin McDonald 1ba10b1f87 renaming things
2019-01-13 15:15:39 -05:00

308 lines
6.8 KiB
JavaScript

import * as utils from './utils';
import * as funky from './funky';
import OnTap from './onTap.js';
import Point from './point.js';
import Sketch from './sketch.js';
import DrawShapes from './drawShapes.js';
import DrawCircle from './drawCircle.js';
import DrawSquare from './drawSquare.js';
import DrawHexagon from './drawHexagon.js';
import Cell from './cell.js';
import CartographerFlatXY from './cartographerFlatXY.js';
import CartographerPointyXY from './cartographerPointyXY.js';
import CartographerFlatXYZ from './cartographerFlatXYZ.js';
import CartographerPointyXYZ from './cartographerPointyXYZ.js';
import {
HEX, CIRCLE, SQUARE,
TILE_STYLES,
BOARD_STYLES,
FLAT, POINTY,
ORIENTATION_STYLES,
FILL, OUTLINE,
DRAW_STYLES,
} from './consts.js';
const TILES = {
[HEX]: new DrawHexagon(),
[CIRCLE]: new DrawCircle(),
[SQUARE]: new DrawSquare(),
};
const Shapes = new DrawShapes();
const DEFAULTS = {
tile: HEX,
board: HEX,
orientation: FLAT,
negativeTiles: true,
tap: utils.noop,
pressStart: utils.noop,
press: utils.noop,
draw: utils.noop,
};
function selectCartographer(board, orientation) {
switch (board) {
case HEX:
switch (orientation) {
case FLAT: return CartographerFlatXYZ;
case POINTY: return CartographerPointyXYZ;
}
case SQUARE:
switch (orientation) {
case FLAT: return CartographerFlatXY;
case POINTY: return CartographerPointyXY;
}
}
}
export class Tessellate {
static get TILE_STYLES() {return TILE_STYLES}
static get BOARD_STYLES() {return BOARD_STYLES}
static get ORIENTATION_STYLES() {return ORIENTATION_STYLES}
static get DRAW_STYLES() {return DRAW_STYLES}
static get TILES() {return TILES}
static get Cell() {return Cell}
static get Shapes() {return Shapes}
static get utils() {return utils}
static get funky() {return funky}
constructor (settings) {
[
'checkSettings',
'tap',
'doubletap',
'pressStart',
'press',
'move',
'zoom',
'pixelToTile',
'tileToPixel',
'getLocationSets',
'draw',
'resize',
'remap',
].map(method => {this[method] = this[method].bind(this)});
this.checkSettings(settings);
this.sketch = new Sketch(Object.assign({
element: this.settings.element,
draw: this.draw,
resize: this.resize,
}, funky.pick(this.settings, ['drawDelay'])));
this.onTap = new OnTap(Object.assign({
element: this.settings.element,
tap: this.tap,
doubletap: this.doubletap,
pressStart: this.pressStart,
press: this.press,
move: this.move,
zoom: this.zoom,
}, funky.pick(this.settings, ['desktopPress', 'moveThreshold', 'doubletapThreshold', 'pressThreshold', 'wheelFactor'])));
const cartographer = selectCartographer(this.settings.board, this.settings.orientation);
this.cartographer = new cartographer(Object.assign(this.sketch.getSize(), funky.pick(this.settings, [
'adjustScaleMin',
'centerX',
'centerY',
'height',
'negativeTiles',
'radius',
'scale',
'width',
'wrap',
])));
}
checkSettings (settings) {
this.settings = Object.assign({}, DEFAULTS, settings);
this.settings.element = this.settings.element instanceof HTMLElement ? this.settings.element :
document.querySelector(this.settings.element);
if (this.settings.radius) {
this.settings.height = this.settings.radius * 2 + 1;
this.settings.width = this.settings.radius * 2 + 1;
}
if (this.settings.negativeTiles) {
if (this.settings.height && (this.settings.height % 2 === 0)) {
this.settings.height++;
}
if (this.settings.width && (this.settings.width % 2 === 0)) {
this.settings.width++;
}
}
}
tap (event) {
const point = new Point(event.offsetX, event.offsetY);
const tile = this.cartographer.pixelToTile(point);
const mapTile = this.cartographer.teleport(tile);
this.settings.tap({
event,
mapTile,
point,
tile,
});
}
doubletap (event) {
console.log('DOUBLETAP', event);
const point = new Point(event.offsetX, event.offsetY);
const tile = this.cartographer.pixelToTile(point);
const mapTile = this.cartographer.teleport(tile);
let tap = {
event,
map,
mapTile,
point,
tile
};
console.log(tap);
}
pressStart (event) {
const point = new Point(event.offsetX, event.offsetY);
const tile = this.cartographer.pixelToTile(point);
const mapTile = this.cartographer.teleport(tile);
let tap = {
event,
mapTile,
point,
tile
};
console.log(tap);
}
pressStart (event) {
const point = new Point(event.offsetX, event.offsetY);
const tile = this.cartographer.pixelToTile(point);
const mapTile = this.cartographer.teleport(tile);
this.settings.pressStart({
event,
mapTile,
point,
tile,
});
}
press (event) {
const point = new Point(event.offsetX, event.offsetY);
const tile = this.cartographer.pixelToTile(point);
const mapTile = this.cartographer.teleport(tile);
this.settings.press({
event,
mapTile,
point,
tile,
});
}
move (event) {
return this.cartographer.move(event);
}
zoom (event) {
this.cartographer.zoom(event);
}
pixelToTile (x, y) {
return this.cartographer.pixelToTile(x, y);
}
tileToPixel (tilePoint) {
return this.cartographer.tileToPixel(tilePoint);
}
getLocationSets ({upperLeftX, upperLeftY, lowerRightX, lowerRightY}) {
const upperLeft = new Point(upperLeftX, upperLeftY);
const upperRight = new Point(lowerRightX, 0);
const lowerLeft = new Point(0, lowerRightY);
const lowerRight = new Point(lowerRightX, lowerRightY);
return this.cartographer.boundingBox(upperLeft, upperRight, lowerLeft, lowerRight);
}
draw (context) {
const canvas = context.canvas;
const height = canvas.height;
const width = canvas.width;
const corners = {
upperLeftX: 0,
upperLeftY: 0,
lowerRightX: width,
lowerRightY: height
};
const locationSets = this.getLocationSets(corners);
this.settings.draw({
context,
height, width,
scale: this.cartographer.getScale(),
lastNow: context.lastUTC,
now: context.utc,
locationSets,
});
}
resize (event) {
const originX = this.cartographer.getOriginX();
const originY = this.cartographer.getOriginY();
const scaleOrig = this.cartographer.getScale();
const moveForResize = Object.assign({}, event, {
deltaX: event.deltaX / 2,
deltaY: event.deltaY / 2,
});
this.move(moveForResize);
this.cartographer.checkScale(event.height, event.width);
const centerX = event.width / 2;
const centerY = event.height / 2;
const scaleNew = this.cartographer.getScale();
const moveForScale = {
deltaX: (((centerX - originX) / scaleOrig) * (scaleOrig - scaleNew)),
deltaY: (((centerY - originY) / scaleOrig) * (scaleOrig - scaleNew)),
height: event.height,
width: event.width,
};
this.move(moveForScale);
}
remap ({height, width}) {
this.cartographer.remap(Object.assign({
height,
width,
}, this.sketch.getSize()));
}
}