From 34a29a2e4609850385a6d2c2fc0a9cf8539f7755 Mon Sep 17 00:00:00 2001 From: airslice Date: Mon, 26 Jun 2023 16:58:44 +0800 Subject: [PATCH 1/4] feat: support shadow map --- web/src/beta/lib/core/Map/types/index.ts | 3 +++ web/src/beta/lib/core/engines/Cesium/hooks.ts | 13 +++++++++++++ 2 files changed, 16 insertions(+) diff --git a/web/src/beta/lib/core/Map/types/index.ts b/web/src/beta/lib/core/Map/types/index.ts index a9b3d58fe5..8b529b8258 100644 --- a/web/src/beta/lib/core/Map/types/index.ts +++ b/web/src/beta/lib/core/Map/types/index.ts @@ -288,6 +288,9 @@ export type SceneProperty = { ground_atmosphere?: boolean; sky_atmosphere?: boolean; shadows?: boolean; + shadowResolution?: 1024 | 2048 | 4096; + softShadow?: boolean; + shadowDarkness?: number; fog?: boolean; fog_density?: number; brightness_shift?: number; diff --git a/web/src/beta/lib/core/engines/Cesium/hooks.ts b/web/src/beta/lib/core/engines/Cesium/hooks.ts index 965a01b354..8605f7c7e6 100644 --- a/web/src/beta/lib/core/engines/Cesium/hooks.ts +++ b/web/src/beta/lib/core/engines/Cesium/hooks.ts @@ -132,6 +132,19 @@ export default ({ property?.light?.lightIntensity, ]); + // shadow map + useEffect(() => { + const shadowMap = cesium?.current?.cesiumElement?.shadowMap; + if (!shadowMap) return; + shadowMap.softShadows = property?.atmosphere?.softShadow ?? false; + shadowMap.darkness = property?.atmosphere?.shadowDarkness ?? 0.5; + shadowMap.size = property?.atmosphere?.shadowResolution ?? 2048; + }, [ + property?.atmosphere?.softShadow, + property?.atmosphere?.shadowDarkness, + property?.atmosphere?.shadowResolution, + ]); + useEffect(() => { engineAPI.changeSceneMode(property?.default?.sceneMode, 0); }, [property?.default?.sceneMode, engineAPI]); From 6079d2b919273a15e6f943f9821cc52473c8ee94 Mon Sep 17 00:00:00 2001 From: airslice Date: Mon, 26 Jun 2023 20:18:50 +0800 Subject: [PATCH 2/4] refactor: update default value --- web/src/beta/lib/core/engines/Cesium/hooks.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/src/beta/lib/core/engines/Cesium/hooks.ts b/web/src/beta/lib/core/engines/Cesium/hooks.ts index 8605f7c7e6..bd69c904b4 100644 --- a/web/src/beta/lib/core/engines/Cesium/hooks.ts +++ b/web/src/beta/lib/core/engines/Cesium/hooks.ts @@ -137,7 +137,7 @@ export default ({ const shadowMap = cesium?.current?.cesiumElement?.shadowMap; if (!shadowMap) return; shadowMap.softShadows = property?.atmosphere?.softShadow ?? false; - shadowMap.darkness = property?.atmosphere?.shadowDarkness ?? 0.5; + shadowMap.darkness = property?.atmosphere?.shadowDarkness ?? 0.3; shadowMap.size = property?.atmosphere?.shadowResolution ?? 2048; }, [ property?.atmosphere?.softShadow, From 4ecfec5d552caf2972653019c9a358b2fe7eb14d Mon Sep 17 00:00:00 2001 From: airslice Date: Wed, 28 Jun 2023 09:45:59 +0800 Subject: [PATCH 3/4] refactor: add default shadow bias --- web/src/beta/lib/core/engines/Cesium/hooks.ts | 48 ++++++++++++++++++- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/web/src/beta/lib/core/engines/Cesium/hooks.ts b/web/src/beta/lib/core/engines/Cesium/hooks.ts index bd69c904b4..d3e7e66a79 100644 --- a/web/src/beta/lib/core/engines/Cesium/hooks.ts +++ b/web/src/beta/lib/core/engines/Cesium/hooks.ts @@ -12,7 +12,7 @@ import { SunLight, DirectionalLight, } from "cesium"; -import type { Viewer as CesiumViewer } from "cesium"; +import type { Viewer as CesiumViewer, ShadowMap } from "cesium"; import CesiumDnD, { Context } from "cesium-dnd"; import { isEqual } from "lodash-es"; import { RefObject, useCallback, useEffect, useMemo, useRef } from "react"; @@ -133,12 +133,56 @@ export default ({ ]); // shadow map + type ShadowMapBias = { + polygonOffsetFactor: number; + polygonOffsetUnits: number; + normalOffsetScale: number; + normalShading: boolean; + normalShadingSmooth: number; + depthBias: number; + }; + useEffect(() => { - const shadowMap = cesium?.current?.cesiumElement?.shadowMap; + const shadowMap = cesium?.current?.cesiumElement?.shadowMap as + | (ShadowMap & { + _terrainBias: ShadowMapBias; + _pointBias: ShadowMapBias; + _primitiveBias: ShadowMapBias; + }) + | undefined; if (!shadowMap) return; shadowMap.softShadows = property?.atmosphere?.softShadow ?? false; shadowMap.darkness = property?.atmosphere?.shadowDarkness ?? 0.3; shadowMap.size = property?.atmosphere?.shadowResolution ?? 2048; + + // bias + const defaultTerrainBias: ShadowMapBias = { + polygonOffsetFactor: 1.1, + polygonOffsetUnits: 4.0, + normalOffsetScale: 0.5, + normalShading: true, + normalShadingSmooth: 0.3, + depthBias: 0.0001, + }; + const defaultPrimitiveBias: ShadowMapBias = { + polygonOffsetFactor: 1.1, + polygonOffsetUnits: 4.0, + normalOffsetScale: 0.1 * 100, + normalShading: true, + normalShadingSmooth: 0.05, + depthBias: 0.00002 * 10, + }; + const defaultPointBias: ShadowMapBias = { + polygonOffsetFactor: 1.1, + polygonOffsetUnits: 4.0, + normalOffsetScale: 0.0, + normalShading: true, + normalShadingSmooth: 0.1, + depthBias: 0.0005, + }; + Object.assign(shadowMap._terrainBias, defaultTerrainBias); + Object.assign(shadowMap._primitiveBias, defaultPrimitiveBias); + Object.assign(shadowMap._pointBias, defaultPointBias); }, [ property?.atmosphere?.softShadow, property?.atmosphere?.shadowDarkness, From eb22f86a295fb32ce40fb785323ff99be8358b8b Mon Sep 17 00:00:00 2001 From: airslice Date: Wed, 28 Jun 2023 10:04:55 +0800 Subject: [PATCH 4/4] refactor: add more default settings --- web/src/beta/lib/core/engines/Cesium/hooks.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/web/src/beta/lib/core/engines/Cesium/hooks.ts b/web/src/beta/lib/core/engines/Cesium/hooks.ts index d3e7e66a79..c9595eec9f 100644 --- a/web/src/beta/lib/core/engines/Cesium/hooks.ts +++ b/web/src/beta/lib/core/engines/Cesium/hooks.ts @@ -154,6 +154,9 @@ export default ({ shadowMap.softShadows = property?.atmosphere?.softShadow ?? false; shadowMap.darkness = property?.atmosphere?.shadowDarkness ?? 0.3; shadowMap.size = property?.atmosphere?.shadowResolution ?? 2048; + shadowMap.fadingEnabled = true; + shadowMap.maximumDistance = 5000; + shadowMap.normalOffset = true; // bias const defaultTerrainBias: ShadowMapBias = {