Commit Graph
3816 Commits
Author SHA1 Message Date
Sameh Khamis 53cbd55181 Merge branch 'main' into fix/cctv-panel-collapse-on-disable 2026-11-13 18:47:22 -08:00
Sameh Khamis a91a89ec1c Merge pull request #1579 from bilawalsidhu/german/map-render-error-state
Show a recoverable notice when the globe stops drawing
2026-11-13 18:47:16 -08:00
Sameh Khamis c43bf103d6 Merge branch 'main' into german/map-render-error-state 2026-11-13 18:37:03 -08:00
Sameh Khamis 9b46692c64 Suspend only the layers Context isolation is switching off
The session snapshot recorded a user's switch only after the CCTV panel had
already rendered the layer off, so a first switch-off by the user inside
Contacts, or after a partly failed restore, still kept the panel open.
Context controls now hold the layers _clearLayersOutsideContextMode is
switching off while its transitions run; suspendsLayer reads that set, and
the snapshot is no longer consulted.
2026-11-13 18:32:57 -08:00
Sameh Khamis 9d01f8df77 Show no notice for a lost context on a page that must not reload, and log each render error once
An inline panel that lost its WebGL context showed the panel runtime's own
notice and, over it, an alert dialog with no buttons that it could not act
on. With allowReload false a lost context now clears the notice and shows
none, as the docs already said. keepPanelRendering no longer logs render
errors itself: the render failure notice logs each one. Name the Cesium
private fields finishRaise and reportThrown rely on, and the version they
were checked against.
2026-11-13 18:16:07 -08:00
Sameh Khamis f0ee1b95ca Collapse the CCTV panel when the user switches CCTV off inside Contacts
Turning a layer on does not leave Contacts, so a user could turn CCTV back
on inside the mode and off again; the layer was still in the session
snapshot and the panel stayed open on an empty frame. The snapshot now
records every layer the user switched during the session, and
suspendsLayer is true only for a layer isolation switched off that the
user has not touched since.
2026-11-13 18:12:44 -08:00
Said Turksever f29b0b2639 Keep the CCTV panel through Context isolation, and collapse through the panel chrome
Contacts and Space Missions switch CCTV off to isolate themselves and restore
it on the way out: the panel and its share preference now stay as they are for
that round trip, as they do for Clear selected data layers. The controls no
longer read the collapsed class before asking: the panel chrome tells a panel
the accordion folded from one whose saved state is closed.

