Non-square tokens are now fully supported on square grids (fixes #116)
This commit is contained in:
+44
-16
@@ -10,7 +10,8 @@ export function getSnapPointForToken(x, y, token) {
|
|||||||
if (canvas.grid.type === CONST.GRID_TYPES.GRIDLESS) {
|
if (canvas.grid.type === CONST.GRID_TYPES.GRIDLESS) {
|
||||||
return new PIXI.Point(x, y);
|
return new PIXI.Point(x, y);
|
||||||
}
|
}
|
||||||
if (canvas.grid.isHex && game.modules.get("hex-size-support")?.active && CONFIG.hexSizeSupport.getAltSnappingFlag(token)) {
|
if (canvas.grid.isHex) {
|
||||||
|
if (game.modules.get("hex-size-support")?.active && CONFIG.hexSizeSupport.getAltSnappingFlag(token)) {
|
||||||
if (token.document.getFlag("hex-size-support", "borderSize") % 2 === 0) {
|
if (token.document.getFlag("hex-size-support", "borderSize") % 2 === 0) {
|
||||||
const snapPoint = CONFIG.hexSizeSupport.findVertexSnapPoint(x, y, token, canvas.grid.grid)
|
const snapPoint = CONFIG.hexSizeSupport.findVertexSnapPoint(x, y, token, canvas.grid.grid)
|
||||||
return new PIXI.Point(snapPoint.x, snapPoint.y)
|
return new PIXI.Point(snapPoint.x, snapPoint.y)
|
||||||
@@ -19,24 +20,51 @@ export function getSnapPointForToken(x, y, token) {
|
|||||||
return new PIXI.Point(...canvas.grid.getCenter(x, y))
|
return new PIXI.Point(...canvas.grid.getCenter(x, y))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Tiny tokens can snap to the cells corners
|
else {
|
||||||
if (!canvas.grid.isHex && token.data.width <= 0.5) {
|
return new PIXI.Point(...canvas.grid.getCenter(x, y));
|
||||||
const [topLeftX, topLeftY] = canvas.grid.getTopLeft(x, y);
|
|
||||||
const offsetX = x - topLeftX;
|
|
||||||
const offsetY = y - topLeftY;
|
|
||||||
const subGridWidth = Math.floor(canvas.grid.w / 2);
|
|
||||||
const subGridHeight = Math.floor(canvas.grid.h / 2);
|
|
||||||
const subGridPosX = Math.floor(offsetX / subGridWidth);
|
|
||||||
const subGridPosY = Math.floor(offsetY / subGridHeight);
|
|
||||||
return new PIXI.Point(topLeftX + (subGridPosX + 0.5) * subGridWidth, topLeftY + (subGridPosY + 0.5) * subGridHeight);
|
|
||||||
}
|
}
|
||||||
// Hex tokens, tokens with odd multipliers (1x1, 3x3, ...) and tokens smaller than 1x1 but bigger than 0.5x0.5 snap to the center of the grid cell
|
}
|
||||||
if (canvas.grid.isHex || Math.round(token.data.width) % 2 === 1 || token.data.width < 1) {
|
|
||||||
return new PIXI.Point(...canvas.grid.getCenter(x, y))
|
const [topLeftX, topLeftY] = canvas.grid.getTopLeft(x, y);
|
||||||
|
let cellX, cellY;
|
||||||
|
if (token.data.width % 2 === 0)
|
||||||
|
cellX = x - canvas.grid.h / 2;
|
||||||
|
else
|
||||||
|
cellX = x;
|
||||||
|
if (token.data.height % 2 === 0)
|
||||||
|
cellY = y - canvas.grid.h / 2;
|
||||||
|
else
|
||||||
|
cellY = y;
|
||||||
|
const [centerX, centerY] = canvas.grid.getCenter(cellX, cellY);
|
||||||
|
let snapX, snapY;
|
||||||
|
// Tiny tokens can snap to the cells corners
|
||||||
|
if (token.data.width <= 0.5) {
|
||||||
|
const offsetX = x - topLeftX;
|
||||||
|
const subGridWidth = Math.floor(canvas.grid.w / 2);
|
||||||
|
const subGridPosX = Math.floor(offsetX / subGridWidth);
|
||||||
|
snapX = topLeftX + (subGridPosX + 0.5) * subGridWidth;
|
||||||
|
}
|
||||||
|
// Tokens with odd multipliers (1x1, 3x3, ...) and tokens smaller than 1x1 but bigger than 0.5x0.5 snap to the center of the grid cell
|
||||||
|
else if (Math.round(token.data.width) % 2 === 1 || token.data.width < 1) {
|
||||||
|
snapX = centerX;
|
||||||
}
|
}
|
||||||
// All remaining tokens (those with even or fractional multipliers on square grids) snap to the intersection points of the grid
|
// All remaining tokens (those with even or fractional multipliers on square grids) snap to the intersection points of the grid
|
||||||
const [snappedX, snappedY] = canvas.grid.getCenter(x - canvas.grid.w / 2, y - canvas.grid.h / 2)
|
else {
|
||||||
return new PIXI.Point(snappedX + canvas.grid.w / 2, snappedY + canvas.grid.h / 2)
|
snapX = centerX + canvas.grid.w / 2;
|
||||||
|
}
|
||||||
|
if (token.data.height <= 0.5) {
|
||||||
|
const offsetY = y - topLeftY;
|
||||||
|
const subGridHeight = Math.floor(canvas.grid.h / 2);
|
||||||
|
const subGridPosY = Math.floor(offsetY / subGridHeight);
|
||||||
|
snapY = topLeftY + (subGridPosY + 0.5) * subGridHeight;
|
||||||
|
}
|
||||||
|
else if (Math.round(token.data.height) % 2 === 1 || token.data.height < 1) {
|
||||||
|
snapY = centerY;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
snapY = centerY + canvas.grid.h / 2;
|
||||||
|
}
|
||||||
|
return new PIXI.Point(snapX, snapY);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getSnapPointForMeasuredTemplate(x, y) {
|
export function getSnapPointForMeasuredTemplate(x, y) {
|
||||||
|
|||||||
Reference in New Issue
Block a user