diff --git a/dash/src/app/(nav)/settings/page.tsx b/dash/src/app/(nav)/settings/page.tsx
index bfde0429..4a43d2a1 100644
--- a/dash/src/app/(nav)/settings/page.tsx
+++ b/dash/src/app/(nav)/settings/page.tsx
@@ -56,6 +56,16 @@ export default function SettingsPage() {
Show Drivers Mini Sectors
+
+
settings.setShowCompass(v)} />
+ Show Compass on Track Map
+
+
+
+
settings.setRotateTrackNorth(v)} />
+ Rotate the Track Map to Face North
+
+
settings.setRaceControlChime(v)} />
Play Race Control Chime
diff --git a/dash/src/components/Map.tsx b/dash/src/components/Map.tsx
index 46a20a42..cef3d358 100644
--- a/dash/src/components/Map.tsx
+++ b/dash/src/components/Map.tsx
@@ -33,6 +33,8 @@ type Corner = {
export default function Map() {
const showCornerNumbers = useSettingsStore((state) => state.showCornerNumbers);
+ const showCompass = useSettingsStore((state) => state.showCompass);
+ const rotateTrackNorth = useSettingsStore((state) => state.rotateTrackNorth);
const favoriteDrivers = useSettingsStore((state) => state.favoriteDrivers);
const positions = usePositionStore((state) => state.positions);
@@ -49,6 +51,7 @@ export default function Map() {
const [sectors, setSectors] = useState([]);
const [corners, setCorners] = useState([]);
const [rotation, setRotation] = useState(0);
+ const [compass, setCompass] = useState(null);
useEffect(() => {
(async () => {
@@ -58,7 +61,7 @@ export default function Map() {
const centerX = (Math.max(...mapJson.x) - Math.min(...mapJson.x)) / 2;
const centerY = (Math.max(...mapJson.y) - Math.min(...mapJson.y)) / 2;
- const fixedRotation = mapJson.rotation + ROTATION_FIX;
+ const fixedRotation = rotateTrackNorth ? 90 : mapJson.rotation + ROTATION_FIX;
const sectors = createSectors(mapJson).map((s) => ({
...s,
@@ -86,9 +89,13 @@ export default function Map() {
const cMinX = Math.min(...pointsX) - SPACE;
const cMinY = Math.min(...pointsY) - SPACE;
- const cWidthX = Math.max(...pointsX) - cMinX + SPACE * 2;
+ const cWidthX = Math.max(...pointsX) - cMinX + SPACE * 2 + 1000;
const cWidthY = Math.max(...pointsY) - cMinY + SPACE * 2;
+ const compassX = cMinX + cWidthX - 1500;
+ const compassY = cMinY + 1500;
+
+ setCompass({ x: compassX, y: compassY, angle: fixedRotation });
setCenter([centerX, centerY]);
setBounds([cMinX, cMinY, cWidthX, cWidthY]);
setSectors(sectors);
@@ -96,7 +103,7 @@ export default function Map() {
setRotation(fixedRotation);
setCorners(cornerPositions);
})();
- }, [circuitKey]);
+ }, [circuitKey, rotateTrackNorth]);
const yellowSectors = useMemo(() => findYellowSectors(raceControlMessages), [raceControlMessages]);
@@ -159,6 +166,8 @@ export default function Map() {
);
})}
+ {showCompass && compass && }
+
{showCornerNumbers &&
corners.map((corner) => (
);
};
+
+type CompassProps = {
+ x: number;
+ y: number;
+ angle: number;
+};
+
+const Compass = ({ x, y, angle }: CompassProps) => {
+ let northPos = rotate(0, 400, angle, 0, 0);
+ let sideDif = rotate(100, 0, angle, 0, 0);
+ return (
+ <>
+
+ N
+
+
+
+
+ >
+ );
+};
diff --git a/dash/src/stores/useSettingsStore.ts b/dash/src/stores/useSettingsStore.ts
index b0902181..e2c14b6a 100644
--- a/dash/src/stores/useSettingsStore.ts
+++ b/dash/src/stores/useSettingsStore.ts
@@ -25,6 +25,12 @@ type SettingsStore = {
showMiniSectors: boolean;
setShowMiniSectors: (showMiniSectors: boolean) => void;
+ showCompass: boolean;
+ setShowCompass: (showCompass: boolean) => void;
+
+ rotateTrackNorth: boolean;
+ setRotateTrackNorth: (rotateTrackNorth: boolean) => void;
+
favoriteDrivers: string[];
setFavoriteDrivers: (favoriteDrivers: string[]) => void;
removeFavoriteDriver: (driver: string) => void;
@@ -61,6 +67,12 @@ export const useSettingsStore = create(
showMiniSectors: true,
setShowMiniSectors: (showMiniSectors: boolean) => set({ showMiniSectors }),
+ showCompass: false,
+ setShowCompass: (showCompass: boolean) => set({ showCompass }),
+
+ rotateTrackNorth: false,
+ setRotateTrackNorth: (rotateTrackNorth: boolean) => set({ rotateTrackNorth }),
+
favoriteDrivers: [],
setFavoriteDrivers: (favoriteDrivers: string[]) => set({ favoriteDrivers }),
removeFavoriteDriver: (driver: string) =>