diff --git a/macrovision.js b/macrovision.js index 744380d6..e949c772 100644 --- a/macrovision.js +++ b/macrovision.js @@ -212,12 +212,15 @@ const entities = { } function constrainRel(coords) { + const worldWidth = config.height.toNumber("meters") / canvasHeight * canvasWidth; + const worldHeight = config.height.toNumber("meters"); + if (altHeld) { return coords; } return { - x: Math.min(Math.max(coords.x, 0), 1), - y: Math.min(Math.max(coords.y, 0), 1) + x: Math.min(Math.max(coords.x, -worldWidth / 2), worldWidth / 2), + y: Math.min(Math.max(coords.y, 0), worldHeight) } } function snapRel(coords) { @@ -228,20 +231,31 @@ function snapRel(coords) { } function adjustAbs(coords, oldHeight, newHeight) { - const ratio = math.divide(oldHeight, newHeight); - return { x: 0.5 + (coords.x - 0.5) * math.divide(oldHeight, newHeight), y: 1 + (coords.y - 1) * math.divide(oldHeight, newHeight) }; + return coords; } -function rel2abs(coords) { - return { x: coords.x * canvasWidth + 50, y: coords.y * canvasHeight }; +function pos2pix(coords) { + const worldWidth = config.height.toNumber("meters") / canvasHeight * canvasWidth; + const worldHeight = config.height.toNumber("meters"); + + const x = (coords.x / worldWidth + 0.5) * canvasWidth + 50; + const y = (1 - coords.y / worldHeight) * canvasHeight; + + return { x: x, y: y }; } -function abs2rel(coords) { - return { x: (coords.x - 50) / canvasWidth, y: coords.y / canvasHeight }; +function pix2pos(coords) { + const worldWidth = config.height.toNumber("meters") / canvasHeight * canvasWidth; + const worldHeight = config.height.toNumber("meters"); + + const x = (((coords.x - 50) / canvasWidth) - 0.5) * worldWidth; + const y = (1 - (coords.y / canvasHeight)) * worldHeight; + + return { x: x, y: y }; } function updateEntityElement(entity, element) { - const position = rel2abs({ x: element.dataset.x, y: element.dataset.y }); + const position = pos2pix({ x: element.dataset.x, y: element.dataset.y }); const view = entity.view; element.style.left = position.x + "px"; @@ -2246,7 +2260,7 @@ document.addEventListener("DOMContentLoaded", () => { if (e.dataTransfer.files.length > 0) { let entX = document.querySelector("#entities").getBoundingClientRect().x; let entY = document.querySelector("#entities").getBoundingClientRect().y; - let coords = abs2rel({x: e.clientX-entX, y: e.clientY-entY}); + let coords = pix2pos({x: e.clientX-entX, y: e.clientY-entY}); customEntityFromFile(e.dataTransfer.files[0], coords.x, coords.y); } }) @@ -2709,7 +2723,7 @@ function clearFilter() { document.addEventListener("mousemove", (e) => { if (clicked) { - const position = snapRel(abs2rel({ x: e.clientX - dragOffsetX, y: e.clientY - dragOffsetY })); + const position = snapRel(pix2pos({ x: e.clientX - dragOffsetX, y: e.clientY - dragOffsetY })); clicked.dataset.x = position.x; clicked.dataset.y = position.y; updateEntityElement(entities[clicked.dataset.key], clicked); @@ -2728,7 +2742,7 @@ document.addEventListener("touchmove", (e) => { let x = e.touches[0].clientX; let y = e.touches[0].clientY; - const position = snapRel(abs2rel({ x: x - dragOffsetX, y: y - dragOffsetY })); + const position = snapRel(pix2pos({ x: x - dragOffsetX, y: y - dragOffsetY })); clicked.dataset.x = position.x; clicked.dataset.y = position.y; updateEntityElement(entities[clicked.dataset.key], clicked); @@ -2980,7 +2994,7 @@ function renderToCanvas() { let x = parseFloat(element.dataset.x); let y = parseFloat(element.dataset.y); - let coords = rel2abs({x: x, y: y}); + let coords = pos2pix({x: x, y: y}); let offset = img.style.getPropertyValue("--offset"); offset = parseFloat(offset.substring(0, offset.length-1))