The camera controls gate asserts the collapse, reopens CCTV from the right
rail before switching it back on, and runs a Contacts entry and exit with the
panel open.
2026-11-13 17:46:43 +00:00
Said Turksever 7f18943ec4 docs: CCTV panel collapse on switch-off, and changelog fragment 2026-11-13 17:27:22 +00:00
Said Turksever 0325805eb0 Collapse the CCTV panel when the layer is switched off
The panel opened itself when a camera became active, but nothing closed it
when the layer went off: it stayed expanded, empty, and its meta line still
described the last camera. The collapse runs only on the on-to-off change, so a
panel opened by hand while the layer is off stays open, and a context-mode
layer clear keeps the panel as Radio does.
2026-11-13 17:26:34 +00:00
German Khokhlov 73bd952736 Share one render loop fixture across the render failure tests
Four test files built the same widget on CesiumWidget.prototype, viewer
proxy, store and notice; renderLoopFixture.mjs now does it once. The notice
test drives Cesium.Event instead of a hand-made double. frameEvents() drops
tileset.tileLoad, which Cesium raises inside its own error handling, and the
notice no longer guards a viewer without a canvas or requestRender.
2026-11-13 20:16:08 +04:00
Sameh Khamis 7df581765d Merge pull request #1715 from bilawalsidhu/sameh/vessel-typical-length
Draw a vessel of unknown length at its ship type's typical size
2026-11-13 07:52:52 -08:00
Sameh Khamis 92d34bc4cc Stretch a vessel to its beam only beside a reported length
A vessel drawn at its type's typical length keeps the model's proportions:
a reported beam alone would squeeze a 300 m container ship to that width.
2026-11-13 07:42:27 -08:00
Sameh Khamis 432a29ba59 Add the changelog fragment 2026-11-13 07:34:50 -08:00
Sameh Khamis a9d390c165 Draw a vessel of unknown length at its ship type's typical size
Most live vessel feeds send no length, and the resolver then fell through
every length rule to the range's last model drawn as built, so a cruise
ship or a container ship showed as the smallest model of its range.
types.json gives each passenger, cargo, tanker, fishing and service range
a typical_len (cargo 300 m, tanker 250 m, passenger 140 m, fishing 40 m,
...); a vessel with no usable length is chosen and drawn at it.
2026-11-13 07:34:41 -08:00
Sameh Khamis 140f7ebd21 Merge pull request #1714 from bilawalsidhu/sameh/fleet-models
Procedural fleet models for aircraft, vessels, transit and rail
2026-11-13 07:27:47 -08:00
Sameh Khamis 71bfc8aba0 docs: changelog entry names #1714 2026-11-13 07:19:21 -08:00
German Khokhlov df41c0affb Shorten the render failure notice's comments and docs
Comments keep only the why: the loop-running flag, the mid-raise events and
the one-time canvas focus. The CURRENT-STATE section lists behaviour and
pitfalls instead of retelling the code, and no longer says every tileset
event is raised outside Scene's error handling.
2026-11-13 19:19:15 +04:00
Sameh Khamis f0b0378b11 docs: fleet models on vessels, transit and rail; no live source names monorail, gondola or funicular; model frame axes 2026-11-13 07:16:25 -08:00
Sameh Khamis 0d1e3fb703 fix(models): update the fleet type table (SF34 and SB20 draw the ATR 72; no tower model) 2026-11-13 07:16:25 -08:00
Sameh Khamis a44c42eb94 fix(vessels, transit, rail): fleet models keep their cards and detection, stand on the floor, clip ships at the waterline and follow NVG/FLIR
- a vehicle drawn as a model keeps its selected card and stays in the detection overlay
- transit and rail models drop the 1.5 m floor lift their icons carry
- vessel models are clipped below the waterline
- models switch to an unlit white look under NVG/FLIR and back
- unknown transit modes keep their icon
- aircraft model specs are cached per set; no key-array copies per frame
2026-11-13 07:16:25 -08:00
Sameh Khamis 058ed0ffeb docs: the fleet models, and changelog entry 2026-11-13 07:16:25 -08:00
Sameh Khamis 7b93045895 feat(vessels, transit, rail): draw fleet models under the 3D toggle
Vessels, Transit and Rail turn nearby icons into fleet models at the
aircraft layers' distances. A vessel is drawn at its AIS length and beam
(static dimensions now reach vessel rows), standing at the sea surface; a
transit vehicle or train stands on its road or rail, raised by its type's
elevation, and is painted in its mode or category colour where the model
marks it.
2026-11-13 07:16:25 -08:00
Sameh Khamis fcc44d0eaf feat(flights): aircraft draw life-size fleet models chosen by type
Flights, Military Flights and Local ADS-B draw each aircraft with the fleet
model its ICAO type, class or emitter category selects, scaled to the type's
length, built from the up-front loaded bytes. The eight third-party aircraft
models and their attribution are removed; every shipped model is now the
project's own.
2026-11-13 07:16:25 -08:00
Sameh Khamis f6760ad96c feat(models): the project's procedural fleet models and the resolver that picks one per vehicle
121 GLBs under public/models/fleet (about 2 MB, MIT like the code) with
catalog.json and types.json. src/data/fleetModels.js picks a model by ICAO
type, aircraft class, emitter category, AIS ship type and size, GTFS route
type, transit mode or rail category, and sizes it life size; the set loads
once, up front. Trail anchors are measured from the meshes.
2026-11-13 07:16:25 -08:00
German Khokhlov d42b6fe764 Merge branch 'main' into german/map-render-error-state 2026-11-13 18:47:36 +04:00
German Khokhlov 42540ad85e Merge pull request #1698 from bilawalsidhu/german/i18n-unreviewed-strings-fixes
i18n: review and fix the strings added since the last translation review
2026-11-13 18:13:17 +04:00
German Khokhlov bc8aadf55f Changelog fragment for #1698 2026-11-13 17:50:58 +04:00
German Khokhlov 7314dac1ce i18n: review and fix the strings added since the last translation review
Reviews the 474 strings that 27 pull requests added since the last
review, in all twelve catalogs, and fixes what the review confirmed:
wrong agreement when a placeholder takes a neutral value, plural-less
counts that read "1 sightings", terms that differ from the glossaries,
and typography the language guides set. Also applies most of the
findings earlier reviews left open.

