feat(map): add seamless five-band grid LOD

This commit is contained in:
Codex
2026-08-05 19:36:01 +03:00
parent 2cd3b33141
commit 80e948c018
10 changed files with 638 additions and 62 deletions
+50 -3
View File
@@ -519,9 +519,16 @@ const MAP_PAGE_SETTING_KEYS = new Set([
"sunHour", "sunIntensity", "shadowsEnabled", "buildingsVisible", "buildingsColor",
"buildingsOpacity", "buildingsDetail", "imageryBrightness", "imageryContrast",
"imagerySaturation", "gridVisible", "gridLodEnabled", "gridHeightMeters",
"grid3dEnabled", "gridGraticuleEnabled", "gridCenterMode", "gridCenterLatitude",
"gridCenterLongitude", "gridTileSizeKm", "gridAutoDisableHeightKm", "gridRebuildOnMoveEnd",
"gridMax3dViewAngleDegrees",
"gridLod1MaxHeightKm", "gridLod1StepKm", "gridLod2MaxHeightKm", "gridLod2StepKm",
"gridLod3StepKm", "gridRadiusKm", "gridLineWidth", "gridColor", "gridOpacity",
"gridDotsEnabled", "gridDotsSize", "gridDotsColor", "gridDotsOpacity",
"gridLod3MaxHeightKm", "gridLod3StepKm", "gridLod4MaxHeightKm", "gridLod4StepKm",
"gridLod5StepKm", "gridLod1Mode", "gridLod2Mode", "gridLod3Mode", "gridLod4Mode",
"gridLod5Mode", "gridRadiusKm", "gridLineWidth", "gridLineDiameterMeters", "gridColor", "gridOpacity",
"gridDotsEnabled", "gridDotsSize", "gridDotsDiameterMeters", "gridDotsColor", "gridDotsOpacity",
"gridCrossesEnabled", "gridCrossesLengthMeters", "gridCrossesWidthMeters",
"gridCrossesColor", "gridCrossesOpacity",
]);
function validateMapPageSettingsPatch(value) {
@@ -558,6 +565,9 @@ function validateMapPageLayout(value) {
// Layouts written before this field existed are safely upgraded to the
// no-overwrite default during read/save; they are not rejected as damaged.
if (settings.cacheNoOverwrite !== undefined) requireBoolean(settings.cacheNoOverwrite, "invalid_map_page_setting_cacheNoOverwrite");
for (const key of ["grid3dEnabled", "gridGraticuleEnabled", "gridRebuildOnMoveEnd", "gridCrossesEnabled"]) {
if (settings[key] !== undefined) requireBoolean(settings[key], `invalid_map_page_setting_${key}`);
}
requireString(settings.imagerySource, "invalid_map_page_imagery_source", 64);
for (const key of ["terrainExaggeration", "imageryGamma", "imageryHue", "imageryAlpha", "atmosphereHue", "atmosphereSaturation", "atmosphereBrightness", "fogDensity", "sunHour", "sunIntensity", "buildingsOpacity", "buildingsDetail", "imageryBrightness", "imageryContrast", "imagerySaturation", "gridHeightMeters", "gridLod1MaxHeightKm", "gridLod1StepKm", "gridLod2MaxHeightKm", "gridLod2StepKm", "gridLod3StepKm", "gridRadiusKm", "gridLineWidth", "gridOpacity", "gridDotsSize", "gridDotsOpacity"]) {
requireNumber(settings[key], -100000, 100000, `invalid_map_page_setting_${key}`);
@@ -565,6 +575,18 @@ function validateMapPageLayout(value) {
for (const key of ["monochromeColor", "globeColor", "backgroundColor", "buildingsColor", "gridColor", "gridDotsColor"]) {
requireHex(settings[key], `invalid_map_page_setting_${key}`);
}
for (const key of ["gridCenterLatitude", "gridCenterLongitude", "gridTileSizeKm", "gridAutoDisableHeightKm", "gridMax3dViewAngleDegrees", "gridLod3MaxHeightKm", "gridLod4MaxHeightKm", "gridLod4StepKm", "gridLod5StepKm", "gridLineDiameterMeters", "gridDotsDiameterMeters", "gridCrossesLengthMeters", "gridCrossesWidthMeters", "gridCrossesOpacity"]) {
if (settings[key] !== undefined) requireNumber(settings[key], -100000, 100000, `invalid_map_page_setting_${key}`);
}
if (settings.gridCrossesColor !== undefined) requireHex(settings.gridCrossesColor, "invalid_map_page_setting_gridCrossesColor");
if (settings.gridCenterMode !== undefined && !["camera", "fixed"].includes(settings.gridCenterMode)) {
throw applicationError("invalid_map_page_setting_gridCenterMode");
}
for (const key of ["gridLod1Mode", "gridLod2Mode", "gridLod3Mode", "gridLod4Mode", "gridLod5Mode"]) {
if (settings[key] !== undefined && !["3d", "graticule"].includes(settings[key])) {
throw applicationError(`invalid_map_page_setting_${key}`);
}
}
const camera = value.camera;
for (const key of ["longitude", "latitude", "height", "heading", "pitch", "roll"]) {
requireNumber(camera[key], -1_000_000_000, 1_000_000_000, `invalid_map_page_camera_${key}`);
@@ -712,20 +734,45 @@ function defaultMapPageLayout() {
imagerySaturation: 0,
gridVisible: true,
gridLodEnabled: true,
grid3dEnabled: true,
gridGraticuleEnabled: true,
gridCenterMode: "camera",
gridCenterLatitude: 55.7558,
gridCenterLongitude: 37.6173,
gridTileSizeKm: 10,
gridAutoDisableHeightKm: 10000,
gridRebuildOnMoveEnd: true,
gridMax3dViewAngleDegrees: 30,
gridHeightMeters: 500,
gridLod1MaxHeightKm: 10,
gridLod1StepKm: 1,
gridLod1Mode: "3d",
gridLod2MaxHeightKm: 50,
gridLod2StepKm: 5,
gridLod2Mode: "3d",
gridLod3MaxHeightKm: 180,
gridLod3StepKm: 25,
gridRadiusKm: 40,
gridLod3Mode: "3d",
gridLod4MaxHeightKm: 700,
gridLod4StepKm: 100,
gridLod4Mode: "graticule",
gridLod5StepKm: 500,
gridLod5Mode: "graticule",
gridRadiusKm: 1000,
gridLineWidth: 4,
gridLineDiameterMeters: 10,
gridColor: "#f5f5f5",
gridOpacity: 12,
gridDotsEnabled: true,
gridDotsSize: 7,
gridDotsDiameterMeters: 80,
gridDotsColor: "#ffffff",
gridDotsOpacity: 58,
gridCrossesEnabled: false,
gridCrossesLengthMeters: 200,
gridCrossesWidthMeters: 10,
gridCrossesColor: "#35cfff",
gridCrossesOpacity: 50,
},
mapHeight: 470,
camera: {