@reearth/core 0.0.7-alpha.5 → 0.0.7-beta.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.
Files changed (169) hide show
  1. package/dist/cesium/ThirdParty/Workers/z-worker-pako.js +1 -1
  2. package/dist/cesium/Widgets/I3SBuildingSceneLayerExplorer/I3SBuildingSceneLayerExplorer.css +8 -8
  3. package/dist/cesium/Widgets/widgets.css +8 -8
  4. package/dist/cesium/Workers/{chunk-SUQM3OSW.js → chunk-2YD5QWGR.js} +2 -2
  5. package/dist/cesium/Workers/{chunk-74N6MC2V.js → chunk-3T4KR75X.js} +2 -2
  6. package/dist/cesium/Workers/chunk-46KFVW24.js +26 -0
  7. package/dist/cesium/Workers/chunk-4EI6PP43.js +28 -0
  8. package/dist/cesium/Workers/{chunk-YEJWCH6C.js → chunk-4RS52VIY.js} +2 -2
  9. package/dist/cesium/Workers/{chunk-NPBZI5YA.js → chunk-4YLYA3DC.js} +1 -1
  10. package/dist/cesium/Workers/{chunk-JEWHFDAA.js → chunk-5ENAGXBI.js} +2 -2
  11. package/dist/cesium/Workers/{chunk-MRR3RGFO.js → chunk-5VIB3TI5.js} +2 -2
  12. package/dist/cesium/Workers/{chunk-JCJ24DHF.js → chunk-6NGZLDFZ.js} +2 -2
  13. package/dist/cesium/Workers/{chunk-7X2YQ6I4.js → chunk-6RGNWVZ2.js} +2 -2
  14. package/dist/cesium/Workers/{chunk-BK3HCS7I.js → chunk-7AZZVJ52.js} +2 -2
  15. package/dist/cesium/Workers/{chunk-UBIRX2SP.js → chunk-AMXAQQEL.js} +2 -2
  16. package/dist/cesium/Workers/{chunk-LDCAXLGS.js → chunk-AQW44ZPC.js} +2 -2
  17. package/dist/cesium/Workers/{chunk-B6TRTFAA.js → chunk-CPCMDW6Z.js} +2 -2
  18. package/dist/cesium/Workers/{chunk-3C74MLG3.js → chunk-DNL2WDRL.js} +1 -1
  19. package/dist/cesium/Workers/{chunk-FK5KFB6H.js → chunk-ERW7V247.js} +1 -1
  20. package/dist/cesium/Workers/{chunk-5AG2MVRM.js → chunk-EYRIA4TP.js} +2 -2
  21. package/dist/cesium/Workers/{chunk-6AUUBDOF.js → chunk-F7RQIJML.js} +2 -2
  22. package/dist/cesium/Workers/{chunk-JZLZJJQD.js → chunk-FPZMU6QP.js} +2 -2
  23. package/dist/cesium/Workers/{chunk-YBI55DLZ.js → chunk-FZDVQW7A.js} +2 -2
  24. package/dist/cesium/Workers/{chunk-2MBPFWCP.js → chunk-GAZ2U4FO.js} +2 -2
  25. package/dist/cesium/Workers/{chunk-CSISXEG7.js → chunk-I44IOOT4.js} +1 -1
  26. package/dist/cesium/Workers/{chunk-R2AN7EKC.js → chunk-IALXUAD4.js} +1 -1
  27. package/dist/cesium/Workers/{chunk-MDLPQIMP.js → chunk-IXBUEUZL.js} +2 -2
  28. package/dist/cesium/Workers/{chunk-HPBHKP5S.js → chunk-J3GCYV5K.js} +2 -2
  29. package/dist/cesium/Workers/{chunk-KRZBI2MU.js → chunk-KGSZTFHZ.js} +2 -2
  30. package/dist/cesium/Workers/{chunk-B2SKQ7LU.js → chunk-KKKPU2CI.js} +2 -2
  31. package/dist/cesium/Workers/{chunk-QPOPEH3M.js → chunk-KTEJE5KE.js} +2 -2
  32. package/dist/cesium/Workers/chunk-KYZ3DYY6.js +26 -0
  33. package/dist/cesium/Workers/{chunk-LOPN5R3I.js → chunk-L2QG4MRI.js} +2 -2
  34. package/dist/cesium/Workers/{chunk-EXBFEYPQ.js → chunk-MCE3KFYN.js} +2 -2
  35. package/dist/cesium/Workers/{chunk-C6DMEJQ7.js → chunk-MMLDGXML.js} +2 -2
  36. package/dist/cesium/Workers/{chunk-KTTUANTJ.js → chunk-MTBRPBDQ.js} +2 -2
  37. package/dist/cesium/Workers/{chunk-7VZHIB6P.js → chunk-OKT6VBRK.js} +2 -2
  38. package/dist/cesium/Workers/chunk-PHYDKLSY.js +26 -0
  39. package/dist/cesium/Workers/chunk-PWPX3224.js +26 -0
  40. package/dist/cesium/Workers/{chunk-VQZSIOZW.js → chunk-QHOVE6WG.js} +2 -2
  41. package/dist/cesium/Workers/{chunk-CN7UN2OZ.js → chunk-QJ6MBL22.js} +2 -2
  42. package/dist/cesium/Workers/{chunk-NUSW5B6A.js → chunk-QKO6VIG2.js} +2 -2
  43. package/dist/cesium/Workers/{chunk-4N7SRDH5.js → chunk-QVEE4QL2.js} +2 -2
  44. package/dist/cesium/Workers/{chunk-4T6AS6BZ.js → chunk-RXQOQZ7S.js} +2 -2
  45. package/dist/cesium/Workers/{chunk-RURL6ZX2.js → chunk-S3ZKQKMM.js} +2 -2
  46. package/dist/cesium/Workers/{chunk-ZYWD6OQH.js → chunk-SFEUMZSK.js} +2 -2
  47. package/dist/cesium/Workers/{chunk-BOPB43LN.js → chunk-T75MW4X3.js} +2 -2
  48. package/dist/cesium/Workers/chunk-TVO2A75R.js +66 -0
  49. package/dist/cesium/Workers/{chunk-VHNZBQTR.js → chunk-UHR36K45.js} +2 -2
  50. package/dist/cesium/Workers/{chunk-WZUWQMI7.js → chunk-UKJCDZOR.js} +2 -2
  51. package/dist/cesium/Workers/{chunk-B4TQDFIE.js → chunk-VKVIYER6.js} +2 -2
  52. package/dist/cesium/Workers/{chunk-OUXRUXNB.js → chunk-VPIQWTRZ.js} +2 -2
  53. package/dist/cesium/Workers/{chunk-2ED5WI77.js → chunk-XSX5HRFC.js} +2 -2
  54. package/dist/cesium/Workers/{chunk-5Z6L2FHX.js → chunk-Z5WQQHSL.js} +2 -2
  55. package/dist/cesium/Workers/{chunk-YPDO7SPO.js → chunk-Z7B2VEL5.js} +2 -2
  56. package/dist/cesium/Workers/combineGeometry.js +2 -2
  57. package/dist/cesium/Workers/createBoxGeometry.js +2 -2
  58. package/dist/cesium/Workers/createBoxOutlineGeometry.js +2 -2
  59. package/dist/cesium/Workers/createCircleGeometry.js +2 -2
  60. package/dist/cesium/Workers/createCircleOutlineGeometry.js +2 -2
  61. package/dist/cesium/Workers/createCoplanarPolygonGeometry.js +2 -2
  62. package/dist/cesium/Workers/createCoplanarPolygonOutlineGeometry.js +2 -2
  63. package/dist/cesium/Workers/createCorridorGeometry.js +2 -2
  64. package/dist/cesium/Workers/createCorridorOutlineGeometry.js +2 -2
  65. package/dist/cesium/Workers/createCylinderGeometry.js +2 -2
  66. package/dist/cesium/Workers/createCylinderOutlineGeometry.js +2 -2
  67. package/dist/cesium/Workers/createEllipseGeometry.js +2 -2
  68. package/dist/cesium/Workers/createEllipseOutlineGeometry.js +2 -2
  69. package/dist/cesium/Workers/createEllipsoidGeometry.js +2 -2
  70. package/dist/cesium/Workers/createEllipsoidOutlineGeometry.js +2 -2
  71. package/dist/cesium/Workers/createFrustumGeometry.js +2 -2
  72. package/dist/cesium/Workers/createFrustumOutlineGeometry.js +2 -2
  73. package/dist/cesium/Workers/createGeometry.js +2 -2
  74. package/dist/cesium/Workers/createGroundPolylineGeometry.js +2 -2
  75. package/dist/cesium/Workers/createPlaneGeometry.js +2 -2
  76. package/dist/cesium/Workers/createPlaneOutlineGeometry.js +2 -2
  77. package/dist/cesium/Workers/createPolygonGeometry.js +2 -2
  78. package/dist/cesium/Workers/createPolygonOutlineGeometry.js +2 -2
  79. package/dist/cesium/Workers/createPolylineGeometry.js +2 -2
  80. package/dist/cesium/Workers/createPolylineVolumeGeometry.js +2 -2
  81. package/dist/cesium/Workers/createPolylineVolumeOutlineGeometry.js +2 -2
  82. package/dist/cesium/Workers/createRectangleGeometry.js +2 -2
  83. package/dist/cesium/Workers/createRectangleOutlineGeometry.js +2 -2
  84. package/dist/cesium/Workers/createSimplePolylineGeometry.js +2 -2
  85. package/dist/cesium/Workers/createSphereGeometry.js +2 -2
  86. package/dist/cesium/Workers/createSphereOutlineGeometry.js +2 -2
  87. package/dist/cesium/Workers/createTaskProcessorWorker.js +2 -2
  88. package/dist/cesium/Workers/createVectorTileClampedPolylines.js +2 -2
  89. package/dist/cesium/Workers/createVectorTileGeometries.js +2 -2
  90. package/dist/cesium/Workers/createVectorTilePoints.js +2 -2
  91. package/dist/cesium/Workers/createVectorTilePolygons.js +2 -2
  92. package/dist/cesium/Workers/createVectorTilePolylines.js +2 -2
  93. package/dist/cesium/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +2 -2
  94. package/dist/cesium/Workers/createVerticesFromHeightmap.js +2 -2
  95. package/dist/cesium/Workers/createVerticesFromQuantizedTerrainMesh.js +2 -2
  96. package/dist/cesium/Workers/createWallGeometry.js +2 -2
  97. package/dist/cesium/Workers/createWallOutlineGeometry.js +2 -2
  98. package/dist/cesium/Workers/decodeDraco.js +2 -2
  99. package/dist/cesium/Workers/decodeGoogleEarthEnterprisePacket.js +2 -2
  100. package/dist/cesium/Workers/decodeI3S.js +2 -2
  101. package/dist/cesium/Workers/transcodeKTX2.js +10 -10
  102. package/dist/cesium/Workers/transferTypedArrayTest.js +1 -1
  103. package/dist/cesium/Workers/upsampleQuantizedTerrainMesh.js +2 -2
  104. package/dist/core.js +34193 -34105
  105. package/dist/core.umd.cjs +3866 -3820
  106. package/dist/index.d.ts +212 -217
  107. package/package.json +5 -5
  108. package/src/Map/ClusteredLayers/index.tsx +2 -2
  109. package/src/Map/Layer/index.tsx +3 -3
  110. package/src/Map/Layers/hooks.ts +0 -10
  111. package/src/Map/Layers/index.tsx +2 -2
  112. package/src/Map/Sketch/hooks.ts +66 -46
  113. package/src/Map/Sketch/index.tsx +24 -2
  114. package/src/Map/Sketch/preset.ts +0 -2
  115. package/src/Map/Sketch/types.ts +0 -31
  116. package/src/Map/hooks.ts +4 -0
  117. package/src/Map/index.tsx +5 -8
  118. package/src/Map/ref.ts +7 -4
  119. package/src/Map/types/index.ts +216 -34
  120. package/src/Map/useTimelineManager.ts +3 -5
  121. package/src/Map/utils.ts +43 -1
  122. package/src/Visualizer/coreContext.tsx +8 -1
  123. package/src/Visualizer/hooks.ts +75 -6
  124. package/src/Visualizer/index.stories.tsx +48 -4
  125. package/src/Visualizer/index.tsx +6 -8
  126. package/src/engines/Cesium/Feature/Ellipse/index.stories.tsx +1 -1
  127. package/src/engines/Cesium/Feature/Frustum/index.stories.tsx +1 -1
  128. package/src/engines/Cesium/Feature/Model/index.stories.tsx +1 -1
  129. package/src/engines/Cesium/Feature/Model/index.tsx +9 -10
  130. package/src/engines/Cesium/Feature/Polygon/index.stories.tsx +6 -8
  131. package/src/engines/Cesium/Feature/Raster/index.stories.tsx +2 -2
  132. package/src/engines/Cesium/Feature/Resource/index.stories.tsx +1 -1
  133. package/src/engines/Cesium/Feature/Tileset/hooks.ts +11 -12
  134. package/src/engines/Cesium/Feature/Tileset/index.stories.tsx +1 -1
  135. package/src/engines/Cesium/Feature/Tileset/index.tsx +4 -4
  136. package/src/engines/Cesium/Feature/Tileset/useClippingBox.ts +1 -10
  137. package/src/engines/Cesium/Feature/index.tsx +4 -5
  138. package/src/engines/Cesium/Feature/utils.tsx +2 -3
  139. package/src/engines/Cesium/Shaders/OverriddenShaders/GlobeFS/IBL.glsl +6 -10
  140. package/src/engines/Cesium/{hooks/useOverrideGlobeShader/VertexTerrainElevationMaterial.ts → VertexTerrainElevationMaterial.ts} +2 -3
  141. package/src/engines/Cesium/{hooks/useCameraLimiter.ts → cameraLimiter.ts} +45 -22
  142. package/src/engines/Cesium/core/Globe.tsx +68 -36
  143. package/src/engines/Cesium/core/Imagery.test.ts +9 -9
  144. package/src/engines/Cesium/core/Imagery.tsx +19 -17
  145. package/src/engines/Cesium/core/Indicator/Indicator.tsx +8 -8
  146. package/src/engines/Cesium/hooks.ts +365 -124
  147. package/src/engines/Cesium/index.stories.tsx +1 -1
  148. package/src/engines/Cesium/index.tsx +62 -60
  149. package/src/engines/Cesium/{hooks/useEngineRef.test.tsx → useEngineRef.test.tsx} +34 -38
  150. package/src/engines/Cesium/{hooks/useEngineRef.ts → useEngineRef.ts} +41 -43
  151. package/src/engines/Cesium/{hooks/useOverrideGlobeShader/useOverrideGlobeShader.ts → useOverrideGlobeShader.ts} +17 -20
  152. package/src/engines/index.ts +1 -1
  153. package/src/mantle/compat/types.ts +7 -7
  154. package/dist/cesium/Workers/chunk-45U7TTT3.js +0 -26
  155. package/dist/cesium/Workers/chunk-7VJK3KHI.js +0 -26
  156. package/dist/cesium/Workers/chunk-CUOR5F7T.js +0 -28
  157. package/dist/cesium/Workers/chunk-DGCK3LD2.js +0 -30
  158. package/dist/cesium/Workers/chunk-DXEZYE3K.js +0 -62
  159. package/dist/cesium/Workers/chunk-VAKC5J5C.js +0 -26
  160. package/dist/cesium/Workers/chunk-VKV642QV.js +0 -26
  161. package/dist/cesium/Workers/chunk-VMSXG4OA.js +0 -26
  162. package/src/Map/types/viewerProperty.ts +0 -215
  163. package/src/Visualizer/useCoreAPI.ts +0 -30
  164. package/src/engines/Cesium/hooks/useCamera.ts +0 -135
  165. package/src/engines/Cesium/hooks/useExplicitRender.ts +0 -65
  166. package/src/engines/Cesium/hooks/useLayerDragDrop.ts +0 -77
  167. package/src/engines/Cesium/hooks/useViewerProperty.ts +0 -90
  168. /package/src/engines/Cesium/{hooks/useOverrideGlobeShader/JapanSeaLevelEllipsoid.ts → JapanSeaLevelEllipsoid.ts} +0 -0
  169. /package/src/engines/Cesium/{hooks/useOverrideGlobeShader/vertexTerrainElevationMaterial.glsl → vertexTerrainElevationMaterial.glsl} +0 -0
