From 6147415da920d21e26c9f2eb7fe86eac7a685b3c Mon Sep 17 00:00:00 2001 From: Ivan Date: Tue, 14 Apr 2026 19:35:13 -0500 Subject: [PATCH] feat(network-visualiser): add utility functions for trail positioning and view bounds, and define visualiser constants --- .../network-visualiser/internal/trailUtils.js | 16 ++++++++++++++++ .../network-visualiser/internal/viewBounds.js | 17 +++++++++++++++++ .../internal/visualiserConstants.js | 1 + 3 files changed, 34 insertions(+) create mode 100644 meshchatx/src/frontend/components/network-visualiser/internal/trailUtils.js create mode 100644 meshchatx/src/frontend/components/network-visualiser/internal/viewBounds.js create mode 100644 meshchatx/src/frontend/components/network-visualiser/internal/visualiserConstants.js diff --git a/meshchatx/src/frontend/components/network-visualiser/internal/trailUtils.js b/meshchatx/src/frontend/components/network-visualiser/internal/trailUtils.js new file mode 100644 index 0000000..379eb2f --- /dev/null +++ b/meshchatx/src/frontend/components/network-visualiser/internal/trailUtils.js @@ -0,0 +1,16 @@ +export function getPositionAlongTrail(trail, distBehind) { + if (!trail || trail.length === 0) return { x: 0, y: 0 }; + if (trail.length === 1) return { ...trail[0] }; + let d = 0; + for (let i = trail.length - 1; i > 0; i--) { + const p = trail[i]; + const q = trail[i - 1]; + const seg = Math.hypot(p.x - q.x, p.y - q.y); + if (d + seg >= distBehind) { + const t = seg > 0 ? (distBehind - d) / seg : 0; + return { x: p.x + (q.x - p.x) * t, y: p.y + (q.y - p.y) * t }; + } + d += seg; + } + return { ...trail[0] }; +} diff --git a/meshchatx/src/frontend/components/network-visualiser/internal/viewBounds.js b/meshchatx/src/frontend/components/network-visualiser/internal/viewBounds.js new file mode 100644 index 0000000..435c008 --- /dev/null +++ b/meshchatx/src/frontend/components/network-visualiser/internal/viewBounds.js @@ -0,0 +1,17 @@ +export function getViewCanvasBounds(network) { + const container = document.getElementById("network"); + if (!container || !network) return null; + const scale = network.getScale(); + const vp = network.getViewPosition(); + const w = container.clientWidth; + const h = container.clientHeight; + const halfW = w / (2 * scale); + const halfH = h / (2 * scale); + return { + left: vp.x - halfW, + right: vp.x + halfW, + top: vp.y - halfH, + bottom: vp.y + halfH, + scale, + }; +} diff --git a/meshchatx/src/frontend/components/network-visualiser/internal/visualiserConstants.js b/meshchatx/src/frontend/components/network-visualiser/internal/visualiserConstants.js new file mode 100644 index 0000000..6dd3096 --- /dev/null +++ b/meshchatx/src/frontend/components/network-visualiser/internal/visualiserConstants.js @@ -0,0 +1 @@ +export const PONG_NODE_IDS = ["__pong_ball", "__pong_pad_l", "__pong_pad_r", "__pong_hud"];