@mcolabs/threebox-plugin 4.0.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/LICENSE.txt +97 -0
- package/README.md +199 -0
- package/dist/threebox.cjs +2 -0
- package/dist/threebox.cjs.map +1 -0
- package/dist/threebox.iife.js +2 -0
- package/dist/threebox.iife.js.map +1 -0
- package/dist/threebox.js +3521 -0
- package/dist/threebox.js.map +1 -0
- package/package.json +57 -0
- package/src/Threebox.js +1201 -0
- package/src/animation/AnimationManager.js +482 -0
- package/src/camera/CameraSync.js +298 -0
- package/src/index.js +8 -0
- package/src/objects/CSS2DRenderer.js +236 -0
- package/src/objects/LabelRenderer.js +70 -0
- package/src/objects/Object3D.js +32 -0
- package/src/objects/effects/BuildingShadows.js +163 -0
- package/src/objects/extrusion.js +59 -0
- package/src/objects/fflate.min.js +6 -0
- package/src/objects/label.js +25 -0
- package/src/objects/line.js +45 -0
- package/src/objects/loadObj.js +139 -0
- package/src/objects/objects.js +1111 -0
- package/src/objects/sphere.js +22 -0
- package/src/objects/tooltip.js +26 -0
- package/src/objects/tube.js +28 -0
- package/src/utils/ValueGenerator.js +11 -0
- package/src/utils/constants.js +23 -0
- package/src/utils/material.js +52 -0
- package/src/utils/suncalc.js +311 -0
- package/src/utils/utils.js +420 -0
- package/src/utils/validate.js +114 -0
package/LICENSE.txt
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
v.2.0.1 - v.2.2.6
|
|
2
|
+
MIT License
|
|
3
|
+
Copyright (c) 2020 Jesus Serrano
|
|
4
|
+
|
|
5
|
+
v.0.3.0
|
|
6
|
+
MIT License
|
|
7
|
+
Copyright (c) 2017 Peter Liu
|
|
8
|
+
|
|
9
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
10
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
11
|
+
in the Software without restriction, including without limitation the rights
|
|
12
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
13
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
14
|
+
furnished to do so, subject to the following conditions:
|
|
15
|
+
|
|
16
|
+
The above copyright notice and this permission notice shall be included in all
|
|
17
|
+
copies or substantial portions of the Software.
|
|
18
|
+
|
|
19
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
20
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
21
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
22
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
23
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
24
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
25
|
+
SOFTWARE.
|
|
26
|
+
|
|
27
|
+
---------------------------------------------------------------------------------------------
|
|
28
|
+
SunCalc (c) 2011-2015, Vladimir Agafonkin
|
|
29
|
+
Copyright (c) 2014, Vladimir Agafonkin
|
|
30
|
+
All rights reserved.
|
|
31
|
+
|
|
32
|
+
Redistribution and use in source and binary forms, with or without modification, are
|
|
33
|
+
permitted provided that the following conditions are met:
|
|
34
|
+
|
|
35
|
+
1. Redistributions of source code must retain the above copyright notice, this list of
|
|
36
|
+
conditions and the following disclaimer.
|
|
37
|
+
|
|
38
|
+
2. Redistributions in binary form must reproduce the above copyright notice, this list
|
|
39
|
+
of conditions and the following disclaimer in the documentation and/or other materials
|
|
40
|
+
provided with the distribution.
|
|
41
|
+
|
|
42
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
|
43
|
+
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
44
|
+
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
45
|
+
COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
46
|
+
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
47
|
+
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
48
|
+
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
|
|
49
|
+
TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
50
|
+
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
51
|
+
|
|
52
|
+
---------------------------------------------------------------------------------------------
|
|
53
|
+
3D models attributions
|
|
54
|
+
|
|
55
|
+
- Eiffel Tower
|
|
56
|
+
- Creative Commons License attribution: Eiffel Tower model by https://www.cgtrader.com/lefabshop
|
|
57
|
+
from https://www.cgtrader.com/items/108594/download-page
|
|
58
|
+
|
|
59
|
+
- Elephant
|
|
60
|
+
- Creative Commons NonCommercial License attribution: Asian Elephant low poly model by https://sketchfab.com/jeremielouvetz
|
|
61
|
+
from https://sketchfab.com/3d-models/asian-elephant-2aeeb8958bc64240962b093705abffdf
|
|
62
|
+
|
|
63
|
+
- Liberty Statue
|
|
64
|
+
- Creative Commons License attribution: Liberty statue model by https://sketchfab.com/hellolucy2
|
|
65
|
+
from https://sketchfab.com/3d-models/ellis-island-3cd765a23c5c4c7087acd00624d30590
|
|
66
|
+
|
|
67
|
+
- Plane
|
|
68
|
+
- Creative Commons License attribution: Plane model by https://sketchfab.com/ideehochzwei
|
|
69
|
+
from https://sketchfab.com/3d-models/plane-aa001f5a88f64b16b98356c042f2d5f3
|
|
70
|
+
|
|
71
|
+
- Radar
|
|
72
|
+
- Attribution, no License specified: Model by https://github.com/nasa/
|
|
73
|
+
from https://nasa3d.arc.nasa.gov/detail/jpl-vtad-dsn34
|
|
74
|
+
|
|
75
|
+
- Soldier
|
|
76
|
+
- Attribution: Soldier animated model by T. Choonyung at https://www.mixamo.com
|
|
77
|
+
from https://www.mixamo.com/#/?page=1&query=vanguard&type=Character
|
|
78
|
+
|
|
79
|
+
- Space Needle
|
|
80
|
+
- Creative Commons License attribution: Space Needle model by https://sketchfab.com/microsoft
|
|
81
|
+
from https://sketchfab.com/3d-models/space-needle-1d1325bc1ad745dd9eb34fc76e8f6e87
|
|
82
|
+
|
|
83
|
+
- Triceratops
|
|
84
|
+
- Creative Commons NonCommercial License attribution: Dino low poly model by https://sketchfab.com/Blender_Fox1234
|
|
85
|
+
from https://sketchfab.com/3d-models/triceratops-lowpoly-76beb95d0b5b41a3aae0d07c3eae99fa
|
|
86
|
+
|
|
87
|
+
- Truck & Car
|
|
88
|
+
- Royalty Free License: Vehicles by https://www.cgtrader.com/antonmoek
|
|
89
|
+
from https://www.cgtrader.com/free-3d-models/car/concept/cartoon-low-poly-city-cars-pack
|
|
90
|
+
|
|
91
|
+
- Windmill
|
|
92
|
+
- Creative Commons License attribution: Windmill animated model by https://sketchfab.com/data3anshow
|
|
93
|
+
from https://sketchfab.com/3d-models/windmill-animated-6ce5667e8d5c47068ea13196036efd52
|
|
94
|
+
|
|
95
|
+
- Glacier d'Argentiere
|
|
96
|
+
- Attribution, no License specified: Glacier model by https://github.com/jbbarre
|
|
97
|
+
from https://github.com/jbbarre/glacierargentiere/blob/main/data/glacier_wgs.gltf
|
package/README.md
ADDED
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
# `Threebox`
|
|
2
|
+
|
|
3
|
+

|
|
4
|
+