@@ -1,31 +1,42 @@
1
1
  import {
2
+ Color,
2
3
  Entity,
3
4
  Cesium3DTileFeature,
5
+ Cartesian3,
4
6
  Ion,
5
7
  Cesium3DTileset,
6
8
  JulianDate,
7
9
  Cesium3DTilePointFeature,
8
10
  Model,
9
11
  Cartographic,
12
+ SunLight,
13
+ DirectionalLight,
10
14
  Viewer as CesiumViewer,
11
15
  Primitive,
12
16
  GroundPrimitive,
13
17
  ShadowMap,
14
18
  ImageryLayer,
19
+ Scene,
20
+ Math as CesiumMath,
15
21
  } from "cesium";
16
- import { MutableRefObject, RefObject, useCallback, useEffect, useMemo, useRef } from "react";
22
+ import CesiumDnD, { Context } from "cesium-dnd";
23
+ import { isEqual } from "lodash-es";
24
+ import { RefObject, useCallback, useEffect, useMemo, useRef } from "react";
17
25
  import type { CesiumComponentRef, CesiumMovementEvent, RootEventTarget } from "resium";
26
+ import { useCustomCompareCallback } from "use-custom-compare";
18
27
 
19
28
  import type {
29
+ Camera,
30
+ LatLng,
20
31
  LayerSelectionReason,
21
32
  EngineRef,
22
- ViewerProperty,
33
+ SceneProperty,
23
34
  MouseEvents,
24
35
  LayerEditEvent,
25
36
  LayerVisibilityEvent,
26
37
  } from "..";
