@reearth/core 0.0.6 → 0.0.7-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core.js +8312 -8318
- package/dist/core.umd.cjs +75 -75
- package/dist/index.d.ts +183 -184
- package/package.json +1 -1
- package/src/Map/ClusteredLayers/index.tsx +2 -2
- package/src/Map/Layer/index.tsx +3 -3
- package/src/Map/Layers/index.tsx +2 -2
- package/src/Map/hooks.ts +0 -4
- package/src/Map/index.tsx +8 -5
- package/src/Map/types/index.ts +5 -182
- package/src/Map/types/viewerProperty.ts +216 -0
- package/src/Map/useTimelineManager.ts +2 -2
- package/src/Map/utils.ts +1 -43
- package/src/Visualizer/coreContext.tsx +1 -8
- package/src/Visualizer/hooks.ts +6 -75
- package/src/Visualizer/index.stories.tsx +4 -48
- package/src/Visualizer/index.tsx +8 -6
- package/src/Visualizer/useCoreAPI.ts +30 -0
- package/src/engines/Cesium/Feature/Ellipse/index.stories.tsx +1 -1
- package/src/engines/Cesium/Feature/Frustum/index.stories.tsx +1 -1
- package/src/engines/Cesium/Feature/Model/index.stories.tsx +1 -1
- package/src/engines/Cesium/Feature/Model/index.tsx +10 -9
- package/src/engines/Cesium/Feature/Polygon/index.stories.tsx +8 -6
- package/src/engines/Cesium/Feature/Raster/index.stories.tsx +2 -2
- package/src/engines/Cesium/Feature/Resource/index.stories.tsx +1 -1
- package/src/engines/Cesium/Feature/Tileset/hooks.ts +12 -11
- package/src/engines/Cesium/Feature/Tileset/index.stories.tsx +1 -1
- package/src/engines/Cesium/Feature/Tileset/index.tsx +4 -4
- package/src/engines/Cesium/Feature/index.tsx +5 -4
- package/src/engines/Cesium/Feature/utils.tsx +2 -2
- package/src/engines/Cesium/core/Globe.tsx +36 -68
- package/src/engines/Cesium/core/Imagery.test.ts +9 -9
- package/src/engines/Cesium/core/Imagery.tsx +17 -19
- package/src/engines/Cesium/core/Indicator/Indicator.tsx +8 -8
- package/src/engines/Cesium/hooks/useCamera.ts +144 -0
- package/src/engines/Cesium/{cameraLimiter.ts → hooks/useCameraLimiter.ts} +22 -45
- package/src/engines/Cesium/{useEngineRef.test.tsx → hooks/useEngineRef.test.tsx} +14 -10
- package/src/engines/Cesium/{useEngineRef.ts → hooks/useEngineRef.ts} +17 -17
- package/src/engines/Cesium/hooks/useExplicitRender.ts +65 -0
- package/src/engines/Cesium/hooks/useLayerDragDrop.ts +77 -0
- package/src/engines/Cesium/{VertexTerrainElevationMaterial.ts → hooks/useOverrideGlobeShader/VertexTerrainElevationMaterial.ts} +3 -2
- package/src/engines/Cesium/{useOverrideGlobeShader.ts → hooks/useOverrideGlobeShader/useOverrideGlobeShader.ts} +19 -16
- package/src/engines/Cesium/hooks/useViewerProperty.ts +90 -0
- package/src/engines/Cesium/hooks.ts +117 -353
- package/src/engines/Cesium/index.stories.tsx +1 -1
- package/src/engines/Cesium/index.tsx +48 -50
- package/src/engines/index.ts +1 -1
- /package/src/engines/Cesium/{JapanSeaLevelEllipsoid.ts → hooks/useOverrideGlobeShader/JapanSeaLevelEllipsoid.ts} +0 -0
- /package/src/engines/Cesium/{vertexTerrainElevationMaterial.glsl → hooks/useOverrideGlobeShader/vertexTerrainElevationMaterial.glsl} +0 -0
|
@@ -12,7 +12,7 @@ import { useRef } from "react";
|
|
|
12
12
|
import type { CesiumComponentRef } from "resium";
|
|
13
13
|
import { vi, expect, test, afterEach } from "vitest";
|
|
14
14
|
|
|
15
|
-
import type { EngineRef, Clock } from "
|
|
15
|
+
import type { EngineRef, Clock } from "../../..";
|
|
16
16
|
|
|
17
17
|
import useEngineRef from "./useEngineRef";
|
|
18
18
|
|
|
@@ -188,10 +188,11 @@ test("zoom", async () => {
|
|
|
188
188
|
return engineRef;
|
|
189
189
|
});
|
|
190
190
|
|
|
191
|
-
const commons = await import("
|
|
191
|
+
const commons = await import("../common");
|
|
192
|
+
const zoom = vi.spyOn(commons, "zoom");
|
|
192
193
|
|
|
193
194
|
result.current.current?.zoomIn(10);
|
|
194
|
-
expect(
|
|
195
|
+
expect(zoom).toHaveBeenCalledTimes(1);
|
|
195
196
|
expect(commons.zoom).toHaveBeenCalledWith(
|
|
196
197
|
{
|
|
197
198
|
viewer,
|
|
@@ -221,6 +222,7 @@ test("call orbit when camera focuses on center", async () => {
|
|
|
221
222
|
rotateUp: vi.fn(),
|
|
222
223
|
look: vi.fn(),
|
|
223
224
|
move: vi.fn(),
|
|
225
|
+
getPickRay: vi.fn(),
|
|
224
226
|
positionCartographic: new Cartesian3(),
|
|
225
227
|
},
|
|
226
228
|
mode: SceneMode.SCENE3D,
|
|
@@ -247,15 +249,14 @@ test("call orbit when camera focuses on center", async () => {
|
|
|
247
249
|
return [engineRef, cesium] as const;
|
|
248
250
|
});
|
|
249
251
|
|
|
250
|
-
const commons = await import("
|
|
252
|
+
const commons = await import("../common");
|
|
253
|
+
const getCenterCamera = vi.spyOn(commons, "getCenterCamera");
|
|
251
254
|
|
|
252
255
|
const [engineRef, cesium] = result.current;
|
|
253
256
|
|
|
254
257
|
engineRef.current?.orbit(90);
|
|
255
|
-
expect(
|
|
256
|
-
expect(cesium.current.cesiumElement?.scene.camera.
|
|
257
|
-
expect(cesium.current.cesiumElement?.scene.camera.rotateUp).toHaveBeenCalled();
|
|
258
|
-
expect(cesium.current.cesiumElement?.scene.camera.lookAtTransform).toHaveBeenCalledTimes(2);
|
|
258
|
+
expect(getCenterCamera).toHaveBeenCalled();
|
|
259
|
+
expect(cesium.current.cesiumElement?.scene.camera.lookAtTransform).toHaveBeenCalledTimes(1);
|
|
259
260
|
});
|
|
260
261
|
|
|
261
262
|
test("call orbit when camera does not focus on center", async () => {
|
|
@@ -268,6 +269,7 @@ test("call orbit when camera does not focus on center", async () => {
|
|
|
268
269
|
rotateUp: vi.fn(),
|
|
269
270
|
look: vi.fn(),
|
|
270
271
|
move: vi.fn(),
|
|
272
|
+
getPickRay: vi.fn(),
|
|
271
273
|
positionWC: new Cartesian3(),
|
|
272
274
|
positionCartographic: new Cartesian3(),
|
|
273
275
|
},
|
|
@@ -294,12 +296,13 @@ test("call orbit when camera does not focus on center", async () => {
|
|
|
294
296
|
return [engineRef, cesium] as const;
|
|
295
297
|
});
|
|
296
298
|
|
|
297
|
-
const commons = await import("
|
|
299
|
+
const commons = await import("../common");
|
|
300
|
+
const getCenterCamera = vi.spyOn(commons, "getCenterCamera");
|
|
298
301
|
|
|
299
302
|
const [engineRef, cesium] = result.current;
|
|
300
303
|
|
|
301
304
|
engineRef.current?.orbit(90);
|
|
302
|
-
expect(
|
|
305
|
+
expect(getCenterCamera).toHaveBeenCalled();
|
|
303
306
|
expect(cesium.current.cesiumElement?.scene.camera.look).toHaveBeenCalledTimes(2);
|
|
304
307
|
expect(cesium.current.cesiumElement?.scene.camera.lookAtTransform).toHaveBeenCalledTimes(2);
|
|
305
308
|
});
|
|
@@ -314,6 +317,7 @@ test("orbit on 2D mode", async () => {
|
|
|
314
317
|
rotateUp: vi.fn(),
|
|
315
318
|
look: vi.fn(),
|
|
316
319
|
move: vi.fn(),
|
|
320
|
+
getPickRay: vi.fn(),
|
|
317
321
|
positionWC: new Cartesian3(),
|
|
318
322
|
positionCartographic: new Cartesian3(),
|
|
319
323
|
},
|
|
@@ -4,11 +4,9 @@ import { ClockStep, JulianDate, Math as CesiumMath } from "cesium";
|
|
|
4
4
|
import { useImperativeHandle, Ref, RefObject, useMemo, useRef } from "react";
|
|
5
5
|
import { CesiumComponentRef } from "resium";
|
|
6
6
|
|
|
7
|
-
import type { EngineRef, MouseEventProps, Feature, ComputedFeature } from "
|
|
8
|
-
import { MouseEventCallbacks, TickEventCallback } from "
|
|
9
|
-
import {
|
|
10
|
-
import { Position2d, Position3d } from "../../types";
|
|
11
|
-
|
|
7
|
+
import type { EngineRef, MouseEventProps, Feature, ComputedFeature } from "../..";
|
|
8
|
+
import { MouseEventCallbacks, TickEventCallback, SketchType } from "../../../Map";
|
|
9
|
+
import { Position2d, Position3d } from "../../../types";
|
|
12
10
|
import {
|
|
13
11
|
getLocationFromScreen,
|
|
14
12
|
flyTo,
|
|
@@ -34,11 +32,11 @@ import {
|
|
|
34
32
|
cartesianToLatLngHeight,
|
|
35
33
|
getExtrudedHeight,
|
|
36
34
|
getOverriddenScreenSpaceCameraOptions,
|
|
37
|
-
} from "
|
|
38
|
-
import { attachTag, getTag } from "
|
|
39
|
-
import { PickedFeature, pickManyFromViewportAsFeature } from "
|
|
40
|
-
import { createGeometry } from "
|
|
41
|
-
import { CursorType } from "
|
|
35
|
+
} from "../common";
|
|
36
|
+
import { attachTag, getTag } from "../Feature";
|
|
37
|
+
import { PickedFeature, pickManyFromViewportAsFeature } from "../pickMany";
|
|
38
|
+
import { createGeometry } from "../Sketch/createGeometry";
|
|
39
|
+
import { CursorType } from "../types";
|
|
42
40
|
import {
|
|
43
41
|
convertCesium3DTileFeatureProperties,
|
|
44
42
|
convertEntityDescription,
|
|
@@ -46,7 +44,7 @@ import {
|
|
|
46
44
|
convertObjToComputedFeature,
|
|
47
45
|
findEntity,
|
|
48
46
|
findFeaturesFromLayer,
|
|
49
|
-
} from "
|
|
47
|
+
} from "../utils/utils";
|
|
50
48
|
|
|
51
49
|
export default function useEngineRef(
|
|
52
50
|
ref: Ref<EngineRef>,
|
|
@@ -539,13 +537,15 @@ export default function useEngineRef(
|
|
|
539
537
|
const oldTransform = Cesium.Matrix4.clone(camera.transform);
|
|
540
538
|
|
|
541
539
|
const center = getCenterCamera({ camera, scene });
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
540
|
+
if (center || camera.positionWC) {
|
|
541
|
+
// Get fixed frame from center to globe ellipsoid.
|
|
542
|
+
const frame = Cesium.Transforms.eastNorthUpToFixedFrame(
|
|
543
|
+
center || camera.positionWC,
|
|
544
|
+
scene.globe.ellipsoid,
|
|
545
|
+
);
|
|
547
546
|
|
|
548
|
-
|
|
547
|
+
camera.lookAtTransform(frame);
|
|
548
|
+
}
|
|
549
549
|
|
|
550
550
|
if (viewer.scene.mode !== Cesium.SceneMode.SCENE3D) {
|
|
551
551
|
camera.move(
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { Viewer } from "cesium";
|
|
2
|
+
import { MutableRefObject, RefObject, useCallback, useEffect, useRef } from "react";
|
|
3
|
+
import { CesiumComponentRef } from "resium";
|
|
4
|
+
|
|
5
|
+
import { RequestingRenderMode, ViewerProperty } from "../../../Map";
|
|
6
|
+
import { FORCE_REQUEST_RENDER, NO_REQUEST_RENDER, REQUEST_RENDER_ONCE } from "../../../Map/hooks";
|
|
7
|
+
|
|
8
|
+
export default ({
|
|
9
|
+
cesium,
|
|
10
|
+
requestingRenderMode,
|
|
11
|
+
isLayerDragging,
|
|
12
|
+
shouldRender,
|
|
13
|
+
property,
|
|
14
|
+
}: {
|
|
15
|
+
cesium: RefObject<CesiumComponentRef<Viewer>>;
|
|
16
|
+
requestingRenderMode?: MutableRefObject<RequestingRenderMode>;
|
|
17
|
+
isLayerDragging?: boolean;
|
|
18
|
+
shouldRender?: boolean;
|
|
19
|
+
property?: ViewerProperty;
|
|
20
|
+
}) => {
|
|
21
|
+
// explicit rendering
|
|
22
|
+
const explicitRender = useCallback(() => {
|
|
23
|
+
const viewer = cesium.current?.cesiumElement;
|
|
24
|
+
if (!requestingRenderMode?.current || !viewer || viewer.isDestroyed()) return;
|
|
25
|
+
viewer.scene.requestRender();
|
|
26
|
+
if (requestingRenderMode.current === REQUEST_RENDER_ONCE) {
|
|
27
|
+
requestingRenderMode.current = NO_REQUEST_RENDER;
|
|
28
|
+
}
|
|
29
|
+
}, [cesium, requestingRenderMode]);
|
|
30
|
+
|
|
31
|
+
const explicitRenderRef = useRef<() => void>();
|
|
32
|
+
|
|
33
|
+
useEffect(() => {
|
|
34
|
+
explicitRenderRef.current = explicitRender;
|
|
35
|
+
}, [explicitRender]);
|
|
36
|
+
|
|
37
|
+
useEffect(() => {
|
|
38
|
+
const viewer = cesium.current?.cesiumElement;
|
|
39
|
+
if (!viewer || viewer.isDestroyed()) return;
|
|
40
|
+
return viewer.scene.postUpdate.addEventListener(() => {
|
|
41
|
+
explicitRenderRef.current?.();
|
|
42
|
+
});
|
|
43
|
+
}, [cesium]);
|
|
44
|
+
|
|
45
|
+
// render one frame when scene property changes
|
|
46
|
+
useEffect(() => {
|
|
47
|
+
if (requestingRenderMode) {
|
|
48
|
+
requestingRenderMode.current = REQUEST_RENDER_ONCE;
|
|
49
|
+
}
|
|
50
|
+
}, [property, requestingRenderMode]);
|
|
51
|
+
|
|
52
|
+
// force render when timeline is animating or is shouldRender
|
|
53
|
+
useEffect(() => {
|
|
54
|
+
const viewer = cesium.current?.cesiumElement;
|
|
55
|
+
if (!viewer || viewer.isDestroyed()) return;
|
|
56
|
+
if (requestingRenderMode) {
|
|
57
|
+
requestingRenderMode.current =
|
|
58
|
+
isLayerDragging || shouldRender
|
|
59
|
+
? FORCE_REQUEST_RENDER
|
|
60
|
+
: requestingRenderMode.current === REQUEST_RENDER_ONCE
|
|
61
|
+
? REQUEST_RENDER_ONCE
|
|
62
|
+
: NO_REQUEST_RENDER;
|
|
63
|
+
}
|
|
64
|
+
}, [cesium, isLayerDragging, shouldRender, requestingRenderMode]);
|
|
65
|
+
};
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { Cartesian3, Entity, Viewer } from "cesium";
|
|
2
|
+
import CesiumDnD, { Context } from "cesium-dnd";
|
|
3
|
+
import { RefObject, useCallback, useEffect, useRef } from "react";
|
|
4
|
+
import { CesiumComponentRef } from "resium";
|
|
5
|
+
|
|
6
|
+
import { LatLng } from "../../../utils";
|
|
7
|
+
import { isDraggable, isSelectable } from "../common";
|
|
8
|
+
import { getTag } from "../Feature";
|
|
9
|
+
import { convertCartesian3ToPosition } from "../utils/utils";
|
|
10
|
+
|
|
11
|
+
export default ({
|
|
12
|
+
cesium,
|
|
13
|
+
isLayerDraggable,
|
|
14
|
+
onLayerDrag,
|
|
15
|
+
onLayerDrop,
|
|
16
|
+
}: {
|
|
17
|
+
cesium: RefObject<CesiumComponentRef<Viewer>>;
|
|
18
|
+
isLayerDraggable?: boolean;
|
|
19
|
+
onLayerDrag?: (layerId: string, featureId: string | undefined, position: LatLng) => void;
|
|
20
|
+
onLayerDrop?: (
|
|
21
|
+
layerId: string,
|
|
22
|
+
featureId: string | undefined,
|
|
23
|
+
position: LatLng | undefined,
|
|
24
|
+
) => void;
|
|
25
|
+
}) => {
|
|
26
|
+
// enable Drag and Drop Layers
|
|
27
|
+
const handleLayerDrag = useCallback(
|
|
28
|
+
(e: Entity, position: Cartesian3 | undefined, _context: Context): boolean | void => {
|
|
29
|
+
const viewer = cesium.current?.cesiumElement;
|
|
30
|
+
if (!viewer || viewer.isDestroyed() || !isSelectable(e) || !isDraggable(e)) return false;
|
|
31
|
+
|
|
32
|
+
const pos = convertCartesian3ToPosition(cesium.current?.cesiumElement, position);
|
|
33
|
+
if (!pos) return false;
|
|
34
|
+
|
|
35
|
+
const tag = getTag(e);
|
|
36
|
+
if (!tag) return false;
|
|
37
|
+
|
|
38
|
+
onLayerDrag?.(tag.layerId || "", tag.featureId, pos);
|
|
39
|
+
},
|
|
40
|
+
[cesium, onLayerDrag],
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
const handleLayerDrop = useCallback(
|
|
44
|
+
(e: Entity, position: Cartesian3 | undefined): boolean | void => {
|
|
45
|
+
const viewer = cesium.current?.cesiumElement;
|
|
46
|
+
if (!viewer || viewer.isDestroyed()) return false;
|
|
47
|
+
|
|
48
|
+
const tag = getTag(e);
|
|
49
|
+
const pos = convertCartesian3ToPosition(cesium.current?.cesiumElement, position);
|
|
50
|
+
onLayerDrop?.(tag?.layerId || "", tag?.featureId || "", pos);
|
|
51
|
+
|
|
52
|
+
return false; // let apollo-client handle optimistic updates
|
|
53
|
+
},
|
|
54
|
+
[cesium, onLayerDrop],
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
const cesiumDnD = useRef<CesiumDnD>();
|
|
58
|
+
useEffect(() => {
|
|
59
|
+
const viewer = cesium.current?.cesiumElement;
|
|
60
|
+
if (!viewer || viewer.isDestroyed()) return;
|
|
61
|
+
cesiumDnD.current = new CesiumDnD(viewer, {
|
|
62
|
+
onDrag: handleLayerDrag,
|
|
63
|
+
onDrop: handleLayerDrop,
|
|
64
|
+
dragDelay: 1000,
|
|
65
|
+
initialDisabled: !isLayerDraggable,
|
|
66
|
+
});
|
|
67
|
+
return () => {
|
|
68
|
+
if (!viewer || viewer.isDestroyed()) return;
|
|
69
|
+
cesiumDnD.current?.disable();
|
|
70
|
+
};
|
|
71
|
+
}, [cesium, isLayerDraggable, handleLayerDrag, handleLayerDrop]);
|
|
72
|
+
|
|
73
|
+
return {
|
|
74
|
+
handleLayerDrag,
|
|
75
|
+
handleLayerDrop,
|
|
76
|
+
};
|
|
77
|
+
};
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { Ellipsoid, Material } from "cesium";
|
|
2
2
|
|
|
3
|
-
import { createColorMapImage } from "
|
|
4
|
-
import { turboColorMap } from "
|
|
3
|
+
import { createColorMapImage } from "../../Feature/HeatMap/colorMap";
|
|
4
|
+
import { turboColorMap } from "../../Feature/HeatMap/constants";
|
|
5
|
+
|
|
5
6
|
import { JapanSeaLevelEllipsoid } from "./JapanSeaLevelEllipsoid";
|
|
6
7
|
import source from "./vertexTerrainElevationMaterial.glsl?raw";
|
|
7
8
|
|
|
@@ -8,15 +8,15 @@ import { Viewer, Globe, Material, Cartesian3 } from "cesium";
|
|
|
8
8
|
import { RefObject, useCallback, useEffect, useMemo, useRef } from "react";
|
|
9
9
|
import { CesiumComponentRef } from "resium";
|
|
10
10
|
|
|
11
|
-
import { TerrainProperty } from "
|
|
12
|
-
import { useImmutableFunction } from "
|
|
13
|
-
import { StringMatcher } from "
|
|
14
|
-
|
|
15
|
-
import
|
|
16
|
-
import
|
|
17
|
-
import
|
|
18
|
-
import
|
|
19
|
-
|
|
11
|
+
import { TerrainProperty } from "../../..";
|
|
12
|
+
import { useImmutableFunction } from "../../../../hooks/useRefFunction";
|
|
13
|
+
import { StringMatcher } from "../../../../utils/StringMatcher";
|
|
14
|
+
import { createColorMapImage } from "../../Feature/HeatMap/colorMap";
|
|
15
|
+
import GlobeFSDefinitions from "../../Shaders/OverriddenShaders/GlobeFS/Definitions.glsl?raw";
|
|
16
|
+
import HeatmapForTerrainFS from "../../Shaders/OverriddenShaders/GlobeFS/HeatmapForTerrain.glsl?raw";
|
|
17
|
+
import IBLFS from "../../Shaders/OverriddenShaders/GlobeFS/IBL.glsl?raw";
|
|
18
|
+
import { PrivateCesiumGlobe } from "../../types";
|
|
19
|
+
|
|
20
20
|
import { VertexTerrainElevationMaterial } from "./VertexTerrainElevationMaterial";
|
|
21
21
|
|
|
22
22
|
const defaultMatcher = new StringMatcher()
|
|
@@ -122,17 +122,19 @@ const useIBL = ({
|
|
|
122
122
|
|
|
123
123
|
const useTerrainHeatmap = ({
|
|
124
124
|
cesium,
|
|
125
|
-
terrain
|
|
126
|
-
heatmapType,
|
|
127
|
-
heatmapMaxHeight,
|
|
128
|
-
heatmapMinHeight,
|
|
129
|
-
heatmapLogarithmic,
|
|
130
|
-
heatmapColorLUT,
|
|
131
|
-
} = {},
|
|
125
|
+
terrain,
|
|
132
126
|
}: {
|
|
133
127
|
cesium: RefObject<CesiumComponentRef<Viewer>>;
|
|
134
128
|
terrain: TerrainProperty | undefined;
|
|
135
129
|
}) => {
|
|
130
|
+
const {
|
|
131
|
+
type: heatmapType,
|
|
132
|
+
maxHeight: heatmapMaxHeight,
|
|
133
|
+
minHeight: heatmapMinHeight,
|
|
134
|
+
logarithmic: heatmapLogarithmic,
|
|
135
|
+
colorLUT: heatmapColorLUT,
|
|
136
|
+
} = terrain?.heightMap ?? {};
|
|
137
|
+
|
|
136
138
|
const isCustomHeatmapEnabled = useMemo(() => heatmapType === "custom", [heatmapType]);
|
|
137
139
|
|
|
138
140
|
const shaderForTerrainHeatmap = useMemo(
|
|
@@ -206,6 +208,7 @@ export const useOverrideGlobeShader = ({
|
|
|
206
208
|
enableLighting,
|
|
207
209
|
});
|
|
208
210
|
|
|
211
|
+
// Terrain Heatmap is actually a built-in feature for globe, it renders as a heatmap using terrain height data.
|
|
209
212
|
const { isCustomHeatmapEnabled, shaderForTerrainHeatmap } = useTerrainHeatmap({
|
|
210
213
|
cesium,
|
|
211
214
|
terrain,
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { Cartesian3, Color, DirectionalLight, SceneMode, SunLight, Viewer } from "cesium";
|
|
2
|
+
import { RefObject, useMemo } from "react";
|
|
3
|
+
import { CesiumComponentRef } from "resium";
|
|
4
|
+
|
|
5
|
+
import { ViewerProperty } from "../..";
|
|
6
|
+
|
|
7
|
+
// TODO: move all viewer property -> resium component prop logic here (from the gerneal long Cesium/hooks file)
|
|
8
|
+
export default ({
|
|
9
|
+
cesium,
|
|
10
|
+
property,
|
|
11
|
+
}: {
|
|
12
|
+
cesium: RefObject<CesiumComponentRef<Viewer>>;
|
|
13
|
+
property?: ViewerProperty;
|
|
14
|
+
}) => {
|
|
15
|
+
const sceneLight = useMemo(() => {
|
|
16
|
+
let light;
|
|
17
|
+
if (property?.scene?.light?.type === "sunLight") {
|
|
18
|
+
light = new SunLight({
|
|
19
|
+
color: property.scene?.light?.color
|
|
20
|
+
? Color.fromCssColorString(property.scene.light.color)
|
|
21
|
+
: undefined,
|
|
22
|
+
intensity: property.scene?.light?.intensity,
|
|
23
|
+
});
|
|
24
|
+
} else if (property?.scene?.light?.type === "directionalLight") {
|
|
25
|
+
light = new DirectionalLight({
|
|
26
|
+
direction: new Cartesian3(
|
|
27
|
+
property?.scene?.light?.direction?.[0] ?? 1,
|
|
28
|
+
property?.scene?.light?.direction?.[1] ?? 0,
|
|
29
|
+
property?.scene?.light?.direction?.[2] ?? 0,
|
|
30
|
+
),
|
|
31
|
+
color: property.scene?.light?.color
|
|
32
|
+
? Color.fromCssColorString(property.scene.light.color)
|
|
33
|
+
: undefined,
|
|
34
|
+
intensity: property.scene?.light?.intensity,
|
|
35
|
+
});
|
|
36
|
+
} else {
|
|
37
|
+
light = cesium.current?.cesiumElement?.scene.light;
|
|
38
|
+
if (light) {
|
|
39
|
+
light.color = property?.scene?.light?.color
|
|
40
|
+
? Color.fromCssColorString(property.scene.light.color)
|
|
41
|
+
: light.color;
|
|
42
|
+
light.intensity = property?.scene?.light?.intensity
|
|
43
|
+
? property.scene.light.intensity
|
|
44
|
+
: light.intensity;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return light;
|
|
48
|
+
}, [
|
|
49
|
+
cesium,
|
|
50
|
+
property?.scene?.light?.type,
|
|
51
|
+
property?.scene?.light?.color,
|
|
52
|
+
property?.scene?.light?.direction,
|
|
53
|
+
property?.scene?.light?.intensity,
|
|
54
|
+
]);
|
|
55
|
+
|
|
56
|
+
const sceneBackgroundColor = useMemo(
|
|
57
|
+
() =>
|
|
58
|
+
property?.scene?.backgroundColor
|
|
59
|
+
? Color.fromCssColorString(property.scene.backgroundColor)
|
|
60
|
+
: undefined,
|
|
61
|
+
[property?.scene?.backgroundColor],
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
const sceneMsaaSamples = useMemo(() => {
|
|
65
|
+
// TODO: FXAA doesn't support alpha blending in Cesium, so we will enable FXAA when this is fixed.
|
|
66
|
+
// viewer.scene.postProcessStages.fxaa.enabled = property?.render?.antialias === "high";
|
|
67
|
+
return property?.render?.antialias === "extreme"
|
|
68
|
+
? 8
|
|
69
|
+
: property?.render?.antialias === "high"
|
|
70
|
+
? 6
|
|
71
|
+
: property?.render?.antialias === "medium"
|
|
72
|
+
? 4
|
|
73
|
+
: 1;
|
|
74
|
+
}, [property?.render?.antialias]);
|
|
75
|
+
|
|
76
|
+
const sceneMode = useMemo(() => {
|
|
77
|
+
return property?.scene?.mode === "2d"
|
|
78
|
+
? SceneMode.SCENE2D
|
|
79
|
+
: property?.scene?.mode === "columbus"
|
|
80
|
+
? SceneMode.COLUMBUS_VIEW
|
|
81
|
+
: SceneMode.SCENE3D;
|
|
82
|
+
}, [property?.scene?.mode]);
|
|
83
|
+
|
|
84
|
+
return {
|
|
85
|
+
sceneLight,
|
|
86
|
+
sceneBackgroundColor,
|
|
87
|
+
sceneMsaaSamples,
|
|
88
|
+
sceneMode,
|
|
89
|
+
};
|
|
90
|
+
};
|