itowns 2.42.1-next.2 → 2.42.1-next.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/debug.js +1 -1
- package/dist/debug.js.map +1 -1
- package/dist/itowns.js +1 -1
- package/dist/itowns.js.map +1 -1
- package/dist/itowns_widgets.js +1 -1
- package/dist/itowns_widgets.js.map +1 -1
- package/examples/{.eslintrc.js → .eslintrc.cjs} +1 -1
- package/examples/effects_stereo.html +2 -2
- package/examples/entwine_simple_loader.html +24 -8
- package/examples/misc_collada.html +2 -2
- package/examples/misc_instancing.html +1 -1
- package/examples/source_file_gpx_3d.html +2 -2
- package/examples/source_stream_wfs_25d.html +11 -11
- package/examples/source_stream_wfs_3d.html +1 -1
- package/examples/vector_tile_3d_mesh.html +2 -2
- package/examples/vector_tile_raster_2d.html +1 -1
- package/examples/vector_tile_raster_3d.html +1 -1
- package/examples/view_25d_map.html +2 -2
- package/examples/view_3d_map.html +3 -3
- package/examples/view_3d_map_webxr.html +1 -1
- package/examples/view_3d_mns_map.html +3 -3
- package/examples/view_immersive.html +1 -1
- package/examples/view_multi_25d.html +2 -2
- package/examples/widgets_minimap.html +1 -1
- package/examples/widgets_searchbar.html +2 -2
- package/lib/Controls/FirstPersonControls.js +5 -12
- package/lib/Controls/FlyControls.js +4 -13
- package/lib/Controls/GlobeControls.js +33 -43
- package/lib/Controls/PlanarControls.js +9 -20
- package/lib/Controls/StateControl.js +2 -11
- package/lib/Controls/StreetControls.js +14 -24
- package/lib/Converter/Feature2Mesh.js +77 -70
- package/lib/Converter/Feature2Texture.js +15 -25
- package/lib/Converter/convertToTile.js +16 -26
- package/lib/Converter/textureConverter.js +9 -19
- package/lib/Core/3DTiles/C3DTBatchTable.js +5 -13
- package/lib/Core/3DTiles/C3DTBatchTableHierarchyExtension.js +1 -8
- package/lib/Core/3DTiles/C3DTBoundingVolume.js +17 -27
- package/lib/Core/3DTiles/C3DTExtensions.js +1 -8
- package/lib/Core/3DTiles/C3DTFeature.js +3 -10
- package/lib/Core/3DTiles/C3DTilesEnums.js +3 -11
- package/lib/Core/3DTiles/C3DTileset.js +7 -16
- package/lib/Core/3DTiles/utils/BinaryPropertyAccessor.js +5 -11
- package/lib/Core/AnimationPlayer.js +2 -11
- package/lib/Core/Deprecated/Undeprecator.js +9 -20
- package/lib/Core/EntwinePointTileNode.js +6 -16
- package/lib/Core/Feature.js +16 -30
- package/lib/Core/Geographic/CoordStars.js +3 -12
- package/lib/Core/Geographic/Coordinates.js +12 -22
- package/lib/Core/Geographic/Crs.js +7 -15
- package/lib/Core/Geographic/Extent.js +36 -47
- package/lib/Core/Geographic/GeoidGrid.js +6 -16
- package/lib/Core/Label.js +7 -17
- package/lib/Core/MainLoop.js +7 -16
- package/lib/Core/Math/Ellipsoid.js +6 -17
- package/lib/Core/Picking.js +10 -20
- package/lib/Core/PointCloudNode.js +2 -11
- package/lib/Core/PotreeNode.js +4 -13
- package/lib/Core/Prefab/Globe/Atmosphere.js +17 -26
- package/lib/Core/Prefab/Globe/BuilderEllipsoidTile.js +6 -16
- package/lib/Core/Prefab/Globe/GlobeLayer.js +19 -28
- package/lib/Core/Prefab/Globe/SkyShader.js +2 -11
- package/lib/Core/Prefab/GlobeView.js +27 -45
- package/lib/Core/Prefab/Planar/PlanarLayer.js +11 -20
- package/lib/Core/Prefab/Planar/PlanarTileBuilder.js +6 -16
- package/lib/Core/Prefab/PlanarView.js +10 -25
- package/lib/Core/Prefab/TileBuilder.js +13 -22
- package/lib/Core/Prefab/computeBufferTileGeometry.js +12 -16
- package/lib/Core/Scheduler/Cache.js +2 -10
- package/lib/Core/Scheduler/CancelledCommandException.js +1 -8
- package/lib/Core/Scheduler/Scheduler.js +15 -23
- package/lib/Core/Style.js +26 -40
- package/lib/Core/System/Capabilities.js +2 -13
- package/lib/Core/TileGeometry.js +13 -15
- package/lib/Core/TileMesh.js +6 -15
- package/lib/Core/View.js +43 -58
- package/lib/Layer/C3DTilesLayer.js +29 -41
- package/lib/Layer/ColorLayer.js +10 -16
- package/lib/Layer/ElevationLayer.js +7 -14
- package/lib/Layer/EntwinePointTileLayer.js +11 -18
- package/lib/Layer/FeatureGeometryLayer.js +9 -16
- package/lib/Layer/GeoidLayer.js +6 -15
- package/lib/Layer/GeometryLayer.js +11 -17
- package/lib/Layer/InfoLayer.js +5 -14
- package/lib/Layer/LabelLayer.js +22 -32
- package/lib/Layer/Layer.js +16 -26
- package/lib/Layer/LayerUpdateState.js +1 -8
- package/lib/Layer/LayerUpdateStrategy.js +7 -18
- package/lib/Layer/OrientedImageLayer.js +15 -25
- package/lib/Layer/PointCloudLayer.js +27 -24
- package/lib/Layer/PotreeLayer.js +8 -18
- package/lib/Layer/RasterLayer.js +9 -17
- package/lib/Layer/ReferencingLayerProperties.js +1 -8
- package/lib/Layer/TiledGeometryLayer.js +37 -33
- package/lib/Main.js +86 -707
- package/lib/MainBundle.js +4 -34
- package/lib/Parser/B3dmParser.js +80 -131
- package/lib/Parser/CameraCalibrationParser.js +5 -14
- package/lib/Parser/GDFParser.js +11 -22
- package/lib/Parser/GLTFParser.js +88 -0
- package/lib/Parser/GTXParser.js +9 -21
- package/lib/Parser/GeoJsonParser.js +14 -22
- package/lib/Parser/GpxParser.js +7 -14
- package/lib/Parser/ISGParser.js +19 -28
- package/lib/Parser/KMLParser.js +7 -14
- package/lib/Parser/LASLoader.js +31 -21
- package/lib/Parser/LASParser.js +10 -17
- package/lib/Parser/MapBoxUrlParser.js +2 -9
- package/lib/Parser/PntsParser.js +4 -14
- package/lib/Parser/PotreeBinParser.js +8 -16
- package/lib/Parser/PotreeCinParser.js +3 -12
- package/lib/Parser/ShapefileParser.js +11 -18
- package/lib/Parser/VectorTileParser.js +23 -31
- package/lib/Parser/XbilParser.js +5 -13
- package/lib/Parser/deprecated/LegacyGLTFLoader.js +2 -12
- package/lib/Process/3dTilesProcessing.js +14 -27
- package/lib/Process/FeatureProcessing.js +14 -22
- package/lib/Process/LayeredMaterialNodeProcessing.js +19 -28
- package/lib/Process/ObjectRemovalHelper.js +2 -9
- package/lib/Process/handlerNodeError.js +1 -7
- package/lib/Provider/3dTilesProvider.js +32 -29
- package/lib/Provider/DataSourceProvider.js +2 -9
- package/lib/Provider/Fetcher.js +40 -22
- package/lib/Provider/PointCloudProvider.js +7 -19
- package/lib/Provider/TileProvider.js +4 -12
- package/lib/Provider/URLBuilder.js +4 -12
- package/lib/Renderer/Camera.js +7 -17
- package/lib/Renderer/Color.js +3 -11
- package/lib/Renderer/ColorLayersOrdering.js +14 -22
- package/lib/Renderer/CommonMaterial.js +3 -12
- package/lib/Renderer/Label2DRenderer.js +5 -16
- package/lib/Renderer/LayeredMaterial.js +33 -53
- package/lib/Renderer/OBB.js +12 -21
- package/lib/Renderer/OrientedImageCamera.js +2 -11
- package/lib/Renderer/OrientedImageMaterial.js +17 -35
- package/lib/Renderer/PointsMaterial.js +224 -94
- package/lib/Renderer/RasterTile.js +18 -30
- package/lib/Renderer/RenderMode.js +2 -9
- package/lib/Renderer/Shader/ShaderChunk.js +5 -23
- package/lib/Renderer/Shader/ShaderUtils.js +2 -9
- package/lib/Renderer/SphereHelper.js +2 -11
- package/lib/Renderer/WebXR.js +2 -11
- package/lib/Renderer/c3DEngine.js +20 -53
- package/lib/Source/C3DTilesGoogleSource.js +76 -0
- package/lib/Source/C3DTilesIonSource.js +6 -13
- package/lib/Source/C3DTilesSource.js +5 -12
- package/lib/Source/EntwinePointTileSource.js +12 -19
- package/lib/Source/FileSource.js +7 -14
- package/lib/Source/OrientedImageSource.js +6 -14
- package/lib/Source/PotreeSource.js +9 -16
- package/lib/Source/Source.js +26 -39
- package/lib/Source/TMSSource.js +11 -22
- package/lib/Source/VectorTilesSource.js +75 -34
- package/lib/Source/WFSSource.js +7 -14
- package/lib/Source/WMSSource.js +5 -12
- package/lib/Source/WMTSSource.js +3 -10
- package/lib/ThreeExtended/capabilities/WebGL.js +1 -8
- package/lib/ThreeExtended/libs/ktx-parse.module.js +2 -256
- package/lib/ThreeExtended/libs/zstddec.module.js +2 -8
- package/lib/ThreeExtended/loaders/DDSLoader.js +10 -16
- package/lib/ThreeExtended/loaders/DRACOLoader.js +14 -19
- package/lib/ThreeExtended/loaders/GLTFLoader.js +124 -129
- package/lib/ThreeExtended/loaders/KTX2Loader.js +73 -78
- package/lib/ThreeExtended/utils/BufferGeometryUtils.js +40 -59
- package/lib/ThreeExtended/utils/WorkerPool.js +2 -9
- package/lib/Utils/CameraUtils.js +32 -44
- package/lib/Utils/DEMUtils.js +8 -19
- package/lib/Utils/FeaturesUtils.js +8 -16
- package/lib/Utils/Gradients.js +16 -0
- package/lib/Utils/OrientationUtils.js +8 -18
- package/lib/Utils/ThreeUtils.js +2 -9
- package/lib/Utils/gui/C3DTilesStyle.js +7 -15
- package/lib/Utils/gui/Main.js +7 -48
- package/lib/Utils/gui/Minimap.js +12 -20
- package/lib/Utils/gui/Navigation.js +6 -14
- package/lib/Utils/gui/Scale.js +11 -19
- package/lib/Utils/gui/Searchbar.js +5 -13
- package/lib/Utils/gui/Widget.js +1 -8
- package/lib/Utils/placeObjectOnGround.js +13 -23
- package/package.json +13 -8
|
@@ -175,7 +175,7 @@
|
|
|
175
175
|
view.addFrameRequester(itowns.MAIN_LOOP_EVENTS.BEFORE_RENDER, scaler);
|
|
176
176
|
|
|
177
177
|
var wfsBuildingSource = new itowns.WFSSource({
|
|
178
|
-
url: 'https://
|
|
178
|
+
url: 'https://data.geopf.fr/wfs/ows?',
|
|
179
179
|
version: '2.0.0',
|
|
180
180
|
typeName: 'BDTOPO_V3:batiment',
|
|
181
181
|
crs: 'EPSG:4326',
|
|
@@ -75,7 +75,7 @@
|
|
|
75
75
|
|
|
76
76
|
// Define the source of the ColorLayer data : a vector tiled map from the geoportail.
|
|
77
77
|
const mapSource = new itowns.VectorTilesSource({
|
|
78
|
-
style:
|
|
78
|
+
style: "https://data.geopf.fr/annexes/ressources/vectorTiles/styles/PLAN.IGN/standard.json",
|
|
79
79
|
// We don't display mountains and parcels related data to ease visualisation. Also, we don't display
|
|
80
80
|
// buildings related data as it will be displayed in another Layer.
|
|
81
81
|
filter: (layer) => {
|
|
@@ -110,7 +110,7 @@
|
|
|
110
110
|
|
|
111
111
|
// Define the source of the building data : those are vector tiled data from the geoportail.
|
|
112
112
|
const buildingsSource = new itowns.VectorTilesSource({
|
|
113
|
-
style:
|
|
113
|
+
style: "https://data.geopf.fr/annexes/ressources/vectorTiles/styles/PLAN.IGN/standard.json",
|
|
114
114
|
// We only want to display buildings related data.
|
|
115
115
|
filter: (layer) => {
|
|
116
116
|
return layer['source-layer'].includes('bati_surf')
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
|
|
49
49
|
// Defines a VectorTilesSource to load Vector Tiles data from the geoportail
|
|
50
50
|
var mvtSource = new itowns.VectorTilesSource({
|
|
51
|
-
style:
|
|
51
|
+
style: "https://data.geopf.fr/annexes/ressources/vectorTiles/styles/PLAN.IGN/standard.json",
|
|
52
52
|
// We don't display mountains related data to ease visualisation
|
|
53
53
|
filter: (layer) => !layer['source-layer'].includes('oro_') && !layer['source-layer'].includes('parcellaire'),
|
|
54
54
|
});
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
|
|
50
50
|
// Define a VectorTilesSource to load Vector Tiles data from the geoportail
|
|
51
51
|
var mvtSource = new itowns.VectorTilesSource({
|
|
52
|
-
style:
|
|
52
|
+
style: "https://data.geopf.fr/annexes/ressources/vectorTiles/styles/PLAN.IGN/standard.json",
|
|
53
53
|
// We don't display mountains related data to ease visualisation
|
|
54
54
|
filter: (layer) => !layer['source-layer'].includes('oro_') && !layer['source-layer'].includes('parcellaire'),
|
|
55
55
|
});
|
|
@@ -98,9 +98,9 @@
|
|
|
98
98
|
view.addLayer(wmsElevationLayer);
|
|
99
99
|
|
|
100
100
|
var wfsCartoSource = new itowns.WFSSource({
|
|
101
|
-
url: 'https://
|
|
101
|
+
url: 'https://data.geopf.fr/wfs/ows?',
|
|
102
102
|
version: '2.0.0',
|
|
103
|
-
typeName: '
|
|
103
|
+
typeName: 'BDCARTO_V5:zone_d_habitation',
|
|
104
104
|
crs: 'EPSG:3946',
|
|
105
105
|
ipr: 'IGN',
|
|
106
106
|
format: 'application/json',
|
|
@@ -85,7 +85,7 @@
|
|
|
85
85
|
view,
|
|
86
86
|
new itowns.ColorLayer('minimap', {
|
|
87
87
|
source: new itowns.VectorTilesSource({
|
|
88
|
-
style:
|
|
88
|
+
style: "https://data.geopf.fr/annexes/ressources/vectorTiles/styles/PLAN.IGN/standard.json",
|
|
89
89
|
// We don't display mountains and plot related data to ease visualisation
|
|
90
90
|
filter: (layer) => !layer['source-layer'].includes('oro_')
|
|
91
91
|
&& !layer['source-layer'].includes('parcellaire'),
|
|
@@ -110,8 +110,8 @@
|
|
|
110
110
|
// Define options for geocoding service that should be used by the searchbar.
|
|
111
111
|
const geocodingOptions = {
|
|
112
112
|
url: new URL(
|
|
113
|
-
'https://
|
|
114
|
-
'PositionOfInterest',
|
|
113
|
+
'https://data.geopf.fr/geocodage/completion?' +
|
|
114
|
+
'text=&type=StreetAddress,PositionOfInterest',
|
|
115
115
|
),
|
|
116
116
|
parser: (response) => {
|
|
117
117
|
const map = new Map();
|
|
@@ -84,7 +84,7 @@
|
|
|
84
84
|
view,
|
|
85
85
|
new itowns.ColorLayer('minimap', {
|
|
86
86
|
source: new itowns.VectorTilesSource({
|
|
87
|
-
style:
|
|
87
|
+
style: "https://data.geopf.fr/annexes/ressources/vectorTiles/styles/PLAN.IGN/standard.json",
|
|
88
88
|
// We don't display mountains and plot related data to ease visualisation
|
|
89
89
|
filter: (layer) => !layer['source-layer'].includes('oro_')
|
|
90
90
|
&& !layer['source-layer'].includes('parcellaire'),
|
|
@@ -109,8 +109,8 @@
|
|
|
109
109
|
// Define options for geocoding service that should be used by the searchbar.
|
|
110
110
|
const geocodingOptions = {
|
|
111
111
|
url: new URL(
|
|
112
|
-
'https://
|
|
113
|
-
'PositionOfInterest',
|
|
112
|
+
'https://data.geopf.fr/geocodage/completion?' +
|
|
113
|
+
'text=&type=StreetAddress,PositionOfInterest',
|
|
114
114
|
),
|
|
115
115
|
parser: (response) => {
|
|
116
116
|
const map = new Map();
|
|
@@ -117,7 +117,7 @@
|
|
|
117
117
|
view.addLayer(olayer, view.tileLayer).then(function addWfsLayer(orientedImageLayer) {
|
|
118
118
|
// prepare WFS source for the buildings
|
|
119
119
|
var wfsBuildingSource = new itowns.WFSSource({
|
|
120
|
-
url: 'https://
|
|
120
|
+
url: 'https://data.geopf.fr/wfs/ows?',
|
|
121
121
|
version: '2.0.0',
|
|
122
122
|
typeName: 'BDTOPO_V3:batiment',
|
|
123
123
|
crs: 'EPSG:4326',
|
|
@@ -17,8 +17,8 @@
|
|
|
17
17
|
<script type="importmap">
|
|
18
18
|
{
|
|
19
19
|
"imports": {
|
|
20
|
-
"three": "https://
|
|
21
|
-
"three/addons/": "https://
|
|
20
|
+
"three": "https://cdn.jsdelivr.net/npm/three@0.159.0/build/three.module.js",
|
|
21
|
+
"three/addons/": "https://cdn.jsdelivr.net/npm/three@0.159.0/examples/jsm/"
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
24
|
</script>
|
|
@@ -88,7 +88,7 @@
|
|
|
88
88
|
// Create a ColorLayer that shall be displayed on the minimap.
|
|
89
89
|
const minimapColorLayer = new itowns.ColorLayer('minimap', {
|
|
90
90
|
source: new itowns.VectorTilesSource({
|
|
91
|
-
style:
|
|
91
|
+
style: "https://data.geopf.fr/annexes/ressources/vectorTiles/styles/PLAN.IGN/standard.json",
|
|
92
92
|
// We don't display mountains and plot related data to ease visualisation
|
|
93
93
|
filter: (layer) => !layer['source-layer'].includes('oro_')
|
|
94
94
|
&& !layer['source-layer'].includes('parcellaire'),
|
|
@@ -88,8 +88,8 @@
|
|
|
88
88
|
// Define options for geocoding service that should be used by the searchbar.
|
|
89
89
|
const geocodingOptions = {
|
|
90
90
|
url: new URL(
|
|
91
|
-
'https://
|
|
92
|
-
'PositionOfInterest',
|
|
91
|
+
'https://data.geopf.fr/geocodage/completion?' +
|
|
92
|
+
'text=&type=StreetAddress,PositionOfInterest',
|
|
93
93
|
),
|
|
94
94
|
// As precised in the doc (http://www.itowns-project.org/itowns/docs/#api/Widgets/Searchbar), the parser
|
|
95
95
|
// method must parse the geocoding service response into a Map object. For each item of this Map, the
|
|
@@ -1,16 +1,10 @@
|
|
|
1
|
-
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
import { MAIN_LOOP_EVENTS } from "../Core/MainLoop.js";
|
|
2
3
|
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
var THREE = _interopRequireWildcard(require("three"));
|
|
8
|
-
var _MainLoop = require("../Core/MainLoop");
|
|
9
|
-
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
10
|
-
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
11
4
|
// Note: we could use existing three.js controls (like https://github.com/mrdoob/three.js/blob/dev/examples/js/controls/FirstPersonControls.js)
|
|
12
5
|
// but including these controls in itowns allows use to integrate them tightly with itowns.
|
|
13
6
|
// Especially the existing controls are expecting a continuous update loop while we have a pausable one (so our controls use .notifyChange when needed)
|
|
7
|
+
|
|
14
8
|
function limitRotation(camera3D, rot, verticalFOV) {
|
|
15
9
|
// Limit vertical rotation (look up/down) to make sure the user cannot see
|
|
16
10
|
// outside of the cone defined by verticalFOV
|
|
@@ -134,7 +128,7 @@ class FirstPersonControls extends THREE.EventDispatcher {
|
|
|
134
128
|
document.addEventListener('keydown', this._onKeyDown, false);
|
|
135
129
|
document.addEventListener('keyup', this._onKeyUp, false);
|
|
136
130
|
}
|
|
137
|
-
this.view.addFrameRequester(
|
|
131
|
+
this.view.addFrameRequester(MAIN_LOOP_EVENTS.AFTER_CAMERA_UPDATE, this.update.bind(this));
|
|
138
132
|
|
|
139
133
|
// focus policy
|
|
140
134
|
this._onFocus = () => view.domElement.focus();
|
|
@@ -313,5 +307,4 @@ class FirstPersonControls extends THREE.EventDispatcher {
|
|
|
313
307
|
});
|
|
314
308
|
}
|
|
315
309
|
}
|
|
316
|
-
|
|
317
|
-
exports.default = _default;
|
|
310
|
+
export default FirstPersonControls;
|
|
@@ -1,13 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
var THREE = _interopRequireWildcard(require("three"));
|
|
8
|
-
var _MainLoop = require("../Core/MainLoop");
|
|
9
|
-
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
10
|
-
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
import { MAIN_LOOP_EVENTS } from "../Core/MainLoop.js";
|
|
11
3
|
const MOVEMENTS = {
|
|
12
4
|
38: {
|
|
13
5
|
method: 'translateZ',
|
|
@@ -149,7 +141,7 @@ class FlyControls extends THREE.EventDispatcher {
|
|
|
149
141
|
view.domElement.addEventListener('wheel', onDocumentMouseWheel.bind(this), false);
|
|
150
142
|
view.domElement.addEventListener('keyup', onKeyUp.bind(this), true);
|
|
151
143
|
view.domElement.addEventListener('keydown', onKeyDown.bind(this), true);
|
|
152
|
-
this.view.addFrameRequester(
|
|
144
|
+
this.view.addFrameRequester(MAIN_LOOP_EVENTS.AFTER_CAMERA_UPDATE, this.update.bind(this));
|
|
153
145
|
|
|
154
146
|
// focus policy
|
|
155
147
|
if (options.focusOnMouseOver) {
|
|
@@ -182,5 +174,4 @@ class FlyControls extends THREE.EventDispatcher {
|
|
|
182
174
|
}
|
|
183
175
|
}
|
|
184
176
|
}
|
|
185
|
-
|
|
186
|
-
exports.default = _default;
|
|
177
|
+
export default FlyControls;
|
|
@@ -1,19 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
var _AnimationPlayer = _interopRequireDefault(require("../Core/AnimationPlayer"));
|
|
10
|
-
var _Coordinates = _interopRequireDefault(require("../Core/Geographic/Coordinates"));
|
|
11
|
-
var _Ellipsoid = require("../Core/Math/Ellipsoid");
|
|
12
|
-
var _CameraUtils = _interopRequireDefault(require("../Utils/CameraUtils"));
|
|
13
|
-
var _StateControl = _interopRequireDefault(require("./StateControl"));
|
|
14
|
-
var _View = require("../Core/View");
|
|
15
|
-
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
16
|
-
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
import AnimationPlayer from "../Core/AnimationPlayer.js";
|
|
3
|
+
import Coordinates from "../Core/Geographic/Coordinates.js";
|
|
4
|
+
import { ellipsoidSizes } from "../Core/Math/Ellipsoid.js";
|
|
5
|
+
import CameraUtils from "../Utils/CameraUtils.js";
|
|
6
|
+
import StateControl from "./StateControl.js";
|
|
7
|
+
import { VIEW_EVENTS } from "../Core/View.js";
|
|
8
|
+
|
|
17
9
|
// private members
|
|
18
10
|
const EPS = 0.000001;
|
|
19
11
|
const direction = {
|
|
@@ -46,10 +38,10 @@ let dollyScale;
|
|
|
46
38
|
// Globe move
|
|
47
39
|
const moveAroundGlobe = new THREE.Quaternion();
|
|
48
40
|
const cameraTarget = new THREE.Object3D();
|
|
49
|
-
const coordCameraTarget = new
|
|
41
|
+
const coordCameraTarget = new Coordinates('EPSG:4978');
|
|
50
42
|
cameraTarget.matrixWorldInverse = new THREE.Matrix4();
|
|
51
|
-
const xyz = new
|
|
52
|
-
const c = new
|
|
43
|
+
const xyz = new Coordinates('EPSG:4978', 0, 0, 0);
|
|
44
|
+
const c = new Coordinates('EPSG:4326', 0, 0, 0);
|
|
53
45
|
// Position object on globe
|
|
54
46
|
function positionObject(newPosition, object) {
|
|
55
47
|
xyz.setFromVector3(newPosition).as('EPSG:4326', c);
|
|
@@ -130,13 +122,12 @@ const helpers = {};
|
|
|
130
122
|
* @property CAMERA_TARGET_CHANGED {string} Fires when camera's target change
|
|
131
123
|
*/
|
|
132
124
|
|
|
133
|
-
const CONTROL_EVENTS = {
|
|
125
|
+
export const CONTROL_EVENTS = {
|
|
134
126
|
PAN_CHANGED: 'pan-changed',
|
|
135
127
|
ORIENTATION_CHANGED: 'orientation-changed',
|
|
136
128
|
RANGE_CHANGED: 'range-changed',
|
|
137
129
|
CAMERA_TARGET_CHANGED: 'camera-target-changed'
|
|
138
130
|
};
|
|
139
|
-
exports.CONTROL_EVENTS = CONTROL_EVENTS;
|
|
140
131
|
const quaterPano = new THREE.Quaternion();
|
|
141
132
|
const quaterAxis = new THREE.Quaternion();
|
|
142
133
|
const axisX = new THREE.Vector3(1, 0, 0);
|
|
@@ -184,12 +175,12 @@ class GlobeControls extends THREE.EventDispatcher {
|
|
|
184
175
|
constructor(view, placement) {
|
|
185
176
|
let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
186
177
|
super();
|
|
187
|
-
this.player = new
|
|
178
|
+
this.player = new AnimationPlayer();
|
|
188
179
|
this.view = view;
|
|
189
180
|
this.camera = view.camera3D;
|
|
190
181
|
|
|
191
182
|
// State control
|
|
192
|
-
this.states = new
|
|
183
|
+
this.states = new StateControl(this.view);
|
|
193
184
|
|
|
194
185
|
// this.enabled property has moved to StateControl
|
|
195
186
|
Object.defineProperty(this, 'enabled', {
|
|
@@ -210,7 +201,7 @@ class GlobeControls extends THREE.EventDispatcher {
|
|
|
210
201
|
|
|
211
202
|
// Limits to how far you can dolly in and out ( PerspectiveCamera only )
|
|
212
203
|
this.minDistance = options.minDistance || 250;
|
|
213
|
-
this.maxDistance = options.maxDistance ||
|
|
204
|
+
this.maxDistance = options.maxDistance || ellipsoidSizes.x * 8.0;
|
|
214
205
|
|
|
215
206
|
// Limits to how far you can zoom in and out ( OrthographicCamera only )
|
|
216
207
|
this.minZoom = options.minZoom || 0;
|
|
@@ -523,7 +514,7 @@ class GlobeControls extends THREE.EventDispatcher {
|
|
|
523
514
|
this.player.playLater(durationDampingOrbital, 2);
|
|
524
515
|
}
|
|
525
516
|
this.view.dispatchEvent({
|
|
526
|
-
type:
|
|
517
|
+
type: VIEW_EVENTS.CAMERA_MOVED,
|
|
527
518
|
coord: coordCameraTarget.setFromVector3(cameraTarget.position),
|
|
528
519
|
range: spherical.radius,
|
|
529
520
|
heading: -THREE.MathUtils.radToDeg(spherical.theta),
|
|
@@ -539,7 +530,7 @@ class GlobeControls extends THREE.EventDispatcher {
|
|
|
539
530
|
|
|
540
531
|
// Stop CameraUtils ongoing animations, which can for instance be triggered with `this.travel` or
|
|
541
532
|
// `this.lookAtCoordinate` methods.
|
|
542
|
-
|
|
533
|
+
CameraUtils.stop(this.view, this.camera);
|
|
543
534
|
|
|
544
535
|
// Dispatch events which specify if changes occurred in camera transform options.
|
|
545
536
|
this.onEndingMove();
|
|
@@ -549,7 +540,7 @@ class GlobeControls extends THREE.EventDispatcher {
|
|
|
549
540
|
|
|
550
541
|
// Update camera transform options.
|
|
551
542
|
this.updateTarget();
|
|
552
|
-
previous =
|
|
543
|
+
previous = CameraUtils.getTransformCameraLookingAtTarget(this.view, this.camera, pickedPosition);
|
|
553
544
|
|
|
554
545
|
// Initialize rotation and panoramic movements.
|
|
555
546
|
rotateStart.copy(event.viewCoords);
|
|
@@ -667,8 +658,8 @@ class GlobeControls extends THREE.EventDispatcher {
|
|
|
667
658
|
}
|
|
668
659
|
}
|
|
669
660
|
handlingEvent(current) {
|
|
670
|
-
current = current ||
|
|
671
|
-
const diff =
|
|
661
|
+
current = current || CameraUtils.getTransformCameraLookingAtTarget(this.view, this.camera);
|
|
662
|
+
const diff = CameraUtils.getDiffParams(previous, current);
|
|
672
663
|
if (diff) {
|
|
673
664
|
if (diff.range) {
|
|
674
665
|
this.dispatchEvent({
|
|
@@ -712,7 +703,7 @@ class GlobeControls extends THREE.EventDispatcher {
|
|
|
712
703
|
const range = this.getRange(point);
|
|
713
704
|
if (point && range > this.minDistance) {
|
|
714
705
|
return this.lookAtCoordinate({
|
|
715
|
-
coord: new
|
|
706
|
+
coord: new Coordinates('EPSG:4978', point),
|
|
716
707
|
range: range * (event.direction === 'out' ? 1 / 0.6 : 0.6),
|
|
717
708
|
time: 1500
|
|
718
709
|
});
|
|
@@ -720,7 +711,7 @@ class GlobeControls extends THREE.EventDispatcher {
|
|
|
720
711
|
}
|
|
721
712
|
handleZoom(event) {
|
|
722
713
|
this.player.stop();
|
|
723
|
-
|
|
714
|
+
CameraUtils.stop(this.view, this.camera);
|
|
724
715
|
this.updateTarget();
|
|
725
716
|
const delta = -event.delta;
|
|
726
717
|
this.dolly(delta);
|
|
@@ -918,7 +909,7 @@ class GlobeControls extends THREE.EventDispatcher {
|
|
|
918
909
|
* @return {number} number
|
|
919
910
|
*/
|
|
920
911
|
getRange(position) {
|
|
921
|
-
return
|
|
912
|
+
return CameraUtils.getTransformCameraLookingAtTarget(this.view, this.camera, position).range;
|
|
922
913
|
}
|
|
923
914
|
|
|
924
915
|
/**
|
|
@@ -928,7 +919,7 @@ class GlobeControls extends THREE.EventDispatcher {
|
|
|
928
919
|
* @return {number} The angle of the rotation in degrees.
|
|
929
920
|
*/
|
|
930
921
|
getTilt(position) {
|
|
931
|
-
return
|
|
922
|
+
return CameraUtils.getTransformCameraLookingAtTarget(this.view, this.camera, position).tilt;
|
|
932
923
|
}
|
|
933
924
|
|
|
934
925
|
/**
|
|
@@ -938,7 +929,7 @@ class GlobeControls extends THREE.EventDispatcher {
|
|
|
938
929
|
* @return {number} The angle of the rotation in degrees.
|
|
939
930
|
*/
|
|
940
931
|
getHeading(position) {
|
|
941
|
-
return
|
|
932
|
+
return CameraUtils.getTransformCameraLookingAtTarget(this.view, this.camera, position).heading;
|
|
942
933
|
}
|
|
943
934
|
|
|
944
935
|
/**
|
|
@@ -968,7 +959,7 @@ class GlobeControls extends THREE.EventDispatcher {
|
|
|
968
959
|
*/
|
|
969
960
|
|
|
970
961
|
getCameraCoordinate() {
|
|
971
|
-
return new
|
|
962
|
+
return new Coordinates('EPSG:4978', this.camera.position).as('EPSG:4326');
|
|
972
963
|
}
|
|
973
964
|
|
|
974
965
|
/**
|
|
@@ -976,7 +967,7 @@ class GlobeControls extends THREE.EventDispatcher {
|
|
|
976
967
|
* @return {Coordinates} coordinate
|
|
977
968
|
*/
|
|
978
969
|
getLookAtCoordinate() {
|
|
979
|
-
return
|
|
970
|
+
return CameraUtils.getTransformCameraLookingAtTarget(this.view, this.camera).coord;
|
|
980
971
|
}
|
|
981
972
|
|
|
982
973
|
/**
|
|
@@ -1058,7 +1049,7 @@ class GlobeControls extends THREE.EventDispatcher {
|
|
|
1058
1049
|
let pixelPitch = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0.28;
|
|
1059
1050
|
console.warn('Deprecated, use View#getPixelsToMeters and GlobeControls#getMetersToDegrees instead.');
|
|
1060
1051
|
const chord = this.pixelsToMeters(pixels, pixelPitch);
|
|
1061
|
-
return THREE.MathUtils.radToDeg(2 * Math.asin(chord / (2 *
|
|
1052
|
+
return THREE.MathUtils.radToDeg(2 * Math.asin(chord / (2 * ellipsoidSizes.x)));
|
|
1062
1053
|
}
|
|
1063
1054
|
|
|
1064
1055
|
/**
|
|
@@ -1130,13 +1121,13 @@ class GlobeControls extends THREE.EventDispatcher {
|
|
|
1130
1121
|
}
|
|
1131
1122
|
}
|
|
1132
1123
|
}
|
|
1133
|
-
previous =
|
|
1124
|
+
previous = CameraUtils.getTransformCameraLookingAtTarget(this.view, this.camera);
|
|
1134
1125
|
if (isAnimated) {
|
|
1135
1126
|
params.callback = r => cameraTarget.position.copy(r.targetWorldPosition);
|
|
1136
1127
|
this.dispatchEvent({
|
|
1137
1128
|
type: 'animation-started'
|
|
1138
1129
|
});
|
|
1139
|
-
return
|
|
1130
|
+
return CameraUtils.animateCameraToLookAtTarget(this.view, this.camera, params).then(result => {
|
|
1140
1131
|
this.dispatchEvent({
|
|
1141
1132
|
type: 'animation-ended'
|
|
1142
1133
|
});
|
|
@@ -1144,7 +1135,7 @@ class GlobeControls extends THREE.EventDispatcher {
|
|
|
1144
1135
|
return result;
|
|
1145
1136
|
});
|
|
1146
1137
|
} else {
|
|
1147
|
-
return
|
|
1138
|
+
return CameraUtils.transformCameraToLookAtTarget(this.view, this.camera, params).then(result => {
|
|
1148
1139
|
cameraTarget.position.copy(result.targetWorldPosition);
|
|
1149
1140
|
this.handlingEvent(result);
|
|
1150
1141
|
return result;
|
|
@@ -1163,8 +1154,7 @@ class GlobeControls extends THREE.EventDispatcher {
|
|
|
1163
1154
|
if (!pickedPosition) {
|
|
1164
1155
|
return;
|
|
1165
1156
|
}
|
|
1166
|
-
return new
|
|
1157
|
+
return new Coordinates('EPSG:4978', pickedPosition).as('EPSG:4326');
|
|
1167
1158
|
}
|
|
1168
1159
|
}
|
|
1169
|
-
|
|
1170
|
-
exports.default = _default;
|
|
1160
|
+
export default GlobeControls;
|
|
@@ -1,21 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.keys = exports.default = exports.STATE = exports.PLANAR_CONTROL_EVENT = void 0;
|
|
7
|
-
var THREE = _interopRequireWildcard(require("three"));
|
|
8
|
-
var _MainLoop = require("../Core/MainLoop");
|
|
9
|
-
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
10
|
-
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
import { MAIN_LOOP_EVENTS } from "../Core/MainLoop.js";
|
|
3
|
+
|
|
11
4
|
// event keycode
|
|
12
|
-
const keys = {
|
|
5
|
+
export const keys = {
|
|
13
6
|
CTRL: 17,
|
|
14
7
|
SPACE: 32,
|
|
15
8
|
T: 84,
|
|
16
9
|
Y: 89
|
|
17
10
|
};
|
|
18
|
-
exports.keys = keys;
|
|
19
11
|
const mouseButtons = {
|
|
20
12
|
LEFTCLICK: THREE.MOUSE.LEFT,
|
|
21
13
|
MIDDLECLICK: THREE.MOUSE.MIDDLE,
|
|
@@ -33,7 +25,7 @@ let cameraInitialZoom = 0;
|
|
|
33
25
|
const pointUnderCursor = new THREE.Vector3();
|
|
34
26
|
|
|
35
27
|
// control state
|
|
36
|
-
const STATE = {
|
|
28
|
+
export const STATE = {
|
|
37
29
|
NONE: -1,
|
|
38
30
|
DRAG: 0,
|
|
39
31
|
PAN: 1,
|
|
@@ -43,7 +35,6 @@ const STATE = {
|
|
|
43
35
|
};
|
|
44
36
|
|
|
45
37
|
// cursor shape linked to control state
|
|
46
|
-
exports.STATE = STATE;
|
|
47
38
|
const cursor = {
|
|
48
39
|
default: 'auto',
|
|
49
40
|
drag: 'move',
|
|
@@ -120,7 +111,7 @@ const defaultOptions = {
|
|
|
120
111
|
enableSmartTravel: true,
|
|
121
112
|
enablePan: true
|
|
122
113
|
};
|
|
123
|
-
const PLANAR_CONTROL_EVENT = {
|
|
114
|
+
export const PLANAR_CONTROL_EVENT = {
|
|
124
115
|
MOVED: 'moved'
|
|
125
116
|
};
|
|
126
117
|
|
|
@@ -174,7 +165,6 @@ const PLANAR_CONTROL_EVENT = {
|
|
|
174
165
|
* rotation, in degrees.
|
|
175
166
|
* @param {boolean} [options.handleCollision=true]
|
|
176
167
|
*/
|
|
177
|
-
exports.PLANAR_CONTROL_EVENT = PLANAR_CONTROL_EVENT;
|
|
178
168
|
class PlanarControls extends THREE.EventDispatcher {
|
|
179
169
|
constructor(view) {
|
|
180
170
|
let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
@@ -308,14 +298,14 @@ class PlanarControls extends THREE.EventDispatcher {
|
|
|
308
298
|
|
|
309
299
|
// add this PlanarControl instance to the view's frameRequesters
|
|
310
300
|
// with this, PlanarControl.update() will be called each frame
|
|
311
|
-
this.view.addFrameRequester(
|
|
301
|
+
this.view.addFrameRequester(MAIN_LOOP_EVENTS.AFTER_CAMERA_UPDATE, this._handlerUpdate);
|
|
312
302
|
|
|
313
303
|
// event listeners for user input (to activate the controls)
|
|
314
304
|
this.addInputListeners();
|
|
315
305
|
}
|
|
316
306
|
dispose() {
|
|
317
307
|
this.removeInputListeners();
|
|
318
|
-
this.view.removeFrameRequester(
|
|
308
|
+
this.view.removeFrameRequester(MAIN_LOOP_EVENTS.AFTER_CAMERA_UPDATE, this._handlerUpdate);
|
|
319
309
|
}
|
|
320
310
|
|
|
321
311
|
/**
|
|
@@ -1032,5 +1022,4 @@ class PlanarControls extends THREE.EventDispatcher {
|
|
|
1032
1022
|
return (value ** 2 * (3 - 2 * value)) ** 1.20;
|
|
1033
1023
|
}
|
|
1034
1024
|
}
|
|
1035
|
-
|
|
1036
|
-
exports.default = _default;
|
|
1025
|
+
export default PlanarControls;
|
|
@@ -1,12 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
var THREE = _interopRequireWildcard(require("three"));
|
|
8
|
-
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
9
|
-
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
1
|
+
import * as THREE from 'three';
|
|
10
2
|
const CONTROL_KEYS = {
|
|
11
3
|
LEFT: 37,
|
|
12
4
|
UP: 38,
|
|
@@ -434,5 +426,4 @@ class StateControl extends THREE.EventDispatcher {
|
|
|
434
426
|
this._domElement.removeEventListener('contextmenu', this._onContextMenu, false);
|
|
435
427
|
}
|
|
436
428
|
}
|
|
437
|
-
|
|
438
|
-
exports.default = _default;
|
|
429
|
+
export default StateControl;
|