Commit Graph
3078 Commits
Author SHA1 Message Date
German Khokhlov 06ae95ceb3 Keep scaling the shared atmosphere vectors in place, and take a rebuilt globe's base from the value they had before any scaling
Pointing the scaled uniforms at the scaler's own vectors (bc1b56b6) left the atmosphere unscaled: takram's materials read the AtmosphereParameters.DEFAULT vectors themselves, so the frame dimmed (luma 161 against 214) and qa-navara-bloom found nothing to bloom. The scaler writes those vectors in place again, and a page-wide map keeps each one's value from before it was first scaled: a globe built later on the page takes its base from there instead of from the scaled value. Bloom measures as before (214.4 → 240.3), and qa-strict-context-loss passes 3 of 3 under eight busy threads.
2026-11-04 19:53:33 +04:00
German Khokhlov bc1b56b63a Scale the Navara atmosphere luminance without writing into takram's shared vectors, so a rebuilt globe is not drawn nine times too bright
The sky, aerial perspective and clouds materials hold the vectors of takram's AtmosphereParameters.DEFAULT, one per page. The look's scaler multiplied them in place and took its base from the first value it saw, so a Navara globe built later on the same page (after the parked one lost its WebGL context) could record an already scaled value as its base and draw the atmosphere scale² bright: a washed-out, nearly uniform frame. The fourth case of qa-strict-context-loss failed this way under CPU load (3 of 3 with eight busy threads; 3 of 3 pass now). Scaled uniforms now point at the scaler's own vectors, which it puts back each frame if a material wrote into them; the page's vectors are never written.
2026-11-04 19:04:48 +04:00
German Khokhlov b3efcfb7a2 Build the Navara weather shell without the Cesium SDK: angles from geo, the surface extent in radians
Since the weather layer stopped handing Navara the Cesium global, the shared shell read ContextLimits, Math and Rectangle from an undefined SDK and drew nothing on Navara (qa-weather-engine-switch timed out). On Navara the texture limit stays unset, as Cesium's never-created context left it.
2026-11-04 18:12:17 +04:00
German Khokhlov 1100cdcff5 Let the flights' fix history fill before the long soak measures the heap, and say why a context-loss case drew no frame
The long soak's heap slope counted the per-aircraft dead-reckoning history (POSITION_HISTORY_LIMIT fixes for 10 000 aircraft, about 14 MiB over the first 2.5 min of polls) as switch growth: a run with the same workload and no switches grows as much and then levels off. With --assert the soak now waits until the flights feed has been read more times than the history keeps before it switches; over 500 switches the heap then grows 1.07 KiB per switch.

qa-strict-context-loss records, only when no non-blank frame came, how many frames the running and the watched engine drew in 3 s and how much of the last one differs from its first pixel.
2026-11-04 17:48:46 +04:00
German Khokhlov f89aee1eac Load the Cesium SDK and its widget styles only when a Cesium globe or a feature that needs it first runs
index.html no longer loads /cesium/Cesium.js and widgets.css: the Cesium scene loads both before it builds its viewer. A cold Navara start requests nothing of the Cesium library again, and qa-strict-cold-chunks asserts that without the known-gap allowance. The strict harness puts an accessor in place of the Cesium global on every page and fails a scenario that reads it before Cesium.js has run; GEV_QA_CESIUM_TRAP=record lists every such read site instead.
2026-11-04 17:15:27 +04:00
German Khokhlov b8305de14b Run the Navara paths without the Cesium SDK, and load it on demand for the features that still build on it
Every Cesium read that a Navara page made was surveyed with the strict acceptance (GEV_QA_CESIUM_TRAP=record). Math on those paths now uses src/geo: screen annotations, weather and wind center readings, cyclone picks, scene data pack polygons and images (new navaraGeometry.js), the awareness subject, the orbit offset of camera verbs, voice frame_overhead, the agent world packet and Directions colours and ground picks. The celestial ring's Sun and Moon come from a bit-identical port of Cesium's Simon1994 model, JulianDate and TEME rotation (src/geo/simon1994.js, julianDate.js, transforms.js); a Cesium globe still applies its ICRF rotation once loaded.