zh-Hant is converted from zh-CN again. The new strings had been
translated separately with Taiwan vocabulary. The zh-Hant guide lists
two more characters OpenCC picks wrongly.

Three tests expected the old German and Spanish wording.
2026-11-13 17:49:54 +04:00
Sameh Khamis 188f0ccd9b Merge pull request #1696 from bilawalsidhu/sameh/i18n-entry
feat(i18n): an ./i18n entry for an application with its own language choice
2026-11-12 22:21:25 -08:00
Sameh Khamis ad9bd0f4f9 docs(changelog): 1696-i18n-entry 2026-11-12 22:07:30 -08:00
Sameh Khamis 5f96009b67 feat(i18n): an ./i18n entry for an application with its own language choice
startPageLocale, followPageLocale and switchLocale start, follow and switch
the page's language as the standalone application and the globe picker do,
for an application that offers the language elsewhere and passes
localePicker: false. The standalone application uses them.
2026-11-12 22:07:13 -08:00
Sameh Khamis feab48397f Merge pull request #1695 from bilawalsidhu/sameh/vessel-photos
feat(vessels): a selected vessel shows its Open Vessel Photos photo and MMSI
2026-11-12 20:42:37 -08:00
Sameh Khamis e4832c589c Merge branch 'main' into sameh/vessel-photos 2026-11-12 20:32:03 -08:00
Sameh Khamis e3069612b5 Merge pull request #1694 from bilawalsidhu/sameh/cctv-globe-plane-clamp
fix(cctv): on a globe map the camera plane ends where the view meets the ground
2026-11-12 20:31:59 -08:00
Sameh Khamis a930677c83 Merge branch 'main' into sameh/cctv-globe-plane-clamp 2026-11-12 20:22:04 -08:00
Sameh Khamis 3da5ffe71f Merge pull request #1693 from bilawalsidhu/sameh/cctv-frame-no-flash
fix(cctv): a new camera's frame shows the moment it is decoded, without a fade
2026-11-12 20:21:44 -08:00
Sameh Khamis 2bc3c1bed1 docs(changelog): 1695-vessel-photos 2026-11-12 20:11:20 -08:00
Sameh Khamis d5b030e7fa docs(changelog): 1694-cctv-globe-plane-clamp 2026-11-12 20:11:19 -08:00
Sameh Khamis 23aa1027fc docs(changelog): 1693-cctv-frame-no-flash 2026-11-12 20:11:17 -08:00
Sameh Khamis 347e77d1f6 feat(vessels): a selected vessel shows its Open Vessel Photos photo and MMSI
Selecting a vessel asks Open Vessel Photos (a free, keyless API) for its
photo by MMSI, once per MMSI. The CONTACTS view shows it under the vessel's
name and MMSI with the photographer, the photo's open licence and a link to
the vessel's page; only images on Open Vessel Photos' own host are shown, and
an answer about another MMSI is no photo. The vessel source exposes the lookup
as getEnrichment({kind: 'photo'}) and fetchOpenVesselPhoto for applications
with their own vessel source.
2026-11-12 20:10:30 -08:00
Sameh Khamis 2445af349d fix(cctv): on a globe map the camera plane ends where the view meets the ground
The activation probe raycast only the photoreal tiles. On a globe map the ray
missed, or ran on through the Earth and met a primitive thousands of
kilometres away, and the monitor plane stood at the camera's full range:
about a kilometre wide and hundreds of metres up. A hit at or beyond the range
now counts as none, and on a globe map the plane also clamps short of the
globe's terrain along the axis, or flat ground at the mount's ground while
that terrain is still loading, whichever is nearer.
2026-11-12 20:10:02 -08:00
Sameh Khamis 6e4df4c287 fix(cctv): a new camera's frame shows the moment it is decoded, without a fade
The preview settled when the image had loaded, so the panel's <img> took the
src while it was still decoding and then faded in over 180 ms: every camera
click lingered on an empty box. The preview now settles once the frame is
decoded (a rejected decode still shows the loaded frame, and a decode that
never settles shows it after one second), and the fade is gone.
2026-11-12 20:10:02 -08:00
Sameh Khamis c02ede3bb4 Merge pull request #1691 from bilawalsidhu/said/shortcuts-ignore-modifier-chords
fix(shortcuts): a shortcut key held with Cmd, Ctrl or Alt runs no shortcut
2026-11-12 18:19:30 -08:00
Sameh Khamis 16aae73622 Merge branch 'main' into said/shortcuts-ignore-modifier-chords 2026-11-12 18:11:19 -08:00
Sameh Khamis 01bb68a9a2 Merge pull request #1604 from bilawalsidhu/feat/data-library
Add the Data Library: live regional datasets, tiles and packs
2026-11-12 18:11:08 -08:00
Sameh Khamis 1d476c87ee fix(location): a POI key held with Cmd, Ctrl or Alt runs no POI
The points-of-interest keys (Q/W/E/R/T while a city is expanded) are a
second bare-key document listener, and it did not look at modifiers
either: Alt+R or a delivered Ctrl+R picked the fourth POI and flew the
camera there. It now leaves Cmd, Ctrl and Alt chords to the browser like
the application shortcuts; Shift still counts as the key. The docs and
the changelog entry say so.
2026-11-12 18:02:41 -08:00
Sameh Khamis d1966b9751 Clear a view-bounded layer's error when the camera returns to the drawn view
A failed request for the view in between left its error set, and the
early return for the already drawn view never cleared it, so the drawn
features showed with an error state.
2026-11-12 17:57:31 -08:00
Sameh Khamis 92d6188045 Stop a moved-on view from cancelling the GeoParquet index the next view needs
The browser shared one partition-index build per entry but ran it under
the first view's signal. A camera move cancels the old view before the
next one starts, so the next view was handed the same build, already
cancelled, and drew nothing (the view layer takes an AbortError for its
own cancellation) until the camera moved again. EPC hit this on its
first view after any quick move. The build now belongs to no view: each
view stops waiting on its own signal, and the build runs on for the next
view and every view after it.
2026-11-12 17:56:17 -08:00
Sameh Khamis 8cca78bcd5 Stop sharing a Data Library entry as on once its failed Remove switched it off
When Remove switched a layer off and then its destroy failed, the
manager published no visibility change, so the selection still listed
the entry as on: the link shared it as on and a reload restored it on
while its row read off. A failed Remove now drops the entry from what is
on and remembered whenever its layer ended up off.
2026-11-12 17:49:38 -08:00
Sameh Khamis 837eff7328 Let a share fit a full Data Library and show entries it cannot serve
A share's entries joined the library after the stored ones, and the
selection kept its first 64, so a link opened into a full library never
showed what it shared and the next hash write dropped its lib=. Now the
oldest entries the share leaves off make room for it, and their layers
are removed with them.

Browse counted an entry as added only while its layer was registered,
but an entry this instance cannot serve (switched off by the operator,
or its server unreachable) stayed in the selection and held one of the
64 places. A library full of them looked empty and refused every Add.
Such entries now show as added, so they can be removed one by one or
with Remove all.
2026-11-12 17:49:01 -08:00