mirror of
https://github.com/bilawalsidhu/gods-eye-view.git
synced 2026-11-04 10:24:02 +00:00
fix(street-level): KartaView marker and camera direction; remaining review P4s
Marker and direction (reported on the PR): - KartaView has its own marker, a purple view cone (Street View's is blue), not GEV's default pin that Mapillary uses. - The camera direction (marker, cones, FOLLOW, a panorama's centre) is the direction of travel to the next photo a few metres on. KartaView's heading is the device compass: whole drives read 0 (no compass) and others sit a steady ~110° off. Until the drive loads the compass stands in (0 = unknown), and the pose is sent again once the course is known. Remaining P4s from the review of #1121: - Segment chaining is linear (a per-point cursor) and capped at 20,000 segments a tile and 5,000 points a line: a hostile tile of 60k segments sharing one point took 1.5 s, now tens of ms. - Decoded tiles are dropped when KartaView is switched off. - No network / a refused request says so and is not retried as a timeout; an unreadable answer says so. - A docked flat photo skips the 2,560 px download until the viewer grows. - The panel counts the drive's photos (countActivePhotos), not the thinned page of cones (2,250, not 217). - After a GPU reset the viewer redraws the photo itself, so a lookup the user started is not cancelled; a failure is still reported. - The gate's keyless page lights KartaView and checks it draws with no key; the fixture answers the sequence count; the line-click step checks the camera looks along the drive when the compass says 200°. - README/CHANGELOG show the share-link form the app writes. Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
1 parent
c99eb93174
commit
e9a4dbb062
15 files changed
+588
-63
No files matched your search
@@ -464,6 +464,45 @@ async function assertKeylessGate(page) {
|
||||
assert.match(chip.title, /MAPILLARY_CLIENT_TOKEN/);
|
||||
}
|
||||
|
||||
/**
|
||||
* With no Mapillary key the panel points at KartaView, which needs none:
|
||||
* lit, it draws coverage and the layer is not key-gated.
|
||||
*/
|
||||
async function assertKeylessKartaView(page) {
|
||||
assert.match(
|
||||
await page.$eval('#sl-coverage-meta', (node) => node.textContent),
|
||||
/light KARTAVIEW/,
|
||||
'KEY REQUIRED points at KartaView',
|
||||
);
|
||||
for (let attempt = 0; attempt < 4; attempt++) {
|
||||
await page.evaluate((at) => {
|
||||
const v = window.__godsEyeView.viewer;
|
||||
v.camera.cancelFlight?.();
|
||||
const C = v.camera.positionCartographic.constructor;
|
||||
v.camera.setView({
|
||||
destination: v.scene.globe.ellipsoid.cartographicToCartesian(
|
||||
C.fromDegrees(at.lon, at.lat, at.height),
|
||||
),
|
||||
orientation: { heading: 0, pitch: at.pitch, roll: 0 },
|
||||
});
|
||||
}, PARK);
|
||||
await sleep(1000);
|
||||
}
|
||||
await clickPanelControl(
|
||||
page,
|
||||
'#sl-provider-chips [data-chip-id="kartaview"]',
|
||||
);
|
||||
await waitForCoverage(page);
|
||||
const state = await page.evaluate(() => ({
|
||||
status: document.getElementById('sl-status').textContent,
|
||||
keyRequired: window.__godsEyeView.dataManager.layers
|
||||
.get('street-level')
|
||||
.module.getUIState().keyRequired,
|
||||
}));
|
||||
assert.equal(state.keyRequired, false);
|
||||
assert.doesNotMatch(state.status, /KEY/);
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs in the page. Find a point where a real click picks `prefix` + `id` (any
|
||||
* id when null), searched around `points` ([lon, lat]), the aimed billboards,
|
||||
@@ -942,6 +981,15 @@ async function main() {
|
||||
),
|
||||
`cones for the whole drive: ${JSON.stringify((await ui()).sequence)}`,
|
||||
);
|
||||
// The drive runs north; the photos' compass says 200°.
|
||||
assert.ok(
|
||||
await uiUntil(
|
||||
(u) =>
|
||||
Number.isFinite(u.street.bearing) &&
|
||||
Math.min(u.street.bearing, 360 - u.street.bearing) < 2,
|
||||
),
|
||||
`the camera looks along the drive, not where the compass points: ${(await ui()).street.bearing}`,
|
||||
);
|
||||
}
|
||||
const before = street.imageId;
|
||||
await clickPanelControl(page, '.sl-kv-step-next');
|
||||
@@ -2444,7 +2492,7 @@ async function main() {
|
||||
);
|
||||
if (fixtures)
|
||||
await step(
|
||||
'keyless install (a second page, no key on the server) gates the controls and reports KEY REQUIRED',
|
||||
'keyless install (a second page, no key on the server) gates the controls and reports KEY REQUIRED, and KartaView draws there',
|
||||
async () => {
|
||||
const keyless = await browser.newPage();
|
||||
await keyless.setViewport(VIEWPORTS[0]);
|
||||
@@ -2453,6 +2501,7 @@ async function main() {
|
||||
await boot(keyless, url);
|
||||
await expandStrip(keyless);
|
||||
await assertKeylessGate(keyless);
|
||||
await assertKeylessKartaView(keyless);
|
||||
renderErrorsSeen.push(
|
||||
...(await readRenderErrors(keyless)).map(
|
||||
(text) => `[keyless] scene.renderError: ${text}`,
|
||||
|
||||
Reference in new issue
Block a user