grungnet/src/hooks/useGridSnapping.js

84 lines
2.1 KiB
JavaScript
Raw Normal View History

import Vector2 from "../helpers/Vector2";
2021-02-07 00:16:36 +00:00
import {
getCellLocation,
getNearestCellCoordinates,
getCellCorners,
} from "../helpers/grid";
import useSetting from "./useSetting";
2021-03-12 00:02:58 +00:00
import {
useGrid,
useGridOffset,
useGridCellPixelSize,
useGridCellPixelOffset,
} from "../contexts/GridContext";
/**
* Returns a function that when called will snap a node to the current grid
* @param {number=} snappingSensitivity 1 = Always snap, 0 = never snap if undefined the default user setting will be used
*/
function useGridSnapping(snappingSensitivity) {
const [defaultSnappingSensitivity] = useSetting(
"map.gridSnappingSensitivity"
);
snappingSensitivity = snappingSensitivity || defaultSnappingSensitivity;
2021-03-12 00:02:58 +00:00
const grid = useGrid();
const gridOffset = useGridOffset();
const gridCellPixelSize = useGridCellPixelSize();
const gridCellPixelOffset = useGridCellPixelOffset();
/**
* @param {Vector2} node The node to snap
*/
function snapPositionToGrid(position) {
2021-02-07 00:16:36 +00:00
// Account for grid offset
let offsetPosition = Vector2.subtract(
Vector2.subtract(position, gridOffset),
gridCellPixelOffset
);
2021-02-07 00:16:36 +00:00
const nearsetCell = getNearestCellCoordinates(
grid,
offsetPosition.x,
offsetPosition.y,
gridCellPixelSize
);
const cellPosition = getCellLocation(
grid,
nearsetCell.x,
nearsetCell.y,
gridCellPixelSize
);
2021-02-07 00:16:36 +00:00
const cellCorners = getCellCorners(
grid,
cellPosition.x,
cellPosition.y,
gridCellPixelSize
);
2021-02-07 00:16:36 +00:00
const snapPoints = [cellPosition, ...cellCorners];
for (let snapPoint of snapPoints) {
const distanceToSnapPoint = Vector2.distance(offsetPosition, snapPoint);
if (
distanceToSnapPoint <
Vector2.min(gridCellPixelSize) * snappingSensitivity
2021-02-07 00:16:36 +00:00
) {
// Reverse grid offset
let offsetSnapPoint = Vector2.add(
Vector2.add(snapPoint, gridOffset),
gridCellPixelOffset
);
return offsetSnapPoint;
2021-02-07 00:16:36 +00:00
}
}
return position;
}
return snapPositionToGrid;
}
export default useGridSnapping;