Traffic, Street Level, the Nepal event and locator and geo import build on Cesium's math or entity model on either globe; their enable (or the import) now loads the SDK first through src/app/loadCesium.js, synchronously when it is already there. A production page guards the global so a missed read is reported and starts the load. No module reads Cesium while it loads (scripts/check-cesium-load-time.mjs, run by npm test). Cesium.js is still loaded by index.html here.
2026-11-04 17:15:21 +04:00
German Khokhlov f87da8523e Pin the page clock to an Austin afternoon in the Navara bloom and style checks
The look's sun follows the page clock, so the frame these checks compare was as bright as the hour they ran at: in the acceptance run the half-strength bloom changed the frame by 0.29 against 3.5 earlier, and at dusk the full bloom changes nothing (luma 13).
2026-11-04 00:59:58 +04:00
German Khokhlov 91685c94d9 Assert the soak's heap slope from switch 20 again
Measured over the second half the heap still grew about 20 KiB per switch in the acceptance run (117.8 to 123.8 MiB from switch 250 to 500), so the narrower window did not separate warm-up from growth; the original check stays.
2026-11-04 00:58:32 +04:00
German Khokhlov a56f2f9352 Assert the soak's heap slope over the second half of the run and report the warm-up slope beside it
Under the soak workload V8's compiled code and the layers' caches grow for about 250 switches and then the heap is flat (121.4, 121.7, 120.4, 119.1 MiB after 250 to 400 switches), so a line fitted from switch 20 measured the warm-up. Over the second half the threshold stays 10 KiB per switch; the run before the layer effect fix measures 19 KiB there.
2026-11-04 00:24:47 +04:00
German Khokhlov 43ab3ecaaf Run the Navara visual style, bloom, sonar, cockpit cloud and annotation checks in the strict acceptance 2026-11-04 00:20:13 +04:00
German Khokhlov ebc717df8b Dispose a Navara layer effect's pass when the layer detaches so engine switches stop retaining its material and textures
Layers re-create their ground effects on every attach. Navara's removePass leaves the EffectPass undisposed, so each switch kept its EffectMaterial in three's program and material caches, together with the uniforms' DataTextures and their Float32Array data (earthquakes: about 47 KB of buffers and one WebGL program per switch). engine.LayerEffectDesc now disposes the raw pass on delete, as the app's own effects do.
2026-11-04 00:07:15 +04:00
German Khokhlov 726e201314 Read a parked globe's WebGL context from the one it was built with instead of asking its canvas during a switch
Asking the canvas again during the switch made the reuse depend on getContext at that moment: with new contexts refused (qa-strict-failure-matrix, cold Navara to Cesium) the rollback to the parked Navara threw and left no globe.
2026-11-03 23:33:50 +04:00
German Khokhlov 90d64e6916 Mark a resumed or share-restored follow only while it starts so a later follow of the same subject is navigation again
The aircraft scene binding re-tracked with origin share-restore, which stayed on the entity: a later trackedEntityChanged for it (cockpit exit, refocus) never stamped navigation, and the aircraft lost its selection origin. Flights, military and satellites now set a transient gevRestoring mark around follow.start, and the aircraft binding resumes with the origin the aircraft was selected by.
2026-11-03 23:30:10 +04:00
German Khokhlov cbe1d841ea Dispose the Navara bloom and sharpen passes when their effect is deleted
EffectComposer.removePass does not dispose a pass. One withPassDisposal mixin now does it for the bloom, sharpen, styles and overlay effects.
2026-11-03 23:30:10 +04:00
German Khokhlov b49f9dddf0 Fail the acceptance when a production build throws on a cold start of either engine
qa-strict-prod-smoke opens the keyless vite preview on each engine, switches once and fails on any page error. qa-strict-cold-chunks reports Cesium.js at a cold Navara start as a known gap instead of a failure.
2026-11-03 23:21:10 +04:00
German Khokhlov 125fbc5a3b Load the Cesium SDK from index.html again, since engine-neutral modules read its global when they load
This reverts ae13a56f. In the production build every 'cesium' import is the global that Cesium.js defines; with the script loaded only when a Cesium globe started, modules evaluated at boot (cesiumConstants, annotationEngine) threw ReferenceError and neither engine started. A cold Navara start loading Cesium.js stays a known gap.
2026-11-03 23:21:00 +04:00
German Khokhlov 9cc108835e Bring comments in line with the single application and the Navara capabilities 2026-11-03 23:02:04 +04:00
German Khokhlov 8d7f055572 Format the files this branch wrote or broke with Prettier 2026-11-03 23:02:04 +04:00
German Khokhlov 227e3c2051 Serialize shell attach and detach so recovery waits for a failed attachment's cleanup 2026-11-03 22:56:24 +04:00
German Khokhlov ae13a56f6d Load the Cesium SDK and its widget styles only when a Cesium globe first starts 2026-11-03 22:56:24 +04:00
German Khokhlov 9f8381ff71 Check a parked renderer's real WebGL context before reuse and rebuild it when the context is lost 2026-11-03 22:56:24 +04:00
German Khokhlov 01ae045346 Keep a restored tracked aircraft when Cesium starts or resumes instead of treating it as new navigation 2026-11-03 22:56:24 +04:00
German Khokhlov 59a2e31aa8 Offer voice actions on whichever globe has the capability they need instead of refusing them without a Cesium viewer 2026-11-03 22:42:25 +04:00
German Khokhlov b20579b06a Register the Navara Draw input in the package boundaries again 2026-11-03 22:03:25 +04:00
German Khokhlov a9282b30bb Expect the session's marks and files drawn on Navara as on Cesium in the one-application switch check 2026-11-03 21:52:42 +04:00
German Khokhlov 1a3f6f2486 Treat contacts with the Cyber sonar sweep on Navara behind an optional render.setContactSonar capability
The sprite and point mover shaders rate each contact by its anchor against the sweep with the cyberSonar.js sampler maths; the engine sonar scene feeds the theme, settings and shared sweep angle each drawn frame and keeps the fleet cadence only while the sweep runs over contacts.
2026-11-03 21:49:56 +04:00
German Khokhlov c2d7a6dbb0 Register the Navara style, bloom and cloud cover modules in the package boundaries and keep VisualEffects free of the globe contract 2026-11-03 21:49:50 +04:00
German Khokhlov 89339cdd96 Leave the scope mask off a globe whose container holds no DOM children 2026-11-03 21:47:13 +04:00
German Khokhlov 5983c663bd Put the DISPLAY scope mask over Navara, its terminus following the engine camera's height 2026-11-03 21:46:37 +04:00
German Khokhlov ef174b0ff7 Keep local directories out of the acceptance report 2026-11-03 21:45:20 +04:00
German Khokhlov 6ba67d01af Draw by hand on Navara: clicks, moves and the double click from the engine input, a dashed engine line and vertex dots as the preview, and depth picks at the camera treated as misses 2026-11-03 21:41:30 +04:00
German Khokhlov d8ef366ab1 Classify the Navara launch pad zone onto terrain and 3D tiles with Cesium's fill, rim and emission
The zone was a flat disc at ellipsoid height in Navara's opaque scene: it floated over low pads and sank under raised ground or 3D tiles, with hard edges and an unlit rim. A screen-space pass now paints the ground pixels within the radius of the pad from the scene depth, as Cesium's GroundPrimitive classifies them, using one style shared by both engines (LAUNCH_PAD_ZONE_STYLE).
2026-11-03 21:30:36 +04:00
German Khokhlov f0d38897f4 Drive the Navara volumetric clouds from the cockpit weather behind an optional render.setCloudCover capability
The cockpit's weather feed moves out of the Cesium cloud pass and serves both: Cesium keeps its own cloud canvas, an engine with its own clouds takes their cover from the same observations, with no second WebGL canvas.
2026-11-03 21:22:34 +04:00
German Khokhlov d8c63c69d8 Import GeoJSON, KML, KMZ and GPX files on Navara: shapes as clamped vector layers, pins as sprites, and the graphics it cannot draw counted and reported 2026-11-03 21:19:55 +04:00
German Khokhlov eee4f48745 Hide Navara infrastructure stems and data pack meshes behind walls, terrain and the Earth
Navara draws its transparent scene after the post effects into a target without the scene depth, so stems and pack polygons and images painted through 3D tiles. A scene-depth test now drops each of their fragments behind the depth Navara packs after its opaque pass; they stay in the transparent pass, so their look in the open is unchanged (scripts/qa-edge-occlusion.mjs compares it with the previous build). Wind flow was already hidden and is kept as a guard in the same scenario.
2026-11-03 21:15:03 +04:00
German Khokhlov c392d6fb50 Glow the Navara frame with the Display bloom behind an optional render.setBloom capability
postprocessing's BloomEffect runs after the overlays and before the visual styles, follows Cesium's eased strength and dead zone with its threshold set in display terms, and VisualEffects drives it when the engine has the bloom capability.
2026-11-03 21:11:53 +04:00
German Khokhlov 074f4af10e Release a running camera verb when a Navara scene is parked or torn down, as the Cesium scene does 2026-11-03 21:11:30 +04:00
German Khokhlov dcb8de9d2c Run the camera verbs on the globe contract so orbit, pan, tilt, rotate, globe rotation and the route dolly move a Navara camera as they move Cesium's
A motion drives one camera through a rig: a Cesium viewer's own camera, or any globe engine through camera.pose/setView/lookAt/release/transform/flightActive/following and frames.preRender. An engine rig binds its frame, canvas-input and follow listeners only while its motion runs. A finished once orbit now releases its lookAt lock, and an orbit armed through a flight keeps its nudge budget until it starts.
2026-11-03 21:11:30 +04:00
German Khokhlov 4c28cc0212 Draw the visual styles on Navara as one post pass behind an optional render.setStyle capability
CRT, NVG, FLIR, Anime and Noir run their Cesium shaders through a GLSL prelude with the exact sRGB transfer, crossfade in the stage order, fade the Navara stars with Anime, and report the visualStyles capability through engineCapabilities.
2026-11-03 21:02:50 +04:00
German Khokhlov 00dfed7959 Run the scenarios from the served clean checkout 2026-11-03 21:01:17 +04:00
German Khokhlov f7945d6844 Stop the runner's preview at the end and record only .env names and credential leaks in the served build 2026-11-03 21:00:58 +04:00
German Khokhlov 96b5b0bb1f Draw the session annotation board on Navara: draped areas and routes as clamped meshes, every other mark on the shared screen board over the engine's projector 2026-11-03 20:59:10 +04:00
German Khokhlov 5b7171f485 Pin that push-to-talk starts from the Navara canvas inside its renderer host 2026-11-03 20:40:34 +04:00
German Khokhlov f5c14ec30d Move the session annotation board, Draw and Import out of the Cesium tools into sessionTools.js and give Navara its tools seam 2026-11-03 20:37:59 +04:00
German Khokhlov dea10cac4f Give Local ADS-B the selectById hook the other selectable layers expose
It takes the ICAO a position row carries, in any case, or the marker id, and selects through the same path as a click; selectAircraft now delegates to it.
2026-11-03 20:36:10 +04:00
German Khokhlov 60a230b2ff Keep a bikeshare city's last known stations, marked stale, when it comes back into range during a source outage 2026-11-03 20:33:13 +04:00
German Khokhlov 057dbe24af Reframe a mission after a late active-satellite answer only while nobody has left its orbit view
A flyover, a launch-site view, a cancelled flyover or another mission now clears the pending orbit framing, so a late TLE lookup followed by a data refresh never takes the camera back.
2026-11-03 20:31:49 +04:00
German Khokhlov f0d7def9c7 Report an empty wind field from get_wind as no surface reading instead of a NaN speed 2026-11-03 20:29:44 +04:00
German Khokhlov 1773494116 Run the layer acceptance under a default-deny network policy with per-layer assertion manifests and strict switch contracts
Every scenario runs through scripts/qa-strict-harness.mjs: each page, frame and worker gets an ordered block list before it runs (paid hosts and routes first, then only the preview, declared fixtures, keyless probes and cached free tile hosts), switches with real input on the picker, and records its assertions per layer and engine. The runner reads the catalog from the live page, fails any layer without an assertion on either engine, can build and serve a keyless checkout itself, and adds rapid, hidden-tab, context-loss, failure-injection, cold-chunk and soak scenarios. The main chunk gets a 1% size budget.
2026-11-03 20:15:50 +04:00
German Khokhlov 3144169057 Draw the Navara CCTV frame and viewshed in the depth-tested opaque scene so walls hide them
Navara's transparent pass runs after the post effects without the scene depth, so a camera frame clamped in front of a wall still painted through it. scripts/qa-edge-cctv-occlusion.mjs serves a one-box tileset as a local fixture with no network and checks on both engines that the frame ends at the wall and is not visible behind it.
2026-11-03 20:11:23 +04:00