@threepipe/plugin-3d-tiles-renderer 0.2.0 → 0.3.0

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,7 +1,7 @@
1
1
  {
2
2
  "name": "@threepipe/plugin-3d-tiles-renderer",
3
3
  "description": "Interface for 3d-tiles-renderer",
4
- "version": "0.2.0",
4
+ "version": "0.3.0",
5
5
  "dependencies": {},
6
6
  "overrides": {
7
7
  "threepipe": "$threepipe",
@@ -2,26 +2,35 @@ import {
2
2
  AViewerPluginEventMap,
3
3
  AViewerPluginSync,
4
4
  Box3B,
5
+ DropzonePlugin,
5
6
  EventListener2,
6
7
  generateUUID,
7
8
  IAssetImporter,
8
9
  ILoader,
10
+ ImportAddOptions,
9
11
  Importer,
10
12
  IObject3D,
11
13
  iObjectCommons,
12
14
  IRenderManager,
13
15
  IRenderManagerEventMap,
14
- IScene,
15
- ISceneEventMap,
16
16
  Loader,
17
- ImportAddOptions,
18
17
  LoadingManager,
19
- ThreeViewer, Sphere, uiButton,
18
+ Object3D,
19
+ Sphere,
20
+ ThreeViewer,
21
+ uiButton,
22
+ uiFolderContainer,
23
+ IObjectExtension,
20
24
  } from 'threepipe'
21
25
  import {TilesGroup, TilesRenderer} from '3d-tiles-renderer'
22
26
  import {gltfCesiumRTCExtension, gltfMeshFeaturesExtension, gltfStructuralMetadataExtension} from './gltf'
27
+ import {
28
+ CesiumIonAuthPlugin,
29
+ ImplicitTilingPlugin,
30
+ TilesFadePlugin,
31
+ UpdateOnChangePlugin,
23
32
  // @ts-expect-error moduleResolution issue
24
- import {ImplicitTilingPlugin, TilesFadePlugin, UpdateOnChangePlugin, CesiumIonAuthPlugin} from '3d-tiles-renderer/plugins'
33
+ } from '3d-tiles-renderer/plugins'
25
34
 
26
35
  export type TilesRendererGroup = TilesGroup & IObject3D
27
36
 
@@ -35,6 +44,7 @@ export interface TilesRendererPluginEventMap extends AViewerPluginEventMap {
35
44
  *
36
45
  * Specification - https://www.ogc.org/standards/3dtiles/
37
46
  */
47
+ @uiFolderContainer('3D Tiles')
38
48
  export class TilesRendererPlugin extends AViewerPluginSync<TilesRendererPluginEventMap> {
39
49
  public static readonly PluginType: string = 'TilesRendererPlugin'
40
50
  enabled = true
@@ -65,6 +75,8 @@ export class TilesRendererPlugin extends AViewerPluginSync<TilesRendererPluginEv
65
75
  ...options,
66
76
  fileExtension: TilesRendererPlugin.DUMMY_EXT,
67
77
  fileHandler: importer,
78
+ }).finally(() => {
79
+ this._viewer?.assetManager.importer.unregisterFile(temp)
68
80
  })
69
81
  }
70
82
 
@@ -89,7 +101,8 @@ export class TilesRendererPlugin extends AViewerPluginSync<TilesRendererPluginEv
89
101
  viewer.assetManager.registerGltfExtension(gltfStructuralMetadataExtension)
90
102
  viewer.assetManager.registerGltfExtension(gltfMeshFeaturesExtension)
91
103
  viewer.assetManager.importer.addImporter(this._importer)
92
- viewer.scene.addEventListener('addSceneObject', this._addSceneObject)
104
+ viewer.object3dManager.registerObjectExtension(this._objectExt)
105
+ // viewer.scene.addEventListener('addSceneObject', this._addSceneObject)
93
106
  // viewer.scene.addEventListener('mainCameraChange', this._mainCameraChange)
94
107
  // viewer.scene.addEventListener('mainCameraUpdate', this._mainCameraUpdate)
95
108
  viewer.renderManager.addEventListener('preRender', this._preRender) // note - adding to renderManager preRender, not viewer. So its fired for each camera render
@@ -101,7 +114,8 @@ export class TilesRendererPlugin extends AViewerPluginSync<TilesRendererPluginEv
101
114
  viewer.assetManager.unregisterGltfExtension(gltfCesiumRTCExtension.name)
102
115
  viewer.assetManager.unregisterGltfExtension(gltfStructuralMetadataExtension.name)
103
116
  viewer.assetManager.unregisterGltfExtension(gltfMeshFeaturesExtension.name)
104
- viewer.scene.removeEventListener('addSceneObject', this._addSceneObject)
117
+ viewer.object3dManager.unregisterObjectExtension(this._objectExt)
118
+ // viewer.scene.removeEventListener('addSceneObject', this._addSceneObject)
105
119
  // viewer.scene.removeEventListener('mainCameraChange', this._mainCameraChange)
106
120
  // viewer.scene.removeEventListener('mainCameraUpdate', this._mainCameraUpdate)
107
121
  viewer.renderManager.removeEventListener('preRender', this._preRender)
@@ -155,53 +169,55 @@ export class TilesRendererPlugin extends AViewerPluginSync<TilesRendererPluginEv
155
169
 
156
170
  private _cachedRefs?: Pick<TilesRenderer, 'lruCache' | 'downloadQueue' | 'parseQueue'/* | 'processNodeQueue'*/>
157
171
 
158
- private _addSceneObject: EventListener2<'addSceneObject', ISceneEventMap, IScene> = (e)=>{
159
- const object = e.object
160
- const group = object as TilesRendererGroup
161
- // console.log(e)
162
- if (!group || !group.tilesRenderer || !this._viewer) return
163
-
164
- // set the second renderer to share the cache and queues from the first
165
- if (!this._cachedRefs) {
166
- this._cachedRefs = {
167
- lruCache: group.tilesRenderer.lruCache,
168
- downloadQueue: group.tilesRenderer.downloadQueue,
169
- parseQueue: group.tilesRenderer.parseQueue,
172
+ private _objectExt: IObjectExtension = {
173
+ uuid: 'TilesRendererPluginObjectExt',
174
+ isCompatible: (o)=>!!(o as TilesRendererGroup).tilesRenderer,
175
+ onRegister: (group: TilesRendererGroup)=>{
176
+ if (!group || !group.tilesRenderer || !this._viewer) return
177
+
178
+ // set the second renderer to share the cache and queues from the first
179
+ if (!this._cachedRefs) {
180
+ this._cachedRefs = {
181
+ lruCache: group.tilesRenderer.lruCache,
182
+ downloadQueue: group.tilesRenderer.downloadQueue,
183
+ parseQueue: group.tilesRenderer.parseQueue,
184
+ // @ts-expect-error not in ts
185
+ processNodeQueue: group.tilesRenderer.processNodeQueue,
186
+ }
187
+ } else {
188
+ group.tilesRenderer.lruCache = this._cachedRefs.lruCache
189
+ group.tilesRenderer.downloadQueue = this._cachedRefs.downloadQueue
190
+ group.tilesRenderer.parseQueue = this._cachedRefs.parseQueue
170
191
  // @ts-expect-error not in ts
171
- processNodeQueue: group.tilesRenderer.processNodeQueue,
192
+ group.tilesRenderer.processNodeQueue = this._cachedRefs.processNodeQueue
172
193
  }
173
- } else {
174
- group.tilesRenderer.lruCache = this._cachedRefs.lruCache
175
- group.tilesRenderer.downloadQueue = this._cachedRefs.downloadQueue
176
- group.tilesRenderer.parseQueue = this._cachedRefs.parseQueue
177
- // @ts-expect-error not in ts
178
- group.tilesRenderer.processNodeQueue = this._cachedRefs.processNodeQueue
179
- }
180
194
 
181
- this.objects.push(group)
195
+ this.objects.push(group)
182
196
 
183
- group.tilesRenderer.registerPlugin({
184
- dispose: () => {
185
- const index = this.objects.indexOf(group)
186
- if (index !== -1) this.objects.splice(index, 1)
187
- this.dispatchEvent({type: 'removeTile', group})
188
- },
189
- })
190
- group.tilesRenderer.setCamera(this._viewer.scene.mainCamera)
191
- group.tilesRenderer.setResolutionFromRenderer(this._viewer.scene.mainCamera, this._viewer.renderManager.webglRenderer)
192
- group.tilesRenderer.update()
193
- group.addEventListener('dispose', ()=>{
194
- group.tilesRenderer.dispose()
195
- })
197
+ group.tilesRenderer.registerPlugin({
198
+ dispose: () => {
199
+ const index = this.objects.indexOf(group)
200
+ if (index !== -1) this.objects.splice(index, 1)
201
+ this.dispatchEvent({type: 'removeTile', group})
202
+ },
203
+ })
204
+ group.tilesRenderer.setCamera(this._viewer.scene.mainCamera)
205
+ group.tilesRenderer.setResolutionFromRenderer(this._viewer.scene.mainCamera, this._viewer.renderManager.webglRenderer)
206
+ group.tilesRenderer.update()
207
+ group.addEventListener('dispose', ()=>{
208
+ group.tilesRenderer.dispose()
209
+ })
196
210
 
197
- this.dispatchEvent({type: 'addTile', group})
211
+ this.dispatchEvent({type: 'addTile', group})
212
+ },
198
213
  }
199
214
 
200
215
  @uiButton()
201
216
  async promptForURL() {
202
217
  const url = await this._viewer?.dialog.prompt('TilesRendererPlugin: Enter URL for the root tileset', '', true)
203
218
  if (!url) return
204
- return this.load(url)
219
+ const loader = this._viewer?.getPlugin(DropzonePlugin) ?? this._viewer ?? this
220
+ return await loader.load(url, {fileExtension: TilesRendererPlugin.DUMMY_EXT})
205
221
  }
206
222
  }
207
223
 
@@ -283,7 +299,20 @@ export class TilesRendererLoader extends Loader implements ILoader<TilesRenderer
283
299
  })
284
300
  tiles.addEventListener('load-tile-set', (e) => {
285
301
  const isRoot = e.tileSet === tiles.rootTileSet
286
- if (isRoot && resolve) resolve()
302
+ if (isRoot && resolve) {
303
+ resolve()
304
+ }
305
+ })
306
+
307
+ group.userData.rootPathRefresh = true // when next loaded from gltf, the object will be refreshed based on rootPath
308
+ group._rootPathRefreshed = true // so that it doesn't do it this time
309
+ group._sChildren = [] // so that it's children are not saved in the gltf exporter.
310
+ tiles.registerPlugin({
311
+ processTileModel: (model: Object3D, tile: any) => {
312
+ if (tile === (tiles.rootTileSet as any)?.root) {
313
+ group._sChildren = [model] // the root tileset will be saved inside the gltf on export
314
+ }
315
+ },
287
316
  })
288
317
 
289
318
  const ai = this.ai