mirror of
https://github.com/bilawalsidhu/gods-eye-view.git
synced 2026-11-04 10:24:02 +00:00
The CCTV layer kept every loaded camera live: each view change touched every icon, every notification rebuilt every camera's state, and the picker listed the whole catalog. With the default 4,000 cameras, a continental drag ran at 152-179 fps with 18-24 frames over 30 ms (worst 112 ms). It now runs at 235 fps with none. The layer now: - shows icons only on or near the screen, and when zoomed out keeps one camera per world-anchored cell (healthy feeds first), so panning keeps the same cameras; - grounds and draws coverage only for the cameras in view, the active camera and its coverage neighbours, retrying a camera at most twice per view regime; - reruns the view pass while the camera moves, paced by its own cost, and projects with one matrix per pass instead of a Cesium call per camera; - keeps the billboard buffer-usage hint fixed, so showing or hiding a few icons no longer rewrites the vertex data of every billboard; - lists the cameras in view (active camera first) in the picker, closing with the count of cameras outside the view, and builds the full camera list in the UI state only when it is read.
128 lines
4.2 KiB
JavaScript
128 lines
4.2 KiB
JavaScript
import * as Cesium from 'cesium';
|
|
|
|
export function createTesting({ state: layerState, services, parts, source }) {
|
|
/** Test seam: republishes host entries through the real push path, so tests
|
|
* can observe the pristine module default without touching the setter. */
|
|
|
|
function _pushAmbientCardEntriesForTest() {
|
|
parts.cards.pushAmbientCardEntries();
|
|
}
|
|
|
|
/** Test seam for exercising real layer lifecycle paths without a DOM host. */
|
|
|
|
function _setCctvOverlayHostForTest(host = null) {
|
|
layerState._cctvOverlayHost = host
|
|
? { ...layerState.DEFAULT_CCTV_OVERLAY_HOST, ...host }
|
|
: layerState.DEFAULT_CCTV_OVERLAY_HOST;
|
|
layerState._projectionOverlayOwnerId = null;
|
|
}
|
|
|
|
/**
|
|
* Create the production monitor-plane/host-label pair without media setup.
|
|
* @param {Object} viewer Cesium viewer seam.
|
|
* @param {Object} record CCTV runtime record.
|
|
* @returns {Object} Projection runtime.
|
|
*/
|
|
|
|
function _createCctvProjectionPlaneForTest(viewer, record) {
|
|
layerState._viewer = viewer;
|
|
const geometry =
|
|
record.frustumGeometry ||
|
|
parts.geometry.computeFrustumGeometry(
|
|
record.camera,
|
|
parts.ground.groundAltFor(record),
|
|
record.probeClampRangeM,
|
|
);
|
|
const positions =
|
|
record.frustumPositions || parts.geometry.frustumCartesians(geometry);
|
|
record.frustumGeometry = geometry;
|
|
record.frustumPositions = positions;
|
|
const runtime = {
|
|
cameraId: String(record.camera.id),
|
|
planeEntity: null,
|
|
labelPosition: new Cesium.Cartesian3(),
|
|
overlayEntry: null,
|
|
planeMaterial: new Cesium.ColorMaterialProperty(Cesium.Color.WHITE),
|
|
};
|
|
parts.projection.createProjectionPlane(
|
|
record,
|
|
runtime,
|
|
geometry,
|
|
positions,
|
|
);
|
|
record.projection = runtime;
|
|
return runtime;
|
|
}
|
|
|
|
/**
|
|
* Exercise the production geometry-to-plane-and-label cache update.
|
|
* @param {Object} record CCTV runtime record.
|
|
*/
|
|
|
|
function _updateCctvProjectionPlaneForTest(record) {
|
|
parts.projection.updatePlanePlacement(record);
|
|
}
|
|
|
|
/** Test-only seam for the CCTV ownership proof used by the world-click route. */
|
|
|
|
function _extractPickedCameraIdForTest(picked) {
|
|
return parts.selection.extractPickedCameraId(picked);
|
|
}
|
|
|
|
/**
|
|
* Primes the minimum module state needed to exercise the production coverage
|
|
* refresh path in unit tests.
|
|
* @param {Object} [options={}] Test state values.
|
|
* @param {Object|null} [options.viewer] Viewer-like entity owner.
|
|
* @param {Object[]} [options.records] Seeded CCTV records.
|
|
* @param {string|null} [options.activeCameraId] Active record id.
|
|
* @param {boolean} [options.enabled=true] Layer enabled state.
|
|
* @param {'off'|'on'|'viewshed'} [options.coverageMode='on'] Coverage mode.
|
|
* @param {boolean} [options.showProjection=false] Projection visibility.
|
|
* @param {Map<string, Object>} [options.healthById] Health rows by camera id.
|
|
* @returns {void}
|
|
*/
|
|
|
|
function _setCctvCoverageStateForTest({
|
|
viewer = null,
|
|
records = [],
|
|
activeCameraId = null,
|
|
enabled = true,
|
|
coverageMode = 'on',
|
|
showProjection = false,
|
|
healthById = new Map(),
|
|
} = {}) {
|
|
layerState._viewer = viewer;
|
|
layerState._records = Array.isArray(records) ? records : [];
|
|
layerState._recordById = new Map(
|
|
layerState._records
|
|
.filter((record) => record?.camera?.id)
|
|
.map((record) => [record.camera.id, record]),
|
|
);
|
|
layerState._coverageEntities = [];
|
|
layerState._projectionEntities = [];
|
|
layerState._billboards = null;
|
|
layerState._activeCameraId = activeCameraId;
|
|
layerState._autoHopSuspended = false;
|
|
layerState._enabled = !!enabled;
|
|
layerState._coverageMode = parts.model.normalizeCoverageMode(
|
|
coverageMode,
|
|
'on',
|
|
);
|
|
layerState._showProjection = !!showProjection;
|
|
layerState._healthById = healthById;
|
|
layerState._viewRecords = [];
|
|
layerState._cameraIndexCache = null;
|
|
layerState._coverageVisibleIds = new Set();
|
|
layerState._neighborCountCache = null;
|
|
}
|
|
return {
|
|
_pushAmbientCardEntriesForTest,
|
|
_setCctvOverlayHostForTest,
|
|
_createCctvProjectionPlaneForTest,
|
|
_updateCctvProjectionPlaneForTest,
|
|
_extractPickedCameraIdForTest,
|
|
_setCctvCoverageStateForTest,
|
|
};
|
|
}
|