27
38
  import { e2eAccessToken, setE2ECesiumViewer } from "../../e2eConfig";
28
- import { ComputedFeature, DataType, SelectedFeatureInfo, LatLng, Camera } from "../../mantle";
39
+ import { ComputedFeature, DataType, SelectedFeatureInfo } from "../../mantle";
29
40
  import {
30
41
  LayerLoadEvent,
31
42
  LayerSelectWithRectEnd,
@@ -34,22 +45,20 @@ import {
34
45
  LayersRef,
35
46
  RequestingRenderMode,
36
47
  } from "../../Map";
48
+ import { FORCE_REQUEST_RENDER, NO_REQUEST_RENDER, REQUEST_RENDER_ONCE } from "../../Map/hooks";
37
49
  import { TimelineManagerRef } from "../../Map/useTimelineManager";
38
50
  import { FEATURE_FLAGS } from "../../Visualizer/featureFlags";
39
51
 
40
- import { isSelectable } from "./common";
52
+ import { useCameraLimiter } from "./cameraLimiter";
53
+ import { getCamera, isDraggable, isSelectable } from "./common";
41
54
  import { getTag, type Context as FeatureContext } from "./Feature";
42
55
  import { arrayToCartecian3 } from "./helpers/sphericalHaromic";
43
- import useCamera from "./hooks/useCamera";
44
- import useEngineRef from "./hooks/useEngineRef";
45
- import useExplicitRender from "./hooks/useExplicitRender";
46
- import useLayerDragDrop from "./hooks/useLayerDragDrop";
47
56
  import { useLayerSelectWithRect } from "./hooks/useLayerSelectWithRect";
48
- import { useOverrideGlobeShader } from "./hooks/useOverrideGlobeShader/useOverrideGlobeShader";
49
- import useViewerProperty from "./hooks/useViewerProperty";
50
57
  import { InternalCesium3DTileFeature } from "./types";
58
+ import useEngineRef from "./useEngineRef";
59
+ import { useOverrideGlobeShader } from "./useOverrideGlobeShader";
51
60
  import { makeMouseEventProps } from "./utils/mouse";
52
- import { findEntity, getEntityContent } from "./utils/utils";
61
+ import { convertCartesian3ToPosition, findEntity, getEntityContent } from "./utils/utils";
53
62
 
54
63
  interface CustomGlobeSurface {
55
64
  tileProvider: {
@@ -65,48 +74,46 @@ type CesiumMouseWheelEvent = (delta: number) => void;
65
74
  export default ({
66
75
  ref,
67
76
  property,
68
- time,
77
+ camera,
69
78
  selectedLayerId,
70
79
  selectionReason,
80
+ isLayerDraggable,
81
+ isLayerDragging,
71
82
  meta,
72
83
  layersRef,
73
84
  featureFlags,
74
- timelineManagerRef,
75
- isLayerDraggable,
76
- isLayerDragging,
77
- shouldRender,
78
85
  requestingRenderMode,
79
- camera,
80
- cameraForceHorizontalRoll,
86
+ shouldRender,
87
+ timelineManagerRef,
88
+ cameraForceHorizontalRoll = false,
81
89
  onLayerSelect,
90
+ onCameraChange,
82
91
  onLayerDrag,
83
92
  onLayerDrop,
84
93
  onLayerEdit,
85
94
  onLayerSelectWithRectStart,
86
95
  onLayerSelectWithRectMove,
87
96
  onLayerSelectWithRectEnd,
97
+ onMount,
88
98
  onLayerVisibility,
89
99
  onLayerLoad,
90
- onCameraChange,
91
- onMount,
92
100
  }: {
93
101
  ref: React.ForwardedRef<EngineRef>;
94
- property?: ViewerProperty;
95
- time?: string | Date;
102
+ property?: SceneProperty;
103
+ camera?: Camera;
96
104
  selectedLayerId?: {
97
105
  layerId?: string;
98
106
  featureId?: string;
99
107
  };
100
108
  layersRef?: RefObject<LayersRef>;
101
109
  selectionReason?: LayerSelectionReason;
102
- meta?: Record<string, unknown>;
103
- featureFlags: number;
104
- timelineManagerRef?: TimelineManagerRef;
105
110
  isLayerDraggable?: boolean;
106
111
  isLayerDragging?: boolean;
112
+ meta?: Record<string, unknown>;
113
+ featureFlags: number;
114
+ requestingRenderMode?: React.MutableRefObject<RequestingRenderMode>;
107
115
  shouldRender?: boolean;
108
- requestingRenderMode?: MutableRefObject<RequestingRenderMode>;
109
- camera?: Camera;
116
+ timelineManagerRef?: TimelineManagerRef;
110
117
  cameraForceHorizontalRoll?: boolean;
111
118
  onLayerSelect?: (
112
119
  layerId?: string,
@@ -114,6 +121,7 @@ export default ({
114
121
  options?: LayerSelectionReason,
115
122
  info?: SelectedFeatureInfo,
116
123
  ) => void;
124
+ onCameraChange?: (camera: Camera) => void;
117
125
  onLayerDrag?: (layerId: string, featureId: string | undefined, position: LatLng) => void;
118
126
  onLayerDrop?: (
119
127
  layerId: string,
@@ -124,17 +132,16 @@ export default ({
124
132
  onLayerSelectWithRectStart?: (e: LayerSelectWithRectStart) => void;
125
133
  onLayerSelectWithRectMove?: (e: LayerSelectWithRectMove) => void;
126
134
  onLayerSelectWithRectEnd?: (e: LayerSelectWithRectEnd) => void;
135
+ onMount?: () => void;
127
136
  onLayerVisibility?: (e: LayerVisibilityEvent) => void;
128
137
  onLayerLoad?: (e: LayerLoadEvent) => void;
129
- onCameraChange?: (camera: Camera) => void;
130
- onMount?: () => void;
131
138
  }) => {
132
139
  const cesium = useRef<CesiumComponentRef<CesiumViewer>>(null);
133
-
134
- const cesiumIonAccessToken =
140
+ const cesiumIonDefaultAccessToken =
135
141
  typeof meta?.cesiumIonAccessToken === "string" && meta.cesiumIonAccessToken
136
142
  ? meta.cesiumIonAccessToken
137
143
  : Ion.defaultAccessToken;
144
+ const cesiumIonAccessToken = property?.default?.ion || cesiumIonDefaultAccessToken;
138
145
 
139
146
  // expose ref
140
147
  const engineAPI = useEngineRef(ref, cesium);
@@ -148,6 +155,54 @@ export default ({
148
155
  featureFlags,
149
156
  });
150
157
 
158
+ const backgroundColor = useMemo(
159
+ () =>
160
+ property?.default?.bgcolor ? Color.fromCssColorString(property.default.bgcolor) : undefined,
161
+ [property?.default?.bgcolor],
162
+ );
163
+
164
+ const light = useMemo(() => {
165
+ let light;
166
+ if (property?.light?.lightType === "sunLight") {
167
+ light = new SunLight({
168
+ color: property.light?.lightColor
169
+ ? Color.fromCssColorString(property.light.lightColor)
170
+ : undefined,
171
+ intensity: property.light?.lightIntensity,
172
+ });
173
+ } else if (property?.light?.lightType === "directionalLight") {
174
+ light = new DirectionalLight({
175
+ direction: new Cartesian3(
176
+ property?.light?.lightDirectionX ?? 1,
177
+ property?.light?.lightDirectionY ?? 0,
178
+ property?.light?.lightDirectionZ ?? 0,
179
+ ),
180
+ color: property.light?.lightColor
181
+ ? Color.fromCssColorString(property.light.lightColor)
182
+ : undefined,
183
+ intensity: property.light?.lightIntensity,
184
+ });
185
+ } else {
186
+ light = cesium.current?.cesiumElement?.scene.light;
187
+ if (light) {
188
+ light.color = property?.light?.lightColor
189
+ ? Color.fromCssColorString(property.light.lightColor)
190
+ : light.color;
191
+ light.intensity = property?.light?.lightIntensity
192
+ ? property.light.lightIntensity
193
+ : light.intensity;
194
+ }
195
+ }
196
+ return light;
197
+ }, [
198
+ property?.light?.lightType,
199
+ property?.light?.lightColor,
200
+ property?.light?.lightDirectionX,
201
+ property?.light?.lightDirectionY,
202
+ property?.light?.lightDirectionZ,
203
+ property?.light?.lightIntensity,
204
+ ]);
205
+
151
206
  // shadow map
152
207
  type ShadowMapBias = {
153
208
  polygonOffsetFactor?: number;
@@ -167,11 +222,11 @@ export default ({
167
222
  })
168
223
  | undefined;
169
224
  if (!shadowMap) return;
170
- shadowMap.softShadows = property?.scene?.shadow?.shadowMap?.softShadows ?? false;
171
- shadowMap.darkness = property?.scene?.shadow?.shadowMap?.darkness ?? 0.3;
172
- shadowMap.size = property?.scene?.shadow?.shadowMap?.size ?? 2048;
173
- shadowMap.maximumDistance = property?.scene?.shadow?.shadowMap?.maximumDistance ?? 5000;
225
+ shadowMap.softShadows = property?.atmosphere?.softShadow ?? false;
226
+ shadowMap.darkness = property?.atmosphere?.shadowDarkness ?? 0.3;
227
+ shadowMap.size = property?.atmosphere?.shadowResolution ?? 2048;
174
228
  shadowMap.fadingEnabled = true;
229
+ shadowMap.maximumDistance = property?.atmosphere?.shadowMaximumDistance ?? 5000;
175
230
  shadowMap.normalOffset = true;
176
231
 
177
232
  // bias
@@ -224,12 +279,91 @@ export default ({
224
279
  Object.assign(shadowMap._pointBias, defaultPointBias);
225
280
  }
226
281
  }, [
227
- property?.scene?.shadow?.shadowMap?.softShadows,
228
- property?.scene?.shadow?.shadowMap?.darkness,
229
- property?.scene?.shadow?.shadowMap?.size,
230
- property?.scene?.shadow?.shadowMap?.maximumDistance,
282
+ property?.atmosphere?.softShadow,
283
+ property?.atmosphere?.shadowDarkness,
284
+ property?.atmosphere?.shadowResolution,
285
+ property?.atmosphere?.shadowMaximumDistance,
231
286
  ]);
232
287
 
288
+ useEffect(() => {
289
+ engineAPI.changeSceneMode(property?.default?.sceneMode, 0);
290
+ }, [property?.default?.sceneMode, engineAPI]);
291
+
292
+ // move to initial position at startup
293
+ const initialCameraFlight = useRef(false);
294
+
295
+ const handleMount = useCustomCompareCallback(
296
+ () => {
297
+ if (initialCameraFlight.current) return;
298
+ initialCameraFlight.current = true;
299
+ if (
300
+ property?.cameraLimiter?.cameraLimitterEnabled &&
301
+ property?.cameraLimiter?.cameraLimitterTargetArea
302
+ ) {
303
+ engineAPI.flyTo(property?.cameraLimiter?.cameraLimitterTargetArea, { duration: 0 });
304
+ } else if (property?.default?.camera ?? property?.camera?.camera) {
305
+ const camera = property?.default?.camera ?? property?.camera?.camera;
306
+ engineAPI.flyTo(camera as Camera, { duration: 0 });
307
+ }
308
+ const camera = getCamera(cesium?.current?.cesiumElement);
309
+ if (camera) {
310
+ onCameraChange?.(camera);
311
+ }
312
+ onMount?.();
313
+ },
314
+ [
315
+ engineAPI,
316
+ property?.default?.camera,
317
+ property?.camera?.camera,
318
+ property?.cameraLimiter?.cameraLimitterEnabled,
319
+ onCameraChange,
320
+ onMount,
321
+ ],
322
+ (prevDeps, nextDeps) =>
323
+ prevDeps[0] === nextDeps[0] &&
324
+ isEqual(prevDeps[1], nextDeps[1]) &&
325
+ isEqual(prevDeps[2], nextDeps[2]) &&
326
+ prevDeps[3] === nextDeps[3] &&
327
+ prevDeps[4] === nextDeps[4] &&
328
+ prevDeps[5] === nextDeps[5],
329
+ );
330
+
331
+ const handleUnmount = useCallback(() => {
332
+ initialCameraFlight.current = false;
333
+ }, []);
334
+
335
+ // cache the camera data emitted from viewer camera change
336
+ const emittedCamera = useRef<Camera[]>([]);
337
+ const updateCamera = useCallback(() => {
338
+ const viewer = cesium?.current?.cesiumElement;
339
+ if (!viewer || viewer.isDestroyed() || !onCameraChange) return;
340
+
341
+ const c = getCamera(viewer);
342
+ if (c && !isEqual(c, camera)) {
343
+ emittedCamera.current.push(c);
344
+ // The state change is not sync now. This number is how many state updates can actually happen to be merged within one re-render.
345
+ if (emittedCamera.current.length > 10) {
346
+ emittedCamera.current.shift();
347
+ }
348
+ onCameraChange?.(c);
349
+ }
350
+ }, [camera, onCameraChange]);
351
+
352
+ const handleCameraChange = useCallback(() => {
353
+ updateCamera();
354
+ }, [updateCamera]);
355
+
356
+ const handleCameraMoveEnd = useCallback(() => {
357
+ updateCamera();
358
+ }, [updateCamera]);
359
+
360
+ useEffect(() => {
361
+ if (camera && !emittedCamera.current.includes(camera)) {
362
+ engineAPI.flyTo(camera, { duration: 0 });
363
+ emittedCamera.current = [];
364
+ }
365
+ }, [camera, engineAPI]);
366
+
233
367
  const prevSelectedEntity = useRef<
234
368
  | Entity
235
369
  | Cesium3DTileset
@@ -359,25 +493,22 @@ export default ({
359
493
 
360
494
  const sphericalHarmonicCoefficients = useMemo(
361
495
  () =>
362
- property?.scene?.imageBasedLighting?.sphericalHarmonicCoefficients
496
+ property?.light?.sphericalHarmonicCoefficients
363
497
  ? arrayToCartecian3(
364
- property?.scene?.imageBasedLighting?.sphericalHarmonicCoefficients,
365
- property?.scene?.imageBasedLighting?.intensity,
498
+ property?.light?.sphericalHarmonicCoefficients,
499
+ property?.light?.imageBasedLightIntensity,
366
500
  )
367
501
  : undefined,
368
- [
369
- property?.scene?.imageBasedLighting?.sphericalHarmonicCoefficients,
370
- property?.scene?.imageBasedLighting?.intensity,
371
- ],
502
+ [property?.light?.sphericalHarmonicCoefficients, property?.light?.imageBasedLightIntensity],
372
503
  );
373
504
 
374
505
  useOverrideGlobeShader({
375
506
  cesium,
376
507
  sphericalHarmonicCoefficients,
377
- globeShadowDarkness: property?.scene?.shadow?.darkness,
378
- globeImageBasedLighting: property?.scene?.imageBasedLighting?.enabled,
379
- enableLighting: property?.globe?.enableLighting,
380
- hasVertexNormals: property?.terrain?.enabled && property.terrain.normal,
508
+ globeShadowDarkness: property?.atmosphere?.globeShadowDarkness,
509
+ globeImageBasedLighting: property?.atmosphere?.globeImageBasedLighting,
510
+ enableLighting: property?.atmosphere?.enable_lighting ?? property?.globeLighting?.globeLighting,
511
+ hasVertexNormals: property?.terrain?.terrain && property.terrain.terrainNormal,
381
512
  terrain: property?.terrain,
382
513
  });
383
514
 
@@ -412,18 +543,18 @@ export default ({
412
543
  wheel: CesiumMouseWheelEvent | undefined;
413
544
  } = {
414
545
  click: undefined,
415
- doubleClick: undefined,
416
- mouseDown: undefined,
417
- mouseUp: undefined,
418
- rightClick: undefined,
419
- rightDown: undefined,
420
- rightUp: undefined,
421
- middleClick: undefined,
422
- middleDown: undefined,
423
- middleUp: undefined,
424
- mouseMove: undefined,
425
- mouseEnter: undefined,
426
- mouseLeave: undefined,
546
+ doubleclick: undefined,
547
+ mousedown: undefined,
548
+ mouseup: undefined,
549
+ rightclick: undefined,
550
+ rightdown: undefined,
551
+ rightup: undefined,
552
+ middleclick: undefined,
553
+ middledown: undefined,
554
+ middleup: undefined,
555
+ mousemove: undefined,
556
+ mouseenter: undefined,
557
+ mouseleave: undefined,
427
558
  wheel: (delta: number) => {
428
559
  handleMouseWheel(delta);
429
560
  },
@@ -648,6 +779,55 @@ export default ({
648
779
  viewer.scene.requestRender();
649
780
  }, []);
650
781
 
782
+ // enable Drag and Drop Layers
783
+ const handleLayerDrag = useCallback(
784
+ (e: Entity, position: Cartesian3 | undefined, _context: Context): boolean | void => {
785
+ const viewer = cesium.current?.cesiumElement;
786
+ if (!viewer || viewer.isDestroyed() || !isSelectable(e) || !isDraggable(e)) return false;
787
+
788
+ const pos = convertCartesian3ToPosition(cesium.current?.cesiumElement, position);
789
+ if (!pos) return false;
790
+
791
+ const tag = getTag(e);
792
+ if (!tag) return false;
793
+
794
+ onLayerDrag?.(tag.layerId || "", tag.featureId, pos);
795
+ },
796
+ [onLayerDrag],
797
+ );
798
+
799
+ const handleLayerDrop = useCallback(
800
+ (e: Entity, position: Cartesian3 | undefined): boolean | void => {
801
+ const viewer = cesium.current?.cesiumElement;
802
+ if (!viewer || viewer.isDestroyed()) return false;
803
+
804
+ const tag = getTag(e);
805
+ const pos = convertCartesian3ToPosition(cesium.current?.cesiumElement, position);
806
+ onLayerDrop?.(tag?.layerId || "", tag?.featureId || "", pos);
807
+
808
+ return false; // let apollo-client handle optimistic updates
809
+ },
810
+ [onLayerDrop],
811
+ );
812
+
813
+ const cesiumDnD = useRef<CesiumDnD>();
814
+ useEffect(() => {
815
+ const viewer = cesium.current?.cesiumElement;
816
+ if (!viewer || viewer.isDestroyed()) return;
817
+ cesiumDnD.current = new CesiumDnD(viewer, {
818
+ onDrag: handleLayerDrag,
819
+ onDrop: handleLayerDrop,
820
+ dragDelay: 1000,
821
+ initialDisabled: !isLayerDraggable,
822
+ });
823
+ return () => {
824
+ if (!viewer || viewer.isDestroyed()) return;
825
+ cesiumDnD.current?.disable();
826
+ };
827
+ }, [handleLayerDrag, handleLayerDrop, isLayerDraggable]);
828
+ const { cameraViewBoundaries, cameraViewOuterBoundaries, cameraViewBoundariesMaterial } =
829
+ useCameraLimiter(cesium, camera, property?.cameraLimiter);
830
+
651
831
  const context = useMemo<FeatureContext>(
652
832
  () => ({
653
833
  selectionReason,
@@ -667,86 +847,147 @@ export default ({
667
847
  );
668
848
 
669
849
  useEffect(() => {
670
- const globe = cesium.current?.cesiumElement?.scene.globe;
671
- if (globe) {
672
- const surface = (globe as any)._surface as CustomGlobeSurface;
673
- if (surface) {
674
- surface.tileProvider._debug.wireframe = property?.debug?.showGlobeWireframe ?? false;
675
- }
850
+ if (!cesium.current?.cesiumElement) return;
851
+ const allowCameraMove = !!(featureFlags & FEATURE_FLAGS.CAMERA_MOVE);
852
+ const allowCameraZoom = !!(featureFlags & FEATURE_FLAGS.CAMERA_ZOOM);
853
+ const allowCameraTilt = !!(featureFlags & FEATURE_FLAGS.CAMERA_TILT);
854
+ const allowCameraLook = !!(featureFlags & FEATURE_FLAGS.CAMERA_LOOK);
855
+ cesium.current.cesiumElement.scene.screenSpaceCameraController.enableTranslate =
856
+ allowCameraMove;
857
+ cesium.current.cesiumElement.scene.screenSpaceCameraController.enableRotate = allowCameraMove;
858
+ cesium.current.cesiumElement.scene.screenSpaceCameraController.enableLook = allowCameraLook;
859
+ cesium.current.cesiumElement.scene.screenSpaceCameraController.enableTilt = allowCameraTilt;
860
+ cesium.current.cesiumElement.scene.screenSpaceCameraController.enableZoom = allowCameraZoom;
861
+ }, [featureFlags]);
862
+
863
+ // Anti-aliasing
864
+ useEffect(() => {
865
+ const viewer = cesium.current?.cesiumElement;
866
+ if (!viewer || viewer.isDestroyed()) return;
867
+ // TODO: FXAA doesn't support alpha blending in Cesium, so we will enable FXAA when this is fixed.
868
+ // viewer.scene.postProcessStages.fxaa.enabled = property?.render?.antialias === "high";
869
+ viewer.scene.msaaSamples =
870
+ property?.render?.antialias === "extreme"
871
+ ? 8
872
+ : property?.render?.antialias === "high"
873
+ ? 6
874
+ : property?.render?.antialias === "medium"
875
+ ? 4
876
+ : 1; // default as 1
877
+ }, [property?.render?.antialias]);
878
+
879
+ // explicit rendering
880
+ const explicitRender = useCallback(() => {
881
+ const viewer = cesium.current?.cesiumElement;
882
+ if (!requestingRenderMode?.current || !viewer || viewer.isDestroyed()) return;
883
+ viewer.scene.requestRender();
884
+ if (requestingRenderMode.current === REQUEST_RENDER_ONCE) {
885
+ requestingRenderMode.current = NO_REQUEST_RENDER;
676
886
  }
677
- }, [property?.debug?.showGlobeWireframe]);
887
+ }, [requestingRenderMode]);
888
+
889
+ const explicitRenderRef = useRef<() => void>();
678
890
 
679
891
  useEffect(() => {
680
- if (!time) return;
681
- timelineManagerRef?.current?.commit({
682
- cmd: "SET_TIME",
683
- payload: {
684
- start: time,
685
- stop: time,
686
- current: time,
687
- },
688
- committer: {
689
- source: "initialize",
690
- id: "reearth_core",
691
- },
892
+ explicitRenderRef.current = explicitRender;
893
+ }, [explicitRender]);
894
+
895
+ useEffect(() => {
896
+ const viewer = cesium.current?.cesiumElement;
897
+ if (!viewer || viewer.isDestroyed()) return;
898
+ return viewer.scene.postUpdate.addEventListener(() => {
899
+ explicitRenderRef.current?.();
692
900
  });
693
- }, [time, timelineManagerRef]);
901
+ }, []);
694
902
 
695
- const { sceneLight, sceneBackgroundColor, sceneMsaaSamples, sceneMode } = useViewerProperty({
696
- property,
697
- cesium,
698
- });
903
+ // render one frame when scene property changes
904
+ useEffect(() => {
905
+ if (requestingRenderMode) {
906
+ requestingRenderMode.current = REQUEST_RENDER_ONCE;
907
+ }
908
+ }, [property, requestingRenderMode]);
699
909
 
700
- useLayerDragDrop({ cesium, onLayerDrag, onLayerDrop, isLayerDraggable });
910
+ // force render when timeline is animating or is shouldRender
911
+ useEffect(() => {
912
+ const viewer = cesium.current?.cesiumElement;
913
+ if (!viewer || viewer.isDestroyed()) return;
914
+ if (requestingRenderMode) {
915
+ requestingRenderMode.current =
916
+ isLayerDragging || shouldRender
917
+ ? FORCE_REQUEST_RENDER
918
+ : requestingRenderMode.current === REQUEST_RENDER_ONCE
919
+ ? REQUEST_RENDER_ONCE
920
+ : NO_REQUEST_RENDER;
921
+ }
922
+ }, [isLayerDragging, shouldRender, requestingRenderMode]);
701
923
 
702
- useExplicitRender({ cesium, requestingRenderMode, isLayerDragging, shouldRender, property });
924
+ // cesium timeline & animation widget
925
+ useEffect(() => {
926
+ const viewer = cesium.current?.cesiumElement;
927
+ if (!viewer) return;
928
+ if (viewer.animation?.container) {
929
+ (viewer.animation.container as HTMLDivElement).style.visibility = property?.timeline?.visible
930
+ ? "visible"
931
+ : "hidden";
932
+ }
933
+ if (viewer.timeline?.container) {
934
+ (viewer.timeline.container as HTMLDivElement).style.visibility = property?.timeline?.visible
935
+ ? "visible"
936
+ : "hidden";
937
+ }
938
+ viewer.forceResize();
939
+ }, [property]);
703
940
 
704
- const {
705
- cameraViewBoundaries,
706
- cameraViewOuterBoundaries,
707
- cameraViewBoundariesMaterial,
708
- handleCameraChange,
709
- handleCameraMoveEnd,
710
- mountCamera,
711
- unmountCamera,
712
- } = useCamera({
713
- cesium,
714
- property,
715
- camera,
716
- cameraForceHorizontalRoll,
717
- featureFlags,
718
- engineAPI,
719
- onCameraChange,
720
- });
941
+ const globe = cesium.current?.cesiumElement?.scene.globe;
721
942
 
722
- const handleMount = useCallback(() => {
723
- mountCamera?.();
724
- onMount?.();
725
- }, [mountCamera, onMount]);
943
+ useEffect(() => {
944
+ if (globe) {
945
+ const surface = (globe as any)._surface as CustomGlobeSurface;
946
+ if (surface) {
947
+ surface.tileProvider._debug.wireframe = property?.render?.showWireframe ?? false;
948
+ }
949
+ }
950
+ }, [globe, property?.render?.showWireframe]);
951
+
952
+ const onPreRenderCallback = useCallback(
953
+ (scene: Scene) => {
954
+ if (!scene.camera || !cameraForceHorizontalRoll) return;
955
+ if (Math.abs(CesiumMath.negativePiToPi(scene.camera.roll)) > Math.PI / 86400) {
956
+ scene.camera.setView({
957
+ orientation: {
958
+ heading: scene.camera.heading,
959
+ pitch: scene.camera.pitch,
960
+ roll: 0,
961
+ },
962
+ });
963
+ }
964
+ },
965
+ [cameraForceHorizontalRoll],
966
+ );
726
967
 
727
- const handleUnmount = useCallback(() => {
728
- unmountCamera?.();
729
- }, [unmountCamera]);
968
+ useEffect(() => {
969
+ const viewer = cesium.current?.cesiumElement;
970
+ if (!viewer) return;
971
+ return viewer.scene.preRender.addEventListener(onPreRenderCallback);
972
+ }, [onPreRenderCallback]);
730
973
 
731
974
  return {
975
+ backgroundColor,
732
976
  cesium,
733
- cesiumIonAccessToken,
734
- mouseEventHandles,
735
- layerSelectWithRectEventHandlers,
736
- context,
737
- sceneLight,
738
- sceneBackgroundColor,
739
- sceneMsaaSamples,
740
- sceneMode,
741
977
  cameraViewBoundaries,
742
978
  cameraViewOuterBoundaries,
743
979
  cameraViewBoundariesMaterial,
744
- handleCameraChange,
745
- handleCameraMoveEnd,
746
- handleUpdate,
747
- handleClick,
980
+ cesiumIonAccessToken,
981
+ mouseEventHandles,
982
+ context,
983
+ light,
748
984
  handleMount,
749
985
  handleUnmount,
986
+ handleUpdate,
987
+ handleClick,
988
+ handleCameraChange,
989
+ handleCameraMoveEnd,
990
+ layerSelectWithRectEventHandlers,
750
991
  };
751
992
  };
752
993
 
@@ -35,7 +35,7 @@ Default.args = {
35
35
  tiles: [
36
36
  {
37
37
  id: "default",
38
- type: "default",
38
+ tile_type: "default",
39
39
  },
40
40
  ],
41
41
  },