3dtiles-inspector 0.2.12 → 0.2.13

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "3dtiles-inspector",
3
- "version": "0.2.12",
3
+ "version": "0.2.13",
4
4
  "description": "Inspect, align, and save local 3D Tiles root transforms in an interactive browser session.",
5
5
  "author": "William Liu <lyz15972107087@gmail.com>",
6
6
  "license": "Apache-2.0",
@@ -57,7 +57,6 @@
57
57
  "@sparkjsdev/spark": "2.1.0",
58
58
  "3d-tiles-renderer": "0.4.27",
59
59
  "3d-tiles-rendererjs-3dgs-plugin": "0.1.11",
60
- "cesium": "1.140.0",
61
60
  "esbuild": "^0.25.11"
62
61
  },
63
62
  "dependencies": {
@@ -654,6 +654,34 @@ function buildViewerHtml(viewerConfig) {
654
654
  background: rgba(255, 255, 255, 0.92);
655
655
  }
656
656
 
657
+ .token-field {
658
+ display: grid;
659
+ gap: 5px;
660
+ min-width: 0;
661
+ }
662
+
663
+ .token-field span {
664
+ min-width: 0;
665
+ font-size: 11px;
666
+ font-weight: 600;
667
+ letter-spacing: 0.04em;
668
+ text-transform: uppercase;
669
+ color: #5d738b;
670
+ }
671
+
672
+ .token-field input {
673
+ width: 100%;
674
+ min-width: 0;
675
+ padding: 8px 10px;
676
+ border: 1px solid rgba(22, 50, 79, 0.16);
677
+ border-radius: 10px;
678
+ font: inherit;
679
+ font-size: 12px;
680
+ font-weight: 600;
681
+ color: #16324f;
682
+ background: rgba(255, 255, 255, 0.92);
683
+ }
684
+
657
685
  .coordinate-actions {
658
686
  display: grid;
659
687
  grid-template-columns: 1fr;
@@ -901,6 +929,17 @@ function buildViewerHtml(viewerConfig) {
901
929
  <p class="toolbar-section-title">Canvas</p>
902
930
  </div>
903
931
  <div class="coordinate-actions">
932
+ <label class="token-field">
933
+ <span>Cesium ion token</span>
934
+ <input
935
+ id="cesium-ion-token"
936
+ type="password"
937
+ autocomplete="off"
938
+ autocapitalize="off"
939
+ spellcheck="false"
940
+ placeholder="Required for terrain"
941
+ />
942
+ </label>
904
943
  <button id="terrain" class="wide" type="button">Terrain</button>
905
944
  <button id="bounding-volume" class="wide" type="button">Bounding Volume</button>
906
945
  <button id="move-to-tiles" type="button">Move To Tiles</button>
package/src/viewer/app.js CHANGED
@@ -46,6 +46,7 @@ const viewerElements = getViewerElements();
46
46
  const {
47
47
  boundingVolumeButton,
48
48
  cacheBytesValueEl,
49
+ cesiumIonTokenInput,
49
50
  cropSectionEl,
50
51
  geometricErrorLayerScaleInput,
51
52
  geometricErrorLayerValueEl,
@@ -142,6 +143,7 @@ const globeController = createGlobeController({
142
143
 
143
144
  const viewerToggles = createViewerToggles({
144
145
  boundingVolumeButton,
146
+ cesiumIonTokenInput,
145
147
  globeController,
146
148
  setStatus,
147
149
  terrainButton,
@@ -4,6 +4,7 @@ export function getViewerElements() {
4
4
  return {
5
5
  boundingVolumeButton: document.getElementById('bounding-volume'),
6
6
  cacheBytesValueEl: document.getElementById('cache-bytes-value'),
7
+ cesiumIonTokenInput: document.getElementById('cesium-ion-token'),
7
8
  cropCountValueEl: document.getElementById('crop-count-value'),
8
9
  cropListEl: document.getElementById('crop-list'),
9
10
  cropSectionEl: document.getElementById('crop-section'),
@@ -156,7 +156,9 @@ export function bindViewerEvents({
156
156
  handlers.toggleToolbarVisibility,
157
157
  );
158
158
  terrainButton.addEventListener('click', () => {
159
- handlers.setTerrainEnabled(!getTerrainEnabled());
159
+ if (!handlers.setTerrainEnabled(!getTerrainEnabled())) {
160
+ return;
161
+ }
160
162
  setStatus(
161
163
  getTerrainEnabled()
162
164
  ? 'Terrain enabled with Cesium World Terrain.'
@@ -1,5 +1,6 @@
1
1
  export function createViewerToggles({
2
2
  boundingVolumeButton,
3
+ cesiumIonTokenInput,
3
4
  globeController,
4
5
  setStatus,
5
6
  terrainButton,
@@ -19,8 +20,23 @@ export function createViewerToggles({
19
20
  }
20
21
 
21
22
  function setTerrainEnabled(enabled) {
22
- globeController.setTerrainEnabled(enabled);
23
- syncTerrainButton();
23
+ try {
24
+ const cesiumIonToken = cesiumIonTokenInput?.value?.trim() || '';
25
+ if (enabled && !cesiumIonToken) {
26
+ cesiumIonTokenInput?.focus();
27
+ setStatus('Enter a Cesium ion token to enable terrain.', true);
28
+ syncTerrainButton();
29
+ return false;
30
+ }
31
+
32
+ globeController.setTerrainEnabled(enabled, { cesiumIonToken });
33
+ syncTerrainButton();
34
+ return true;
35
+ } catch (err) {
36
+ setStatus(err && err.message ? err.message : String(err), true);
37
+ syncTerrainButton();
38
+ return false;
39
+ }
24
40
  }
25
41
 
26
42
  function syncBoundingVolumeButton() {
@@ -11,11 +11,12 @@ export function createGlobeController({
11
11
  renderer,
12
12
  }) {
13
13
  let tiles = null;
14
- let terrainEnabled = true;
14
+ let terrainEnabled = false;
15
15
 
16
- function setTerrainEnabled(enabled) {
16
+ function setTerrainEnabled(enabled, { cesiumIonToken = '' } = {}) {
17
17
  const globeTileOptions = {
18
18
  camera,
19
+ cesiumIonToken,
19
20
  preprocessURL: normalizeLocalResourceUrl,
20
21
  renderer,
21
22
  };
@@ -1,4 +1,3 @@
1
- import { Ion } from 'cesium';
2
1
  import { TilesRenderer } from '3d-tiles-renderer';
3
2
  import { ImplicitTilingPlugin } from '3d-tiles-renderer/src/core/plugins/ImplicitTilingPlugin.js';
4
3
  import { CesiumIonAuthPlugin } from '3d-tiles-renderer/src/three/plugins/CesiumIonAuthPlugin.js';
@@ -22,7 +21,6 @@ const SATELLITE_IMAGERY = {
22
21
  levels: 18,
23
22
  };
24
23
  const CESIUM_ION_TERRAIN = {
25
- apiToken: Ion.defaultAccessToken,
26
24
  assetId: 1,
27
25
  };
28
26
 
@@ -73,13 +71,21 @@ export function createImageryGlobeTiles(options) {
73
71
  }
74
72
 
75
73
  export function createTerrainGlobeTiles(options) {
74
+ const apiToken =
75
+ typeof options.cesiumIonToken === 'string'
76
+ ? options.cesiumIonToken.trim()
77
+ : '';
78
+ if (!apiToken) {
79
+ throw new Error('Cesium ion token is required to enable terrain.');
80
+ }
81
+
76
82
  const next = new TilesRenderer();
77
83
  const satelliteOverlay = createSatelliteOverlay(options.preprocessURL);
78
84
  next.downloadQueue.maxJobs = 8;
79
85
  next.parseQueue.maxJobs = 2;
80
86
  next.registerPlugin(
81
87
  new CesiumIonAuthPlugin({
82
- apiToken: CESIUM_ION_TERRAIN.apiToken,
88
+ apiToken,
83
89
  assetId: String(CESIUM_ION_TERRAIN.assetId),
84
90
  autoRefreshToken: true,
85
91
  assetTypeHandler: (type, tilesRenderer) => {