Skip to content
Merged
Show file tree
Hide file tree
Changes from 14 commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
c8be19b
Sightline: editable top times, cancel sweeps, multi-DEM, native resol…
devin-ai-integration[bot] Jul 8, 2026
eddf540
chore: bump version to 5.2.16-20260708 [version bump]
github-actions[bot] Jul 8, 2026
92beab8
Sightline: remove legacy variables.dem config schema field
devin-ai-integration[bot] Jul 8, 2026
b2c84fa
Sightline: cancel sweep via floating x over Sweep progress button
devin-ai-integration[bot] Jul 8, 2026
a29cabf
Sightline: keep Sweep button full width with floating cancel x
devin-ai-integration[bot] Jul 8, 2026
3f355cc
Sightline: revert to relative-scale resolution, drop native label, ad…
devin-ai-integration[bot] Jul 8, 2026
6254132
Revert accidental regenerated src/pre/components.js change
devin-ai-integration[bot] Jul 8, 2026
1a158f2
Sightline: always show DEM dropdown with native resolution, cap effec…
devin-ai-integration[bot] Jul 8, 2026
63e5645
Sightline: drop DEM info endpoints; native resolution comes from admi…
devin-ai-integration[bot] Jul 8, 2026
635c949
Reference missions: give Sightline two DEMs each with resolution set
devin-ai-integration[bot] Jul 8, 2026
cfec104
Sightline: top time inputs drop seconds and match pre-PR borderless look
devin-ai-integration[bot] Jul 8, 2026
e008506
Sightline: dedicated native-res visibility ray + temporal sampling dr…
devin-ai-integration[bot] Jul 8, 2026
52d848f
Sightline: refetch visibility timeline on resweep; rename chart heade…
devin-ai-integration[bot] Jul 8, 2026
81e8ab4
Sightline: fix horizon profile not rendering on immediate reopen; ext…
devin-ai-integration[bot] Jul 8, 2026
66082c1
Sightline: add time-input cross-update interaction tests
devin-ai-integration[bot] Jul 9, 2026
116c9ff
chore: bump version to 5.2.17-20260709 [version bump]
github-actions[bot] Jul 9, 2026
5dd769f
Fix horizon profile blank on immediate charts close/reopen
devin-ai-integration[bot] Jul 9, 2026
23bbc3e
Include DEM URL in horizon profile cache key
devin-ai-integration[bot] Jul 9, 2026
3b42c1a
Kill visibility Python process when client aborts request
devin-ai-integration[bot] Jul 9, 2026
560e740
Re-check visibility freshness after in-flight fetch completes
devin-ai-integration[bot] Jul 9, 2026
775cd4e
Tighten comment
devin-ai-integration[bot] Jul 9, 2026
86eb034
Fix top-time display regex and sub-second visibility sampling
devin-ai-integration[bot] Jul 9, 2026
3b4e312
Scope per-element sweep cancel to its own state
devin-ai-integration[bot] Jul 9, 2026
85f5531
Cap visibility samples instead of erroring; stop refetch loop
devin-ai-integration[bot] Jul 9, 2026
6a500fd
Remove per-item observer-local Start/End time inputs
devin-ai-integration[bot] Jul 9, 2026
e7d1d4b
Widen sight item inputs from 145px to 170px
devin-ai-integration[bot] Jul 9, 2026
b423757
Widen sight item control wrappers (opacity slider etc.) to 170px
devin-ai-integration[bot] Jul 9, 2026
5d515bd
Optimize sweep frame building: 32-bit typed-array pixel fill + Blob o…
devin-ai-integration[bot] Jul 9, 2026
dfe022f
Store decoded sweep grids as flat Uint8Array-backed row views (1 byte…
devin-ai-integration[bot] Jul 9, 2026
b3b59d9
Raise max sweep frames from 2048 to 4096
devin-ai-integration[bot] Jul 9, 2026
cec1dcd
Raise finest-resolution sweep frame cap to 4096; document resolution-…
devin-ai-integration[bot] Jul 9, 2026
4f1a832
Too-many-timesteps warning: show requested count, per-resolution max,…
devin-ai-integration[bot] Jul 9, 2026
bd9e5b9
Rename "Horizon Range" to "Range"; add subtle indeterminate loading s…
devin-ai-integration[bot] Jul 9, 2026
28c094b
Clear visibility timeline at start of load so stale bars aren't shown…
devin-ai-integration[bot] Jul 9, 2026
54a0a0a
Render visibility timeline as all-not-visible while loading instead o…
devin-ai-integration[bot] Jul 9, 2026
474ffd9
Render blank visibility timeline on first open while fetch is in flig…
devin-ai-integration[bot] Jul 9, 2026
9a2b084
Default Visibility Sampling to 16x (was 32x)
devin-ai-integration[bot] Jul 9, 2026
c1aaedb
Frame-limit warning: suggest lowering resolution or zooming in further
devin-ai-integration[bot] Jul 9, 2026
8b0c5b7
Docs: default Visibility Sampling is 16x (match store)
devin-ai-integration[bot] Jul 9, 2026
2952b08
Sightline init: check buildDemsList (dems array or dem) before warnin…
devin-ai-integration[bot] Jul 9, 2026
a6c6908
Sightline: cap ray-march step + bilinear DEM sampling to reduce shado…
devin-ai-integration[bot] Jul 9, 2026
9f228b7
Sightline: tighten ray-march step cap to 6x and document adaptive ste…
devin-ai-integration[bot] Jul 9, 2026
0f695bc
chore: bump version to 5.2.18-20260709 [version bump]
github-actions[bot] Jul 9, 2026
b77eb85
Merge origin/development into devin/1783471872-sightline-improvements…
devin-ai-integration[bot] Jul 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -243,7 +243,18 @@
"icon": "brightness-4",
"js": "SightlineTool",
"variables": {
"dem": "Data/DEMs/LRO_LOLA_DEM_4000m.tif",
"dems": [
{
"name": "LOLA DEM (4000 m/px)",
"path": "Data/DEMs/LRO_LOLA_DEM_4000m.tif",
"resolution": 4000
},
{
"name": "LOLA DEM (8000 m/px)",
"path": "Data/DEMs/LRO_LOLA_DEM_4000m.tif",
"resolution": 8000
}
Comment on lines +253 to +256

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Reference mission demo configs list two DEMs that point to the same file but claim different resolutions

The second DEM entry in each reference mission config reuses the same file path as the first but declares a different (coarser) native resolution (config.reference-mission-lunar-southpole.json:254), so selecting it produces an artificially degraded sightline map and a misleading "Native" readout in the UI.

Impact: Users choosing the second DEM option in any reference mission get unnecessarily coarse results and incorrect resolution labels.

Copy-paste error across all three reference mission configs

All three configs exhibit the same pattern — the second dems entry duplicates the first entry's path but changes only name and resolution:

  • blueprints/Missions/Reference-Mission-Lunar-SouthPole/config.reference-mission-lunar-southpole.json:248-256: both entries use Data/DEMs/LRO_LOLA_DEM_4000m.tif, but the second claims resolution: 8000.
  • blueprints/Missions/Reference-Mission-Mars/config.reference-mission-mars.json:170-178: both entries use Data/DEMs/missionDEM_20m_COG.tif, but the second claims resolution: 40.
  • blueprints/Missions/Reference-Mission/config.reference-mission.json:4174-4182: both entries use Data/DEMs/USGS_13_n38w123_20250826_SFHill.tif, but the second claims resolution: 20.

The resolution field is consumed by SightlineTool.getElementNativeResolution() (SightlineTool.js:2128-2133) and used to cap _resolutionToMaxDim() (SightlineTool.js:2345-2352). A falsely coarse resolution value caps the output grid to fewer pixels than the DEM actually supports, producing a blurrier sightline map than necessary. The UI also displays this wrong value as "Native: 8000 m/px" via SightlineElement.jsx:677.

The second entries should either point to genuinely different DEM files or, if only one file exists, be removed.

Prompt for agents
All three reference mission configs (Lunar SouthPole, Mars, and Reference-Mission) have a second DEM entry in the new `dems` array that is a copy-paste of the first entry with only the name and resolution changed — the `path` still points to the same file. This means the second option is functionally identical to the first but with a wrong resolution cap.

Either:
1. Point the second entry's `path` to a genuinely different DEM file (if one exists in the mission data), or
2. Remove the second entry entirely if only one DEM file is available for the demo.

Affected files:
- blueprints/Missions/Reference-Mission-Lunar-SouthPole/config.reference-mission-lunar-southpole.json (lines 253-256)
- blueprints/Missions/Reference-Mission-Mars/config.reference-mission-mars.json (lines 175-178)
- blueprints/Missions/Reference-Mission/config.reference-mission.json (lines 4179-4182)
Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is intentional, not a copy-paste error. The maintainer explicitly requested each reference mission's Sightline have two DEM entries pointing at the same file with different resolution values ("Both dem paths in each ref mission should just point to the same dem since its easier") — the goal is to exercise/demo the multi-DEM selector and native-resolution readout without shipping a second large DEM file. Leaving as-is.

],
Comment on lines +246 to +257

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔍 Blueprint configs reuse the same DEM file path for entries with different resolutions

In all three blueprint config files, the dems array contains two entries that point to the same physical DEM file but declare different resolution values. For example, config.reference-mission-lunar-southpole.json:249-256 lists LRO_LOLA_DEM_4000m.tif twice — once at 4000 m/px and once at 8000 m/px. Similarly config.reference-mission-mars.json:171-178 and config.reference-mission.json:4175-4182. The resolution field is a metadata hint (the DEM's native ground sample distance) used to cap the output grid and display the effective working resolution. Declaring a different resolution for the same file is misleading — the DEM's actual pixel spacing doesn't change. If these are placeholders to demonstrate the multi-DEM dropdown, a comment or distinct file paths would be clearer. If they're meant to model different downsampled views of the same terrain, the current implementation doesn't actually downsample the DEM read — it only caps the output grid dimension.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Intentional — these are placeholder entries to demonstrate the multi-DEM dropdown. The repo owner explicitly asked for each reference mission to have two DEM entries both pointing at the same file with distinct resolution values ("Both dem paths in each ref mission should just point to the same dem since its easier"). As the comment notes, resolution only caps the output grid dimension / drives the effective-resolution readout; it does not resample the DEM read, so the second entry simply models a coarser working cap over the same terrain. Leaving as-is per that request.

"sources": [
{
"name": "Sun",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,18 @@
"icon": "brightness-4",
"js": "SightlineTool",
"variables": {
"dem": "Data/DEMs/missionDEM_20m_COG.tif",
"dems": [
{
"name": "Mission DEM (20 m/px)",
"path": "Data/DEMs/missionDEM_20m_COG.tif",
"resolution": 20
},
{
"name": "Mission DEM (40 m/px)",
"path": "Data/DEMs/missionDEM_20m_COG.tif",
"resolution": 40
}
],
"sources": [
{
"name": "Sun",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4169,7 +4169,18 @@
"icon": "brightness-4",
"js": "SightlineTool",
"variables": {
"dem": "Data/DEMs/USGS_13_n38w123_20250826_SFHill.tif",
"dems": [
{
"name": "USGS 1/3 arc-second (10 m/px)",
"path": "Data/DEMs/USGS_13_n38w123_20250826_SFHill.tif",
"resolution": 10
},
{
"name": "USGS 1/3 arc-second (20 m/px)",
"path": "Data/DEMs/USGS_13_n38w123_20250826_SFHill.tif",
"resolution": 20
}
],
"sources": [
{
"name": "Sun",
Expand Down
2 changes: 1 addition & 1 deletion configure/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "configure",
"version": "5.2.15-20260707",
"version": "5.2.16-20260708",
"homepage": "./configure/build",
"private": true,
"dependencies": {
Expand Down
79 changes: 66 additions & 13 deletions docs/pages/Tools/Sightline/Sightline.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,17 @@ There are two SPICE python scripts that require these backend kernel setups:
```javascript
{
"dem": "Data/missionDEM.tif",
"dems": [
{
"name": "Mission DEM (20 m)",
"path": "Data/DEMs/missionDEM_20m_COG.tif",
"resolution": 20
},
{
"name": "Regional DEM (200 m)",
"path": "Data/DEMs/regionalDEM_200m_COG.tif"
}
],
"data": [
{
"name": "MSL_DEM",
Expand Down Expand Up @@ -72,7 +83,9 @@ There are two SPICE python scripts that require these backend kernel setups:
}
```

_**dem**_ - A path to a DEM.tif. This is used to get the current center elevation. This can/should be the same file used for the Measure Tool and the Coordinate's elevation.
_**dem**_ - _(legacy, single DEM)_ A path to a DEM.tif. This is used to get the current center elevation. This can/should be the same file used for the Measure Tool and the Coordinate's elevation. Kept for backward compatibility: it is used only when the `dems` list below is empty or absent, so existing single-DEM configs continue to work unchanged.

_**dems**_ - _(multiple DEMs)_ An array of selectable DEMs, mirroring the `MeasureTool`'s `layerDems` precedent. Each entry has a `name` (shown in the per-item DEM dropdown), a `path` (a Cloud Optimized GeoTIFF DEM relative to the mission directory), and an optional `resolution` (the DEM's native ground sample distance in meters-per-pixel, entered by the mission admin). When `resolution` is set it is shown as the DEM's native resolution and used to cap the effective working resolution so it never oversamples beyond the data; when omitted, no native resolution is shown and the effective resolution is uncapped. The DEM selector is always shown in each sightline item's Source section (even with a single DEM) and the chosen DEM is threaded through the sightmap and horizon-profile computations. When `dems` is empty/absent, the legacy single `dem` field is used.

_**data**_ - At minimum, the Sightline tool requires at least one "data" source. A data source describes a DEM tileset (see /auxiliary/gdal2customtiles or /auxiliary/1bto4b) and allows users to select it by name to generate sightline maps over.

Expand All @@ -93,7 +106,7 @@ _**utcTimeFormat**_ - Sets the placeholder information for when the observer tim
### Interface

- _Time_
- The desired datetime to query. Formatted as `YYYY MMM DD HH:MM:SS` and for example `2023 SEP 06 19:27:05` (or based on `utcTimeFormat`). Updating this time and pressing 'Enter' will set it as the current time for the SightlineTool and for all of MMGIS. It is both connected to the Observer's local time as well as MMGIS' timeline (expandable via the clock icon in the bottom left of the screen).
- The shared time section at the top shows **Start Time**, **End Time**, and **Step Size (min)**. Start and End are **directly editable** UTC inputs (ISO 8601, e.g. `2023-09-06T00:00:00Z`; a zoneless `YYYY-MM-DDThh:mm:ss` is accepted as UTC). Editing a value and blurring or pressing 'Enter' validates it and updates the SightlineTool sweep times and all of MMGIS' timeline (expandable via the clock icon in the bottom left) — reusing the same validation/conversion and global update logic as the per-item observer-local inputs. Invalid entries revert to the last valid value.

#### Source

Expand All @@ -117,14 +130,16 @@ _**utcTimeFormat**_ - Sets the placeholder information for when the observer tim
- The color to highlight the visible regions on the map.
- _Opacity_
- The opaqueness of the visible regions on the map. A value of 0 is fully transparent and a value of 1 is fully opaque.
- _DEM_
- A dropdown that selects which terrain dataset this sightline item uses (via `dems`). It is always shown, even with a single configured DEM. When the selected DEM's config sets a `resolution`, the tool displays that **native (dataset) resolution** in meters-per-pixel (`Native: … m/px`) directly beneath the dropdown.
- _Resolution_
- MMGIS downloads terrain data needed for the visibility algorithm. Increasing the resolution improves the quality of the sightline map and the cost of download and render speed. Each higher option is 4x the resolution of the previous one (i.e. 'ultra' is 4x more terrain data than 'high' and 16x more data than 'medium'). To save on performance, if the resolution is 'high' or 'ultra', the Sightline Tool will no longer regenerate the visibility map whenever any parameter changes and instead 'Generate/Regenerate' must manually be pressed.
- _Elevation Map_

- Specifies the terrain dataset to use.
- A relative scale (1×, 0.5×, 0.25× default, 0.125×) applied to the viewport's longest pixel dimension to size the output grid (minimum 50px). Lower scales compute faster and coarser. Directly below the selector the tool displays the **effective working ground resolution** in meters-per-pixel (≈ viewport ground extent ÷ output grid dimension); this readout updates as you pan/zoom so the real detail of the current setting is always visible. When a DEM's native `resolution` is configured, the output grid — and therefore the effective resolution — is capped so it never goes finer than that native resolution (no oversampling beyond the data).
- _Shadow Reach_
- Extends the terrain loaded for shadow computation beyond the visible map area (kilometers), read at a lower resolution so distant features can cast shadows into the viewport. Set to 0 to use only the viewport extent.

- _Generate/Regenerate_
- Submits a request to generate a sightline map with the provided parameters. Note that if the resolution is 'high' or 'ultra', the Sightline Tool will not regenerate the visibility map whenever any parameter changes and instead 'Generate/Regenerate' must manually be pressed.
- _Generate / Sweep_
- Submits a request to generate a sightline map with the provided parameters. In static mode it auto-generates when settings change.
- **Cancelling a sweep**: In composite/playback mode the button reads **Sweep**; while a sweep is running the button keeps showing its progress and a small **×** floats over the right side of it. Clicking the × aborts the in-flight streaming request via an `AbortController`, and the backend per-frame loop stops cleanly when the connection closes.

#### Results

Expand All @@ -148,7 +163,7 @@ Each sightline map item can be set to one of three modes:
- **Composite**: Sweeps through a time range and produces a cumulative heatmap showing how often each point on the ground has line-of-sight across all time steps.
- **Playback**: Sweeps through a time range and stores each frame. Users can play back the sweep as an animation, stepping through individual sightline frames with time controls.

Multiple sightline maps can be created simultaneously (e.g., Sun + Moon). Each element tracks its own sweep progress independently — starting a sweep on one element does not cancel another.
Multiple sightline maps can be created simultaneously (e.g., Sun + Moon). Each element tracks its own sweep progress independently — starting a sweep on one element does not cancel another. A running sweep can be cancelled per-item via the small **×** that floats over the Sweep button (see _Generate / Sweep_ above).

### Charts (Horizon Profile + Visibility Timeline)

Expand All @@ -174,11 +189,12 @@ The chart is north-centered (0° N at center, ±180° at edges) and adapts to th

A per-source horizontal bar showing when the source is visible vs. occluded over the sweep time range:

- **Colored segments** indicate the source is visible (lit pixel at observer position in the sightmap grid), using the element's configured color.
- **Colored segments** indicate the source is above the local terrain horizon (visible), using the element's configured color.
- **Gray/white segments** indicate the source is occluded.
- Visibility is determined by the **sightmap grid pixel** at the observer's position — if the pixel is lit (value 1 or 2) the source is visible, if shadowed (value 0) the source is occluded.
- Visibility is computed by a **dedicated single-ray query** (`POST /api/sightline/visibility`), independent of the sweep grid. For each sample it casts one ray from the observer toward the source azimuth at the DEM's **native resolution** and compares the local horizon elevation against the source's elevation — so the result is zoom/viewport-independent, unlike the earlier grid-pixel derivation. (The Composite heatmap's percent-visible series still rides on the sweep grid.)
- **Visibility Sampling dropdown** — In the charts panel header, to the right of the Horizon Polygon checkbox, a `1x…256x` selector (default `32x`) controls the **temporal sampling rate** of the timeline. `1x` computes one visibility ray per sweep timestep; higher rates compute that many samples per timestep (interpolated timestamps between sweep frames) for a smoother, higher-fidelity visibility chart. Changing the rate refetches and redraws the timeline.
- A red slider indicator tracks the current playback frame position.
- Time labels along the bottom show UTC timestamps spanning the full time range.
- Time labels along the bottom show UTC timestamps spanning the full time range (denser when a higher sampling rate is selected).

#### Azimuth Lines on Map

Expand Down Expand Up @@ -225,7 +241,7 @@ The sightmap computes a 2D visibility grid showing which terrain cells have dire

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `dem` | string | — | Path to DEM raster (under `/Missions/`) |
| `dem` | string | — | Path to the selected DEM raster (under `/Missions/`); resolved from the per-item DEM selector |
| `lat`, `lng` | number | — | Observer latitude/longitude |
| `height` | number | 0 | Observer height above terrain (meters) |
| `target` | string | — | SPICE target name (e.g. `SUN`, `MRO`) |
Expand Down Expand Up @@ -283,3 +299,40 @@ For each azimuth (default 360 directions at 1° intervals):
- **Logarithmic stepping** — Instead of stepping 1 pixel per sample, the step size increases logarithmically with distance: `step = max(1, log₂(r + 1))` pixels. Near the observer (r < 2px) it steps 1px for fine detail; at r = 1000px it steps ~10px. This preserves accuracy for nearby terrain (which subtends large angles) while skipping redundant samples at distance (where per-pixel angle change is negligible). Reduces ~2500 samples/ray to ~600 for a 250km radius.
- **Early termination** — After each sample beyond 1km, the algorithm checks: "Could the tallest plausible terrain (10km relief, minus curvature drop) at this distance produce a steeper angle than the current maximum?" If not, the ray terminates immediately. For typical terrain where the horizon is found within a few km, rays terminate well before the max radius — often at 50–200 samples instead of 600+.
- **Combined speedup** — Together, logarithmic stepping + early termination yield a 4–8× reduction in samples per ray compared to naïve 1px stepping to max radius.

---

#### Visibility (dedicated timeline ray)

**Endpoint:** `POST /api/sightline/visibility`

Computes the Visibility Timeline's per-sample visibility as a **single ray** from the observer toward each source over a time range, at the DEM's **native resolution** (no viewport downsampling). This is separate from the sweep grid: the timeline no longer samples a grid pixel, so its result is independent of zoom and working resolution.

**Core Algorithm:**

For each timestep (start → end at `stepSeconds`):

1. **Source direction** — The source azimuth/elevation is computed from SPICE (or taken from the custom az/el for a custom target).
2. **Single horizon ray** — One ray is cast from the observer toward the source azimuth using the same logarithmic-stepping + early-termination march as the Horizon Profile, yielding the terrain horizon elevation angle along that bearing.
3. **Visibility test** — The source is `visible` when its elevation is above the local horizon angle along its azimuth (and above 0°); otherwise it is occluded.
4. **Output** — An array of `{time, az, el, horizonAngle, visible}` per sample.

**Temporal sampling:** The client sizes `stepSeconds` as `sweepStep / samplingRate`, where `samplingRate` is the `1x…32x` selector in the charts header. `1x` yields one sample per sweep timestep; higher rates interpolate that many samples per timestep. Fine sample index `k·rate` aligns with sweep frame `k`, so the playback slider still maps to sweep frames.

**Parameters:**

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `dem` | string | — | Path/URL to DEM raster (under `/Missions/`) |
| `lat`, `lng` | number | — | Observer latitude/longitude |
| `height` | number | 0 | Observer height above terrain (meters) |
| `target` | string | — | Source entity (SPICE body) or `CUSTOM` |
| `startTime`, `endTime` | ISO 8601 | — | Time range |
| `stepSeconds` | number | — | Sample interval in seconds (= sweep step ÷ sampling rate) |
| `maxRadius` | number | — | Maximum ray march distance in meters |
| `minSkipRadius` | number | 0 | Skip terrain samples within this distance (meters) |
| `planetRadius` | number | 0 | Planet radius in meters (for curvature; 0 = flat) |
| `isCustom`, `customAz`, `customEl` | — | — | Custom fixed-direction source parameters |

**Performance:** One ray per sample (vs. a full sightmap grid per frame in the old approach) with the horizon march's logarithmic stepping + early termination; the native-resolution window read is hard-capped to bound memory. Frame count is capped (≤ 32768) and the request supports client cancellation.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "mmgis",
"version": "5.2.15-20260707",
"version": "5.2.16-20260708",
"description": "A web-based mapping and localization solution for science operation on planetary missions.",
"homepage": "build",
"repository": {
Expand Down
7 changes: 7 additions & 0 deletions plugins/core/backend/Sightline/plugin.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
const sightmapRouter = require("./routes/sightmap");
const horizonprofileRouter = require("./routes/horizonprofile");
const visibilityRouter = require("./routes/visibility");

let setup = {
//Once the app initializes
Expand All @@ -16,6 +17,12 @@ let setup = {
s.setContentType,
horizonprofileRouter
);
s.app.use(
s.ROOT_PATH + "/api/sightline",
s.ensureUser(),
s.setContentType,
visibilityRouter
);
},
//Once the server starts
onceStarted: (s) => {},
Expand Down
Loading
Loading