feat(map): adopt DC Default scene

This commit is contained in:
DCCONSTRUCTIONS
2026-07-29 17:55:44 +03:00
parent 5a06194962
commit b91d3b913e
9 changed files with 1299 additions and 331 deletions
+279 -14
View File
@@ -19,10 +19,44 @@ export interface MapCamera {
export interface MapVisualSettings {
atmosphereEnabled: boolean;
lightingEnabled: boolean;
atmosphereHue: number;
atmosphereSaturation: number;
atmosphereBrightness: number;
fogEnabled: boolean;
fogDensity: number;
sunEnabled: boolean;
sunHour: number;
sunIntensity: number;
shadowsEnabled: boolean;
monochromeEnabled: boolean;
monochromeColor: string;
imageryBrightness: number;
imageryContrast: number;
imagerySaturation: number;
imageryGamma: number;
imageryHue: number;
imageryAlpha: number;
globeColor: string;
backgroundColor: string;
terrainExaggeration: number;
buildingsColor: string;
buildingsOpacity: number;
buildingsMaximumScreenSpaceError: number;
gridLodEnabled: boolean;
gridHeightMeters: number;
gridLod1MaxHeightKm: number;
gridLod1StepKm: number;
gridLod2MaxHeightKm: number;
gridLod2StepKm: number;
gridLod3StepKm: number;
gridRadiusKm: number;
gridLineWidth: number;
gridColor: string;
gridOpacity: number;
gridDotsEnabled: boolean;
gridDotsSize: number;
gridDotsColor: string;
gridDotsOpacity: number;
cameraAnimationEnabled: boolean;
}
@@ -69,16 +103,57 @@ export function defaultMapViewDocument(): MapViewDocument {
return {
revision: 0,
view: {
camera: null,
camera: {
longitude: 37.618423,
latitude: 55.751244,
height: 40_000,
heading: 0,
pitch: -51.56620156177409,
roll: 0,
},
visualSettings: {
atmosphereEnabled: true,
lightingEnabled: true,
atmosphereEnabled: false,
atmosphereHue: 0,
atmosphereSaturation: 0,
atmosphereBrightness: 0,
fogEnabled: true,
fogDensity: 2,
sunEnabled: true,
sunHour: 12,
sunIntensity: 200,
shadowsEnabled: true,
monochromeEnabled: false,
monochromeColor: "#15151b",
imageryBrightness: 118,
imageryContrast: 102,
imagerySaturation: 0,
imageryGamma: 57,
imageryHue: 13,
imageryAlpha: 27,
globeColor: "#15151b",
backgroundColor: "#08090d",
terrainExaggeration: 1,
buildingsMaximumScreenSpaceError: 16,
buildingsColor: "#a27aff",
buildingsOpacity: 1,
buildingsMaximumScreenSpaceError: 4,
gridLodEnabled: true,
gridHeightMeters: 500,
gridLod1MaxHeightKm: 10,
gridLod1StepKm: 1,
gridLod2MaxHeightKm: 50,
gridLod2StepKm: 5,
gridLod3StepKm: 25,
gridRadiusKm: 40,
gridLineWidth: 4,
gridColor: "#f5f5f5",
gridOpacity: 12,
gridDotsEnabled: true,
gridDotsSize: 7,
gridDotsColor: "#ffffff",
gridDotsOpacity: 58,
cameraAnimationEnabled: true,
},
mapHeight: 720,
mapHeight: 694,
inspectorOpenSections: [],
cacheIntent: {
enabled: true,
@@ -89,7 +164,7 @@ export function defaultMapViewDocument(): MapViewDocument {
imagery: true,
terrain: true,
buildings: true,
grid: false,
grid: true,
targets: true,
},
},
@@ -99,7 +174,7 @@ export function defaultMapViewDocument(): MapViewDocument {
export function decodeMapViewDocument(value: unknown): MapViewDocument {
const document = requireRecord(value, "map view");
requireExactKeys(document, ["schema_version", "revision", "view"], "map view");
if (document.schema_version !== "missioncore.map-view/v1") {
if (document.schema_version !== "missioncore.map-view/v2") {
throw new Error("Версия сохранённого состояния карты не поддерживается.");
}
return {
@@ -124,11 +199,45 @@ export function encodeMapViewPut(document: MapViewDocument): unknown {
: null,
visual_settings: {
atmosphere_enabled: document.view.visualSettings.atmosphereEnabled,
lighting_enabled: document.view.visualSettings.lightingEnabled,
atmosphere_hue: document.view.visualSettings.atmosphereHue,
atmosphere_saturation: document.view.visualSettings.atmosphereSaturation,
atmosphere_brightness: document.view.visualSettings.atmosphereBrightness,
fog_enabled: document.view.visualSettings.fogEnabled,
fog_density: document.view.visualSettings.fogDensity,
sun_enabled: document.view.visualSettings.sunEnabled,
sun_hour: document.view.visualSettings.sunHour,
sun_intensity: document.view.visualSettings.sunIntensity,
shadows_enabled: document.view.visualSettings.shadowsEnabled,
monochrome_enabled: document.view.visualSettings.monochromeEnabled,
monochrome_color: document.view.visualSettings.monochromeColor,
imagery_brightness: document.view.visualSettings.imageryBrightness,
imagery_contrast: document.view.visualSettings.imageryContrast,
imagery_saturation: document.view.visualSettings.imagerySaturation,
imagery_gamma: document.view.visualSettings.imageryGamma,
imagery_hue: document.view.visualSettings.imageryHue,
imagery_alpha: document.view.visualSettings.imageryAlpha,
globe_color: document.view.visualSettings.globeColor,
background_color: document.view.visualSettings.backgroundColor,
terrain_exaggeration: document.view.visualSettings.terrainExaggeration,
buildings_color: document.view.visualSettings.buildingsColor,
buildings_opacity: document.view.visualSettings.buildingsOpacity,
buildings_maximum_screen_space_error:
document.view.visualSettings.buildingsMaximumScreenSpaceError,
grid_lod_enabled: document.view.visualSettings.gridLodEnabled,
grid_height_meters: document.view.visualSettings.gridHeightMeters,
grid_lod_1_max_height_km: document.view.visualSettings.gridLod1MaxHeightKm,
grid_lod_1_step_km: document.view.visualSettings.gridLod1StepKm,
grid_lod_2_max_height_km: document.view.visualSettings.gridLod2MaxHeightKm,
grid_lod_2_step_km: document.view.visualSettings.gridLod2StepKm,
grid_lod_3_step_km: document.view.visualSettings.gridLod3StepKm,
grid_radius_km: document.view.visualSettings.gridRadiusKm,
grid_line_width: document.view.visualSettings.gridLineWidth,
grid_color: document.view.visualSettings.gridColor,
grid_opacity: document.view.visualSettings.gridOpacity,
grid_dots_enabled: document.view.visualSettings.gridDotsEnabled,
grid_dots_size: document.view.visualSettings.gridDotsSize,
grid_dots_color: document.view.visualSettings.gridDotsColor,
grid_dots_opacity: document.view.visualSettings.gridDotsOpacity,
camera_animation_enabled: document.view.visualSettings.cameraAnimationEnabled,
},
map_height: document.view.mapHeight,
@@ -228,29 +337,175 @@ function decodeVisualSettings(value: unknown): MapVisualSettings {
settings,
[
"atmosphere_enabled",
"lighting_enabled",
"atmosphere_hue",
"atmosphere_saturation",
"atmosphere_brightness",
"fog_enabled",
"fog_density",
"sun_enabled",
"sun_hour",
"sun_intensity",
"shadows_enabled",
"monochrome_enabled",
"monochrome_color",
"imagery_brightness",
"imagery_contrast",
"imagery_saturation",
"imagery_gamma",
"imagery_hue",
"imagery_alpha",
"globe_color",
"background_color",
"terrain_exaggeration",
"buildings_color",
"buildings_opacity",
"buildings_maximum_screen_space_error",
"grid_lod_enabled",
"grid_height_meters",
"grid_lod_1_max_height_km",
"grid_lod_1_step_km",
"grid_lod_2_max_height_km",
"grid_lod_2_step_km",
"grid_lod_3_step_km",
"grid_radius_km",
"grid_line_width",
"grid_color",
"grid_opacity",
"grid_dots_enabled",
"grid_dots_size",
"grid_dots_color",
"grid_dots_opacity",
"camera_animation_enabled",
],
"map view.view.visual_settings",
);
return {
atmosphereEnabled: requireBoolean(settings.atmosphere_enabled, "atmosphere_enabled"),
lightingEnabled: requireBoolean(settings.lighting_enabled, "lighting_enabled"),
atmosphereHue: requireNumber(settings.atmosphere_hue, "atmosphere_hue", -100, 100),
atmosphereSaturation: requireNumber(
settings.atmosphere_saturation,
"atmosphere_saturation",
-100,
100,
),
atmosphereBrightness: requireNumber(
settings.atmosphere_brightness,
"atmosphere_brightness",
-100,
100,
),
fogEnabled: requireBoolean(settings.fog_enabled, "fog_enabled"),
fogDensity: requireNumber(settings.fog_density, "fog_density", 0, 100),
sunEnabled: requireBoolean(settings.sun_enabled, "sun_enabled"),
sunHour: requireNumber(settings.sun_hour, "sun_hour", 0, 24),
sunIntensity: requireNumber(settings.sun_intensity, "sun_intensity", 0, 200),
shadowsEnabled: requireBoolean(settings.shadows_enabled, "shadows_enabled"),
monochromeEnabled: requireBoolean(settings.monochrome_enabled, "monochrome_enabled"),
monochromeColor: requireHexColor(settings.monochrome_color, "monochrome_color"),
imageryBrightness: requireNumber(
settings.imagery_brightness,
"imagery_brightness",
0,
200,
),
imageryContrast: requireNumber(
settings.imagery_contrast,
"imagery_contrast",
0,
200,
),
imagerySaturation: requireNumber(
settings.imagery_saturation,
"imagery_saturation",
0,
200,
),
imageryGamma: requireNumber(settings.imagery_gamma, "imagery_gamma", 0, 300),
imageryHue: requireNumber(settings.imagery_hue, "imagery_hue", -180, 180),
imageryAlpha: requireNumber(settings.imagery_alpha, "imagery_alpha", 0, 100),
globeColor: requireHexColor(settings.globe_color, "globe_color"),
backgroundColor: requireHexColor(settings.background_color, "background_color"),
terrainExaggeration: requireNumber(
settings.terrain_exaggeration,
"terrain_exaggeration",
0.1,
20,
0.25,
3,
),
buildingsColor: requireHexColor(settings.buildings_color, "buildings_color"),
buildingsOpacity: requireNumber(
settings.buildings_opacity,
"buildings_opacity",
0,
1,
),
buildingsMaximumScreenSpaceError: requireNumber(
settings.buildings_maximum_screen_space_error,
"buildings_maximum_screen_space_error",
4,
32,
),
gridLodEnabled: requireBoolean(settings.grid_lod_enabled, "grid_lod_enabled"),
gridHeightMeters: requireNumber(
settings.grid_height_meters,
"grid_height_meters",
0,
1000,
),
gridLod1MaxHeightKm: requireNumber(
settings.grid_lod_1_max_height_km,
"grid_lod_1_max_height_km",
1,
64,
50,
),
gridLod1StepKm: requireNumber(
settings.grid_lod_1_step_km,
"grid_lod_1_step_km",
1,
10,
),
gridLod2MaxHeightKm: requireNumber(
settings.grid_lod_2_max_height_km,
"grid_lod_2_max_height_km",
10,
200,
),
gridLod2StepKm: requireNumber(
settings.grid_lod_2_step_km,
"grid_lod_2_step_km",
1,
25,
),
gridLod3StepKm: requireNumber(
settings.grid_lod_3_step_km,
"grid_lod_3_step_km",
5,
100,
),
gridRadiusKm: requireNumber(settings.grid_radius_km, "grid_radius_km", 5, 150),
gridLineWidth: requireNumber(
settings.grid_line_width,
"grid_line_width",
1,
8,
),
gridColor: requireHexColor(settings.grid_color, "grid_color"),
gridOpacity: requireNumber(settings.grid_opacity, "grid_opacity", 0, 100),
gridDotsEnabled: requireBoolean(
settings.grid_dots_enabled,
"grid_dots_enabled",
),
gridDotsSize: requireNumber(
settings.grid_dots_size,
"grid_dots_size",
2,
28,
),
gridDotsColor: requireHexColor(settings.grid_dots_color, "grid_dots_color"),
gridDotsOpacity: requireNumber(
settings.grid_dots_opacity,
"grid_dots_opacity",
0,
100,
),
cameraAnimationEnabled: requireBoolean(
settings.camera_animation_enabled,
@@ -317,6 +572,16 @@ function requireBoolean(value: unknown, path: string): boolean {
return value;
}
function requireHexColor(value: unknown, path: string): string {
if (
typeof value !== "string" ||
!/^#[0-9a-f]{6}$/i.test(value)
) {
throw new Error(`${path} должен быть цветом #RRGGBB.`);
}
return value.toLowerCase();
}
function requireNumber(
value: unknown,
path: string,