@macrostrat/cesium-martini 1.4.0 → 1.5.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/.idea/misc.xml ADDED
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="21" project-jdk-type="JavaSDK">
4
+ <output url="file://$PROJECT_DIR$/out" />
5
+ </component>
6
+ </project>
@@ -0,0 +1,8 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="ProjectModuleManager">
4
+ <modules>
5
+ <module fileurl="file://$PROJECT_DIR$/.idea/cesium-martini.iml" filepath="$PROJECT_DIR$/.idea/cesium-martini.iml" />
6
+ </modules>
7
+ </component>
8
+ </project>
@@ -0,0 +1,8 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="PrettierConfiguration">
4
+ <option name="myConfigurationMode" value="MANUAL" />
5
+ <option name="myRunOnSave" value="true" />
6
+ <option name="myFilesPattern" value="**/*.{js,ts,jsx,tsx,cjs,cts,mjs,mts,vue,astro,md}" />
7
+ </component>
8
+ </project>
package/.idea/vcs.xml ADDED
@@ -0,0 +1,20 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="IssueNavigationConfiguration">
4
+ <option name="links">
5
+ <list>
6
+ <IssueNavigationLink>
7
+ <option name="issueRegexp" value="\(#(\d+)\)" />
8
+ <option name="linkRegexp" value="https://github.com/davenquinn/cesium-martini/issues/$1" />
9
+ </IssueNavigationLink>
10
+ <IssueNavigationLink>
11
+ <option name="issueRegexp" value="\(#(\d+)\)" />
12
+ <option name="linkRegexp" value="https://github.com/davenquinn/martini/issues/$1" />
13
+ </IssueNavigationLink>
14
+ </list>
15
+ </option>
16
+ </component>
17
+ <component name="VcsDirectoryMappings">
18
+ <mapping directory="" vcs="Git" />
19
+ </component>
20
+ </project>
@@ -0,0 +1,125 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="AutoImportSettings">
4
+ <option name="autoReloadType" value="SELECTIVE" />
5
+ </component>
6
+ <component name="ChangeListManager">
7
+ <list default="true" id="c63fbe16-a437-4e92-9177-f56de7f7200d" name="Changes" comment="">
8
+ <change beforePath="$PROJECT_DIR$/README.md" beforeDir="false" afterPath="$PROJECT_DIR$/README.md" afterDir="false" />
9
+ <change beforePath="$PROJECT_DIR$/package.json" beforeDir="false" afterPath="$PROJECT_DIR$/package.json" afterDir="false" />
10
+ </list>
11
+ <option name="SHOW_DIALOG" value="false" />
12
+ <option name="HIGHLIGHT_CONFLICTS" value="true" />
13
+ <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
14
+ <option name="LAST_RESOLUTION" value="IGNORE" />
15
+ </component>
16
+ <component name="Git.Settings">
17
+ <option name="RECENT_BRANCH_BY_REPOSITORY">
18
+ <map>
19
+ <entry key="$PROJECT_DIR$" value="b35a980e6b6d6bdd4e6fe12f48dea9d5d1fee27a" />
20
+ </map>
21
+ </option>
22
+ <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
23
+ </component>
24
+ <component name="GitHubPullRequestSearchHistory">{
25
+ &quot;lastFilter&quot;: {
26
+ &quot;state&quot;: &quot;OPEN&quot;,
27
+ &quot;assignee&quot;: &quot;davenquinn&quot;
28
+ }
29
+ }</component>
30
+ <component name="GithubPullRequestsUISettings">{
31
+ &quot;selectedUrlAndAccountId&quot;: {
32
+ &quot;url&quot;: &quot;https://github.com/davenquinn/cesium-martini.git&quot;,
33
+ &quot;accountId&quot;: &quot;52565d3a-d148-4d26-a021-78a3e61fe000&quot;
34
+ }
35
+ }</component>
36
+ <component name="ProjectColorInfo">{
37
+ &quot;associatedIndex&quot;: 1
38
+ }</component>
39
+ <component name="ProjectId" id="2scR6KJfXRgKYtH9HK3HqkyDJQi" />
40
+ <component name="ProjectViewState">
41
+ <option name="autoscrollToSource" value="true" />
42
+ <option name="hideEmptyMiddlePackages" value="true" />
43
+ <option name="openDirectoriesWithSingleClick" value="true" />
44
+ <option name="showExcludedFiles" value="false" />
45
+ <option name="showLibraryContents" value="true" />
46
+ </component>
47
+ <component name="PropertiesComponent"><![CDATA[{
48
+ "keyToString": {
49
+ "RunOnceActivity.ShowReadmeOnStart": "true",
50
+ "RunOnceActivity.git.unshallow": "true",
51
+ "git-widget-placeholder": "overscaled-tiles",
52
+ "kotlin-language-version-configured": "true",
53
+ "last_opened_file_path": "/Users/Daven/Projects/Macrostrat/Software/cesium-martini/examples/vite/src",
54
+ "node.js.detected.package.eslint": "true",
55
+ "node.js.detected.package.tslint": "true",
56
+ "node.js.selected.package.eslint": "(autodetect)",
57
+ "node.js.selected.package.tslint": "(autodetect)",
58
+ "nodejs_package_manager_path": "yarn",
59
+ "prettierjs.PrettierConfiguration.Package": "yarn:package.json:prettier",
60
+ "project.structure.last.edited": "Modules",
61
+ "project.structure.proportion": "0.0",
62
+ "project.structure.side.proportion": "0.0",
63
+ "settings.editor.selected.configurable": "settings.javascript.prettier",
64
+ "ts.external.directory.path": "yarn:examples/_webpack-config/package.json:typescript",
65
+ "vue.rearranger.settings.migration": "true"
66
+ }
67
+ }]]></component>
68
+ <component name="RecentsManager">
69
+ <key name="CopyFile.RECENT_KEYS">
70
+ <recent name="$PROJECT_DIR$/examples/vite/src" />
71
+ <recent name="$PROJECT_DIR$/examples/vite-mapzen-worker" />
72
+ <recent name="$PROJECT_DIR$/examples" />
73
+ <recent name="$PROJECT_DIR$/examples/webpack-worker" />
74
+ </key>
75
+ <key name="MoveFile.RECENT_KEYS">
76
+ <recent name="$PROJECT_DIR$/examples/webpack" />
77
+ <recent name="$PROJECT_DIR$/examples/_shared" />
78
+ <recent name="$PROJECT_DIR$/examples/vite-mapzen-worker" />
79
+ </key>
80
+ </component>
81
+ <component name="SharedIndexes">
82
+ <attachedChunks>
83
+ <set>
84
+ <option value="bundled-jdk-9823dce3aa75-125ca727e0f0-intellij.indexing.shared.core-IU-243.23654.189" />
85
+ <option value="bundled-js-predefined-d6986cc7102b-822845ee3bb5-JavaScript-IU-243.23654.189" />
86
+ </set>
87
+ </attachedChunks>
88
+ </component>
89
+ <component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
90
+ <component name="TaskManager">
91
+ <task active="true" id="Default" summary="Default task">
92
+ <changelist id="c63fbe16-a437-4e92-9177-f56de7f7200d" name="Changes" comment="" />
93
+ <created>1738752699502</created>
94
+ <option name="number" value="Default" />
95
+ <option name="presentableId" value="Default" />
96
+ <updated>1738752699502</updated>
97
+ <workItem from="1738752700650" duration="46117000" />
98
+ <workItem from="1739406376299" duration="20669000" />
99
+ </task>
100
+ <servers />
101
+ </component>
102
+ <component name="TypeScriptGeneratedFilesManager">
103
+ <option name="version" value="3" />
104
+ <option name="exactExcludedFiles">
105
+ <list>
106
+ <option value="$PROJECT_DIR$/src/index.d.ts" />
107
+ </list>
108
+ </option>
109
+ </component>
110
+ <component name="Vcs.Log.Tabs.Properties">
111
+ <option name="TAB_STATES">
112
+ <map>
113
+ <entry key="MAIN">
114
+ <value>
115
+ <State />
116
+ </value>
117
+ </entry>
118
+ </map>
119
+ </option>
120
+ </component>
121
+ <component name="XSLT-Support.FileAssociations.UIState">
122
+ <expand />
123
+ <select />
124
+ </component>
125
+ </project>
package/.prettierrc ADDED
@@ -0,0 +1,3 @@
1
+ {
2
+ "proseWrap": "always"
3
+ }
package/README.md CHANGED
@@ -2,28 +2,30 @@
2
2
 
