diff --git a/example/googleMapsExample.js b/example/googleMapsExample.js
index 711dc280..127fc53f 100644
--- a/example/googleMapsExample.js
+++ b/example/googleMapsExample.js
@@ -16,12 +16,12 @@ import {
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';
import { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js';
import { GUI } from 'three/examples/jsm/libs/lil-gui.module.min.js';
-import { estimateBytesUsed } from 'three/examples/jsm/utils/BufferGeometryUtils.js';
import Stats from 'three/examples/jsm/libs/stats.module.js';
import { CameraTransitionManager } from './src/camera/CameraTransitionManager.js';
import { TileCompressionPlugin } from './src/plugins/TileCompressionPlugin.js';
import { UpdateOnChangePlugin } from './src/plugins/UpdateOnChangePlugin.js';
import { TilesFadePlugin } from './src/plugins/fade/TilesFadePlugin.js';
+import { BatchedTilesPlugin } from './src/plugins/batched/BatchedTilesPlugin.js';
let controls, scene, renderer, tiles, transition;
let statsContainer, stats;
@@ -35,8 +35,10 @@ const params = {
enableCacheDisplay: false,
enableRendererStats: false,
apiKey: apiKey,
+ useBatchedMesh: Boolean( new URLSearchParams( window.location.hash.replace( /^#/, '' ) ).get( 'batched' ) ),
+ errorTarget: 40,
- 'reload': reinstantiateTiles,
+ reload: reinstantiateTiles,
};
@@ -59,7 +61,17 @@ function reinstantiateTiles() {
tiles.registerPlugin( new GoogleCloudAuthPlugin( { apiToken: params.apiKey, autoRefreshToken: true } ) );
tiles.registerPlugin( new TileCompressionPlugin() );
tiles.registerPlugin( new UpdateOnChangePlugin() );
- tiles.registerPlugin( new TilesFadePlugin() );
+
+ if ( params.useBatchedMesh ) {
+
+ tiles.registerPlugin( new BatchedTilesPlugin( { renderer } ) );
+
+ } else {
+
+ tiles.registerPlugin( new TilesFadePlugin() );
+
+ }
+
tiles.group.rotation.x = - Math.PI / 2;
// Note the DRACO compression files need to be supplied via an explicit source.
@@ -138,13 +150,19 @@ function init() {
} );
- const mapsOptions = gui.addFolder( 'Google Tiles' );
+ const mapsOptions = gui.addFolder( 'Google Photorealistic Tiles' );
mapsOptions.add( params, 'apiKey' );
+ mapsOptions.add( params, 'useBatchedMesh' ).listen();
mapsOptions.add( params, 'reload' );
const exampleOptions = gui.addFolder( 'Example Options' );
exampleOptions.add( params, 'enableCacheDisplay' );
exampleOptions.add( params, 'enableRendererStats' );
+ exampleOptions.add( params, 'errorTarget', 5, 100, 1 ).onChange( () => {
+
+ tiles.getPluginByName( 'UPDATE_ON_CHANGE_PLUGIN' ).needsUpdate = true;
+
+ } );
statsContainer = document.createElement( 'div' );
document.getElementById( 'info' ).appendChild( statsContainer );
@@ -207,22 +225,34 @@ function updateHash() {
cartographicResult.lon *= MathUtils.RAD2DEG;
// update hash
- const params = new URLSearchParams();
- params.set( 'lat', cartographicResult.lat.toFixed( 4 ) );
- params.set( 'lon', cartographicResult.lon.toFixed( 4 ) );
- params.set( 'height', cartographicResult.height.toFixed( 2 ) );
- params.set( 'az', orientationResult.azimuth.toFixed( 2 ) );
- params.set( 'el', orientationResult.elevation.toFixed( 2 ) );
- params.set( 'roll', orientationResult.roll.toFixed( 2 ) );
- window.history.replaceState( undefined, undefined, `#${ params }` );
+ const urlParams = new URLSearchParams();
+ urlParams.set( 'lat', cartographicResult.lat.toFixed( 4 ) );
+ urlParams.set( 'lon', cartographicResult.lon.toFixed( 4 ) );
+ urlParams.set( 'height', cartographicResult.height.toFixed( 2 ) );
+ urlParams.set( 'az', orientationResult.azimuth.toFixed( 2 ) );
+ urlParams.set( 'el', orientationResult.elevation.toFixed( 2 ) );
+ urlParams.set( 'roll', orientationResult.roll.toFixed( 2 ) );
+
+ if ( params.useBatchedMesh ) {
+
+ urlParams.set( 'batched', 1 );
+
+ }
+ window.history.replaceState( undefined, undefined, `#${ urlParams }` );
}
function initFromHash() {
const hash = window.location.hash.replace( /^#/, '' );
- const params = new URLSearchParams( hash );
- if ( ! params.has( 'lat' ) && ! params.has( 'lon' ) ) {
+ const urlParams = new URLSearchParams( hash );
+ if ( urlParams.has( 'batched' ) ) {
+
+ params.useBatchedMesh = Boolean( urlParams.get( 'batched' ) );
+
+ }
+
+ if ( ! urlParams.has( 'lat' ) && ! urlParams.has( 'lon' ) ) {
return;
@@ -233,16 +263,16 @@ function initFromHash() {
// get the position fields
const camera = transition.camera;
- const lat = parseFloat( params.get( 'lat' ) );
- const lon = parseFloat( params.get( 'lon' ) );
- const height = parseFloat( params.get( 'height' ) ) || 1000;
+ const lat = parseFloat( urlParams.get( 'lat' ) );
+ const lon = parseFloat( urlParams.get( 'lon' ) );
+ const height = parseFloat( urlParams.get( 'height' ) ) || 1000;
- if ( params.has( 'az' ) && params.has( 'el' ) ) {
+ if ( urlParams.has( 'az' ) && urlParams.has( 'el' ) ) {
// get the az el fields for rotation if present
- const az = parseFloat( params.get( 'az' ) );
- const el = parseFloat( params.get( 'el' ) );
- const roll = parseFloat( params.get( 'roll' ) ) || 0;
+ const az = parseFloat( urlParams.get( 'az' ) );
+ const el = parseFloat( urlParams.get( 'el' ) );
+ const roll = parseFloat( urlParams.get( 'roll' ) ) || 0;
// extract the east-north-up frame into matrix world
WGS84_ELLIPSOID.getRotationMatrixFromAzElRoll(
@@ -287,6 +317,7 @@ function animate() {
// update tiles
camera.updateMatrixWorld();
+ tiles.errorTarget = params.errorTarget;
tiles.update();
renderer.render( scene, camera );
@@ -299,48 +330,23 @@ function animate() {
function updateHtml() {
// render html text updates
- const cacheFullness = tiles.lruCache.itemList.length / tiles.lruCache.maxSize;
let str = '';
if ( params.enableCacheDisplay ) {
+ const lruCache = tiles.lruCache;
+ const cacheFullness = lruCache.cachedBytes / lruCache.maxBytesSize;
str += `Downloading: ${ tiles.stats.downloading } Parsing: ${ tiles.stats.parsing } Visible: ${ tiles.visibleTiles.size }
`;
-
- const geomSet = new Set();
- tiles.traverse( tile => {
-
- const scene = tile.cached.scene;
- if ( scene ) {
-
- scene.traverse( c => {
-
- if ( c.geometry ) {
-
- geomSet.add( c.geometry );
-
- }
-
- } );
-
- }
-
- } );
-
- let count = 0;
- geomSet.forEach( g => {
-
- count += estimateBytesUsed( g );
-
- } );
- str += `Cache: ${ ( 100 * cacheFullness ).toFixed( 2 ) }% ~${ ( count / 1000 / 1000 ).toFixed( 2 ) }mb
`;
+ str += `Cache: ${ ( 100 * cacheFullness ).toFixed( 2 ) }% ~${ ( lruCache.cachedBytes / 1000 / 1000 ).toFixed( 2 ) }mb
`;
}
if ( params.enableRendererStats ) {
const memory = renderer.info.memory;
+ const render = renderer.info.render;
const programCount = renderer.info.programs.length;
- str += `Geometries: ${ memory.geometries } Textures: ${ memory.textures } Programs: ${ programCount }`;
+ str += `Geometries: ${ memory.geometries } Textures: ${ memory.textures } Programs: ${ programCount } Draw Calls: ${ render.calls }`;
}
diff --git a/example/src/plugins/UpdateOnChangePlugin.js b/example/src/plugins/UpdateOnChangePlugin.js
index e8ba1879..8256512a 100644
--- a/example/src/plugins/UpdateOnChangePlugin.js
+++ b/example/src/plugins/UpdateOnChangePlugin.js
@@ -5,6 +5,7 @@ export class UpdateOnChangePlugin {
constructor() {
+ this.name = 'UPDATE_ON_CHANGE_PLUGIN';
this.tiles = null;
this.needsUpdate = false;
this.cameraMatrices = new Map();
diff --git a/example/src/plugins/batched/ArrayTextureCopyMaterial.js b/example/src/plugins/batched/ArrayTextureCopyMaterial.js
deleted file mode 100644
index c254d9f2..00000000
--- a/example/src/plugins/batched/ArrayTextureCopyMaterial.js
+++ /dev/null
@@ -1,51 +0,0 @@
-import { MeshBasicMaterial } from 'three';
-
-// A MeshBasicMaterial that supports taking a TextureArray and a layer to render
-export class ArrayTextureCopyMaterial extends MeshBasicMaterial {
-
- set layer( v ) {
-
- this._layerUniform.value = v;
-
- }
-
- get layer() {
-
- return this._layerUniform.value;
-
- }
-
- constructor( ...args ) {
-
- super( ...args );
- this._layerUniform = { value: 0 };
-
- }
-
- onBeforeCompile( shader ) {
-
- shader.uniforms.layer = this._layerUniform;
-
- shader.fragmentShader = shader.fragmentShader
- .replace(
- '#include ',
- /* glsl */`
- #ifdef USE_MAP
- precision highp sampler2DArray;
- uniform sampler2DArray map;
- uniform int layer;
- #endif
- `,
- )
- .replace(
- '#include ',
- /* glsl */`
- #ifdef USE_MAP
- diffuseColor *= texture( map, vec3( vMapUv, layer ) );
- #endif
- `
- );
-
- }
-
-}
diff --git a/example/src/plugins/batched/BatchedTilesPlugin.js b/example/src/plugins/batched/BatchedTilesPlugin.js
index c065fbef..9f1f87d5 100644
--- a/example/src/plugins/batched/BatchedTilesPlugin.js
+++ b/example/src/plugins/batched/BatchedTilesPlugin.js
@@ -1,11 +1,9 @@
import { WebGLArrayRenderTarget, MeshBasicMaterial, Group, DataTexture, REVISION } from 'three';
import { FullScreenQuad } from 'three/examples/jsm/postprocessing/Pass.js';
import { ExpandingBatchedMesh } from './ExpandingBatchedMesh.js';
-import { ArrayTextureCopyMaterial } from './ArrayTextureCopyMaterial.js';
import { convertMapToArrayTexture, isColorWhite } from './utilities.js';
const _textureRenderQuad = new FullScreenQuad( new MeshBasicMaterial() );
-const _layerCopyQuad = new FullScreenQuad( new ArrayTextureCopyMaterial() );
const _whiteTex = new DataTexture( new Uint8Array( [ 255, 255, 255, 255 ] ), 1, 1 );
_whiteTex.needsUpdate = true;
@@ -133,11 +131,11 @@ export class BatchedTilesPlugin {
const texture = material.map;
if ( texture ) {
- this.renderTextureToLayer( texture, instanceId );
+ this.assignTextureToLayer( texture, instanceId );
} else {
- this.renderTextureToLayer( _whiteTex, instanceId );
+ this.assignTextureToLayer( _whiteTex, instanceId );
}
@@ -205,7 +203,7 @@ export class BatchedTilesPlugin {
}
// init the batched mesh
- const { instanceCount, vertexCount, indexCount, tiles } = this;
+ const { instanceCount, vertexCount, indexCount, tiles, renderer } = this;
const material = this.material ? this.material : new target.material.constructor();
const batchedMesh = new ExpandingBatchedMesh( instanceCount, instanceCount * vertexCount, instanceCount * indexCount, material );
batchedMesh.name = 'BatchTilesPlugin';
@@ -215,7 +213,7 @@ export class BatchedTilesPlugin {
// init the array texture render target
const map = target.material.map;
- const textureOptions = {
+ const textureOptions = {
colorSpace: map.colorSpace,
wrapS: map.wrapS,
wrapT: map.wrapT,
@@ -223,11 +221,12 @@ export class BatchedTilesPlugin {
// TODO: Generating mipmaps for the volume every time a new texture is added is extremely slow
// generateMipmaps: map.generateMipmaps,
// minFilter: map.minFilter,
- // magFilter: map.magFilter,
+ magFilter: map.magFilter,
};
const arrayTarget = new WebGLArrayRenderTarget( map.image.width, map.image.height, instanceCount );
Object.assign( arrayTarget.texture, textureOptions );
+ renderer.initRenderTarget( arrayTarget );
// init the material
material.map = arrayTarget.texture;
@@ -239,7 +238,7 @@ export class BatchedTilesPlugin {
}
// render the given into the given layer
- renderTextureToLayer( texture, layer ) {
+ assignTextureToLayer( texture, layer ) {
this.expandArrayTargetIfNeeded();
@@ -278,20 +277,9 @@ export class BatchedTilesPlugin {
const newArrayTarget = new WebGLArrayRenderTarget( arrayTarget.width, arrayTarget.height, targetDepth );
Object.assign( newArrayTarget.texture, textureOptions );
- // render each old layer into the new texture target
- const currentRenderTarget = renderer.getRenderTarget();
- for ( let i = 0; i < arrayTarget.depth; i ++ ) {
-
- _layerCopyQuad.material.map = arrayTarget.texture;
- _layerCopyQuad.material.layer = i;
- renderer.setRenderTarget( newArrayTarget, i );
- _layerCopyQuad.render( renderer );
-
- }
-
- // reset the state
- renderer.setRenderTarget( currentRenderTarget );
- _layerCopyQuad.material.map = null;
+ // copy the contents
+ renderer.initRenderTarget( newArrayTarget );
+ renderer.copyTextureToTexture( arrayTarget.texture, newArrayTarget.texture );
// replace the old array target
arrayTarget.dispose();
@@ -324,23 +312,25 @@ export class BatchedTilesPlugin {
dispose() {
- if ( this.arrayTarget ) {
+ const { arrayTarget, tiles, batchedMesh } = this;
+ if ( arrayTarget ) {
- this.arrayTarget.dispose();
+ arrayTarget.dispose();
}
- if ( this.batchedMesh ) {
+ if ( batchedMesh ) {
- this.batchedMesh.material.dispose();
- this.batchedMesh.dispose();
- this.batchedMesh.removeFromParent();
+ batchedMesh.material.dispose();
+ batchedMesh.geometry.dispose();
+ batchedMesh.dispose();
+ batchedMesh.removeFromParent();
}
- this.tiles.removeEventListener( 'load-model', this._onLoadModel );
- this.tiles.removeEventListener( 'dispose-model', this._onDisposeModel );
- this.tiles.removeEventListener( 'tile-visibility-change', this._onVisibilityChange );
+ tiles.removeEventListener( 'load-model', this._onLoadModel );
+ tiles.removeEventListener( 'dispose-model', this._onDisposeModel );
+ tiles.removeEventListener( 'tile-visibility-change', this._onVisibilityChange );
}
diff --git a/example/src/plugins/batched/ExpandingBatchedMesh.js b/example/src/plugins/batched/ExpandingBatchedMesh.js
index d1a62ccb..7e225db0 100644
--- a/example/src/plugins/batched/ExpandingBatchedMesh.js
+++ b/example/src/plugins/batched/ExpandingBatchedMesh.js
@@ -7,19 +7,12 @@ const _batchIntersects = [];
// Implementation of BatchedMesh that automatically expands
export class ExpandingBatchedMesh extends ModelViewBatchedMesh {
- get instanceCount() {
-
- return this._currentInstances;
-
- }
-
constructor( ...args ) {
super( ...args );
this.expandPercent = 0.25;
this.maxInstanceExpansionSize = Infinity;
- this._currentInstances = 0;
// set of available geometry ids that are no longer being used
this._freeGeometryIds = [];
@@ -39,13 +32,13 @@ export class ExpandingBatchedMesh extends ModelViewBatchedMesh {
freeGeometryIds.forEach( ( id, i ) => {
// if indices are not needed then they default to - 1
- const reservedRange = this._reservedRanges[ id ];
- const { indexCount, vertexCount } = reservedRange;
- if ( indexCount >= neededIndexCount && vertexCount >= neededVertexCount ) {
+ const geometryInfo = this.getGeometryRangeAt( id );
+ const { reservedIndexCount, reservedVertexCount } = geometryInfo;
+ if ( reservedIndexCount >= neededIndexCount && reservedVertexCount >= neededVertexCount ) {
// generate score that is a combination of how much unused space a geometry would have if used and pick the
// one with the least amount of unused space.
- const score = ( neededIndexCount - indexCount ) + ( neededVertexCount - vertexCount );
+ const score = ( neededIndexCount - reservedIndexCount ) + ( neededVertexCount - reservedVertexCount );
if ( score < bestScore ) {
bestIndex = i;
@@ -90,12 +83,20 @@ export class ExpandingBatchedMesh extends ModelViewBatchedMesh {
} else {
- try {
+ const needsMoreSpace = () => {
+
+ const vertexNeedsSpace = this.unusedVertexCount < reservedVertexRange;
+ const indexNeedsSpace = this.unusedIndexCount < reservedIndexRange;
+ return vertexNeedsSpace || indexNeedsSpace;
- // try to add the geometry, catching the error if it cannot fit
- resultId = super.addGeometry( geometry, reservedVertexRange, reservedIndexRange );
+ };
- } catch {
+ const index = geometry.index;
+ const position = geometry.attributes.position;
+ reservedVertexRange = Math.max( reservedVertexRange, position.count );
+ reservedIndexRange = Math.max( reservedIndexRange, index ? index.count : 0 );
+
+ if ( needsMoreSpace() ) {
// shift all the unused geometries to try to make space
_freeGeometryIds.forEach( id => this.deleteGeometry( id ) );
@@ -103,31 +104,45 @@ export class ExpandingBatchedMesh extends ModelViewBatchedMesh {
this.optimize();
- try {
-
- // see if we can insert geometry now
- resultId = super.addGeometry( geometry, reservedVertexRange, reservedIndexRange );
-
- } catch {
+ if ( needsMoreSpace() ) {
// lastly try to expand the batched mesh size so the new geometry fits
+
const batchedIndex = this.geometry.index;
const batchedPosition = this.geometry.attributes.position;
- const index = geometry.index;
- const position = geometry.attributes.position;
- const addIndexCount = batchedIndex ? Math.ceil( expandPercent * batchedIndex.count ) : - 1;
- const newIndexCount = batchedIndex ? Math.max( addIndexCount, reservedIndexRange, index.count ) + batchedIndex.count : - 1;
- const addVertexCount = Math.ceil( expandPercent * batchedPosition.count );
- const newVertexCount = Math.max( addVertexCount, reservedVertexRange, position.count ) + batchedPosition.count;
+ // compute the new geometry size to expand to accounting for the case where the geometry is not initialized
+ let newIndexCount, newVertexCount;
+ if ( batchedIndex ) {
+
+ const addIndexCount = Math.ceil( expandPercent * batchedIndex.count );
+ newIndexCount = Math.max( addIndexCount, reservedIndexRange, index.count ) + batchedIndex.count;
+
+ } else {
+
+ newIndexCount = Math.max( this.unusedIndexCount, reservedIndexRange );
+
+ }
+
+ if ( batchedPosition ) {
+
+ const addVertexCount = Math.ceil( expandPercent * batchedPosition.count );
+ newVertexCount = Math.max( addVertexCount, reservedVertexRange, position.count ) + batchedPosition.count;
+
+ } else {
+
+ newVertexCount = Math.max( this.unusedVertexCount, reservedVertexRange );
+
+ }
this.setGeometrySize( newVertexCount, newIndexCount );
- resultId = super.addGeometry( geometry, reservedVertexRange, reservedIndexRange );
}
}
+ resultId = super.addGeometry( geometry, reservedVertexRange, reservedIndexRange );
+
}
return resultId;
@@ -137,14 +152,13 @@ export class ExpandingBatchedMesh extends ModelViewBatchedMesh {
// add an instance and automatically expand the number of instances if necessary
addInstance( geometryId ) {
- if ( this.maxInstanceCount === this._currentInstances ) {
+ if ( this.maxInstanceCount === this.instanceCount ) {
const newCount = Math.ceil( this.maxInstanceCount * ( 1 + this.expandPercent ) );
this.setInstanceCount( Math.min( newCount, this.maxInstanceExpansionSize ) );
}
- this._currentInstances ++;
return super.addInstance( geometryId );
}
@@ -152,15 +166,13 @@ export class ExpandingBatchedMesh extends ModelViewBatchedMesh {
// delete an instance, keeping note that the geometry id is now unused
deleteInstance( instanceId ) {
- if ( this._drawInfo[ instanceId ].active === false ) {
+ const geometryId = this.getGeometryIdAt( instanceId );
+ if ( geometryId !== - 1 ) {
- // TODO: how is this happening?
- return;
+ this._freeGeometryIds.push( geometryId );
}
- this._freeGeometryIds.push( this.getGeometryIdAt( instanceId ) );
- this._currentInstances --;
return super.deleteInstance( instanceId );
}
diff --git a/example/src/plugins/batched/ModelViewBatchedMesh.js b/example/src/plugins/batched/ModelViewBatchedMesh.js
index 48356202..0c379575 100644
--- a/example/src/plugins/batched/ModelViewBatchedMesh.js
+++ b/example/src/plugins/batched/ModelViewBatchedMesh.js
@@ -16,7 +16,6 @@ export class ModelViewBatchedMesh extends BatchedMesh {
}
-
setMatrixAt( ...args ) {
super.setMatrixAt( ...args );
@@ -59,11 +58,9 @@ export class ModelViewBatchedMesh extends BatchedMesh {
if ( this._forceUpdate || vec1.distanceTo( vec2 ) > this.resetDistance ) {
- // TODO: resize and re-instantiate the texture here if the size is different
- const drawInfo = this._drawInfo;
const matricesArray = matricesTexture.image.data;
const modelViewArray = modelViewMatricesTexture.image.data;
- for ( let i = 0; i < drawInfo.length; i ++ ) {
+ for ( let i = 0; i < this.maxInstanceCount; i ++ ) {
matrix
.fromArray( matricesArray, i * 16 )
@@ -101,6 +98,8 @@ export class ModelViewBatchedMesh extends BatchedMesh {
dispose() {
+ super.dispose();
+
if ( this._modelViewMatricesTexture ) {
this._modelViewMatricesTexture.dispose();
diff --git a/package-lock.json b/package-lock.json
index 4d2f064e..2d967271 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -16,6 +16,7 @@
"@types/three": "^0.166.0",
"@typescript-eslint/eslint-plugin": "^7.14.1",
"@typescript-eslint/parser": "^7.14.1",
+ "@vitejs/plugin-react": "^4.3.2",
"babel-jest": "^29.5.0",
"cesium": "^1.97.0",
"concurrently": "^6.2.1",
@@ -26,13 +27,12 @@
"jest": "^27.1.1",
"jest-cli": "^27.1.1",
"leva": "^0.9.35",
- "three": "^0.166.0",
+ "three": "^0.170.0",
"typescript": "^5.1.3",
"vite": "^5.3.1"
},
"optionalDependencies": {
"@react-three/fiber": "^8.17.9",
- "@vitejs/plugin-react": "^4.3.2",
"react": "^18.3.1",
"react-dom": "^18.3.1"
},
@@ -44,7 +44,7 @@
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
"integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
- "devOptional": true,
+ "dev": true,
"dependencies": {
"@jridgewell/gen-mapping": "^0.3.5",
"@jridgewell/trace-mapping": "^0.3.24"
@@ -57,7 +57,7 @@
"version": "7.25.7",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz",
"integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==",
- "devOptional": true,
+ "dev": true,
"dependencies": {
"@babel/highlight": "^7.25.7",
"picocolors": "^1.0.0"
@@ -70,7 +70,7 @@
"version": "7.25.8",
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.8.tgz",
"integrity": "sha512-ZsysZyXY4Tlx+Q53XdnOFmqwfB9QDTHYxaZYajWRoBLuLEAwI2UIbtxOjWh/cFaa9IKUlcB+DDuoskLuKu56JA==",
- "devOptional": true,
+ "dev": true,
"engines": {
"node": ">=6.9.0"
}
@@ -79,7 +79,7 @@
"version": "7.25.8",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.8.tgz",
"integrity": "sha512-Oixnb+DzmRT30qu9d3tJSQkxuygWm32DFykT4bRoORPa9hZ/L4KhVB/XiRm6KG+roIEM7DBQlmg27kw2HZkdZg==",
- "devOptional": true,
+ "dev": true,
"dependencies": {
"@ampproject/remapping": "^2.2.0",
"@babel/code-frame": "^7.25.7",
@@ -109,7 +109,7 @@
"version": "7.25.7",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz",
"integrity": "sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==",
- "devOptional": true,
+ "dev": true,
"dependencies": {
"@babel/types": "^7.25.7",
"@jridgewell/gen-mapping": "^0.3.5",
@@ -149,7 +149,7 @@
"version": "7.25.7",
"resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz",
"integrity": "sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==",
- "devOptional": true,
+ "dev": true,
"dependencies": {
"@babel/compat-data": "^7.25.7",
"@babel/helper-validator-option": "^7.25.7",
@@ -232,7 +232,7 @@
"version": "7.25.7",
"resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz",
"integrity": "sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==",
- "devOptional": true,
+ "dev": true,
"dependencies": {
"@babel/traverse": "^7.25.7",
"@babel/types": "^7.25.7"
@@ -245,7 +245,7 @@
"version": "7.25.7",
"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz",
"integrity": "sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==",
- "devOptional": true,
+ "dev": true,
"dependencies": {
"@babel/helper-module-imports": "^7.25.7",
"@babel/helper-simple-access": "^7.25.7",
@@ -275,7 +275,7 @@
"version": "7.25.7",
"resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz",
"integrity": "sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==",
- "devOptional": true,
+ "dev": true,
"engines": {
"node": ">=6.9.0"
}
@@ -318,7 +318,7 @@
"version": "7.25.7",
"resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz",
"integrity": "sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==",
- "devOptional": true,
+ "dev": true,
"dependencies": {
"@babel/traverse": "^7.25.7",
"@babel/types": "^7.25.7"
@@ -344,7 +344,7 @@
"version": "7.25.7",
"resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz",
"integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==",
- "devOptional": true,
+ "dev": true,
"engines": {
"node": ">=6.9.0"
}
@@ -353,7 +353,7 @@
"version": "7.25.7",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz",
"integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==",
- "devOptional": true,
+ "dev": true,
"engines": {
"node": ">=6.9.0"
}
@@ -362,7 +362,7 @@
"version": "7.25.7",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz",
"integrity": "sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==",
- "devOptional": true,
+ "dev": true,
"engines": {
"node": ">=6.9.0"
}
@@ -385,7 +385,7 @@
"version": "7.25.7",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.7.tgz",
"integrity": "sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==",
- "devOptional": true,
+ "dev": true,
"dependencies": {
"@babel/template": "^7.25.7",
"@babel/types": "^7.25.7"
@@ -398,7 +398,7 @@
"version": "7.25.7",
"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz",
"integrity": "sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==",
- "devOptional": true,
+ "dev": true,
"dependencies": {
"@babel/helper-validator-identifier": "^7.25.7",
"chalk": "^2.4.2",
@@ -413,7 +413,7 @@
"version": "7.25.8",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.8.tgz",
"integrity": "sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==",
- "devOptional": true,
+ "dev": true,
"dependencies": {
"@babel/types": "^7.25.8"
},
@@ -1360,7 +1360,7 @@
"version": "7.25.7",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.7.tgz",
"integrity": "sha512-JD9MUnLbPL0WdVK8AWC7F7tTG2OS6u/AKKnsK+NdRhUiVdnzyR1S3kKQCaRLOiaULvUiqK6Z4JQE635VgtCFeg==",
- "optional": true,
+ "dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.25.7"
},
@@ -1375,7 +1375,7 @@
"version": "7.25.7",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.7.tgz",
"integrity": "sha512-S/JXG/KrbIY06iyJPKfxr0qRxnhNOdkNXYBl/rmwgDd72cQLH9tEGkDm/yJPGvcSIUoikzfjMios9i+xT/uv9w==",
- "optional": true,
+ "dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.25.7"
},
@@ -1668,7 +1668,7 @@
"version": "7.25.7",
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz",
"integrity": "sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==",
- "devOptional": true,
+ "dev": true,
"dependencies": {
"@babel/code-frame": "^7.25.7",
"@babel/parser": "^7.25.7",
@@ -1682,7 +1682,7 @@
"version": "7.25.7",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz",
"integrity": "sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==",
- "devOptional": true,
+ "dev": true,
"dependencies": {
"@babel/code-frame": "^7.25.7",
"@babel/generator": "^7.25.7",
@@ -1700,7 +1700,7 @@
"version": "7.25.8",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.8.tgz",
"integrity": "sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==",
- "devOptional": true,
+ "dev": true,
"dependencies": {
"@babel/helper-string-parser": "^7.25.7",
"@babel/helper-validator-identifier": "^7.25.7",
@@ -1778,6 +1778,7 @@
"cpu": [
"ppc64"
],
+ "dev": true,
"optional": true,
"os": [
"aix"
@@ -1793,6 +1794,7 @@
"cpu": [
"arm"
],
+ "dev": true,
"optional": true,
"os": [
"android"
@@ -1808,6 +1810,7 @@
"cpu": [
"arm64"
],
+ "dev": true,
"optional": true,
"os": [
"android"
@@ -1823,6 +1826,7 @@
"cpu": [
"x64"
],
+ "dev": true,
"optional": true,
"os": [
"android"
@@ -1838,6 +1842,7 @@
"cpu": [
"arm64"
],
+ "dev": true,
"optional": true,
"os": [
"darwin"
@@ -1853,6 +1858,7 @@
"cpu": [
"x64"
],
+ "dev": true,
"optional": true,
"os": [
"darwin"
@@ -1868,6 +1874,7 @@
"cpu": [
"arm64"
],
+ "dev": true,
"optional": true,
"os": [
"freebsd"
@@ -1883,6 +1890,7 @@
"cpu": [
"x64"
],
+ "dev": true,
"optional": true,
"os": [
"freebsd"
@@ -1898,6 +1906,7 @@
"cpu": [
"arm"
],
+ "dev": true,
"optional": true,
"os": [
"linux"
@@ -1913,6 +1922,7 @@
"cpu": [
"arm64"
],
+ "dev": true,
"optional": true,
"os": [
"linux"
@@ -1928,6 +1938,7 @@
"cpu": [
"ia32"
],
+ "dev": true,
"optional": true,
"os": [
"linux"
@@ -1943,6 +1954,7 @@
"cpu": [
"loong64"
],
+ "dev": true,
"optional": true,
"os": [
"linux"
@@ -1958,6 +1970,7 @@
"cpu": [
"mips64el"
],
+ "dev": true,
"optional": true,
"os": [
"linux"
@@ -1973,6 +1986,7 @@
"cpu": [
"ppc64"
],
+ "dev": true,
"optional": true,
"os": [
"linux"
@@ -1988,6 +2002,7 @@
"cpu": [
"riscv64"
],
+ "dev": true,
"optional": true,
"os": [
"linux"
@@ -2003,6 +2018,7 @@
"cpu": [
"s390x"
],
+ "dev": true,
"optional": true,
"os": [
"linux"
@@ -2018,6 +2034,7 @@
"cpu": [
"x64"
],
+ "dev": true,
"optional": true,
"os": [
"linux"
@@ -2033,6 +2050,7 @@
"cpu": [
"x64"
],
+ "dev": true,
"optional": true,
"os": [
"netbsd"
@@ -2048,6 +2066,7 @@
"cpu": [
"x64"
],
+ "dev": true,
"optional": true,
"os": [
"openbsd"
@@ -2063,6 +2082,7 @@
"cpu": [
"x64"
],
+ "dev": true,
"optional": true,
"os": [
"sunos"
@@ -2078,6 +2098,7 @@
"cpu": [
"arm64"
],
+ "dev": true,
"optional": true,
"os": [
"win32"
@@ -2093,6 +2114,7 @@
"cpu": [
"ia32"
],
+ "dev": true,
"optional": true,
"os": [
"win32"
@@ -2108,6 +2130,7 @@
"cpu": [
"x64"
],
+ "dev": true,
"optional": true,
"os": [
"win32"
@@ -3807,7 +3830,7 @@
"version": "0.3.5",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
"integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
- "devOptional": true,
+ "dev": true,
"dependencies": {
"@jridgewell/set-array": "^1.2.1",
"@jridgewell/sourcemap-codec": "^1.4.10",
@@ -3821,7 +3844,7 @@
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
"integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
- "devOptional": true,
+ "dev": true,
"engines": {
"node": ">=6.0.0"
}
@@ -3830,7 +3853,7 @@
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
"integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
- "devOptional": true,
+ "dev": true,
"engines": {
"node": ">=6.0.0"
}
@@ -3839,13 +3862,13 @@
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
"integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
- "devOptional": true
+ "dev": true
},
"node_modules/@jridgewell/trace-mapping": {
"version": "0.3.25",
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
"integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
- "devOptional": true,
+ "dev": true,
"dependencies": {
"@jridgewell/resolve-uri": "^3.1.0",
"@jridgewell/sourcemap-codec": "^1.4.14"
@@ -4546,6 +4569,7 @@
"cpu": [
"arm"
],
+ "dev": true,
"optional": true,
"os": [
"android"
@@ -4558,6 +4582,7 @@
"cpu": [
"arm64"
],
+ "dev": true,
"optional": true,
"os": [
"android"
@@ -4570,6 +4595,7 @@
"cpu": [
"arm64"
],
+ "dev": true,
"optional": true,
"os": [
"darwin"
@@ -4582,6 +4608,7 @@
"cpu": [
"x64"
],
+ "dev": true,
"optional": true,
"os": [
"darwin"
@@ -4594,6 +4621,7 @@
"cpu": [
"arm"
],
+ "dev": true,
"optional": true,
"os": [
"linux"
@@ -4606,6 +4634,7 @@
"cpu": [
"arm"
],
+ "dev": true,
"optional": true,
"os": [
"linux"
@@ -4618,6 +4647,7 @@
"cpu": [
"arm64"
],
+ "dev": true,
"optional": true,
"os": [
"linux"
@@ -4630,6 +4660,7 @@
"cpu": [
"arm64"
],
+ "dev": true,
"optional": true,
"os": [
"linux"
@@ -4642,6 +4673,7 @@
"cpu": [
"ppc64"
],
+ "dev": true,
"optional": true,
"os": [
"linux"
@@ -4654,6 +4686,7 @@
"cpu": [
"riscv64"
],
+ "dev": true,
"optional": true,
"os": [
"linux"
@@ -4666,6 +4699,7 @@
"cpu": [
"s390x"
],
+ "dev": true,
"optional": true,
"os": [
"linux"
@@ -4678,6 +4712,7 @@
"cpu": [
"x64"
],
+ "dev": true,
"optional": true,
"os": [
"linux"
@@ -4690,6 +4725,7 @@
"cpu": [
"x64"
],
+ "dev": true,
"optional": true,
"os": [
"linux"
@@ -4702,6 +4738,7 @@
"cpu": [
"arm64"
],
+ "dev": true,
"optional": true,
"os": [
"win32"
@@ -4714,6 +4751,7 @@
"cpu": [
"ia32"
],
+ "dev": true,
"optional": true,
"os": [
"win32"
@@ -4726,6 +4764,7 @@
"cpu": [
"x64"
],
+ "dev": true,
"optional": true,
"os": [
"win32"
@@ -4783,7 +4822,7 @@
"version": "7.20.5",
"resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
"integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
- "devOptional": true,
+ "dev": true,
"dependencies": {
"@babel/parser": "^7.20.7",
"@babel/types": "^7.20.7",
@@ -4796,7 +4835,7 @@
"version": "7.6.8",
"resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz",
"integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==",
- "devOptional": true,
+ "dev": true,
"dependencies": {
"@babel/types": "^7.0.0"
}
@@ -4805,7 +4844,7 @@
"version": "7.4.4",
"resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
"integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
- "devOptional": true,
+ "dev": true,
"dependencies": {
"@babel/parser": "^7.1.0",
"@babel/types": "^7.0.0"
@@ -4815,7 +4854,7 @@
"version": "7.20.6",
"resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz",
"integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==",
- "devOptional": true,
+ "dev": true,
"dependencies": {
"@babel/types": "^7.20.7"
}
@@ -4846,7 +4885,7 @@
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
"integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
- "devOptional": true
+ "dev": true
},
"node_modules/@types/graceful-fs": {
"version": "4.1.9",
@@ -4891,7 +4930,7 @@
"version": "22.7.5",
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz",
"integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==",
- "devOptional": true,
+ "dev": true,
"dependencies": {
"undici-types": "~6.19.2"
}
@@ -5205,7 +5244,7 @@
"version": "4.3.2",
"resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.2.tgz",
"integrity": "sha512-hieu+o05v4glEBucTcKMK3dlES0OeJlD9YVOAPraVMOInBCwzumaIFiUjr4bHK7NPgnAHgiskUoceKercrN8vg==",
- "optional": true,
+ "dev": true,
"dependencies": {
"@babel/core": "^7.25.2",
"@babel/plugin-transform-react-jsx-self": "^7.24.7",
@@ -5348,7 +5387,7 @@
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "devOptional": true,
+ "dev": true,
"dependencies": {
"color-convert": "^1.9.0"
},
@@ -5840,7 +5879,7 @@
"version": "4.24.0",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz",
"integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==",
- "devOptional": true,
+ "dev": true,
"funding": [
{
"type": "opencollective",
@@ -5957,7 +5996,7 @@
"version": "1.0.30001667",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001667.tgz",
"integrity": "sha512-7LTwJjcRkzKFmtqGsibMeuXmvFDfZq/nzIjnmgCGzKKRVzjD72selLDK1oPF/Oxzmt4fNcPvTDvGqSDG4tCALw==",
- "devOptional": true,
+ "dev": true,
"funding": [
{
"type": "opencollective",
@@ -5990,7 +6029,7 @@
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "devOptional": true,
+ "dev": true,
"dependencies": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
@@ -6061,7 +6100,7 @@
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "devOptional": true,
+ "dev": true,
"dependencies": {
"color-name": "1.1.3"
}
@@ -6070,7 +6109,7 @@
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "devOptional": true
+ "dev": true
},
"node_modules/colord": {
"version": "2.9.3",
@@ -6213,7 +6252,7 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
"integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
- "devOptional": true
+ "dev": true
},
"node_modules/core-js-compat": {
"version": "3.38.1",
@@ -6381,7 +6420,7 @@
"version": "4.3.7",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
"integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
- "devOptional": true,
+ "dev": true,
"dependencies": {
"ms": "^2.1.3"
},
@@ -6570,7 +6609,7 @@
"version": "1.5.35",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.35.tgz",
"integrity": "sha512-hOSRInrIDm0Brzp4IHW2F/VM+638qOL2CzE0DgpnGzKW27C95IqqeqgKz/hxHGnvPxvQGpHUGD5qRVC9EZY2+A==",
- "devOptional": true
+ "dev": true
},
"node_modules/emittery": {
"version": "0.8.1",
@@ -6761,7 +6800,7 @@
"version": "0.21.5",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
"integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
- "devOptional": true,
+ "dev": true,
"hasInstallScript": true,
"bin": {
"esbuild": "bin/esbuild"
@@ -6799,7 +6838,7 @@
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
"integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
- "devOptional": true,
+ "dev": true,
"engines": {
"node": ">=6"
}
@@ -6808,7 +6847,7 @@
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "devOptional": true,
+ "dev": true,
"engines": {
"node": ">=0.8.0"
}
@@ -7697,6 +7736,7 @@
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
"integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
"hasInstallScript": true,
"optional": true,
"os": [
@@ -7746,7 +7786,7 @@
"version": "1.0.0-beta.2",
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
"integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
- "devOptional": true,
+ "dev": true,
"engines": {
"node": ">=6.9.0"
}
@@ -7886,7 +7926,7 @@
"version": "11.12.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
"integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
- "devOptional": true,
+ "dev": true,
"engines": {
"node": ">=4"
}
@@ -7976,7 +8016,7 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "devOptional": true,
+ "dev": true,
"engines": {
"node": ">=4"
}
@@ -12002,7 +12042,7 @@
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
"integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==",
- "devOptional": true,
+ "dev": true,
"bin": {
"jsesc": "bin/jsesc"
},
@@ -12041,7 +12081,7 @@
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
"integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
- "devOptional": true,
+ "dev": true,
"bin": {
"json5": "lib/cli.js"
},
@@ -12215,7 +12255,7 @@
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
"integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
- "devOptional": true,
+ "dev": true,
"dependencies": {
"yallist": "^3.0.2"
}
@@ -12392,13 +12432,13 @@
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "devOptional": true
+ "dev": true
},
"node_modules/nanoid": {
"version": "3.3.7",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
"integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
- "devOptional": true,
+ "dev": true,
"funding": [
{
"type": "github",
@@ -12428,7 +12468,7 @@
"version": "2.0.18",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz",
"integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==",
- "devOptional": true
+ "dev": true
},
"node_modules/normalize-path": {
"version": "3.0.0",
@@ -12727,7 +12767,7 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz",
"integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==",
- "devOptional": true
+ "dev": true
},
"node_modules/picomatch": {
"version": "2.3.1",
@@ -12775,7 +12815,7 @@
"version": "8.4.47",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz",
"integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==",
- "devOptional": true,
+ "dev": true,
"funding": [
{
"type": "opencollective",
@@ -13060,7 +13100,7 @@
"version": "0.14.2",
"resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz",
"integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==",
- "optional": true,
+ "dev": true,
"engines": {
"node": ">=0.10.0"
}
@@ -13273,7 +13313,7 @@
"version": "4.24.0",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.0.tgz",
"integrity": "sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==",
- "devOptional": true,
+ "dev": true,
"dependencies": {
"@types/estree": "1.0.6"
},
@@ -13411,7 +13451,7 @@
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "devOptional": true,
+ "dev": true,
"bin": {
"semver": "bin/semver.js"
}
@@ -13545,7 +13585,7 @@
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
"integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
- "devOptional": true,
+ "dev": true,
"engines": {
"node": ">=0.10.0"
}
@@ -13804,7 +13844,7 @@
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "devOptional": true,
+ "dev": true,
"dependencies": {
"has-flag": "^3.0.0"
},
@@ -13933,9 +13973,9 @@
"peer": true
},
"node_modules/three": {
- "version": "0.166.1",
- "resolved": "https://registry.npmjs.org/three/-/three-0.166.1.tgz",
- "integrity": "sha512-LtuafkKHHzm61AQA1be2MAYIw1IjmhOUxhBa0prrLpEMWbV7ijvxCRHjSgHPGp2493wLBzwKV46tA9nivLEgKg==",
+ "version": "0.170.0",
+ "resolved": "https://registry.npmjs.org/three/-/three-0.170.0.tgz",
+ "integrity": "sha512-FQK+LEpYc0fBD+J8g6oSEyyNzjp+Q7Ks1C568WWaoMRLW+TkNNWmenWeGgJjV105Gd+p/2ql1ZcjYvNiPZBhuQ==",
"devOptional": true
},
"node_modules/three-mesh-bvh": {
@@ -13987,7 +14027,7 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
"integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
- "devOptional": true,
+ "dev": true,
"engines": {
"node": ">=4"
}
@@ -14287,7 +14327,7 @@
"version": "6.19.8",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz",
"integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==",
- "devOptional": true
+ "dev": true
},
"node_modules/unicode-canonical-property-names-ecmascript": {
"version": "2.0.1",
@@ -14342,7 +14382,7 @@
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz",
"integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==",
- "devOptional": true,
+ "dev": true,
"funding": [
{
"type": "opencollective",
@@ -14464,7 +14504,7 @@
"version": "5.4.8",
"resolved": "https://registry.npmjs.org/vite/-/vite-5.4.8.tgz",
"integrity": "sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==",
- "devOptional": true,
+ "dev": true,
"dependencies": {
"esbuild": "^0.21.3",
"postcss": "^8.4.43",
@@ -14819,7 +14859,7 @@
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
- "devOptional": true
+ "dev": true
},
"node_modules/yargs": {
"version": "16.2.0",
diff --git a/package.json b/package.json
index 5a84626f..113a96b3 100644
--- a/package.json
+++ b/package.json
@@ -49,6 +49,7 @@
"@types/three": "^0.166.0",
"@typescript-eslint/eslint-plugin": "^7.14.1",
"@typescript-eslint/parser": "^7.14.1",
+ "@vitejs/plugin-react": "^4.3.2",
"babel-jest": "^29.5.0",
"cesium": "^1.97.0",
"concurrently": "^6.2.1",
@@ -59,7 +60,7 @@
"jest": "^27.1.1",
"jest-cli": "^27.1.1",
"leva": "^0.9.35",
- "three": "^0.166.0",
+ "three": "^0.170.0",
"typescript": "^5.1.3",
"vite": "^5.3.1"
},
@@ -68,7 +69,6 @@
},
"optionalDependencies": {
"@react-three/fiber": "^8.17.9",
- "@vitejs/plugin-react": "^4.3.2",
"react": "^18.3.1",
"react-dom": "^18.3.1"
}
diff --git a/src/r3f/components/TilesRenderer.jsx b/src/r3f/components/TilesRenderer.jsx
index e6d9b67d..8e9b5b9e 100644
--- a/src/r3f/components/TilesRenderer.jsx
+++ b/src/r3f/components/TilesRenderer.jsx
@@ -22,7 +22,6 @@ function TileSetRoot( { children } ) {
}
-
}, [ tiles ] );
return { children };