mirror of
https://github.com/bilawalsidhu/gods-eye-view.git
synced 2026-11-04 18:34:02 +00:00
- OPEN STREET VIEW in the PROVIDERS row opens Street View's nearest panorama at the ground under the middle of the screen, without moving the camera: Street View no longer needs a pointer. It is disabled (and says so) until the camera is at street zoom. - Off the Google 3D map Street View does not appear at all: no chip, legend swatch, globe credit, layer source or button, and Google's script is not loaded (the viewer has no prewarm; the script loads on first use). The share option keeps the user's choice for when Google 3D returns. - A ground click measures the camera height at the click rather than reading the cached flag. - A chip without a usable key explains it instead of lighting; it darkens beside a lit chip, and the other chips keep switching, so a refused Street View key cannot lock Mapillary out. - The gate checks that nothing of Street View shows off Google 3D even when a share link switches it on, presses OPEN STREET VIEW on Google 3D, and asserts that each chip it switches really switched. Co-Authored-By: Claude Opus 5.5 <[email protected]>
134 lines
4.0 KiB
JavaScript
134 lines
4.0 KiB
JavaScript
import assert from 'node:assert/strict';
|
||
import test from 'node:test';
|
||
import * as Cesium from 'cesium';
|
||
import { createGroundClick, groundClickHeightOk } from './groundClick.js';
|
||
import * as scenePick from '../../data/scenePick.js';
|
||
|
||
const GROUND = Cesium.Cartesian3.fromDegrees(-121.4944, 38.5816, 10);
|
||
const TILESET = { isCesium3DTileset: true };
|
||
|
||
/**
|
||
* A layer state with providers `{id, on, groundClick, configured, available}`;
|
||
* `picked` is where the depth buffer lands, `ellipsoid` the fallback hit.
|
||
*/
|
||
function harness({
|
||
providers = [
|
||
{ id: 'mapillary', groundClick: false },
|
||
{ id: 'google', groundClick: true },
|
||
],
|
||
height = 400,
|
||
enabled = true,
|
||
picked = GROUND,
|
||
ellipsoid = undefined,
|
||
} = {}) {
|
||
const opened = [];
|
||
const state = {
|
||
enabled,
|
||
services: { scenePick },
|
||
providers: new Map(
|
||
providers.map(
|
||
({
|
||
id,
|
||
on = true,
|
||
groundClick,
|
||
configured = true,
|
||
available = true,
|
||
}) => [
|
||
id,
|
||
{ on, def: { id, groundClick }, status: { configured }, available },
|
||
],
|
||
),
|
||
),
|
||
viewer: {
|
||
scene: { pickPositionSupported: true, pickPosition: () => picked },
|
||
camera: {
|
||
pickEllipsoid: () => ellipsoid,
|
||
positionCartographic: Cesium.Cartographic.fromDegrees(
|
||
-121.4944,
|
||
38.5816,
|
||
height,
|
||
),
|
||
},
|
||
},
|
||
};
|
||
const openAtGround = createGroundClick({
|
||
state,
|
||
openNearest: (point, options) => {
|
||
opened.push({ point, options });
|
||
return Promise.resolve(true);
|
||
},
|
||
isAvailable: (entry) => entry.available,
|
||
});
|
||
return { opened, openAtGround };
|
||
}
|
||
|
||
const near = (point) =>
|
||
Math.abs(point.lon - -121.4944) < 1e-9 &&
|
||
Math.abs(point.lat - 38.5816) < 1e-9;
|
||
|
||
test('a click on the map opens the click-to-open providers there, without moving the camera', () => {
|
||
for (const picked of [undefined, { primitive: TILESET }, { content: {} }]) {
|
||
const { opened, openAtGround } = harness();
|
||
openAtGround({ x: 10, y: 20 }, picked);
|
||
assert.equal(opened.length, 1, JSON.stringify(picked));
|
||
assert.ok(near(opened[0].point));
|
||
assert.deepEqual(opened[0].options, {
|
||
providerIds: ['google'],
|
||
frame: false,
|
||
});
|
||
}
|
||
});
|
||
|
||
test('where the depth buffer names no place, the ellipsoid answers', () => {
|
||
const { opened, openAtGround } = harness({
|
||
picked: new Cesium.Cartesian3(500, 0, 0),
|
||
ellipsoid: GROUND,
|
||
});
|
||
openAtGround({ x: 1, y: 1 });
|
||
assert.ok(near(opened[0].point));
|
||
});
|
||
|
||
test('nothing opens over another layer’s object, the sky, from high up, off its map stack, or with the provider off', () => {
|
||
const cases = [
|
||
{ picked: { id: { id: 'flight:1' } }, label: 'an entity' },
|
||
{ picked: { id: 'cctv:7', primitive: TILESET }, label: 'an id on a tile' },
|
||
{ options: { picked: null, ellipsoid: undefined }, label: 'the sky' },
|
||
{ options: { height: 5000 }, label: 'high up' },
|
||
{
|
||
options: {
|
||
providers: [{ id: 'google', groundClick: true, available: false }],
|
||
},
|
||
label: 'not Google 3D',
|
||
},
|
||
{
|
||
options: { providers: [{ id: 'google', groundClick: true, on: false }] },
|
||
label: 'off',
|
||
},
|
||
{
|
||
options: {
|
||
providers: [{ id: 'google', groundClick: true, configured: false }],
|
||
},
|
||
label: 'no key',
|
||
},
|
||
{ options: { enabled: false }, label: 'layer off' },
|
||
];
|
||
for (const { picked, options = {}, label } of cases) {
|
||
const { opened, openAtGround } = harness(options);
|
||
assert.equal(openAtGround({ x: 1, y: 1 }, picked), false, label);
|
||
assert.equal(opened.length, 0, label);
|
||
}
|
||
});
|
||
|
||
test('street zoom is measured above the ground under the camera', () => {
|
||
const viewer = (height) => ({
|
||
camera: {
|
||
positionCartographic: Cesium.Cartographic.fromDegrees(0, 0, height),
|
||
},
|
||
scene: { globe: { getHeight: () => 1500 } },
|
||
});
|
||
// 1,500 m up a plateau, 2,000 m above it: still a street.
|
||
assert.equal(groundClickHeightOk(viewer(3500)), true);
|
||
assert.equal(groundClickHeightOk(viewer(5000)), false);
|
||
assert.equal(groundClickHeightOk(null), false);
|
||
});
|