|
|
5
|
+
[](https://github.com/jscastro76/threebox/releases/)
|
|
6
|
+
[](https://www.npmjs.org/package/threebox-plugin)
|
|
7
|
+
[](https://www.npmjs.org/package/threebox-plugin)
|
|
8
|
+
|
|
9
|
+
A **[*Three.js*](https://threejs.org/)** plugin for **[*Mapbox GL JS*](https://docs.mapbox.com/mapbox-gl-js/examples/)** and **[*Azure Maps*](https://azure.microsoft.com/en-us/services/azure-maps/)** using the [`CustomLayerInterface`](https://docs.mapbox.com/mapbox-gl-js/api/properties/#customlayerinterface) feature. Provides convenient methods to manage objects in lnglat coordinates, and to synchronize the map and scene cameras.
|
|
10
|
+
<img alt="threebox" src="docs/gallery.jpg">
|
|
11
|
+
|
|
12
|
+
<br>
|
|
13
|
+
|
|
14
|
+
- - -
|
|
15
|
+
## Latest release
|
|
16
|
+
|
|
17
|
+

|
|
18
|
+
Latest **code release** is [](https://github.com/jscastro76/threebox/releases/), please review the [**Change log**](https://github.com/jscastro76/threebox/blob/master/CHANGELOG.md) for more details.
|
|
19
|
+
|
|
20
|
+
Threebox is also available as an **nmp package** [](https://www.npmjs.org/package/threebox-plugin)
|
|
21
|
+
|
|
22
|
+
```js
|
|
23
|
+
npm i threebox-plugin
|
|
24
|
+
```
|
|
25
|
+
<br>
|
|
26
|
+
|
|
27
|
+
- - -
|
|
28
|
+
|
|
29
|
+
## ONLY in this Threebox fork
|
|
30
|
+
|
|
31
|
+
|Models built-in & custom animations |Mouse over/out, Selected, Drag&Drop, Drag&Rotate, Wireframe
|
|
32
|
+
|---------|-----------------------
|
|
33
|
+
|<img alt="threebox" src="https://i.postimg.cc/vTNLLLLn/Animation-Video.gif" width="100%">|<img alt="threebox" src="https://i.postimg.cc/3Jjgnvjz/Wireframes.gif" width="100%" >
|
|
34
|
+
|
|
35
|
+
|Tooltips using altitude|Optimization of camera perspective and depth
|
|
36
|
+
|----------|-------
|
|
37
|
+
|<img alt="threebox" src="https://i.postimg.cc/wM7DvR8j/Labels-On-Height.gif" width="100%">|<img alt="threebox" src="https://i.postimg.cc/zB9nPwcY/Depth.gif" width="100%">
|
|
38
|
+
|
|
39
|
+
|Runtime style change|Optimized performance through cache
|
|
40
|
+
|----------|-------
|
|
41
|
+
|<img alt="threebox" src="https://i.postimg.cc/QMh57yGP/Style-Change.gif" width="100%">|<img alt="threebox" src="https://i.postimg.cc/zf2wTYwB/Performance.gif" width="100%">
|
|
42
|
+
|
|
43
|
+
|Customizable FOV|Geojson and Points Extrusions
|
|
44
|
+
|---------|-------
|
|
45
|
+
|<img alt="threebox" src="https://i.postimg.cc/43Lh7vvR/Customizable-FOV.gif" width="100%">|<img alt="threebox" src="https://i.postimg.cc/50KqJdKv/extrusions.gif" width="100%">
|
|
46
|
+
|
|
47
|
+
|Sunlight illumination for a given datetime and lnglat|Models built-in shadows and sky layer synced with Sunlight
|
|
48
|
+
|---------|-------
|
|
49
|
+
|<img alt="threebox" src="https://i.postimg.cc/6QnjWSVm/Eiffel-Shadow.gif" width="100%">|<img alt="threebox" src="https://i.postimg.cc/63Y7SP6t/SunSki.gif" width="100%">
|
|
50
|
+
|
|
51
|
+
<br>
|
|
52
|
+
|
|
53
|
+
Only in this fork, there is a list of new features implemented on top of the amazing work from [@peterqliu](https://github.com/peterqliu/threebox/):
|
|
54
|
+
- Updated to [**Three.js r132**](https://github.com/mrdoob/three.js/releases/tag/r132).
|
|
55
|
+
- Updated to **Mapbox-gl-js v2.2.0**.
|
|
56
|
+
- Updated to **Azure Maps v2.0.31**.
|
|
57
|
+
- [+20 examples](https://github.com/jscastro76/threebox/tree/master/examples) with all the new features.
|
|
58
|
+
- Support for multiple 3D format objects (FBX, GLTF/GLB, Collada, OBJ/MTL).
|
|
59
|
+
- Support for 3D extruded shapes from [GeoJson](https://geojson.org/) features or points array.
|
|
60
|
+
- Support for CSS2D labels and rich HTML controls through a new LabelManager.
|
|
61
|
+
- Support for CSS2D tooltips/title browser-like and mapbox-like.
|
|
62
|
+
- Support for built-in Raycaster in Object3D and fill-extrusions together.
|
|
63
|
+
- Support for built-in MouseOver/Mouseout, Selected, Drag&Drop, Drag&Rotate, Wireframe in loadedObjects including events.
|
|
64
|
+
- Support for wireframing on any Object3D, removing them from the Raycaster.
|
|
65
|
+
- Support for [GeoJson](https://geojson.org/) standard features format import and export in different layers.
|
|
66
|
+
- Support for Object3D embedded animations, and custom animations on AnimationManager (i.e. embedded animation + translate + rotate).
|
|
67
|
+
- Support for multi-layer and multi-floor design of spaces.
|
|
68
|
+
- Support for built-in shadows and real Sun light positioning for a given datetime and lnglat coords.
|
|
69
|
+
- Support for built-in Mapbox v2 Sky and Terrain layer synced with real Sun light.
|
|
70
|
+
- Support for Non-AABB Non Axes Aligned Bounding Box and real model size, including floor projection.
|
|
71
|
+
- Support for Object3D auto-centering and 9 default anchor positions customizable through adjustments.
|
|
72
|
+
- Support for `setLayerZoomRange` and `setLayoutProperty` on Custom Layers (not available in Mapbox).
|
|
73
|
+
- Support for `removeLayer` considering Object3D.
|
|
74
|
+
- Support for style change through `setStyle` and keeping Object3D.
|
|
75
|
+
- Support for partial and full dispose of Mapbox, Three and Threebox resources and memory.
|
|
76
|
+
- Support for Orthographic view, customizable Perspective FOV and fixed-size Object3D.
|
|
77
|
+
- Optimization of Camera perspective to have Raycast with pixel-precision level and depth sync between Mapbox and Threebox objects.
|
|
78
|
+
- Optimization for loading thousands of objects through cache.
|
|
79
|
+
- Available as [npm package](https://www.npmjs.com/package/threebox-plugin)
|
|
80
|
+
- Check out [change log](https://github.com/jscastro76/threebox/blob/master/CHANGELOG.md) for more detail.
|
|
81
|
+
|
|
82
|
+
<br>
|
|
83
|
+
|
|
84
|
+
- - -
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
## Documentation
|
|
88
|
+
<img alt="threebox" src="docs/soldieranimation.jpg">
|
|
89
|
+
|
|
90
|
+
All the [**Threebox Documentation**](/docs/Threebox.md) has been completely updated, including all the methods, properties and events implemented in Threebox and objects, but still *'work in progress'* adding better documented examples and images to illustrate Threebox capabilities.
|
|
91
|
+
- [**Using Threebox**](/docs/Threebox.md#using-threebox)
|
|
92
|
+
- [**Loading a 3D Model**](/docs/Threebox.md#loading-a-3d-model)
|
|
93
|
+
- [**Threebox methods**](/docs/Threebox.md#threebox-methods)
|
|
94
|
+
- [**Object methods**](/docs/Threebox.md#object-methods)
|
|
95
|
+
- [**Examples**](/examples/README.md)
|
|
96
|
+
|
|
97
|
+
<br>
|
|
98
|
+
|
|
99
|
+
- - -
|
|
100
|
+
|
|
101
|
+
## Compatibility/Dependencies
|
|
102
|
+
|
|
103
|
+
- [**Three.js 132**](https://github.com/mrdoob/three.js/releases/tag/r132). (already bundled into the Threebox build). If desired, other versions can be swapped in and rebuilt [here](https://github.com/jscastro76/threebox/blob/master/src/three.js), though compatibility is not guaranteed.
|
|
104
|
+
- **Mapbox-gl-js v1.11.1. or v.2.0.1**. **Warning**: Despite v1.11.1 still supported, if used, some features from mapbox v.2.0.1 won't be obviously available such as sky layers.
|
|
105
|
+
- **Azure Maps v2.0.31.**
|
|
106
|
+
|
|
107
|
+
<br>
|
|
108
|
+
|
|
109
|
+
- - -
|
|
110
|
+
|
|
111
|
+
## Getting started
|
|
112
|
+
|
|
113
|
+
You can use threebox in three different ways.
|
|
114
|
+
|
|
115
|
+
#### NPM install
|
|
116
|
+
Add threebox to your project via **npm package** [](https://www.npmjs.org/package/threebox-plugin) :
|
|
117
|
+
```js
|
|
118
|
+
npm install threebox-plugin
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
Then you will need to import Threebox object in your code. Depending your javascript framework this might be different.
|
|
122
|
+
```js
|
|
123
|
+
import { Threebox } from 'threebox-plugin';
|
|
124
|
+
```
|
|
125
|
+
Depending the framework, wrapper or bundler you ar using, try with this:
|
|
126
|
+
```js
|
|
127
|
+
import { Threebox } from 'threebox-plugin/dist/threebox';
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
<br/>
|
|
131
|
+
|
|
132
|
+
#### Use the bundle locally
|
|
133
|
+
Download the bundle from [`dist/threebox.js`](dist/threebox.js) or [`dist/threebox.min.js`](dist/threebox.min.js) and include it in a `<script>` tag on your page.
|
|
134
|
+
If you want to use styles predefined, add the link to the cascade style sheet, just ensure the `src` and `href` attributes are pointing to relative or absolute url path.
|
|
135
|
+
```html
|
|
136
|
+
<script src="../dist/threebox.js" type="text/javascript"></script>
|
|
137
|
+
<link href="../dist/threebox.css" rel="stylesheet" />
|
|
138
|
+
```
|
|
139
|
+
<br/>
|
|
140
|
+
|
|
141
|
+
#### Public CDNs
|
|
142
|
+
Threebox can be also used from different public CDNs:
|
|
143
|
+
|
|
144
|
+
##### jsdelivr
|
|
145
|
+
This CDN has the particularity that always requires the version of the package to download individual files.
|
|
146
|
+
```html
|
|
147
|
+
<script src="https://cdn.jsdelivr.net/gh/jscastro76/threebox@v.2.2.2/dist/threebox.min.js" type="text/javascript"></script>
|
|
148
|
+
<link href="https://cdn.jsdelivr.net/gh/jscastro76/threebox@v.2.2.2/dist/threebox.css" rel="stylesheet" />
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
<br/>
|
|
152
|
+
|
|
153
|
+
##### unpkg
|
|
154
|
+
Despite this CDN admits version, if omitted, it will download always the last one published.
|
|
155
|
+
|
|
156
|
+
```html
|
|
157
|
+
<script src="https://unpkg.com/threebox-plugin/dist/threebox.min.js" type="text/javascript"></script>
|
|
158
|
+
<link href="https://unpkg.com/threebox-plugin/dist/threebox.css" rel="stylesheet" />
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
For an specific version (i.e. v2.2.1) use the followin:
|
|
162
|
+
```html
|
|
163
|
+
<script src="https://unpkg.com/threebox-plugin@2.2.1/dist/threebox.min.js" type="text/javascript"></script>
|
|
164
|
+
<link href="https://unpkg.com/threebox-plugin@2.2.1/dist/threebox.css" rel="stylesheet" />
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
<br/>
|
|
168
|
+
|
|
169
|
+
#### Test the samples
|
|
170
|
+
Several introductory examples are [here](https://github.com/jscastro76/threebox/tree/master/examples).
|
|
171
|
+
To run them, create a `config.js` file with your Mapbox-gl-js access token, alongside and in the format of [the template](https://github.com/jscastro76/threebox/blob/master/examples/config_template.js).
|
|
172
|
+
|
|
173
|
+
<br>
|
|
174
|
+
|
|
175
|
+
- - -
|
|
176
|
+
|
|
177
|
+
## Contributing
|
|
178
|
+
- Clone the [Github repo](https://github.com/jscastro76/threebox/).
|
|
179
|
+
- Build the library with `npm run build` to get the minimized version, or `npm run dev` to get the development version and rebuild continuously as you develop.
|
|
180
|
+
- Both commands will output a bundle in [`dist/`](dist/) folder.
|
|
181
|
+
|
|
182
|
+
#### Unit tests
|
|
183
|
+
Tests live [here](/tests).
|
|
184
|
+
- Build first the test bundle with `npm run test`, this will create [`tests\threebox-tests-bundle.js`](tests/threebox-tests-bundle.js)
|
|
185
|
+
- Then in your preferred browser navigate to [`threebox-tests.html`](https://github.com/jscastro76/threebox/blob/master/tests/threebox-tests.html) and check the console for test results.
|
|
186
|
+
|
|
187
|
+
#### How to build the project in Visual Studio
|
|
188
|
+
Sample to get a full build from scratch for Visual Studio:
|
|
189
|
+
- Install [Node.js](https://nodejs.org/en/)
|
|
190
|
+
- Clone the repo and open a new Project using main.js
|
|
191
|
+
- Install / Update the packages browserify, tape, ncp, uglyfy, watchify.
|
|
192
|
+
- Right click on the project at the Solution Explorer > Open Node.js Interactive Window:
|
|
193
|
+
- execute `.npm [ProjectName] init -y`
|
|
194
|
+
- execute `.npm [ProjectName] install`
|
|
195
|
+
- execute `.npm [ProjectName] i`
|
|
196
|
+
- execute `.npm [ProjectName] run dev` or `.npm run build
|
|
197
|
+
`
|
|
198
|
+
|
|
199
|
+
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("three"),t=require("three/addons/loaders/OBJLoader.js"),i=require("three/addons/loaders/MTLLoader.js"),r=require("three/addons/loaders/FBXLoader.js"),a=require("three/addons/loaders/GLTFLoader.js"),n=require("three/addons/loaders/ColladaLoader.js"),s=require("three/addons/lines/Line2.js"),l=require("three/addons/lines/LineMaterial.js"),h=require("three/addons/lines/LineGeometry.js");function c(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e)for(const i in e)if("default"!==i){const r=Object.getOwnPropertyDescriptor(e,i);Object.defineProperty(t,i,r.get?r:{enumerable:!0,get:()=>e[i]})}return t.default=e,Object.freeze(t)}const u=c(e),d=1024e3,p=.1/180*Math.PI,m=Math.atan(3/4),f=6371008.8,g={WORLD_SIZE:d,PROJECTION_WORLD_SIZE:d/(f*Math.PI*2),MERCATOR_A:f,DEG2RAD:Math.PI/180,RAD2DEG:180/Math.PI,EARTH_RADIUS:f,EARTH_CIRCUMFERENCE:2*Math.PI*f,EARTH_CIRCUMFERENCE_EQUATOR:40075017,FOV_ORTHO:p,FOV:m,FOV_DEGREES:180*m/Math.PI,TILE_SIZE:512};function b(){}b.prototype={Coords:function(e){if(e.constructor===Array)if(e.length<2)console.error("Coords length must be at least 2");else{for(const t of e)if(t.constructor!==Number)return void console.error("Coords values must be numbers");if(!(Math.abs(e[1])>90))return e;console.error("Latitude must be between -90 and 90")}else console.error("Coords must be an array")},Line:function(e){if(e.constructor===Array){for(const t of e)if(!this.Coords(t))return void console.error("Each coordinate in a line must be a valid Coords type");return e}console.error("Line must be an array")},Rotation:function(e){if(e.constructor===Number)e={z:e};else{if(e.constructor!==Object)return void console.error("Rotation must be an object or a number");for(const t of Object.keys(e)){if(!["x","y","z"].includes(t))return void console.error("Rotation parameters must be x, y, or z");if(e[t].constructor!==Number)return void console.error("Individual rotation values must be numbers")}}return e},Scale:function(e){if(e.constructor===Number)e={x:e,y:e,z:e};else{if(e.constructor!==Object)return void console.error("Scale must be an object or a number");for(const t of Object.keys(e)){if(!["x","y","z"].includes(t))return void console.error("Scale parameters must be x, y, or z");if(e[t].constructor!==Number)return void console.error("Individual scale values must be numbers")}}return e}};var y={prettyPrintMatrix:function(e){for(var t=0;t<4;t++){var i=[e[t],e[t+4],e[t+8],e[t+12]];console.log(i.map(function(e){return e.toFixed(4)}))}},makePerspectiveMatrix:function(e,t,i,r){var o=new u.Matrix4,a=1/Math.tan(e/2),n=1/(i-r),s=[a/t,0,0,0,0,a,0,0,0,0,(r+i)*n,-1,0,0,2*r*i*n,0];return o.elements=s,o},makeOrthographicMatrix:function(e,t,i,r,o,a){var n=new u.Matrix4;const s=1/(t-e),l=1/(i-r),h=1/(a-o);var c=[2*s,0,0,0,0,2*l,0,0,0,0,-1*h,0,-((t+e)*s),-((i+r)*l),-(o*h),1];return n.elements=c,n},radify:function(e){function t(e){return e=e||0,2*Math.PI*e/360}return"object"==typeof e?e.length>0?e.map(function(e){return t(e)}):[t(e.x),t(e.y),t(e.z)]:t(e)},degreeify:function(e){function t(e){return 360*(e=e||0)/(2*Math.PI)}return"object"==typeof e?[t(e.x),t(e.y),t(e.z)]:t(e)},projectToWorld:function(e){var t=[-g.MERCATOR_A*g.DEG2RAD*e[0]*g.PROJECTION_WORLD_SIZE,-g.MERCATOR_A*Math.log(Math.tan(.25*Math.PI+.5*g.DEG2RAD*e[1]))*g.PROJECTION_WORLD_SIZE];if(e[2]){var i=this.projectedUnitsPerMeter(e[1]);t.push(e[2]*i)}else t.push(0);return new u.Vector3(t[0],t[1],t[2])},projectedUnitsPerMeter:function(e){return Math.abs(g.WORLD_SIZE/Math.cos(g.DEG2RAD*e)/g.EARTH_CIRCUMFERENCE)},_circumferenceAtLatitude:function(e){return g.EARTH_CIRCUMFERENCE*Math.cos(e*Math.PI/180)},mercatorZfromAltitude:function(e,t){return e/this._circumferenceAtLatitude(t)},_scaleVerticesToMeters:function(e,t){var i=this.projectedUnitsPerMeter(e[1]);this.projectToWorld(e);for(var r=0;r<t.length;r++)t[r].multiplyScalar(i);return t},projectToScreen:function(e){console.log("WARNING: Projecting to screen coordinates is not yet implemented")},unprojectFromScreen:function(e){console.log("WARNING: unproject is not yet implemented")},unprojectFromWorld:function(e){var t=[-e.x/(g.MERCATOR_A*g.DEG2RAD*g.PROJECTION_WORLD_SIZE),2*(Math.atan(Math.exp(e.y/(g.PROJECTION_WORLD_SIZE*-g.MERCATOR_A)))-Math.PI/4)/g.DEG2RAD],i=this.projectedUnitsPerMeter(t[1]),r=e.z||0;return t.push(r/i),t},toScreenPosition:function(e,t){var i=new u.Vector3,r=.5*renderer.context.canvas.width,o=.5*renderer.context.canvas.height;return e.updateMatrixWorld(),i.setFromMatrixPosition(e.matrixWorld),i.project(t),i.x=i.x*r+r,i.y=-i.y*o+o,{x:i.x,y:i.y}},getFeatureCenter:function(e,t,i){let r=[],o=0,a=0,n=0,s=[...e.geometry.coordinates[0]];return"Point"===e.geometry.type?r=[...s[0]]:("MultiPolygon"===e.geometry.type&&(s=s[0]),s.splice(-1,1),s.forEach(function(e){o+=e[0],a+=e[1]}),r=[o/s.length,a/s.length]),n=this.getObjectHeightOnFloor(e,t,i),r.length<3?r.push(n):r[2]=n,r},getObjectHeightOnFloor:function(e,t,i=e.properties.level||0){let r=i*(e.properties.levelHeight||0),o=e.properties.base_height||e.properties.min_height||0;return r+((t&&t.model?0:e.properties.height-o)+o)},_flipMaterialSides:function(e){},normalizeVertices(e){let t=new u.BufferGeometry,i=[];for(var r=0;r<e.length;r++){let t=e[r];i.push(t.x,t.y,t.z),i.push(t.x,t.y,t.z)}t.setAttribute("position",new u.BufferAttribute(new Float32Array(i),3)),t.computeBoundingSphere();var o=t.boundingSphere.center;return{vertices:e.map(function(e){return e.sub(o)}),position:o}},flattenVectors(e){var t=[];for(let i of e)t.push(i.x,i.y,i.z);return t},lnglatsToWorld:function(e){return e.map(function(e){var t=y.projectToWorld(e);return new u.Vector3(t.x,t.y,t.z)})},extend:function(e,t){for(let i in t)e[i]=t[i]},clone:function(e){var t={};for(let i in e)t[i]=e[i];return t},clamp:function(e,t,i){return Math.min(i,Math.max(t,e))},types:{rotation:function(e,t){e||(e=0),"number"==typeof e&&(e={z:e});var i=this.applyDefault([e.x,e.y,e.z],t);return y.radify(i)},scale:function(e,t){return e||(e=1),"number"==typeof e?[e,e,e]:this.applyDefault([e.x,e.y,e.z],t)},applyDefault:function(e,t){return e.map(function(e,i){return e=e||t[i]})}},toDecimal:function(e,t){return Number(e.toFixed(t))},equal:function(e,t){const i=Object.keys(e),r=Object.keys(t);if(i.length!==r.length)return!1;if(0==i.length&&0==r.length&&i!==r)return!1;for(const o of i){const i=e[o],r=t[o],a=this.isObject(i)&&this.isObject(r);if(a&&!equal(i,r)||!a&&i!==r)return!1}return!0},isObject:function(e){return null!=e&&"object"==typeof e},curveToLine:(e,t)=>{let{width:i,color:r}=t,o=(new u.BufferGeometry).setFromPoints(e.getPoints(100)),a=new u.LineBasicMaterial({color:r,linewidth:i});return new u.Line(o,a)},curvesToLines:e=>{var t=[16711680,2031360,2490623];return e.map((e,i)=>curveToLine(e,{width:3,color:t[i]||"purple"}))},_validate:function(e,t){e=e||{};var i={};y.extend(i,e);for(let r of Object.keys(t))if(void 0===e[r]){if(null===t[r])return void console.error(r+" is required");i[r]=t[r]}else i[r]=e[r];return i},Validator:new b,exposedMethods:["projectToWorld","projectedUnitsPerMeter","extend","unprojectFromWorld"]};function v(e,t,i){this.map=e,this.camera=t,this.active=!0,this.camera.matrixAutoUpdate=!1,this.world=i||new u.Group,this.world.position.x=this.world.position.y=g.WORLD_SIZE/2,this.world.matrixAutoUpdate=!1,this.state={translateCenter:(new u.Matrix4).makeTranslation(g.WORLD_SIZE/2,-g.WORLD_SIZE/2,0),worldSizeRatio:g.TILE_SIZE/g.WORLD_SIZE,worldSize:g.TILE_SIZE*this.map.transform.scale};let r=this;this.map.on("move",function(){r.updateCamera()}).on("resize",function(){r.setupCamera()}),this.setupCamera()}v.prototype={setupCamera:function(){const e=this.map.transform;this.camera.aspect=e.width/e.height,this.halfFov=e._fov/2,this.cameraToCenterDistance=.5/Math.tan(this.halfFov)*e.height;const t=e._maxPitch*Math.PI/180;this.acuteAngle=Math.PI/2-t,this.updateCamera()},updateCamera:function(e){if(!this.camera)return void console.log("nocamera");const t=this.map.transform;this.camera.aspect=t.width/t.height;const i=t.centerOffset||new u.Vector3;let r=0,o=0;this.halfFov=t._fov/2;const a=Math.PI/2+t._pitch,n=Math.cos(Math.PI/2-t._pitch);this.cameraToCenterDistance=.5/Math.tan(this.halfFov)*t.height;let s=1;const l=this.worldSize();if(this.map.tb.mapboxVersion>=2){s=this.mercatorZfromAltitude(1,t.center.lat)*l;const e=t._fov*(.5+t.centerOffset.y/t.height),i=t.elevation?t.elevation.getMinElevationBelowMSL()*s:0,h=(t._camera.position[2]*l-i)/Math.cos(t._pitch);o=n*(Math.sin(e)*h/Math.sin(y.clamp(Math.PI-a-e,.01,Math.PI-.01)))+h;const c=h*(1/t._horizonShift);r=Math.min(1.01*o,c)}else{o=n*(Math.sin(this.halfFov)*this.cameraToCenterDistance/Math.sin(Math.PI-a-this.halfFov))+this.cameraToCenterDistance,r=1.01*o}this.cameraTranslateZ=(new u.Matrix4).makeTranslation(0,0,this.cameraToCenterDistance);const h=t.height/50,c=Math.max(h*n,h),d=t.height,p=t.width;this.camera instanceof u.OrthographicCamera?this.camera.projectionMatrix=y.makeOrthographicMatrix(p/-2,p/2,d/2,d/-2,c,r):this.camera.projectionMatrix=y.makePerspectiveMatrix(t._fov,p/d,c,r),this.camera.projectionMatrix.elements[8]=2*-i.x/t.width,this.camera.projectionMatrix.elements[9]=2*i.y/t.height;let m=this.calcCameraMatrix(t._pitch,t.angle);t.elevation&&(m.elements[14]=t._camera.position[2]*l),this.camera.matrixWorld.copy(m);let f=t.scale*this.state.worldSizeRatio,g=new u.Matrix4,b=new u.Matrix4,x=new u.Matrix4;g.makeScale(f,f,f);let w=t.x||t.point.x,M=t.y||t.point.y;b.makeTranslation(-w,M,0),x.makeRotationZ(Math.PI),this.world.matrix=(new u.Matrix4).premultiply(x).premultiply(this.state.translateCenter).premultiply(g).premultiply(b),this.map.fire("CameraSynced",{detail:{nearZ:c,farZ:r,pitch:t._pitch,angle:t.angle,furthestDistance:o,cameraToCenterDistance:this.cameraToCenterDistance,t:this.map.transform,tbProjMatrix:this.camera.projectionMatrix.elements,tbWorldMatrix:this.world.matrix.elements,cameraSyn:v}})},worldSize(){let e=this.map.transform;return e.tileSize*e.scale},worldSizeFromZoom(){let e=this.map.transform;return Math.pow(2,e.zoom)*e.tileSize},mercatorZfromAltitude(e,t){return e/this.circumferenceAtLatitude(t)},mercatorZfromZoom(){return this.cameraToCenterDistance/this.worldSizeFromZoom()},circumferenceAtLatitude:e=>g.EARTH_CIRCUMFERENCE*Math.cos(e*Math.PI/180),calcCameraMatrix(e,t,i){const r=this.map.transform,o=void 0===e?r._pitch:e,a=void 0===t?r.angle:t,n=void 0===i?this.cameraTranslateZ:i;return(new u.Matrix4).premultiply(n).premultiply((new u.Matrix4).makeRotationX(o)).premultiply((new u.Matrix4).makeRotationZ(a))},updateCameraState(){let e=this.map.transform;if(!e.height)return;const t=e._camera.forward(),i=e.cameraToCenterDistance,r=e.point;e._cameraZoom?e._cameraZoom:e._zoom;const o=this.mercatorZfromZoom(e)-this.mercatorZfromAltitude(e._centerAltitude,e.center.lat),a=e.cameraToCenterDistance/o;return[r.x/this.worldSize()-t[0]*i/a,r.y/this.worldSize()-t[1]*i/a,this.mercatorZfromAltitude(e._centerAltitude,e._center.lat)+-t[2]*i/a]},getWorldToCamera(e,t){let i=this.map.transform;const r=new u.Matrix4,o=new u.Matrix4,a=i._camera._orientation,n=i._camera.position,s=new u.Vector3(n[0],n[1],n[2]),l=new u.Quaternion;l.set(a[0],a[1],a[2],a[3]);const h=l.conjugate();return s.multiplyScalar(-e),o.makeTranslation(s.x,s.y,s.z),r.makeRotationFromQuaternion(h).premultiply(o),r.elements[1]*=-1,r.elements[5]*=-1,r.elements[9]*=-1,r.elements[13]*=-1,r.elements[8]*=t,r.elements[9]*=t,r.elements[10]*=t,r.elements[11]*=t,r},translate(e,t,i){let r,o,a,n,s,l,h,c,u,d,p,m,f=i[0]||i.x,g=i[1]||i.y,b=i[2]||i.z;return t===e?(e[12]=t[0]*f+t[4]*g+t[8]*b+t[12],e[13]=t[1]*f+t[5]*g+t[9]*b+t[13],e[14]=t[2]*f+t[6]*g+t[10]*b+t[14],e[15]=t[3]*f+t[7]*g+t[11]*b+t[15]):(r=t[0],o=t[1],a=t[2],n=t[3],s=t[4],l=t[5],h=t[6],c=t[7],u=t[8],d=t[9],p=t[10],m=t[11],e[0]=r,e[1]=o,e[2]=a,e[3]=n,e[4]=s,e[5]=l,e[6]=h,e[7]=c,e[8]=u,e[9]=d,e[10]=p,e[11]=m,e[12]=r*f+s*g+u*b+t[12],e[13]=o*f+l*g+d*b+t[13],e[14]=a*f+h*g+p*b+t[14],e[15]=n*f+c*g+m*b+t[15]),e}};var x=Math.PI,w=Math.sin,M=Math.cos,j=Math.tan,S=Math.asin,O=Math.atan2,L=Math.acos,C=x/180,_=864e5,P=2440588,D=2451545;function z(e){return e.valueOf()/_-.5+P}function T(e){return new Date((e+.5-P)*_)}function F(e){return z(e)-D}var E=23.4397*C;function A(e,t){return O(w(e)*M(E)-j(t)*w(E),M(e))}function R(e,t){return S(w(t)*M(E)+M(t)*w(E)*w(e))}function k(e,t,i){return O(w(e),M(e)*w(t)-j(i)*M(t))}function H(e,t,i){return S(w(t)*w(i)+M(t)*M(i)*M(e))}function B(e,t){return C*(280.16+360.9856235*e)-t}function I(e){return C*(357.5291+.98560028*e)}function N(e){return e+C*(1.9148*w(e)+.02*w(2*e)+3e-4*w(3*e))+102.9372*C+x}function V(e){var t=N(I(e));return{dec:R(t,0),ra:A(t,0)}}var W={getPosition:function(e,t,i){var r=C*-i,o=C*t,a=F(e),n=V(a),s=B(a,r)-n.ra;return{azimuth:k(s,o,n.dec),altitude:H(s,o,n.dec)}},toJulian:function(e){return z(e)}},G=W.times=[[-.833,"sunrise","sunset"],[-.3,"sunriseEnd","sunsetStart"],[-6,"dawn","dusk"],[-12,"nauticalDawn","nauticalDusk"],[-18,"nightEnd","night"],[6,"goldenHourEnd","goldenHour"]];W.addTime=function(e,t,i){G.push([e,t,i])};var Z=9e-4;function q(e,t,i){return Z+(e+t)/(2*x)+i}function U(e,t,i){return D+e+.0053*w(t)-.0069*w(2*i)}function Q(e,t,i,r,o,a,n){var s=function(e,t,i){return L((w(e)-w(t)*w(i))/(M(t)*M(i)))}(e,i,r);return U(q(s,t,o),a,n)}function J(e){var t=C*(134.963+13.064993*e),i=C*(93.272+13.22935*e),r=C*(218.316+13.176396*e)+6.289*C*w(t),o=5.128*C*w(i),a=385001-20905*M(t);return{ra:A(r,o),dec:R(r,o),dist:a}}function X(e,t){return new Date(e.valueOf()+t*_/24)}W.getTimes=function(e,t,i,r){var o,a,n,s,l,h=C*-i,c=C*t,u=function(e){return-2.076*Math.sqrt(e)/60}(r=r||0),d=function(e,t){return Math.round(e-Z-t/(2*x))}(F(e),h),p=q(0,h,d),m=I(p),f=N(m),g=R(f,0),b=U(p,m,f),y={solarNoon:T(b),nadir:T(b-.5)};for(o=0,a=G.length;o<a;o+=1)l=b-((s=Q(((n=G[o])[0]+u)*C,h,c,g,d,m,f))-b),y[n[1]]=T(l),y[n[2]]=T(s);return y},W.getMoonPosition=function(e,t,i){var r=C*-i,o=C*t,a=F(e),n=J(a),s=B(a,r)-n.ra,l=H(s,o,n.dec),h=O(w(s),j(o)*M(n.dec)-w(n.dec)*M(s));return l+=function(e){return e<0&&(e=0),2967e-7/Math.tan(e+.00312536/(e+.08901179))}(l),{azimuth:k(s,o,n.dec),altitude:l,distance:n.dist,parallacticAngle:h}},W.getMoonIllumination=function(e){var t=F(e||new Date),i=V(t),r=J(t),o=149598e3,a=L(w(i.dec)*w(r.dec)+M(i.dec)*M(r.dec)*M(i.ra-r.ra)),n=O(o*w(a),r.dist-o*M(a)),s=O(M(i.dec)*w(i.ra-r.ra),w(i.dec)*M(r.dec)-M(i.dec)*w(r.dec)*M(i.ra-r.ra));return{fraction:(1+M(n))/2,phase:.5+.5*n*(s<0?-1:1)/Math.PI,angle:s}},W.getMoonTimes=function(e,t,i,r){var o=new Date(e);r?o.setUTCHours(0,0,0,0):o.setHours(0,0,0,0);for(var a,n,s,l,h,c,u,d,p,m,f,g,b,y=.133*C,v=W.getMoonPosition(o,t,i).altitude-y,x=1;x<=24&&(a=W.getMoonPosition(X(o,x),t,i).altitude-y,d=((h=(v+(n=W.getMoonPosition(X(o,x+1),t,i).altitude-y))/2-a)*(u=-(c=(n-v)/2)/(2*h))+c)*u+a,m=0,(p=c*c-4*h*a)>=0&&(f=u-(b=Math.sqrt(p)/(2*Math.abs(h))),g=u+b,Math.abs(f)<=1&&m++,Math.abs(g)<=1&&m++,f<-1&&(f=g)),1===m?v<0?s=x+f:l=x+f:2===m&&(s=x+(d<0?g:f),l=x+(d<0?f:g)),!s||!l);x+=2)v=n;var w={};return s&&(w.rise=X(o,s)),l&&(w.set=X(o,l)),s||l||(w[d>0?"alwaysUp":"alwaysDown"]=!0),w};var K={material:"MeshBasicMaterial",color:"black",opacity:1};function Y(e){var t;function i(){return new u[K.material]({color:K.color})}return e?((t=(e=y._validate(e,K)).material&&e.material.isMaterial?e.material:e.material||e.color||e.opacity?new u[e.material]({color:e.color,transparent:e.opacity<1}):i()).opacity=e.opacity,e.side&&(t.side=e.side)):t=i(),t}function $(e){this.map=e,this.enrolledObjects=[],this.previousFrameTime}$.prototype={unenroll:function(e){this.enrolledObjects.splice(this.enrolledObjects.indexOf(e),1)},enroll:function(e){if(e.clock=new u.Clock,e.hasDefaultAnimation=!1,e.defaultAction,e.actions=[],e.mixer,e.animations&&e.animations.length>0){e.hasDefaultAnimation=!0;let i=e.userData.defaultAnimation?e.userData.defaultAnimation:0;e.mixer=new u.AnimationMixer(e),t(i)}function t(t){for(let i=0;i<e.animations.length;i++){t>e.animations.length&&console.log("The animation index "+t+" doesn't exist for this object");let r=e.animations[i],o=e.mixer.clipAction(r);e.actions.push(o),t===i?(e.defaultAction=o,o.setEffectiveWeight(1)):o.setEffectiveWeight(0),o.play()}}let i=!1;Object.defineProperty(e,"isPlaying",{get:()=>i,set(t){i!=t&&(i=t,e.dispatchEvent({type:"IsPlayingChanged",detail:e}))}}),this.enrolledObjects.push(e),e.animationQueue=[],e.set=function(t){if(t.duration>0){let i={start:Date.now(),expiration:Date.now()+t.duration,endState:{}};y.extend(t,i);let r=t.coords,o=t.rotation,a=t.scale||t.scaleX||t.scaleY||t.scaleZ;if(o){let i=e.rotation;t.startRotation=[i.x,i.y,i.z],t.endState.rotation=y.types.rotation(t.rotation,t.startRotation),t.rotationPerMs=t.endState.rotation.map(function(e,i){return(e-t.startRotation[i])/t.duration})}if(a){let i=e.scale;t.startScale=[i.x,i.y,i.z],t.endState.scale=y.types.scale(t.scale,t.startScale),t.scalePerMs=t.endState.scale.map(function(e,i){return(e-t.startScale[i])/t.duration})}r&&(t.pathCurve=new u.CatmullRomCurve3(y.lnglatsToWorld([e.coordinates,t.coords])));let n={type:"set",parameters:t};this.animationQueue.push(n),tb.map.repaint=!0}else this.stop(),t.rotation=y.radify(t.rotation),this._setObject(t);return this},e.animationMethod=null,e.stop=function(t){return e.mixer&&(e.isPlaying=!1,cancelAnimationFrame(e.animationMethod)),this.animationQueue=[],this},e.followPath=function(e,t){let i={type:"followPath",parameters:y._validate(e,ee.followPath)};return y.extend(i.parameters,{pathCurve:new u.CatmullRomCurve3(y.lnglatsToWorld(e.path)),start:Date.now(),expiration:Date.now()+i.parameters.duration,cb:t}),this.animationQueue.push(i),tb.map.repaint=!0,this},e._setObject=function(t){e.setScale();let i=t.position,r=t.rotation,o=t.scale,a=t.worldCoordinates,n=t.quaternion,s=t.translate,l=t.worldTranslate;if(i){this.coordinates=i;let e=y.projectToWorld(i);this.position.copy(e)}if(s){this.coordinates=[this.coordinates[0]+s[0],this.coordinates[1]+s[1],this.coordinates[2]+s[2]];let e=y.projectToWorld(s);this.position.copy(e),t.position=this.coordinates}if(l){this.translateX(l.x),this.translateY(l.y),this.translateZ(l.z);let e=y.unprojectFromWorld(this.position);this.coordinates=t.position=e}if(r&&(this.rotation.set(r[0],r[1],r[2]),t.rotation=new u.Vector3(r[0],r[1],r[2])),o&&(this.scale.set(o[0],o[1],o[2]),t.scale=this.scale),n&&(this.quaternion.setFromAxisAngle(n[0],n[1]),t.rotation=n[0].multiplyScalar(n[1])),a){this.position.copy(a);let e=y.unprojectFromWorld(a);this.coordinates=t.position=e}this.setBoundingBoxShadowFloor(),this.setReceiveShadowFloor(),this.updateMatrixWorld(),tb.map.repaint=!0;let h={type:"ObjectChanged",detail:{object:this,action:{position:t.position,rotation:t.rotation,scale:t.scale}}};this.dispatchEvent(h)},e.playDefault=function(t){if(e.mixer&&e.hasDefaultAnimation){let i={start:Date.now(),expiration:Date.now()+t.duration,endState:{}};y.extend(t,i),e.mixer.timeScale=t.speed||1;let r={type:"playDefault",parameters:t};return this.animationQueue.push(r),tb.map.repaint=!0,this}},e.playAnimation=function(i){e.mixer&&(i.animation&&t(i.animation),e.playDefault(i))},e.pauseAllActions=function(){e.mixer&&e.actions.forEach(function(e){e.paused=!0})},e.unPauseAllActions=function(){e.mixer&&e.actions.forEach(function(e){e.paused=!1})},e.deactivateAllActions=function(){e.mixer&&e.actions.forEach(function(e){e.stop()})},e.activateAllActions=function(){e.mixer&&e.actions.forEach(function(e){e.play()})},e.idle=function(){return e.mixer&&e.mixer.update(.01),tb.map.repaint=!0,this}},update:function(e){if(void 0===this.previousFrameTime&&(this.previousFrameTime=e),!this.enrolledObjects)return!1;for(let t=this.enrolledObjects.length-1;t>=0;t--){let i=this.enrolledObjects[t];if(i.animationQueue&&0!==i.animationQueue.length)for(let t=i.animationQueue.length-1;t>=0;t--){let r=i.animationQueue[t];if(!r)continue;let o=r.parameters;if(!o.expiration)return i.animationQueue.splice(t,1),void(i.animationQueue[t]&&(i.animationQueue[t].parameters.start=e));if(e>=o.expiration)o.expiration=!1,"playDefault"===r.type?i.stop():(o.endState&&i._setObject(o.endState),void 0!==o.cb&&o.cb());else{let t=(e-o.start)/o.duration;if("set"===r.type){let e={};o.pathCurve&&(e.worldCoordinates=o.pathCurve.getPoint(t)),o.rotationPerMs&&(e.rotation=o.startRotation.map(function(e,i){return e+o.rotationPerMs[i]*t*o.duration})),o.scalePerMs&&(e.scale=o.startScale.map(function(e,i){return e+o.scalePerMs[i]*t*o.duration})),i._setObject(e)}if("followPath"===r.type){let e={worldCoordinates:o.pathCurve.getPointAt(t)};if(o.trackHeading){let i=o.pathCurve.getTangentAt(t).normalize(),r=new u.Vector3(0,0,0),a=new u.Vector3(0,1,0);r.crossVectors(a,i).normalize();let n=Math.acos(a.dot(i));e.quaternion=[r,n]}i._setObject(e)}"playDefault"===r.type&&(i.activateAllActions(),i.isPlaying=!0,i.animationMethod=requestAnimationFrame(this.update),i.mixer.update(i.clock.getDelta()),tb.map.repaint=!0)}}}this.previousFrameTime=e}};const ee={followPath:{path:null,duration:1e3,trackHeading:!0}};class te extends u.Object3D{constructor(e){super(),this.element=e||document.createElement("div"),this.element.style.position="absolute",this.element.style.userSelect="none",this.element.setAttribute("draggable",!1),this.alwaysVisible=!1,Object.defineProperty(this,"layer",{get(){return this.parent&&this.parent.parent?this.parent.parent.layer:null}}),this.dispose=function(){this.remove(),this.element=null},this.remove=function(){this.element instanceof Element&&null!==this.element.parentNode&&this.element.parentNode.removeChild(this.element)},this.addEventListener("removed",function(){this.remove()})}copy(e,t){return super.copy(e,t),this.element=e.element.cloneNode(!0),this}}te.prototype.isCSS2DObject=!0;const ie=new u.Vector3,re=new u.Matrix4,oe=new u.Matrix4,ae=new u.Vector3,ne=new u.Vector3;class se{constructor(){const e=this;let t,i,r,o;const a={objects:new WeakMap,list:new Map};this.cacheList=a.list;const n=document.createElement("div");function s(t,i,h){if(t.isCSS2DObject)if(t.visible){t.onBeforeRender(e,i,h),ie.setFromMatrixPosition(t.matrixWorld),ie.applyMatrix4(oe);const s=t.element;var c;c=/apple/i.test(navigator.vendor)?"translate(-50%,-50%) translate("+Math.round(ie.x*r+r)+"px,"+Math.round(-ie.y*o+o)+"px)":"translate(-50%,-50%) translate("+(ie.x*r+r)+"px,"+(-ie.y*o+o)+"px)",s.style.WebkitTransform=c,s.style.MozTransform=c,s.style.oTransform=c,s.style.transform=c,s.style.display=t.visible&&ie.z>=-1&&ie.z<=1?"":"none";const u={distanceToCameraSquared:l(h,t)};a.objects.set({key:t.uuid},u),a.list.set(t.uuid,t),s.parentNode!==n&&n.appendChild(s),t.onAfterRender(e,i,h)}else a.objects.delete({key:t.uuid}),a.list.delete(t.uuid),t.remove();for(let e=0,r=t.children.length;e<r;e++)s(t.children[e],i,h)}function l(e,t){return ae.setFromMatrixPosition(e.matrixWorld),ne.setFromMatrixPosition(t.matrixWorld),ae.distanceToSquared(ne)}n.style.overflow="hidden",this.domElement=n,this.getSize=function(){return{width:t,height:i}},this.render=function(e,t){!0===e.autoUpdate&&e.updateMatrixWorld(),null===t.parent&&t.updateMatrixWorld(),re.copy(t.matrixWorldInverse),oe.multiplyMatrices(t.projectionMatrix,re),s(e,e,t),function(e){const t=function(e){const t=[];return e.traverse(function(e){e.isCSS2DObject&&t.push(e)}),t}(e).sort(function(e,t){let i=a.objects.get({key:e.uuid}),r=a.objects.get({key:t.uuid});if(i&&r){return i.distanceToCameraSquared-r.distanceToCameraSquared}}),i=t.length;for(let r=0,o=t.length;r<o;r++)t[r].element.style.zIndex=i-r}(e)},this.setSize=function(e,a){t=e,i=a,r=t/2,o=i/2,n.style.width=e+"px",n.style.height=a+"px"}}}function le(){}function he(e){let t=(e=y._validate(e,le.prototype._defaults.Object3D)).obj;const i=y.types.rotation(e.rotation,[0,0,0]),r=y.types.scale(e.scale,[1,1,1]);t.rotation.set(i[0],i[1],i[2]),t.scale.set(r[0],r[1],r[2]),t.name="model";let o=le.prototype._makeGroup(t,e);return e.obj.name="model",le.prototype._addMethods(o),o.setAnchor(e.anchor),o.setCenter(e.adjustment),o.raycasted=e.raycasted,o.visibility=!0,o}function ce(e){e=y._validate(e,le.prototype._defaults.extrusion);let t=ce.prototype.buildShape(e.coordinates),i=ce.prototype.buildGeometry(t,e.geometryOptions),r=new u.Mesh(i,e.materials);return e.obj=r,new he(e)}le.prototype={line:function(e){e=y._validate(e,this._defaults.line);var t=y.lnglatsToWorld(e.geometry),i=y.normalizeVertices(t),r=y.flattenVectors(i.vertices),o=new Float32Array(r),a=new u.BufferGeometry;a.setAttribute("position",new u.BufferAttribute(o,3));var n=new u.LineBasicMaterial({color:16711680,linewidth:21}),s=new u.Line(a,n);return s.options=options||{},s.position.copy(i.position),s},extrusion:function(e){},unenroll:function(e,t){t||this.animationManager.unenroll(e)},_addMethods:function(e,t){var i=this;const r="label",o="tooltip",a="help",n="shadowPlane";if(t);else{let t=function(e,t,i,r){let o=y.radify(r);e.position.sub(t),e.position.applyAxisAngle(i,o),e.position.add(t),e.rotateOnAxis(i,o),tb.map.repaint=!0},s=function(e){return Math.pow(2,e)};e.coordinates||(e.coordinates=[0,0,0]),Object.defineProperty(e,"model",{get:()=>e.getObjectByName("model")}),Object.defineProperty(e,"animations",{get(){const t=e.model;return t?t.animations:null}}),i.animationManager.enroll(e),e.setCoords=function(t){return e.userData.topMargin&&e.userData.feature&&(t[2]+=((e.userData.feature.properties.height||0)-(e.userData.feature.properties.base_height||e.userData.feature.properties.min_height||0))*(e.userData.topMargin||0)),e.coordinates=t,e.set({position:t}),e},e.setTranslate=function(t){return e.set({translate:t}),e},e.setRotation=function(t){"number"==typeof t&&(t={z:t});var i={x:y.radify(t.x)||e.rotation.x,y:y.radify(t.y)||e.rotation.y,z:y.radify(t.z)||e.rotation.z};e._setObject({rotation:[i.x,i.y,i.z]})},e.calculateAdjustedPosition=function(t,i,r){let o=t.slice(),a=y.unprojectFromWorld(e.modelSize);return r?(o[0]-=0!=i.x?a[0]/i.x:0,o[1]-=0!=i.y?a[1]/i.y:0,o[2]-=0!=i.z?a[2]/i.z:0):(o[0]+=0!=i.x?a[0]/i.x:0,o[1]+=0!=i.y?a[1]/i.y:0,o[2]+=0!=i.z?a[2]/i.z:0),o},e.setRotationAxis=function(i){"number"==typeof i&&(i={z:i});let r=e.modelBox(),o=new u.Vector3(r.max.x,r.max.y,r.min.z);0!=i.x&&t(e,o,new u.Vector3(0,0,1),i.x),0!=i.y&&t(e,o,new u.Vector3(0,0,1),i.y),0!=i.z&&t(e,o,new u.Vector3(0,0,1),i.z)},Object.defineProperty(e,"scaleGroup",{get:()=>e.getObjectByName("scaleGroup")}),Object.defineProperty(e,"boxGroup",{get:()=>e.getObjectByName("boxGroup")}),Object.defineProperty(e,"boundingBox",{get:()=>e.getObjectByName("boxModel")}),Object.defineProperty(e,"boundingBoxShadow",{get:()=>e.getObjectByName("boxShadow")}),e.drawBoundingBox=function(){let t=e.box3(),i=new u.Group;i.name="boxGroup",i.updateMatrixWorld(!0);let r=new u.Box3Helper(t,le.prototype._defaults.colors.yellow);r.name="boxModel",i.add(r),r.layers.disable(0);let o=t.clone();o.max.z=o.min.z;let a=new u.Box3Helper(o,le.prototype._defaults.colors.black);a.name="boxShadow",i.add(a),a.layers.disable(0),i.visible=!1,e.scaleGroup.add(i),e.setBoundingBoxShadowFloor()},e.setBoundingBoxShadowFloor=function(){if(e.boundingBoxShadow){let t=-e.modelHeight,i=e.rotation,r=e.boundingBoxShadow;r.box.max.z=r.box.min.z=t,r.rotation.y=i.y,r.rotation.x=-i.x}},e.setAnchor=function(t){const i=e.box3(),r=i.getCenter(new u.Vector3);switch(e.none={x:0,y:0,z:0},e.center={x:r.x,y:r.y,z:i.min.z},e.bottom={x:r.x,y:i.max.y,z:i.min.z},e.bottomLeft={x:i.max.x,y:i.max.y,z:i.min.z},e.bottomRight={x:i.min.x,y:i.max.y,z:i.min.z},e.top={x:r.x,y:i.min.y,z:i.min.z},e.topLeft={x:i.max.x,y:i.min.y,z:i.min.z},e.topRight={x:i.min.x,y:i.min.y,z:i.min.z},e.left={x:i.max.x,y:r.y,z:i.min.z},e.right={x:i.min.x,y:r.y,z:i.min.z},t){case"center":e.anchor=e.center;break;case"top":e.anchor=e.top;break;case"top-left":e.anchor=e.topLeft;break;case"top-right":e.anchor=e.topRight;break;case"left":e.anchor=e.left;break;case"right":e.anchor=e.right;break;case"bottom":e.anchor=e.bottom;break;case"bottom-left":default:e.anchor=e.bottomLeft;break;case"bottom-right":e.anchor=e.bottomRight;break;case"auto":case"none":e.anchor=e.none}e.model.position.set(-e.anchor.x,-e.anchor.y,-e.anchor.z)},e.setCenter=function(t){if(t&&(0!=t.x||0!=t.y||0!=t.z)){let i=e.getSize();e.anchor={x:e.anchor.x-i.x*t.x,y:e.anchor.y-i.y*t.y,z:e.anchor.z-i.z*t.z},e.model.position.set(-e.anchor.x,-e.anchor.y,-e.anchor.z)}},Object.defineProperty(e,"label",{get:()=>e.getObjectByName(r)}),Object.defineProperty(e,"tooltip",{get:()=>e.getObjectByName(o)}),Object.defineProperty(e,"help",{get:()=>e.getObjectByName(a)});let l=!1;Object.defineProperty(e,"hidden",{get:()=>l,set(t){l!=t&&(l=t,e.visibility=!l)}}),Object.defineProperty(e,"visibility",{get:()=>e.visible,set(t){let i=t;if("visible"==t||1==t)i=!0,e.label&&(e.label.visible=i);else{if("none"!=t&&0!=t)return;i=!1,e.label&&e.label.alwaysVisible&&(e.label.visible=i),e.tooltip&&(e.tooltip.visible=i)}if(e.visible!=i){if(e.hidden&&i)return;e.visible=i,e.model&&e.model.traverse(function(t){"Mesh"!=t.type&&"SkinnedMesh"!=t.type||(i&&e.raycasted?t.layers.enable(0):t.layers.disable(0)),"LineSegments"==t.type&&t.layers.disableAll()})}}}),e.addLabel=function(t,i,r,o){t&&e.drawLabelHTML(t,i,r,o)},e.removeLabel=function(){e.removeCSS2D(r)},e.drawLabelHTML=function(t,o=!1,a=e.anchor,n=.5){let s=i.drawLabelHTML(t,le.prototype._defaults.label.cssClass),l=e.addCSS2D(s,r,a,n);return l.alwaysVisible=o,l.visible=o,l},e.addTooltip=function(t,i,r,a=!0,n=1){let s=e.addHelp(t,o,i,r,n);s.visible=!1,s.custom=a},e.removeTooltip=function(){e.removeCSS2D(o)},e.addHelp=function(t,r=a,o=!1,n=e.anchor,s=0){let l=i.drawTooltip(t,o),h=e.addCSS2D(l,r,n,s);return h.visible=!0,h},e.removeHelp=function(){e.removeCSS2D(a)},e.addCSS2D=function(t,i,r=e.anchor,o=1){if(t){const a=e.box3(),n=a.getSize(new u.Vector3);let s={x:a.max.x,y:a.max.y,z:a.min.z};e.removeCSS2D(i);let l=new te(t);return l.name=i,l.position.set(.5*-n.x-e.model.position.x-r.x+s.x,.5*-n.y-e.model.position.y-r.y+s.y,n.z*o),l.visible=!1,e.scaleGroup.add(l),l}},e.removeCSS2D=function(t){let i=e.getObjectByName(t);if(i){i.dispose();let t=e.scaleGroup.children;t.splice(t.indexOf(i),1)}},Object.defineProperty(e,"shadowPlane",{get:()=>e.getObjectByName(n)});let h=!1;Object.defineProperty(e,"castShadow",{get:()=>h,set(t){if(e.model&&h!==t){if(e.model.traverse(function(e){e.isMesh&&(e.castShadow=!0)}),t){const i=e.modelSize,r=[i.x,i.y,i.z,e.modelHeight],o=10*Math.max(...r),a=new u.PlaneGeometry(o,o),s=new u.ShadowMaterial;s.opacity=.5;let l=new u.Mesh(a,s);l.name=n,l.layers.enable(1),l.layers.disable(0),l.receiveShadow=t,e.add(l)}else e.traverse(function(t){t.isMesh&&t.material instanceof u.ShadowMaterial&&e.remove(t)});h=t}}}),e.setReceiveShadowFloor=function(){if(e.castShadow){let t=e.shadowPlane,i=t.position,r=t.rotation;if(i.z=-e.modelHeight,r.y=e.rotation.y,r.x=-e.rotation.x,"meters"===e.userData.units){const r=e.modelSize,o=[r.x,r.y,r.z,-i.z],a=10*Math.max(...o)/t.geometry.parameters.width;t.scale.set(a,a,a)}}};let c=!1;Object.defineProperty(e,"receiveShadow",{get:()=>c,set(t){e.model&&c!==t&&(e.model.traverse(function(e){e.isMesh&&(e.receiveShadow=!0)}),c=t)}});let d=!1;Object.defineProperty(e,"wireframe",{get:()=>d,set(t){e.model&&d!==t&&(e.model.traverse(function(e){if("Mesh"==e.type||"SkinnedMesh"==e.type){let i=[];Array.isArray(e.material)?i=e.material:i.push(e.material);let r=i[0];t?(e.userData.materials=r,e.material=r.clone(),e.material.wireframe=e.material.transparent=t,e.material.opacity=.3):(e.material.dispose(),e.material=e.userData.materials,e.userData.materials.dispose(),e.userData.materials=null),t?(e.layers.disable(0),e.layers.enable(1)):(e.layers.disable(1),e.layers.enable(0))}"LineSegments"==e.type&&e.layers.disableAll()}),d=t,e.dispatchEvent({type:"Wireframed",detail:e}))}});let p=null;Object.defineProperty(e,"color",{get:()=>p,set(t){e.model&&p!==t&&(e.model.traverse(function(e){if("Mesh"==e.type||"SkinnedMesh"==e.type){let i=[];Array.isArray(e.material)?i=e.material:i.push(e.material);let r=i[0];t?(e.userData.materials=r,e.material=new u.MeshStandardMaterial,e.material.color.setHex(t)):(e.material.dispose(),e.material=e.userData.materials,e.userData.materials.dispose(),e.userData.materials=null)}}),p=t)}});let m=!1;Object.defineProperty(e,"selected",{get:()=>m,set(t){t?(e.userData.bbox&&!e.boundingBox&&e.drawBoundingBox(),e.boxGroup&&(e.boundingBox.material=le.prototype._defaults.materials.boxSelectedMaterial,e.boundingBox.parent.visible=!0,e.boundingBox.layers.enable(1),e.boundingBoxShadow.layers.enable(1)),e.label&&!e.label.alwaysVisible&&(e.label.visible=!0)):(e.boxGroup&&e.remove(e.boxGroup),e.label&&!e.label.alwaysVisible&&(e.label.visible=!1),e.removeHelp()),e.tooltip&&(e.tooltip.visible=t),m!=t&&(m=t,e.dispatchEvent({type:"SelectedChange",detail:e}))}});let f=!0;Object.defineProperty(e,"raycasted",{get:()=>f,set(t){e.model&&f!==t&&(e.model.traverse(function(e){"Mesh"!=e.type&&"SkinnedMesh"!=e.type||(t?(e.layers.disable(1),e.layers.enable(0)):(e.layers.disable(0),e.layers.enable(1)))}),f=t)}});let g=!1;Object.defineProperty(e,"over",{get:()=>g,set(t){t?(e.selected||(e.userData.bbox&&!e.boundingBox&&e.drawBoundingBox(),e.userData.tooltip&&!e.tooltip&&e.addTooltip(e.uuid,!0,e.anchor,!1),e.boxGroup&&(e.boundingBox.material=le.prototype._defaults.materials.boxOverMaterial,e.boundingBox.parent.visible=!0,e.boundingBox.layers.enable(1),e.boundingBoxShadow.layers.enable(1))),e.label&&!e.label.alwaysVisible&&(e.label.visible=!0),e.dispatchEvent({type:"ObjectMouseOver",detail:e})):(e.selected||(e.boxGroup&&(e.remove(e.boxGroup),e.tooltip&&!e.tooltip.custom&&e.removeTooltip()),e.label&&!e.label.alwaysVisible&&(e.label.visible=!1)),e.dispatchEvent({type:"ObjectMouseOut",detail:e})),e.tooltip&&(e.tooltip.visible=t||e.selected),g=t}}),e.box3=function(){let t;if(e.updateMatrix(),e.updateMatrixWorld(!0,!0),e.model){let i=e.clone(!0),r=e.model.clone();if(t=(new u.Box3).setFromObject(r),e.parent){let o=new u.Matrix4,a=new u.Matrix4;e.matrix.extractRotation(o),a.copy(o).invert(),i.setRotationFromMatrix(a),t=(new u.Box3).setFromObject(r)}}return t},e.modelBox=function(){return e.box3()},e.getSize=function(){return e.box3().getSize(new u.Vector3(0,0,0))};let b=!1;Object.defineProperty(e,"modelSize",{get:()=>(b=e.getSize(),b),set(e){b!=e&&(b=e)}}),Object.defineProperty(e,"modelHeight",{get(){let t=e.coordinates[2]||0;return"scene"===e.userData.units&&(t*=e.unitsPerMeter/e.scale.x),t}}),Object.defineProperty(e,"unitsPerMeter",{get:()=>Number(y.projectedUnitsPerMeter(e.coordinates[1]).toFixed(7))}),Object.defineProperty(e,"fixedZoom",{get:()=>e.userData.fixedZoom,set(t){e.userData.fixedZoom!==t&&(e.userData.fixedZoom=t,e.userData.units=t?"scene":"meters")}}),e.setFixedZoom=function(t){if(null!=e.fixedZoom&&0!=e.fixedZoom){t||(t=e.userData.mapScale);let i=s(e.fixedZoom);if(i>t){let r=i/t;e.scale.set(r,r,r)}else e.scale.set(1,1,1)}},e.setScale=function(t){if("scene"!=e.userData.units){let t=e.unitsPerMeter;e.scale.set(t,t,t)}else e.fixedZoom?(t&&(e.userData.mapScale=t),e.setFixedZoom(e.userData.mapScale)):e.scale.set(1,1,1)},e.setObjectScale=function(t){e.setScale(t),e.setBoundingBoxShadowFloor(),e.setReceiveShadowFloor()}}e.add=function(t){return e.scaleGroup.add(t),t.position.z=e.coordinates[2]?-e.coordinates[2]:0,t},e.remove=function(t){t&&(t.traverse(e=>{if(e.geometry&&e.geometry.dispose(),e.material)if(e.material.isMaterial)s(e.material);else for(const t of e.material)s(t);e.dispose&&e.dispose()}),e.scaleGroup.remove(t),tb.map.repaint=!0)},e.duplicate=function(t){let r=e.clone(!0);if(r.getObjectByName("model").animations=e.animations,r.userData.feature&&(t&&t.feature&&(r.userData.feature=t.feature),r.userData.feature.properties.uuid=r.uuid),i._addMethods(r),!t||y.equal(t.scale,e.userData.scale))return r.copyAnchor(e),r;{r.userData=t,r.userData.isGeoGroup=!0,r.remove(r.boxGroup);const e=y.types.rotation(t.rotation,[0,0,0]),i=y.types.scale(t.scale,[1,1,1]);return r.model.position.set(0,0,0),r.model.rotation.set(e[0],e[1],e[2]),r.model.scale.set(i[0],i[1],i[2]),r.setAnchor(t.anchor),r.setCenter(t.adjustment),r}},e.copyAnchor=function(t){e.anchor=t.anchor,e.none={x:0,y:0,z:0},e.center=t.center,e.bottom=t.bottom,e.bottomLeft=t.bottomLeft,e.bottomRight=t.bottomRight,e.top=t.top,e.topLeft=t.topLeft,e.topRight=t.topRight,e.left=t.left,e.right=t.right},e.dispose=function(){le.prototype.unenroll(e),e.traverse(e=>{if((!e.parent||"world"!=e.parent.name)&&"threeboxObject"!==e.name){if(e.geometry&&e.geometry.dispose(),e.material)if(e.material.isMaterial)s(e.material);else for(const t of e.material)s(t);e.dispose&&e.dispose()}}),e.children=[]};const s=e=>{e.dispose();for(const i of Object.keys(e)){const t=e[i];t&&"object"==typeof t&&"minFilter"in t&&t.dispose()}let t=e;(t.map||t.alphaMap||t.aoMap||t.bumpMap||t.displacementMap||t.emissiveMap||t.envMap||t.lightMap||t.metalnessMap||t.normalMap||t.roughnessMap)&&(t.map&&t.map.dispose(),t.alphaMap&&t.alphaMap.dispose(),t.aoMap&&t.aoMap.dispose(),t.bumpMap&&t.bumpMap.dispose(),t.displacementMap&&t.displacementMap.dispose(),t.emissiveMap&&t.emissiveMap.dispose(),t.envMap&&t.envMap.dispose(),t.lightMap&&t.lightMap.dispose(),t.metalnessMap&&t.metalnessMap.dispose(),t.normalMap&&t.normalMap.dispose(),t.roughnessMap&&t.roughnessMap.dispose())};return e},_makeGroup:function(e,t){let i=new u.Group;i.name="scaleGroup",i.add(e);var r=new u.Group;if(r.userData=t||{},r.userData.isGeoGroup=!0,r.userData.feature&&(r.userData.feature.properties.uuid=r.uuid),i.length)for(o of i)r.add(o);else r.add(i);return r.name="threeboxObject",r},animationManager:new $,drawTooltip:function(e,t=!1){if(e){let i;if(t){let t=document.createElement("div");t.className="mapboxgl-popup-content";let r=document.createElement("strong");r.innerHTML=e,t.appendChild(r);let o=document.createElement("div");o.className="mapboxgl-popup-tip";let a=document.createElement("div");a.className="marker mapboxgl-popup-anchor-bottom",a.appendChild(o),a.appendChild(t),i=document.createElement("div"),i.className+="label3D",i.appendChild(a)}else i=document.createElement("span"),i.className=this._defaults.tooltip.cssClass,i.innerHTML=e;return i}},drawLabelHTML:function(e,t){let i=document.createElement("div");return i.className+=t,i.innerHTML="string"==typeof e?e:e.outerHTML,i},_defaults:{colors:{red:new u.Color(16711680),yellow:new u.Color(16776960),green:new u.Color(65280),black:new u.Color(0)},materials:{boxNormalMaterial:new u.LineBasicMaterial({color:new u.Color(16711680)}),boxOverMaterial:new u.LineBasicMaterial({color:new u.Color(16776960)}),boxSelectedMaterial:new u.LineBasicMaterial({color:new u.Color(65280)})},line:{geometry:null,color:"black",width:1,opacity:1},label:{htmlElement:null,cssClass:" label3D",alwaysVisible:!1,topMargin:-.5},tooltip:{text:"",cssClass:"toolTip text-xs",mapboxStyle:!1,topMargin:0},sphere:{position:[0,0,0],radius:1,sides:20,units:"scene",material:"MeshBasicMaterial",anchor:"bottom-left",bbox:!0,tooltip:!0,raycasted:!0},tube:{geometry:null,radius:1,sides:6,units:"scene",material:"MeshBasicMaterial",anchor:"center",bbox:!0,tooltip:!0,raycasted:!0},loadObj:{type:null,obj:null,units:"scene",scale:1,rotation:0,defaultAnimation:0,anchor:"bottom-left",bbox:!0,tooltip:!0,raycasted:!0,clone:!0,withCredentials:!1},Object3D:{obj:null,units:"scene",anchor:"bottom-left",bbox:!0,tooltip:!0,raycasted:!0},extrusion:{coordinates:[[[]]],geometryOptions:{},height:100,materials:new u.MeshPhongMaterial({color:6684672,side:u.DoubleSide}),scale:1,rotation:0,units:"scene",anchor:"center",bbox:!0,tooltip:!0,raycasted:!0}},geometries:{line:["LineString"],tube:["LineString"],sphere:["Point"]}},ce.prototype={buildShape:function(e){if(e[0]instanceof(u.Vector2||u.Vector3))return new u.Shape(e);let t=new u.Shape;for(let i=0;i<e.length;i++)0===i?t=new u.Shape(this.buildPoints(e[0],e[0])):t.holes.push(new u.Path(this.buildPoints(e[i],e[0])));return t},buildPoints:function(e,t){const i=[];let r=y.projectToWorld([t[0][0],t[0][1],0]);for(let o=0;o<e.length;o++){let t=y.projectToWorld([e[o][0],e[o][1],0]);i.push(new u.Vector2(y.toDecimal(t.x-r.x,9),y.toDecimal(t.y-r.y,9)))}return i},buildGeometry:function(e,t){let i=new u.ExtrudeGeometry(e,t);return i.computeBoundingBox(),i}};const ue=new t.OBJLoader,de=new i.MTLLoader,pe=new a.GLTFLoader,me=new r.FBXLoader,fe=new n.ColladaLoader;function ge(e,t,i){if(void 0===e)return console.error("Invalid options provided to loadObj()");let r;switch((e=y._validate(e,le.prototype._defaults.loadObj)).type||(e.type="mtl"),e.type){case"mtl":r=ue;break;case"gltf":case"glb":r=pe;break;case"fbx":r=me;break;case"dae":r=fe}de.withCredentials=e.withCredentials,de.load(e.mtl,function(o){o&&"mtl"==e.type&&(o.preload(),r.setMaterials(o));r.withCredentials=e.withCredentials,r.load(e.obj,r=>{let o=[];switch(e.type){case"mtl":r=r.children[0];break;case"gltf":case"glb":case"dae":o=r.animations,r=r.scene;break;case"fbx":o=r.animations}r.animations=o;const a=y.types.rotation(e.rotation,[0,0,0]),n=y.types.scale(e.scale,[1,1,1]);r.rotation.set(a[0],a[1],a[2]),r.scale.set(n[0],n[1],n[2]),e.normalize&&r.traverse(function(e){if(e.isMesh){let t;"MeshStandardMaterial"==e.material.type?(e.material.metalness&&(e.material.metalness*=.1),e.material.glossiness&&(e.material.glossiness*=.25),t=new u.Color(12,12,12)):"MeshPhongMaterial"==e.material.type&&(e.material.shininess=.1,t=new u.Color(20,20,20)),e.material.specular&&e.material.specular.isColor&&(e.material.specular=t)}}),r.name="model";let s=le.prototype._makeGroup(r,e);le.prototype._addMethods(s),s.setAnchor(e.anchor),s.setCenter(e.adjustment),s.raycasted=e.raycasted,i(s),t(s),s.setFixedZoom(e.mapScale),s.idle()},()=>null,t=>{console.error("Could not load model file: "+e.obj+" \n "+t.stack),i("Error loading the model")})},()=>null,e=>{console.warn("No material file found "+e.stack)})}function be(e){this.map=e,this.renderer=new se,this.renderer.setSize(this.map.getCanvas().clientWidth,this.map.getCanvas().clientHeight),this.renderer.domElement.style.position="absolute",this.renderer.domElement.id="labelCanvas",this.renderer.domElement.style.top=0,this.renderer.domElement.style.zIndex="0",this.map.getCanvasContainer().appendChild(this.renderer.domElement),this.scene,this.camera,this.dispose=function(){this.map.getCanvasContainer().removeChild(this.renderer.domElement),this.renderer.domElement.remove(),this.renderer={}},this.setSize=function(e,t){this.renderer.setSize(e,t)},this.map.on("resize",function(){this.renderer.setSize(this.map.getCanvas().clientWidth,this.map.getCanvas().clientHeight)}.bind(this)),this.state={reset:function(){}},this.render=async function(e,t){return this.scene=e,this.camera=t,new Promise(i=>{i(this.renderer.render(e,t))})},this.toggleLabels=async function(e,t){return new Promise(i=>{i(this.setVisibility(e,t,this.scene,this.camera,this.renderer))})},this.setVisibility=function(e,t,i,r,o){this.renderer.cacheList.forEach(function(a){a.visible!=t&&a.layer===e&&(t&&a.alwaysVisible||!t)&&(a.visible=t,o.renderObject(a,i,r))})}}class ye{constructor(e,t){this.id=e.layerId,this.type="custom",this.renderingMode="3d",this.opacity=.5,this.buildingsLayerId=e.buildingsLayerId,this.minAltitude=e.minAltitude||.1,this.tb=t}onAdd(e,t){this.map=e;const i=this.map.getLayer(this.buildingsLayerId).source;this.source=(this.map.style.sourceCaches||this.map.style._otherSourceCaches)[i],this.source||console.warn(`Can't find layer ${this.buildingsLayerId}'s source.`);const r=this._getVertexSource(),o=t.createShader(t.VERTEX_SHADER);t.shaderSource(o,r),t.compileShader(o);const a=t.createShader(t.FRAGMENT_SHADER);t.shaderSource(a,"\n\t\t\tvoid main() {\n\t\t\t\tgl_FragColor = vec4(0.0, 0.0, 0.0, 0.7);\n\t\t\t}\n\t\t\t"),t.compileShader(a),this.program=t.createProgram(),t.attachShader(this.program,o),t.attachShader(this.program,a),t.linkProgram(this.program),t.validateProgram(this.program),this.uMatrix=t.getUniformLocation(this.program,"u_matrix"),this.uHeightFactor=t.getUniformLocation(this.program,"u_height_factor"),this.uAltitude=t.getUniformLocation(this.program,"u_altitude"),this.uAzimuth=t.getUniformLocation(this.program,"u_azimuth"),this.tb.mapboxVersion>=2?this.aPosNormal=t.getAttribLocation(this.program,"a_pos_normal_ed"):(this.aPos=t.getAttribLocation(this.program,"a_pos"),this.aNormal=t.getAttribLocation(this.program,"a_normal_ed")),this.aBase=t.getAttribLocation(this.program,"a_base"),this.aHeight=t.getAttribLocation(this.program,"a_height")}render(e,t){if(!this.source)return;e.useProgram(this.program);const i=this.source.getVisibleCoordinates().reverse(),r=this.map.getLayer(this.buildingsLayerId),o=this.map.painter.context,{lng:a,lat:n}=this.map.getCenter(),s=this.tb.getSunPosition(this.tb.lightDateTime,[a,n]);e.uniform1f(this.uAltitude,s.altitude>this.minAltitude?s.altitude:0),e.uniform1f(this.uAzimuth,s.azimuth+3*Math.PI/2),e.enable(e.BLEND),e.blendFunc(e.SRC_ALPHA,e.ONE_MINUS_SRC_ALPHA),e.getExtension("EXT_blend_minmax"),e.disable(e.DEPTH_TEST);for(const l of i){const t=this.source.getTile(l),i=t.getBucket(r);if(!i)continue;const[a,n]=i.programConfigurations.programConfigurations[this.buildingsLayerId]._buffers;e.uniformMatrix4fv(this.uMatrix,!1,l.posMatrix||l.projMatrix),e.uniform1f(this.uHeightFactor,Math.pow(2,l.overscaledZ)/t.tileSize/8);for(const r of i.segments.get()){const t=o.currentNumAttributes||0,s=2;for(let i=s;i<t;i++)e.disableVertexAttribArray(i);const l=r.vertexOffset||0;e.enableVertexAttribArray(this.aNormal),e.enableVertexAttribArray(this.aHeight),e.enableVertexAttribArray(this.aBase),i.layoutVertexBuffer.bind(),this.tb.mapboxVersion>=2?(e.enableVertexAttribArray(this.aPosNormal),e.vertexAttribPointer(this.aPosNormal,4,e.SHORT,!1,8,8*l)):(e.enableVertexAttribArray(this.aPos),e.vertexAttribPointer(this.aPos,2,e.SHORT,!1,12,12*l),e.vertexAttribPointer(this.aNormal,4,e.SHORT,!1,12,4+12*l)),a.bind(),e.vertexAttribPointer(this.aHeight,1,e.FLOAT,!1,4,4*l),n.bind(),e.vertexAttribPointer(this.aBase,1,e.FLOAT,!1,4,4*l),i.indexBuffer.bind(),o.currentNumAttributes=s,e.drawElements(e.TRIANGLES,3*r.primitiveLength,e.UNSIGNED_SHORT,3*r.primitiveOffset*2)}}}_getVertexSource(){return this.tb.mapboxVersion>=2?"\n\t\t\t\tuniform mat4 u_matrix;\n\t\t\t\tuniform float u_height_factor;\n\t\t\t\tuniform float u_altitude;\n\t\t\t\tuniform float u_azimuth;\n\t\t\t\tattribute vec4 a_pos_normal_ed;\n\t\t\t\tattribute lowp vec2 a_base;\n\t\t\t\tattribute lowp vec2 a_height;\n\t\t\t\tvoid main() {\n\t\t\t\t\tfloat base = max(0.0, a_base.x);\n\t\t\t\t\tfloat height = max(0.0, a_height.x);\n\n\t\t\t\t\tvec3 pos_nx = floor(a_pos_normal_ed.xyz * 0.5);\n\t\t\t\t\tmediump vec3 top_up_ny = a_pos_normal_ed.xyz - 2.0 * pos_nx;\n\t\t\t\t\tfloat t = top_up_ny.x;\n\t\t\t\t\tvec4 pos = vec4(pos_nx.xy, t > 0.0 ? height : base, 1);\n\n\t\t\t\t\tfloat len = pos.z * u_height_factor / tan(u_altitude);\n\t\t\t\t\tpos.x += cos(u_azimuth) * len;\n\t\t\t\t\tpos.y += sin(u_azimuth) * len;\n\t\t\t\t\tpos.z = 0.0;\n\t\t\t\t\tgl_Position = u_matrix * pos;\n\t\t\t\t}\n\t\t\t":"\n\t\t\t\tuniform mat4 u_matrix;\n\t\t\t\tuniform float u_height_factor;\n\t\t\t\tuniform float u_altitude;\n\t\t\t\tuniform float u_azimuth;\n\t\t\t\tattribute vec2 a_pos;\n\t\t\t\tattribute vec4 a_normal_ed;\n\t\t\t\tattribute lowp vec2 a_base;\n\t\t\t\tattribute lowp vec2 a_height;\n\t\t\t\tvoid main() {\n\t\t\t\t\tfloat base = max(0.0, a_base.x);\n\t\t\t\t\tfloat height = max(0.0, a_height.x);\n\t\t\t\t\tfloat t = mod(a_normal_ed.x, 2.0);\n\t\t\t\t\tvec4 pos = vec4(a_pos, t > 0.0 ? height : base, 1);\n\t\t\t\t\tfloat len = pos.z * u_height_factor / tan(u_altitude);\n\t\t\t\t\tpos.x += cos(u_azimuth) * len;\n\t\t\t\t\tpos.y += sin(u_azimuth) * len;\n\t\t\t\t\tpos.z = 0.0;\n\t\t\t\t\tgl_Position = u_matrix * pos;\n\t\t\t\t}\n\t\t\t"}}function ve(e,t,i){this.init(e,t,i)}ve.prototype={repaint:function(){this.map.repaint=!0},init:function(e,t,i){this.options=y._validate(i||{},xe),this.map=e,this.map.tb=this,this.objects=new le,this.mapboxVersion=parseFloat(this.map.version),this.renderer=new u.WebGLRenderer({alpha:!0,antialias:!0,preserveDrawingBuffer:i.preserveDrawingBuffer,canvas:e.getCanvas(),context:t}),this.renderer.setPixelRatio(window.devicePixelRatio),this.renderer.setSize(this.map.getCanvas().clientWidth,this.map.getCanvas().clientHeight),this.renderer.outputColorSpace=u.SRGBColorSpace,this.renderer.autoClear=!1,this.labelRenderer=new be(this.map),this.scene=new u.Scene,this.world=new u.Group,this.world.name="world",this.scene.add(this.world),this.objectsCache=new Map,this.zoomLayers=[],this.fov=this.options.fov,this.orthographic=this.options.orthographic||!1,this.raycaster=new u.Raycaster,this.raycaster.layers.set(0),this.mapCenter=this.map.getCenter(),this.mapCenterUnits=y.projectToWorld([this.mapCenter.lng,this.mapCenter.lat]),this.lightDateTime=new Date,this.lightLng=this.mapCenter.lng,this.lightLat=this.mapCenter.lat,this.sunPosition,this.rotationStep=5,this.gridStep=6,this.altitudeStep=.1,this.defaultCursor="default",this.lights=this.initLights,this.options.defaultLights&&this.defaultLights(),this.options.realSunlight&&this.realSunlight(this.options.realSunlightHelper),this.skyLayerName="sky-layer",this.terrainSourceName="mapbox-dem",this.terrainExaggeration=1,this.terrainLayerName="",this.enableSelectingFeatures=this.options.enableSelectingFeatures||!1,this.enableSelectingObjects=this.options.enableSelectingObjects||!1,this.enableDraggingObjects=this.options.enableDraggingObjects||!1,this.enableRotatingObjects=this.options.enableRotatingObjects||!1,this.enableTooltips=this.options.enableTooltips||!1,this.multiLayer=this.options.multiLayer||!1,this.enableHelpTooltips=this.options.enableHelpTooltips||!1,this.map.on("style.load",function(){this.tb.zoomLayers=[],this.tb.options.multiLayer&&this.addLayer({id:"threebox_layer",type:"custom",renderingMode:"3d",map:this,onAdd:function(e,t){},render:function(e,t){this.map.tb.update()}}),this.once("idle",()=>{this.tb.setObjectsScale()}),this.tb.options.sky&&(this.tb.sky=!0),this.tb.options.terrain&&(this.tb.terrain=!0);["satellite","mapbox-mapbox-satellite","satelliteLayer"].forEach(e=>{this.getLayer(e)&&(this.tb.terrainLayerName=e)})}),this.map.on("load",function(){let t;this.selectedObject,this.selectedFeature,this.draggedObject,this.overedObject,this.overedFeature;let i,r=this.getCanvasContainer();this.getCanvasContainer().style.cursor=this.tb.defaultCursor;let o,a,n,s,l=[];function h(e){var t=r.getBoundingClientRect();return{x:e.originalEvent.clientX-t.left-r.clientLeft,y:e.originalEvent.clientY-t.top-r.clientTop}}this.unselectObject=function(){this.selectedObject.selected=!1,this.selectedObject=null},this.outObject=function(){this.overedObject.over=!1,this.overedObject=null},this.unselectFeature=function(e){void 0!==e.id&&(this.setFeatureState({source:e.source,sourceLayer:e.sourceLayer,id:e.id},{select:!1}),this.removeTooltip(e),(e=this.queryRenderedFeatures({layers:[e.layer.id],filter:["==",["id"],e.id]})[0])&&this.fire("SelectedFeatureChange",{detail:e}),this.selectedFeature=null)},this.selectFeature=function(e){this.selectedFeature=e,this.setFeatureState({source:this.selectedFeature.source,sourceLayer:this.selectedFeature.sourceLayer,id:this.selectedFeature.id},{select:!0}),this.selectedFeature=this.queryRenderedFeatures({layers:[this.selectedFeature.layer.id],filter:["==",["id"],this.selectedFeature.id]})[0],this.addTooltip(this.selectedFeature),this.fire("SelectedFeatureChange",{detail:this.selectedFeature})},this.outFeature=function(t){this.overedFeature&&void 0!==this.overedFeature&&this.overedFeature.id!=t&&(e.setFeatureState({source:this.overedFeature.source,sourceLayer:this.overedFeature.sourceLayer,id:this.overedFeature.id},{hover:!1}),this.removeTooltip(this.overedFeature),this.overedFeature=null)},this.addTooltip=function(e){if(!this.tb.enableTooltips)return;let t=this.tb.getFeatureCenter(e),i=this.tb.tooltip({text:e.properties.name||e.id||e.type,mapboxStyle:!0,feature:e});i.setCoords(t),this.tb.add(i,e.layer.id),e.tooltip=i,e.tooltip.tooltip.visible=!0},this.removeTooltip=function(e){e.tooltip&&(e.tooltip.visibility=!1,this.tb.remove(e.tooltip),e.tooltip=null)},e.onContextMenu=function(e){alert("contextMenu")},this.onClick=function(t){let i,r=[];if(e.tb.enableSelectingObjects&&(r=this.tb.queryRenderedFeatures(t.point)),i="object"==typeof r[0],i){let e=ve.prototype.findParent3DObject(r[0]);if(e){if(this.selectedFeature&&this.unselectFeature(this.selectedFeature),this.selectedObject){if(this.selectedObject.uuid!=e.uuid)this.selectedObject.selected=!1,e.selected=!0,this.selectedObject=e;else if(this.selectedObject.uuid==e.uuid)return void this.unselectObject()}else this.selectedObject=e,this.selectedObject.selected=!0;this.selectedObject.dispatchEvent({type:"Wireframed",detail:this.selectedObject}),this.selectedObject.dispatchEvent({type:"IsPlayingChanged",detail:this.selectedObject}),this.repaint=!0,t.preventDefault()}}else{let i=[];if(e.tb.enableSelectingFeatures&&(i=this.queryRenderedFeatures(t.point)),i.length>0&&"fill-extrusion"==i[0].layer.type&&void 0!==i[0].id)if(this.selectedObject&&this.unselectObject(),this.selectedFeature){if(this.selectedFeature.id!=i[0].id)this.unselectFeature(this.selectedFeature),this.selectFeature(i[0]);else if(this.selectedFeature.id==i[0].id)return void this.unselectFeature(this.selectedFeature)}else this.selectFeature(i[0])}},this.onMouseMove=function(r){let l,c=h(r);if(this.getCanvasContainer().style.cursor=this.tb.defaultCursor,r.originalEvent.altKey&&this.draggedObject){if(!e.tb.enableRotatingObjects)return;t="rotate",this.getCanvasContainer().style.cursor="move",Math.min(i.x,c.x),Math.max(i.x,c.x),Math.min(i.y,c.y),Math.max(i.y,c.y);let r={x:0,y:0,z:Math.round(s[2]+~~((c.x-i.x)/this.tb.rotationStep)%360*this.tb.rotationStep%360)};return this.draggedObject.setRotation(r),void(e.tb.enableHelpTooltips&&this.draggedObject.addHelp("rot: "+r.z+"°"))}if(r.originalEvent.shiftKey&&this.draggedObject){if(!e.tb.enableDraggingObjects)return;t="translate",this.getCanvasContainer().style.cursor="move";let i=r.lngLat,n=[Number((i.lng+o).toFixed(this.tb.gridStep)),Number((i.lat+a).toFixed(this.tb.gridStep)),this.draggedObject.modelHeight];return this.draggedObject.setCoords(n),void(e.tb.enableHelpTooltips&&this.draggedObject.addHelp("lng: "+n[0]+"°, lat: "+n[1]+"°"))}if(r.originalEvent.ctrlKey&&this.draggedObject){if(!e.tb.enableDraggingObjects)return;t="altitude",this.getCanvasContainer().style.cursor="move";let i=r.point.y*this.tb.altitudeStep,o=[this.draggedObject.coordinates[0],this.draggedObject.coordinates[1],Number((-i-n).toFixed(this.tb.gridStep))];return this.draggedObject.setCoords(o),void(e.tb.enableHelpTooltips&&this.draggedObject.addHelp("alt: "+o[2]+"m"))}let u=[];if(e.tb.enableSelectingObjects&&(u=this.tb.queryRenderedFeatures(r.point)),l="object"==typeof u[0],l){let e=ve.prototype.findParent3DObject(u[0]);e&&(this.outFeature(this.overedFeature),this.getCanvasContainer().style.cursor="pointer",this.selectedObject&&e.uuid==this.selectedObject.uuid?this.selectedObject&&e.uuid==this.selectedObject.uuid&&(e.over=!0,this.overedObject=e):(this.overedObject&&this.overedObject.uuid!=e.uuid&&this.outObject(),e.over=!0,this.overedObject=e),this.repaint=!0,r.preventDefault())}else{this.overedObject&&this.outObject();let t=[];e.tb.enableSelectingFeatures&&(t=this.queryRenderedFeatures(r.point)),t.length>0&&(this.outFeature(t[0]),"fill-extrusion"==t[0].layer.type&&void 0!==t[0].id&&(this.selectedFeature&&this.selectedFeature.id==t[0].id||(this.getCanvasContainer().style.cursor="pointer",this.overedFeature=t[0],this.setFeatureState({source:this.overedFeature.source,sourceLayer:this.overedFeature.sourceLayer,id:this.overedFeature.id},{hover:!0}),this.overedFeature=e.queryRenderedFeatures({layers:[this.overedFeature.layer.id],filter:["==",["id"],this.overedFeature.id]})[0],this.addTooltip(this.overedFeature))))}},this.onMouseDown=function(t){(t.originalEvent.shiftKey||t.originalEvent.altKey||t.originalEvent.ctrlKey)&&0===t.originalEvent.button&&this.selectedObject&&(e.tb.enableDraggingObjects||e.tb.enableRotatingObjects)&&(t.preventDefault(),e.getCanvasContainer().style.cursor="move",e.once("mouseup",this.onMouseUp),this.draggedObject=this.selectedObject,i=h(t),l=this.draggedObject.coordinates,s=y.degreeify(this.draggedObject.rotation),o=l[0]-t.lngLat.lng,a=l[1]-t.lngLat.lat,n=-this.draggedObject.modelHeight-t.point.y*this.tb.altitudeStep)},this.onMouseUp=function(e){this.getCanvasContainer().style.cursor=this.tb.defaultCursor,this.off("mouseup",this.onMouseUp),this.off("mouseout",this.onMouseUp),this.dragPan.enable(),this.draggedObject&&(this.draggedObject.dispatchEvent({type:"ObjectDragged",detail:{draggedObject:this.draggedObject,draggedAction:t}}),this.draggedObject.removeHelp(),this.draggedObject=null,t=null)},this.onMouseOut=function(e){if(this.overedFeature){let t=this.queryRenderedFeatures(e.point);t.length>0&&this.overedFeature.id!=t[0].id&&(this.getCanvasContainer().style.cursor=this.tb.defaultCursor,this.outFeature(t[0]))}},this.onZoom=function(e){this.tb.zoomLayers.forEach(e=>{this.tb.toggleLayer(e)}),this.tb.setObjectsScale()};let c=!1;this.on("click",this.onClick),this.on("mousemove",this.onMouseMove),this.on("mouseout",this.onMouseOut),this.on("mousedown",this.onMouseDown),this.on("zoom",this.onZoom),this.on("zoomend",this.onZoom),document.addEventListener("keydown",function(t){17===t.which||t.which,16===t.which&&(c=!0);let i=this.selectedObject;if(c&&83===t.which&&i){let t=y.toDecimal;if(i.help)i.removeHelp();else{let r=i.modelSize,o=1;"meters"!==i.userData.units&&(o=y.projectedUnitsPerMeter(i.coordinates[1]),o||(o=1),o=t(o,7)),e.tb.enableHelpTooltips&&i.addHelp("size(m): "+t(r.x/o,3)+" W, "+t(r.y/o,3)+" L, "+t(r.z/o,3)+" H"),this.repaint=!0}return!1}}.bind(this),!0),document.addEventListener("keyup",function(e){17==e.which||e.which,16===e.which&&(c=!1)}.bind(this))})},get sky(){return this.options.sky},set sky(e){e?this.createSkyLayer():this.removeLayer(this.skyLayerName),this.options.sky=e},get terrain(){return this.options.terrain},set terrain(e){if(this.terrainLayerName="",e)this.createTerrainLayer();else{if(this.mapboxVersion<2)return void console.warn("Terrain layer are only supported by Mapbox-gl-js > v2.0");this.map.getTerrain()&&(this.map.setTerrain(null),this.map.removeSource(this.terrainSourceName))}this.options.terrain=e},get fov(){return this.options.fov},set fov(e){this.camera instanceof u.PerspectiveCamera&&this.options.fov!==e&&(this.map.transform.fov=e,this.camera.fov=this.map.transform.fov,this.cameraSync.setupCamera(),this.map.repaint=!0,this.options.fov=e)},get orthographic(){return this.options.orthographic},set orthographic(e){const t=this.map.getCanvas().clientHeight,i=this.map.getCanvas().clientWidth;e?(this.map.transform.fov=0,this.camera=new u.OrthographicCamera(i/-2,i/2,t/2,t/-2,.1,1e21)):(this.map.transform.fov=this.fov,this.camera=new u.PerspectiveCamera(this.map.transform.fov,i/t,.1,1e21)),this.camera.layers.enable(0),this.camera.layers.enable(1),this.cameraSync=new v(this.map,this.camera,this.world),this.map.repaint=!0,this.options.orthographic=e},createSkyLayer:function(){if(this.mapboxVersion<2)return console.warn("Sky layer are only supported by Mapbox-gl-js > v2.0"),void(this.options.sky=!1);this.map.getLayer(this.skyLayerName)||(this.map.addLayer({id:this.skyLayerName,type:"sky",paint:{"sky-opacity":["interpolate",["linear"],["zoom"],0,0,5,.3,8,1],"sky-type":"atmosphere","sky-atmosphere-sun":this.getSunSky(this.lightDateTime),"sky-atmosphere-sun-intensity":10}}),this.map.once("idle",()=>{this.setSunlight(),this.repaint()}))},createTerrainLayer:function(){if(this.mapboxVersion<2)return console.warn("Terrain layer are only supported by Mapbox-gl-js > v2.0"),void(this.options.terrain=!1);this.map.getTerrain()||(this.map.addSource(this.terrainSourceName,{type:"raster-dem",url:"mapbox://mapbox.mapbox-terrain-dem-v1",tileSize:512,maxzoom:14}),this.map.setTerrain({source:this.terrainSourceName,exaggeration:this.terrainExaggeration}),this.map.once("idle",()=>{this.cameraSync.updateCamera(),this.repaint()}))},sphere:function(e){return this.setDefaultView(e,this.options),function(e){e=y._validate(e,le.prototype._defaults.sphere);let t=new u.SphereGeometry(e.radius,e.sides,e.sides),i=Y(e);return new he({obj:new u.Mesh(t,i),units:e.units,anchor:e.anchor,adjustment:e.adjustment,bbox:e.bbox,tooltip:e.tooltip,raycasted:e.raycasted})}(e,this.world)},line:function(e){e=y._validate(e,le.prototype._defaults.line);var t=y.lnglatsToWorld(e.geometry),i=y.normalizeVertices(t),r=y.flattenVectors(i.vertices),o=new h.LineGeometry;o.setPositions(r);let a=new l.LineMaterial({color:e.color,linewidth:e.width,dashed:!1,opacity:e.opacity});a.resolution.set(window.innerWidth,window.innerHeight),a.isMaterial=!0,a.transparent=!0,a.depthWrite=!1;let n=new s.Line2(o,a);return n.position.copy(i.position),n.computeLineDistances(),n},label:function(e){e=y._validate(e,le.prototype._defaults.label);let t=le.prototype.drawLabelHTML(e.htmlElement,e.cssClass),i=new te(t);i.name="label",i.visible=e.alwaysVisible,i.alwaysVisible=e.alwaysVisible;var r=le.prototype._makeGroup(i,e);return le.prototype._addMethods(r),r.visibility=e.alwaysVisible,r},tooltip:function(e){if((e=y._validate(e,le.prototype._defaults.tooltip)).text){let i=le.prototype.drawTooltip(e.text,e.mapboxStyle),r=new te(i);r.visible=!1,r.name="tooltip";var t=le.prototype._makeGroup(r,e);return le.prototype._addMethods(t),t}},tube:function(e){return this.setDefaultView(e,this.options),function(e){e=y._validate(e,le.prototype._defaults.tube);let t=[];e.geometry.forEach(e=>{t.push(new u.Vector3(e[0],e[1],e[2]))});const i=new u.CatmullRomCurve3(t);let r=new u.TubeGeometry(i,t.length,e.radius,e.sides,!1),o=Y(e);return new he({obj:new u.Mesh(r,o),units:e.units,anchor:e.anchor,adjustment:e.adjustment,bbox:e.bbox,tooltip:e.tooltip,raycasted:e.raycasted})}(e,this.world)},extrusion:function(e){return this.setDefaultView(e,this.options),ce(e)},Object3D:function(e){return this.setDefaultView(e,this.options),he(e)},loadObj:async function(e,t){if(this.setDefaultView(e,this.options),!1===e.clone)return new Promise(async i=>{ge(e,t,async e=>{i(e)})});{let i=this.objectsCache.get(e.obj);i?i.promise.then(i=>{t(i.duplicate(e))}).catch(t=>{this.objectsCache.delete(e.obj),console.error("Could not load model file: "+e.obj)}):this.objectsCache.set(e.obj,{promise:new Promise(async(i,r)=>{ge(e,t,async e=>{e.duplicate?i(e.duplicate()):r(e)})})})}},material:function(e){return Y(e)},initLights:{ambientLight:null,dirLight:null,dirLightBack:null,dirLightHelper:null,hemiLight:null,pointLight:null},utils:y,SunCalc:W,Constants:g,projectToWorld:function(e){return this.utils.projectToWorld(e)},unprojectFromWorld:function(e){return this.utils.unprojectFromWorld(e)},projectedUnitsPerMeter:function(e){return this.utils.projectedUnitsPerMeter(e)},getFeatureCenter:function(e,t,i){return y.getFeatureCenter(e,t,i)},getObjectHeightOnFloor:function(e,t,i){return y.getObjectHeightOnFloor(e,t,i)},queryRenderedFeatures:function(e){let t=new u.Vector2;return t.x=e.x/this.map.transform.width*2-1,t.y=1-e.y/this.map.transform.height*2,this.raycaster.setFromCamera(t,this.camera),this.raycaster.intersectObjects(this.world.children,!0)},findParent3DObject:function(e){var t;return e.object.traverseAncestors(function(e){e.parent&&"Group"==e.parent.type&&e.userData.obj&&(t=e)}),t},setLayoutProperty:function(e,t,i){this.map.setLayoutProperty(e,t,i),null!=i&&"visibility"===t&&this.world.children.filter(t=>t.layer===e).forEach(e=>{e.visibility=i})},setLayerZoomRange:function(e,t,i){this.map.getLayer(e)&&(this.map.setLayerZoomRange(e,t,i),this.zoomLayers.includes(e)||this.zoomLayers.push(e),this.toggleLayer(e))},setLayerHeigthProperty:function(e,t){let i=this.map.getLayer(e);if(i)if("fill-extrusion"==i.type){let e=this.map.getStyle().sources[i.source].data;e.features.forEach(function(e){e.properties.level=t}),this.map.getSource(i.source).setData(e)}else"custom"==i.type&&this.world.children.forEach(function(i){let r=i.userData.feature;if(r&&r.layer===e){let e=this.tb.getFeatureCenter(r,i,t);i.setCoords(e)}})},setObjectsScale:function(){this.world.children.filter(e=>null!=e.fixedZoom).forEach(e=>{e.setObjectScale(this.map.transform.scale)})},setStyle:function(e,t){this.clear().then(()=>{this.map.setStyle(e,t)})},toggleLayer:function(e,t=!0){let i=this.map.getLayer(e);if(i){if(!t)return void this.toggle(i.id,!1);let e=this.map.getZoom();if(i.minzoom&&e<i.minzoom)return void this.toggle(i.id,!1);if(i.maxzoom&&e>=i.maxzoom)return void this.toggle(i.id,!1);this.toggle(i.id,!0)}},toggle:function(e,t){this.setLayoutProperty(e,"visibility",t?"visible":"none"),this.labelRenderer.toggleLabels(e,t)},update:function(){this.map.repaint&&(this.map.repaint=!1);var e=Date.now();this.objects.animationManager.update(e),this.updateLightHelper(),this.renderer.resetState(),this.renderer.render(this.scene,this.camera),this.labelRenderer.render(this.scene,this.camera),!1===this.options.passiveRendering&&this.map.triggerRepaint()},add:function(e,t,i){if(!this.enableTooltips&&e.tooltip&&(e.tooltip.visibility=!1),this.world.add(e),t){e.layer=t,e.source=i;let r=this.map.getLayer(t);if(r){let t=r.visibility,i=void 0===t;e.visibility=!(!i&&"visible"!==t)}}},removeByName:function(e){let t=this.world.getObjectByName(e);t&&this.remove(t)},remove:function(e){this.map.selectedObject&&e.uuid==this.map.selectedObject.uuid&&this.map.unselectObject(),this.map.draggedObject&&e.uuid==this.map.draggedObject.uuid&&(this.map.draggedObject=null),e.dispose&&e.dispose(),this.world.remove(e),e=null},clear:async function(e=null,t=!1){return new Promise((i,r)=>{let o=[];this.world.children.forEach(function(e){o.push(e)});for(let t=0;t<o.length;t++){let i=o[t];i.layer!==e&&e||this.remove(i)}t&&this.objectsCache.forEach(e=>{e.promise.then(e=>{e.dispose(),e=null})}),i("clear")})},removeLayer:function(e){this.clear(e,!0).then(()=>{this.map.removeLayer(e)})},getSunPosition:function(e,t){return W.getPosition(e||Date.now(),t[1],t[0])},getSunTimes:function(e,t){return W.getTimes(e,t[1],t[0],t[2]?t[2]:0)},setBuildingShadows:function(e){if(this.map.getLayer(e.buildingsLayerId)){let t=new ye(e,this);this.map.addLayer(t,e.buildingsLayerId)}else console.warn("The layer '"+e.buildingsLayerId+"' does not exist in the map.")},setSunlight:function(e=new Date,t){if(!this.lights.dirLight||!this.options.realSunlight)return void console.warn("To use setSunlight it's required to set realSunlight : true in Threebox initial options.");var i=new Date(e.getTime());if(t?t.lng&&t.lat?this.mapCenter=t:this.mapCenter={lng:t[0],lat:t[1]}:this.mapCenter=this.map.getCenter(),this.lightDateTime&&this.lightDateTime.getTime()===i.getTime()&&this.lightLng===this.mapCenter.lng&&this.lightLat===this.mapCenter.lat)return;this.lightDateTime=i,this.lightLng=this.mapCenter.lng,this.lightLat=this.mapCenter.lat,this.sunPosition=this.getSunPosition(i,[this.mapCenter.lng,this.mapCenter.lat]);let r=this.sunPosition.altitude,o=Math.PI+this.sunPosition.azimuth,a=g.WORLD_SIZE/2,n=Math.sin(r),s=Math.cos(r),l=Math.cos(o)*s,h=Math.sin(o)*s;this.lights.dirLight.position.set(h,l,n),this.lights.dirLight.position.multiplyScalar(a),this.lights.dirLight.intensity=Math.max(n,0),this.lights.hemiLight.intensity=Math.max(1*n,.1),this.lights.dirLight.updateMatrixWorld(),this.updateLightHelper(),this.map.loaded()&&(this.updateSunGround(this.sunPosition),this.map.setLight({anchor:"map",position:[3,180+180*this.sunPosition.azimuth/Math.PI,90-180*this.sunPosition.altitude/Math.PI],intensity:Math.cos(this.sunPosition.altitude),color:`hsl(40, ${50*Math.cos(this.sunPosition.altitude)}%, ${Math.max(20,20+96*Math.sin(this.sunPosition.altitude))}%)`},{duration:0}),this.sky&&this.updateSunSky(this.getSunSky(i,this.sunPosition)))},getSunSky:function(e,t){if(!t){var i=this.map.getCenter();t=this.getSunPosition(e||Date.now(),[i.lng,i.lat])}return[180+180*t.azimuth/Math.PI,90-180*t.altitude/Math.PI]},updateSunSky:function(e){this.sky&&this.map.setPaintProperty(this.skyLayerName,"sky-atmosphere-sun",e)},updateSunGround:function(e){""!=this.terrainLayerName&&this.map.setPaintProperty(this.terrainLayerName,"raster-opacity",Math.max(Math.min(1,4*e.altitude),.25))},updateLightHelper:function(){this.lights.dirLightHelper&&(this.lights.dirLightHelper.position.setFromMatrixPosition(this.lights.dirLight.matrixWorld),this.lights.dirLightHelper.updateMatrix(),this.lights.dirLightHelper.update())},dispose:async function(){return console.log(this.memory()),new Promise(e=>{e(this.clear(null,!0).then(e=>(this.map.remove(),this.map={},this.scene.remove(this.world),this.world.children=[],this.world=null,this.objectsCache.clear(),this.labelRenderer.dispose(),console.log(this.memory()),this.renderer.dispose(),e)))})},defaultLights:function(){this.lights.ambientLight=new u.AmbientLight(new u.Color("hsl(0, 0%, 100%)"),.75),this.scene.add(this.lights.ambientLight),this.lights.dirLightBack=new u.DirectionalLight(new u.Color("hsl(0, 0%, 100%)"),.25),this.lights.dirLightBack.position.set(30,100,100),this.scene.add(this.lights.dirLightBack),this.lights.dirLight=new u.DirectionalLight(new u.Color("hsl(0, 0%, 100%)"),.25),this.lights.dirLight.position.set(-30,100,-100),this.scene.add(this.lights.dirLight)},realSunlight:function(e=!1){this.renderer.shadowMap.enabled=!0,this.lights.dirLight=new u.DirectionalLight(16777215,1),this.scene.add(this.lights.dirLight),e&&(this.lights.dirLightHelper=new u.DirectionalLightHelper(this.lights.dirLight,5),this.scene.add(this.lights.dirLightHelper));this.lights.dirLight.castShadow=!0,this.lights.dirLight.shadow.radius=2,this.lights.dirLight.shadow.mapSize.width=8192,this.lights.dirLight.shadow.mapSize.height=8192,this.lights.dirLight.shadow.camera.top=this.lights.dirLight.shadow.camera.right=1e3,this.lights.dirLight.shadow.camera.bottom=this.lights.dirLight.shadow.camera.left=-1e3,this.lights.dirLight.shadow.camera.near=1,this.lights.dirLight.shadow.camera.visible=!0,this.lights.dirLight.shadow.camera.far=4e8,this.lights.hemiLight=new u.HemisphereLight(new u.Color(16777215),new u.Color(16777215),.6),this.lights.hemiLight.color.setHSL(.661,.96,.12),this.lights.hemiLight.groundColor.setHSL(.11,.96,.14),this.lights.hemiLight.position.set(0,0,50),this.scene.add(this.lights.hemiLight),this.setSunlight(),this.map.once("idle",()=>{this.setSunlight(),this.repaint()})},setDefaultView:function(e,t){e.bbox=(e.bbox||null==e.bbox)&&t.enableSelectingObjects,e.tooltip=(e.tooltip||null==e.tooltip)&&t.enableTooltips,e.mapScale=this.map.transform.scale},memory:function(){return this.renderer.info.memory},programs:function(){return this.renderer.info.programs.length},version:"2.2.7"};var xe={defaultLights:!1,realSunlight:!1,realSunlightHelper:!1,passiveRendering:!0,preserveDrawingBuffer:!1,enableSelectingFeatures:!1,enableSelectingObjects:!1,enableDraggingObjects:!1,enableRotatingObjects:!1,enableTooltips:!1,enableHelpTooltips:!1,multiLayer:!1,orthographic:!1,fov:g.FOV_DEGREES,sky:!1,terrain:!1};exports.Threebox=ve;
|
|
2
|
+
//# sourceMappingURL=threebox.cjs.map
|