3
3
  **On-the-fly meshing of raster elevation tiles for the CesiumJS virtual globe**
4
4
 
5
+ [![npm version](https://badge.fury.io/js/@macrostrat%2Fcesium-martini.svg)](https://badge.fury.io/js/@macrostrat%2Fcesium-martini)
6
+
5
7
  ![Himalayas](/img/himalayas.jpg)
6
8
 
7
9
  This package contains a Cesium
8
10
  [TerrainProvider](https://cesium.com/docs/cesiumjs-ref-doc/TerrainProvider.html)
9
11
  that uses right-triangular irregular networks (RTIN) pioneered by
10
- [Mapbox's Martini](https://observablehq.com/@mourner/martin-real-time-rtin-terrain-mesh) to
11
- transform [Terrain-RGB elevation tiles](https://blog.mapbox.com/global-elevation-data-6689f1d0ba65) into
12
- [quantized mesh terrain](https://github.com/CesiumGS/quantized-mesh),
13
- for rendering in the [CesiumJS digital globe](https://cesium.com).
14
- The module provides a general technique applicable to all raster imagery
15
- (although the Terrain-RGB format is near-ideal for streaming elevation data).
16
- Fixes for performance and better control of rendering quality are in progress.
17
-
18
- This module was created to support our geologic map visualization work
19
- at [Macrostrat](https://macrostrat.org) and as a building block
20
- for future rich geoscience visualizations.
21
-
12
+ [Mapbox's Martini](https://observablehq.com/@mourner/martin-real-time-rtin-terrain-mesh)
13
+ to transform
14
+ [Terrain-RGB elevation tiles](https://blog.mapbox.com/global-elevation-data-6689f1d0ba65)
15
+ into [quantized mesh terrain](https://github.com/CesiumGS/quantized-mesh), for
16
+ rendering in the [CesiumJS digital globe](https://cesium.com). The module
17
+ provides a general technique applicable to all raster imagery (although the
18
+ Terrain-RGB format is near-ideal for streaming elevation data). Fixes for
19
+ performance and better control of rendering quality are in progress.
20
+
21
+ This module was created to support our geologic map visualization work at
22
+ [Macrostrat](https://macrostrat.org) and as a building block for future rich
23
+ geoscience visualizations.
22
24
 
23
25
  ## Installation
24
26
 
25
- This package is listed on NPM as `@macrostrat/cesium-martini`. It can be installed
26
- using the command
27
+ This package is listed on NPM as `@macrostrat/cesium-martini`. It can be
28
+ installed using the command
27
29
 
28
30
  ```
29
31
  npm install --save @macrostrat/cesium-martini
@@ -33,8 +35,8 @@ npm install --save @macrostrat/cesium-martini
33
35
 
34
36
  ## Development
35
37
 
36
- As of version `1.3.x`, `cesium-martini` development is tested with the Yarn package manager.
37
- Your mileage with `npm` may vary.
38
+ As of version `1.3.x`, `cesium-martini` development is tested with the Yarn
39
+ package manager. Your mileage with `npm` may vary.
38
40
 
39
41
  ### Quick start
40
42
 
@@ -47,12 +49,15 @@ After cloning this repository, you can build the module (using Rollup) with
47
49
 
48
50
  ### Example applications
49
51
 
50
- Several example applications are available in the [`examples/`](examples/) directory and runnable from the root project.
51
- The main example is built with Vite and others are built with Webpack v5. As well as showing how to use this module,
52
- these examples contain configuration for bundling Cesium in each packaging system.
52
+ Several example applications are available in the [`examples/`](examples/)
53
+ directory and runnable from the root project. The main example is built with
54
+ Vite and others are built with Webpack v5. As well as showing how to use this
55
+ module, these examples contain configuration for bundling Cesium in each
56
+ packaging system.
53
57
 
54
- To run an example application, add `MAPBOX_API_TOKEN=<your-mapbox-token>` to a `.env` file.
55
- in the root of this repository, and then start the appropriate example:
58
+ To run an example application, add `MAPBOX_API_TOKEN=<your-mapbox-token>` to a
59
+ `.env` file. in the root of this repository, and then start the appropriate
60
+ example:
56
61
 
57
62
  - `yarn run example` (Vite)
58
63
  - `yarn run example:mapzen` (Vite + Mapzen)
@@ -60,66 +65,77 @@ in the root of this repository, and then start the appropriate example:
60
65
  - `yarn run example:webpack-mapzen` (Webpack + Mapzen)
61
66
  - `yarn run example:webpack-react` (Webpack + React)
62
67
 
63
- Contributions in the form of bug reports and pull requests are welcome.
64
- These can be to add functionality (e.g. optional normal-map generation) or for
68
+ Contributions in the form of bug reports and pull requests are welcome. These
69
+ can be to add functionality (e.g. optional normal-map generation) or for
65
70
  performance. See list of [known limitations](#current-known-limitations) below.
66
71
 
67
72
  ## Motivation
68
73
 
69
74
  The Cesium digital globe is a powerful platform for visualization of geospatial
70
- data in 3D. Cesium maintains a global elevation dataset as a prebuilt terrain mesh,
71
- which caches the computationally-intensive step of meshing height-field data
72
- into a triangle irregular network (TIN). Unfortunately, this
73
- [quantized mesh](https://github.com/CesiumGS/quantized-mesh) format is relatively
74
- new, narrowly supported and tailored to Cesium itself. Going forward, supporting
75
- a TIN format for elevation datasets requires maintenance of significant single-purpose
76
- processing pipelines and storage resources.
75
+ data in 3D. Cesium maintains a global elevation dataset as a prebuilt terrain
76
+ mesh, which caches the computationally-intensive step of meshing height-field
77
+ data into a triangle irregular network (TIN). Unfortunately, this
78
+ [quantized mesh](https://github.com/CesiumGS/quantized-mesh) format is
79
+ relatively new, narrowly supported and tailored to Cesium itself. Supporting a
80
+ TIN format for elevation datasets requires maintenance of significant
81
+ single-purpose processing pipelines and storage resources.
82
+
83
+ ### Fast raster meshing
77
84
 
78
85
  Mapbox maintains a multiscale global elevation dataset in their clever
79
86
  [terrain-RGB](https://blog.mapbox.com/global-elevation-data-6689f1d0ba65)
80
- format, which bridges web standard file formats (PNG images) with traditional raster GIS
81
- formats for representing terrain. Rasters are the standard representation of elevation data across the
82
- geosciences, and many pipelines are available to create and modify raster images.
83
- Basically any elevation dataset can be easily rescaled to the Terrain-RGB
84
- format, but the jump from there to a "Quantized mesh" is more complicated.
85
-
86
- Recently, the [MARTINI](https://github.com/mapbox/martini) project by
87
- [Vladimir Agafonkin](https://agafonkin.com/) at Mapbox demonstrated an
87
+ format, which bridges web standard file formats (PNG images) with traditional
88
+ raster GIS formats for representing terrain. Rasters are the standard
89
+ representation of elevation data across the geosciences, and many pipelines are
90
+ available to create and modify raster images. Basically any elevation dataset
91
+ can be easily rescaled to the Terrain-RGB format, but the jump from there to a
92
+ "Quantized mesh" is more complicated.
93
+
94
+ More recently, [Vladimir Agafonkin](https://agafonkin.com/) at Mapbox
95
+ demonstrated an
88
96
  [elegant algorithmic approach](https://observablehq.com/@mourner/martin-real-time-rtin-terrain-mesh)
89
- that sidesteps this issue.
90
- MARTINI meshes based on right-triangulated irregular networks (RTIN, _Evans et al., 1998_)
91
- and is far quicker than the traditional TIN generation techniques.
92
-
93
- A speedy meshing algorithm allows this data-preparation step to be handled
94
- in the browser after elevation tiles are loaded. Integrating this
95
- toolchain into the Cesium digital globe enables the usage of Mapbox global
96
- data and other raster terrain layers (e.g. planetary and bathymetric data!),
97
- without adding overhead of TIN processing and storage.
98
-
99
- ## Current limitations
100
-
101
- ### Lack of support for overzooming
102
-
103
- Cesium's implementations of the `TerrainProvider` interface are generally geared
104
- towards representing static terrain meshes. The RTIN algorithm used here can
105
- dynamically build meshes at a variety of error levels, and the input height
106
- field are data-dense and can represent extremely detailed meshes at a given zoom level. Currently,
107
- meshes are generated at levels of detail that undersample the available structure
108
- in a terrain tile — levels of detail are calibrated to what Cesium needs to
109
- render visually pleasing output at a given zoom level.
110
-
111
- A smarter and more parsimonious solution would use much lower zoom levels
112
- for terrain than imagery, using the full resolution of the dataset in
113
- mesh construction. Done correctly, this could lead to an extremely
114
- data-efficient and adaptive terrain render, but this seems to run somewhat
115
- counter to how Cesium internally manages levels of detail. Ideally, someone familiar with the inner workings
116
- of Cesium would provide some guidance here.
97
+ that sidesteps this issue. His [MARTINI](https://github.com/mapbox/martini)
98
+ project constructs meshes based on right-triangulated irregular networks (RTIN,
99
+ _Evans et al., 1998_) and is far quicker than the traditional TIN generation
100
+ techniques.
101
+
102
+ A speedy meshing algorithm allows this data-preparation step to be handled in
103
+ the browser after elevation tiles are loaded. Integrating this toolchain into
104
+ the Cesium digital globe enables the usage of Mapbox global data and other
105
+ raster terrain layers (e.g. planetary and bathymetric data!), without adding
106
+ overhead of TIN processing and storage.
107
+
108
+ ### Progressive mesh enhancement (added in version `1.5.0`)
109
+
110
+ Cesium `TerrainProvider`s are generally designed to represent static terrain
111
+ meshes. The RTIN algorithm used here can dynamically build meshes at a variety
112
+ of error levels, and the input height fields can represent extremely detailed
113
+ meshes at a given zoom level.
114
+
115
+ By default, meshes are generated at levels of detail that undersample the
116
+ available structure in a terrain tile, calibrated to what Cesium needs to render
117
+ visually pleasing output at a given zoom level. To more fully exploit the
118
+ available data, we can generate meshes at progressively higher resolution from
119
+ the same input data. This allows some zoom levels to be skipped, greatly
120
+ increasing efficiency.
121
+
122
+ This "overzooming" can be enabled using the `skipZoomLevels` configuration. For
123
+ instance, the below function will refuse to load tiles except in
124
+
125
+ ```js
126
+ function skipZoomLevels(z) {
127
+ return z % 3 != 0;
128
+ }
129
+ ```
130
+
131
+ The configuration also takes a single number and array.
117
132
 
118
133
  ### Outstanding bugs and issues
119
134
 
120
135
  - [x] High-resolution `@2x` tiles are notionally supported but not well-tested.
121
136
  - [ ] There is no formal testing framework to catch regressions.
122
- - [ ] TypeScript types are discarded on compilation rather than checked properly.
137
+ - [x] TypeScript types are discarded on compilation rather than checked
138
+ properly.
123
139
 
124
140
  ## Prior art and relevant examples
125
141
 
@@ -132,35 +148,41 @@ of Cesium would provide some guidance here.
132
148
  - [Cesium globe materials example](https://sandcastle.cesium.com/?src=Globe%20Materials.html)
133
149
  - [Cesium sky/atmosphere example](https://sandcastle.cesium.com/?src=Sky%20Atmosphere.html)
134
150
 
135
- ## TODO
136
-
137
- - Make compatible with Mapbox's new `terrain-dem` tileset if possible
138
- - Better masking of unavailable tiles
139
- - Bathymetry option
140
- - Tie to hillshade generator so the same tiles are loaded
151
+ ## Changelog
141
152
 
142
- Pull requests for any and all of these priorities are appreciated!
153
+ ### `[1.5.0]`: February 2025
143
154
 
144
- ## Changelog
155
+ - Allow overzooming of tiles when zoom levels are skipped
156
+ - Improve and deduplicate examples
157
+ - Fix typescript types
158
+ - Improve some internal organization of code
145
159
 
146
160
  ### `[1.4.0]`: February 2025
147
161
 
148
- - Merge [**PR #10**](https://github.com/davenquinn/cesium-martini/pull/10) from [*Stuart Attenborrow*](https://github.com/stuarta0) to allow loading of non-Mapbox terrain tiles
149
- - Created Vite and Webpack examples of using the module with Mapzen Terrarium tiles
162
+ - Merge [**PR #10**](https://github.com/davenquinn/cesium-martini/pull/10) from
163
+ [_Stuart Attenborrow_](https://github.com/stuarta0) to allow loading of
164
+ non-Mapbox terrain tiles
165
+ - Created Vite and Webpack examples of using the module with Mapzen Terrarium
166
+ tiles
150
167
  - Migrated Vite examples to Vite 5
151
168
  - Upgraded `axios` dependency
152
- - Remove submodule dependency for `@mapbox/martini` in favor of directly importing from [my fork](https://github.com/davenquinn/martini)
169
+ - Remove submodule dependency for `@mapbox/martini` in favor of directly
170
+ importing from [my fork](https://github.com/davenquinn/martini)
153
171
  - Upgrade `yarn` to `4.6.0`
154
172
 
155
173
  ### `[1.3.0]`: September 2023
156
174
 
157
- - Add compilation to ESModules, which allows the package to be used with modern bundlers like [**Vite**](https://vitejs.dev). *Contributed by [@fc](https://github.com/fc).*
158
- - Change latitude-based scaling factor for tile error to improve fidelity at high latitudes.
175
+ - Add compilation to ESModules, which allows the package to be used with modern
176
+ bundlers like [**Vite**](https://vitejs.dev). _Contributed by
177
+ [@fc](https://github.com/fc)._
178
+ - Change latitude-based scaling factor for tile error to improve fidelity at
179
+ high latitudes.
159
180
  - Remove `regenerator-runtime` from web-worker code, targeting modern platforms.
160
181
 
161
182
  #### Development environment
162
183
 
163
- We reorganized the development environment and examples for a more modern overall design.
184
+ We reorganized the development environment and examples for a more modern
185
+ overall design.
164
186
 
165
187
  - Switched to `yarn` from `npm` as the default package manager
166
188
  - Enabled Yarn Plug'n'Play for faster development
@@ -169,15 +191,15 @@ We reorganized the development environment and examples for a more modern overal
169
191
  - Moved all examples to the `examples/` directory as Yarn workspaces, enabling
170
192
  separation of dependencies
171
193
 
172
-
173
194
  ### `[1.2.0]`: November 2021
174
195
 
175
196
  - Globe caps! (disable using the `fillPoles` option).
176
197
  - Some fixes for efficiency
177
198
  - Fixed small errors in tile occlusion code
178
- - Added a `minZoom` configuration option to prevent excessive loading of low-resolution tiles
179
- - Four (!) pull requests from [@stuarta0](https://github.com/stuarta0) to improve loading of non-Mapbox tilesets
180
-
199
+ - Added a `minZoom` configuration option to prevent excessive loading of
200
+ low-resolution tiles
201
+ - Four (!) pull requests from [@stuarta0](https://github.com/stuarta0) to
202
+ improve loading of non-Mapbox tilesets
181
203
 
182
204
  ### `[1.1.3]`: June 2021
183
205
 
@@ -186,8 +208,8 @@ We reorganized the development environment and examples for a more modern overal
186
208
  ### `[1.1.2]`: May 2021
187
209
 
188
210
  - Fixed a bug with loading high-resolution tiles
189
- - Added a `skipOddLevels` option that significantly reduces the load of zooming through many terrain levels.
190
- This is enabled by default.
211
+ - Added a `skipOddLevels` option that significantly reduces the load of zooming
212
+ through many terrain levels. This is enabled by default.
191
213
  - Greatly increase skirt height
192
214
 
193
215
  ### `[1.1.0]`: May 2021
@@ -0,0 +1,3 @@
1
+ module.exports = {
2
+ presets: ["@babel/preset-env", "@babel/preset-typescript"],
3
+ };