Something went wrong. Try again.
[PRE-ALPHA] an open source web-based 2D/3D graphing calculator cartesium.org
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113import type { GraphDocument2d, RenderScene2d, Viewport } from './types';
export const PREVIEW_CELL_SIZE = 2;export const INTERACTIVE_PREVIEW_CELL_SIZE = 4;export const REFINE_DELAY_MS = 200;
/** Camera settle already has a compatible retained scene, so only quality or coverage is stale. */export function refineDelayMs(preservingCameraScene: boolean) { return preservingCameraScene ? 0 : REFINE_DELAY_MS;}
/** Whether retained whole-scene pixels can cover the complete presentation camera. */export function sceneCoversViewport(coverage: Viewport | undefined, viewport: Viewport) { if (coverage === undefined) return false; const coverageXDensity = coverage.width / (coverage.x_max - coverage.x_min); const coverageYDensity = coverage.height / (coverage.y_max - coverage.y_min); const viewportXDensity = viewport.width / (viewport.x_max - viewport.x_min); const viewportYDensity = viewport.height / (viewport.y_max - viewport.y_min);
return ( sceneContainsViewport(coverage, viewport) && coverageXDensity >= viewportXDensity && coverageYDensity >= viewportYDensity );}
/** Whether retained scene bounds contain the camera, independent of sampling density. */export function sceneContainsViewport(coverage: Viewport | undefined, viewport: Viewport) { return ( coverage !== undefined && coverage.x_min <= viewport.x_min && coverage.x_max >= viewport.x_max && coverage.y_min <= viewport.y_min && coverage.y_max >= viewport.y_max );}
export function shouldPresentScene(requestSequence: number, presentedSequence: number) { return requestSequence > presentedSequence;}
export function createPreviewDocument( document: GraphDocument2d, cellSize = PREVIEW_CELL_SIZE): GraphDocument2d { return { ...document, grid_cell_size: Math.max(1, Math.floor(cellSize)) };}
/** * Chooses the whole-scene sampling budget for a live render request. * * Camera interaction must not turn an already-interactive model update (for * example an animation frame) back into a full-resolution build. Retained * presentation can transform the last completed scene while this bounded * preview catches up to both the newest model and camera. */export function createLivePreviewDocument(document: GraphDocument2d, interactive: boolean) { return createPreviewDocument( document, interactive ? INTERACTIVE_PREVIEW_CELL_SIZE : PREVIEW_CELL_SIZE );}
/** * Whether a coarse whole-scene result still needs a full-resolution successor. * * Cartesian implicit contours and inequalities refine through spatial tiles, * while explicit, parametric, and ordinary polar curves ignore grid_cell_size * and are already full quality in the preview. The remaining coarse-only path * is the general polar-inequality classifier. Its adaptive boundary metadata * records the seed count, so it also identifies an empty classified fill. */export function needsWholeSceneRefinement(scene: RenderScene2d) { return scene.layers.some( (layer) => layer.type === 'polyline' && layer.source_kind === 'polar_inequality' && layer.sampling.target_samples < Math.max(scene.coverage.width * 2, 1024) + 1 );}
/** * Whether a settled camera requires newly sampled whole-scene geometry. * * Spatial Cartesian contours and masks obtain exact camera detail from tiles, * so stale fallback density alone must not trigger their former redundant * full-scene classifier. Direct vector inequality fills, explicit, parametric, * and polar geometry have no spatial successor and must be rebuilt when * retained coverage or sampling density no longer matches the camera. Exact * connected-point geometry is viewport-invariant, but its retained paths are * clipped to scene coverage and therefore need replacement coverage after the * camera outruns that clip. */export function needsWholeSceneCameraRefresh(scene: RenderScene2d, viewport: Viewport) { if (sceneCoversViewport(scene.coverage, viewport)) return false;
return scene.layers.some( (layer) => (layer.type === 'fill' && layer.polygons !== undefined) || (layer.type === 'polyline' && (layer.source_kind === 'explicit' || layer.source_kind === 'parametric' || layer.source_kind === 'polar' || layer.source_kind === 'polar_inequality' || layer.source_kind === 'polyline' || layer.source_kind === 'polygon')) );}