@loaders.gl/terrain 4.0.0-beta.7 → 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 CHANGED
@@ -1,9 +1,6 @@
1
- Copyright (c) 2015 Uber Technologies, Inc.
2
-
3
- This software includes parts of PhiloGL (https://github.com/philogb/philogl)
4
- under MIT license. PhiloGL parts Copyright © 2013 Sencha Labs.
1
+ loaders.gl is licensed under the MIT license
5
2
 
6
- This software includes adaptations of postprocessing code from THREE.js (https://github.com/mrdoob/three.js/) under MIT license. Additional attribution given in specific source files. THREE.js parts Copyright © 2010-2018 three.js authors.
3
+ Copyright (c) vis.gl contributors
7
4
 
8
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
9
6
  of this software and associated documentation files (the "Software"), to deal
@@ -23,8 +20,12 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
20
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24
21
  THE SOFTWARE.
25
22
 
23
+ ---
24
+
25
+ Copyright (c) 2015 Uber Technologies, Inc.
26
26
 
27
- loaders.gl includes certain files from Cesium (https://github.com/AnalyticalGraphicsInc/cesium) under the Apache 2 License:
27
+ loaders.gl includes certain files from Cesium (https://github.com/AnalyticalGraphicsInc/cesium)
28
+ under the Apache 2 License (found in the submodule: modules/3d-tiles):)
28
29
 
29
30
  Copyright 2011-2018 CesiumJS Contributors
30
31
 
@@ -38,4 +39,3 @@ distributed under the License is distributed on an "AS IS" BASIS,
38
39
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
39
40
  See the License for the specific language governing permissions and limitations under the License.
40
41
 
41
- Cesium-derived code can be found in the submodule: modules/3d-tiles
@@ -1 +1 @@
1
- {"version":3,"file":"parse-terrain.d.ts","sourceRoot":"","sources":["../../src/lib/parse-terrain.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,cAAc,GAAG;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,UAAU,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;IAC3C,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,KAAK,YAAY,GAAG;IAClB,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,KAAK,gBAAgB,GAAG;IACtB,OAAO,EAAE,GAAG,CAAC;IACb,OAAO,EAAE,GAAG,CAAC;IACb,OAAO,EAAE,GAAG,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,YAAY,EAAE,YAAY,EAC1B,cAAc,EAAE,cAAc;;;;;;;;;;;;;;;;;;;;;;;EA2D/B"}
1
+ {"version":3,"file":"parse-terrain.d.ts","sourceRoot":"","sources":["../../src/lib/parse-terrain.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,cAAc,GAAG;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,UAAU,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;IAC3C,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,KAAK,YAAY,GAAG;IAClB,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,KAAK,gBAAgB,GAAG;IACtB,OAAO,EAAE,GAAG,CAAC;IACb,OAAO,EAAE,GAAG,CAAC;IACb,OAAO,EAAE,GAAG,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,YAAY,EAAE,YAAY,EAC1B,cAAc,EAAE,cAAc;;;;;;;;;;;;;;;;;;;;;;;EA2D/B"}
@@ -1 +1 @@
1
- {"version":3,"file":"parse-terrain.js","names":["getMeshBoundingBox","Martini","Delatin","addSkirt","makeTerrainMeshFromImage","terrainImage","terrainOptions","meshMaxError","bounds","elevationDecoder","data","width","height","terrain","mesh","tesselator","getTerrain","getMartiniTileMesh","getDelatinTileMesh","vertices","triangles","attributes","getMeshAttributes","boundingBox","skirtHeight","newAttributes","newTriangles","loaderData","header","vertexCount","length","mode","indices","value","Uint32Array","from","size","gridSize","martini","tile","createTile","getMesh","tin","run","coords","imageData","rScaler","bScaler","gScaler","offset","Float32Array","i","y","x","k","r","g","b","numOfVerticies","positions","texCoords","minX","minY","maxX","maxY","xScale","yScale","pixelIdx","POSITION","TEXCOORD_0"],"sources":["../../src/lib/parse-terrain.ts"],"sourcesContent":["// loaders.gl, MIT license\n\nimport {getMeshBoundingBox} from '@loaders.gl/schema';\nimport Martini from '@mapbox/martini';\nimport Delatin from './delatin';\nimport {addSkirt} from './helpers/skirt';\n\nexport type TerrainOptions = {\n meshMaxError: number;\n bounds: number[];\n elevationDecoder: ElevationDecoder;\n tesselator: 'martini' | 'delatin' | 'auto';\n skirtHeight?: number;\n};\n\ntype TerrainImage = {\n data: Uint8Array;\n width: number;\n height: number;\n};\n\ntype ElevationDecoder = {\n rScaler: any;\n bScaler: any;\n gScaler: any;\n offset: number;\n};\n\n/**\n * Returns generated mesh object from image data\n *\n * @param terrainImage terrain image data\n * @param terrainOptions terrain options\n * @returns mesh object\n */\nexport function makeTerrainMeshFromImage(\n terrainImage: TerrainImage,\n terrainOptions: TerrainOptions\n) {\n const {meshMaxError, bounds, elevationDecoder} = terrainOptions;\n\n const {data, width, height} = terrainImage;\n\n let terrain;\n let mesh;\n switch (terrainOptions.tesselator) {\n case 'martini':\n terrain = getTerrain(data, width, height, elevationDecoder, terrainOptions.tesselator);\n mesh = getMartiniTileMesh(meshMaxError, width, terrain);\n break;\n case 'delatin':\n terrain = getTerrain(data, width, height, elevationDecoder, terrainOptions.tesselator);\n mesh = getDelatinTileMesh(meshMaxError, width, height, terrain);\n break;\n // auto\n default:\n if (width === height && !(height & (width - 1))) {\n terrain = getTerrain(data, width, height, elevationDecoder, 'martini');\n mesh = getMartiniTileMesh(meshMaxError, width, terrain);\n } else {\n terrain = getTerrain(data, width, height, elevationDecoder, 'delatin');\n mesh = getDelatinTileMesh(meshMaxError, width, height, terrain);\n }\n break;\n }\n\n const {vertices} = mesh;\n let {triangles} = mesh;\n let attributes = getMeshAttributes(vertices, terrain, width, height, bounds);\n\n // Compute bounding box before adding skirt so that z values are not skewed\n const boundingBox = getMeshBoundingBox(attributes);\n\n if (terrainOptions.skirtHeight) {\n const {attributes: newAttributes, triangles: newTriangles} = addSkirt(\n attributes,\n triangles,\n terrainOptions.skirtHeight\n );\n attributes = newAttributes;\n triangles = newTriangles;\n }\n\n return {\n // Data return by this loader implementation\n loaderData: {\n header: {}\n },\n header: {\n vertexCount: triangles.length,\n boundingBox\n },\n mode: 4, // TRIANGLES\n indices: {value: Uint32Array.from(triangles), size: 1},\n attributes\n };\n}\n\n/**\n * Get Martini generated vertices and triangles\n *\n * @param {number} meshMaxError threshold for simplifying mesh\n * @param {number} width width of the input data\n * @param {number[] | Float32Array} terrain elevation data\n * @returns {{vertices: Uint16Array, triangles: Uint32Array}} vertices and triangles data\n */\nfunction getMartiniTileMesh(meshMaxError, width, terrain) {\n const gridSize = width + 1;\n const martini = new Martini(gridSize);\n const tile = martini.createTile(terrain);\n const {vertices, triangles} = tile.getMesh(meshMaxError);\n\n return {vertices, triangles};\n}\n\n/**\n * Get Delatin generated vertices and triangles\n *\n * @param {number} meshMaxError threshold for simplifying mesh\n * @param {number} width width of the input data array\n * @param {number} height height of the input data array\n * @param {number[] | Float32Array} terrain elevation data\n * @returns {{vertices: number[], triangles: number[]}} vertices and triangles data\n */\nfunction getDelatinTileMesh(meshMaxError, width, height, terrain) {\n const tin = new Delatin(terrain, width + 1, height + 1);\n tin.run(meshMaxError);\n // @ts-expect-error\n const {coords, triangles} = tin;\n const vertices = coords;\n return {vertices, triangles};\n}\n\nfunction getTerrain(\n imageData: Uint8Array,\n width: number,\n height: number,\n elevationDecoder: ElevationDecoder,\n tesselator: 'martini' | 'delatin'\n) {\n const {rScaler, bScaler, gScaler, offset} = elevationDecoder;\n\n // From Martini demo\n // https://observablehq.com/@mourner/martin-real-time-rtin-terrain-mesh\n const terrain = new Float32Array((width + 1) * (height + 1));\n // decode terrain values\n for (let i = 0, y = 0; y < height; y++) {\n for (let x = 0; x < width; x++, i++) {\n const k = i * 4;\n const r = imageData[k + 0];\n const g = imageData[k + 1];\n const b = imageData[k + 2];\n terrain[i + y] = r * rScaler + g * gScaler + b * bScaler + offset;\n }\n }\n\n if (tesselator === 'martini') {\n // backfill bottom border\n for (let i = (width + 1) * width, x = 0; x < width; x++, i++) {\n terrain[i] = terrain[i - width - 1];\n }\n // backfill right border\n for (let i = height, y = 0; y < height + 1; y++, i += height + 1) {\n terrain[i] = terrain[i - 1];\n }\n }\n\n return terrain;\n}\n\nfunction getMeshAttributes(\n vertices,\n terrain: Uint8Array,\n width: number,\n height: number,\n bounds: number[]\n) {\n const gridSize = width + 1;\n const numOfVerticies = vertices.length / 2;\n // vec3. x, y in pixels, z in meters\n const positions = new Float32Array(numOfVerticies * 3);\n // vec2. 1 to 1 relationship with position. represents the uv on the texture image. 0,0 to 1,1.\n const texCoords = new Float32Array(numOfVerticies * 2);\n\n const [minX, minY, maxX, maxY] = bounds || [0, 0, width, height];\n const xScale = (maxX - minX) / width;\n const yScale = (maxY - minY) / height;\n\n for (let i = 0; i < numOfVerticies; i++) {\n const x = vertices[i * 2];\n const y = vertices[i * 2 + 1];\n const pixelIdx = y * gridSize + x;\n\n positions[3 * i + 0] = x * xScale + minX;\n positions[3 * i + 1] = -y * yScale + maxY;\n positions[3 * i + 2] = terrain[pixelIdx];\n\n texCoords[2 * i + 0] = x / width;\n texCoords[2 * i + 1] = y / height;\n }\n\n return {\n POSITION: {value: positions, size: 3},\n TEXCOORD_0: {value: texCoords, size: 2}\n // NORMAL: {}, - optional, but creates the high poly look with lighting\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"parse-terrain.js","names":["getMeshBoundingBox","Martini","Delatin","addSkirt","makeTerrainMeshFromImage","terrainImage","terrainOptions","meshMaxError","bounds","elevationDecoder","data","width","height","terrain","mesh","tesselator","getTerrain","getMartiniTileMesh","getDelatinTileMesh","vertices","triangles","attributes","getMeshAttributes","boundingBox","skirtHeight","newAttributes","newTriangles","loaderData","header","vertexCount","length","mode","indices","value","Uint32Array","from","size","gridSize","martini","tile","createTile","getMesh","tin","run","coords","imageData","rScaler","bScaler","gScaler","offset","Float32Array","i","y","x","k","r","g","b","numOfVerticies","positions","texCoords","minX","minY","maxX","maxY","xScale","yScale","pixelIdx","POSITION","TEXCOORD_0"],"sources":["../../src/lib/parse-terrain.ts"],"sourcesContent":["// loaders.gl, MIT license\n// Copyright (c) vis.gl contributors\n\nimport {getMeshBoundingBox} from '@loaders.gl/schema';\nimport Martini from '@mapbox/martini';\nimport Delatin from './delatin';\nimport {addSkirt} from './helpers/skirt';\n\nexport type TerrainOptions = {\n meshMaxError: number;\n bounds: number[];\n elevationDecoder: ElevationDecoder;\n tesselator: 'martini' | 'delatin' | 'auto';\n skirtHeight?: number;\n};\n\ntype TerrainImage = {\n data: Uint8Array;\n width: number;\n height: number;\n};\n\ntype ElevationDecoder = {\n rScaler: any;\n bScaler: any;\n gScaler: any;\n offset: number;\n};\n\n/**\n * Returns generated mesh object from image data\n *\n * @param terrainImage terrain image data\n * @param terrainOptions terrain options\n * @returns mesh object\n */\nexport function makeTerrainMeshFromImage(\n terrainImage: TerrainImage,\n terrainOptions: TerrainOptions\n) {\n const {meshMaxError, bounds, elevationDecoder} = terrainOptions;\n\n const {data, width, height} = terrainImage;\n\n let terrain;\n let mesh;\n switch (terrainOptions.tesselator) {\n case 'martini':\n terrain = getTerrain(data, width, height, elevationDecoder, terrainOptions.tesselator);\n mesh = getMartiniTileMesh(meshMaxError, width, terrain);\n break;\n case 'delatin':\n terrain = getTerrain(data, width, height, elevationDecoder, terrainOptions.tesselator);\n mesh = getDelatinTileMesh(meshMaxError, width, height, terrain);\n break;\n // auto\n default:\n if (width === height && !(height & (width - 1))) {\n terrain = getTerrain(data, width, height, elevationDecoder, 'martini');\n mesh = getMartiniTileMesh(meshMaxError, width, terrain);\n } else {\n terrain = getTerrain(data, width, height, elevationDecoder, 'delatin');\n mesh = getDelatinTileMesh(meshMaxError, width, height, terrain);\n }\n break;\n }\n\n const {vertices} = mesh;\n let {triangles} = mesh;\n let attributes = getMeshAttributes(vertices, terrain, width, height, bounds);\n\n // Compute bounding box before adding skirt so that z values are not skewed\n const boundingBox = getMeshBoundingBox(attributes);\n\n if (terrainOptions.skirtHeight) {\n const {attributes: newAttributes, triangles: newTriangles} = addSkirt(\n attributes,\n triangles,\n terrainOptions.skirtHeight\n );\n attributes = newAttributes;\n triangles = newTriangles;\n }\n\n return {\n // Data return by this loader implementation\n loaderData: {\n header: {}\n },\n header: {\n vertexCount: triangles.length,\n boundingBox\n },\n mode: 4, // TRIANGLES\n indices: {value: Uint32Array.from(triangles), size: 1},\n attributes\n };\n}\n\n/**\n * Get Martini generated vertices and triangles\n *\n * @param {number} meshMaxError threshold for simplifying mesh\n * @param {number} width width of the input data\n * @param {number[] | Float32Array} terrain elevation data\n * @returns {{vertices: Uint16Array, triangles: Uint32Array}} vertices and triangles data\n */\nfunction getMartiniTileMesh(meshMaxError, width, terrain) {\n const gridSize = width + 1;\n const martini = new Martini(gridSize);\n const tile = martini.createTile(terrain);\n const {vertices, triangles} = tile.getMesh(meshMaxError);\n\n return {vertices, triangles};\n}\n\n/**\n * Get Delatin generated vertices and triangles\n *\n * @param {number} meshMaxError threshold for simplifying mesh\n * @param {number} width width of the input data array\n * @param {number} height height of the input data array\n * @param {number[] | Float32Array} terrain elevation data\n * @returns {{vertices: number[], triangles: number[]}} vertices and triangles data\n */\nfunction getDelatinTileMesh(meshMaxError, width, height, terrain) {\n const tin = new Delatin(terrain, width + 1, height + 1);\n tin.run(meshMaxError);\n // @ts-expect-error\n const {coords, triangles} = tin;\n const vertices = coords;\n return {vertices, triangles};\n}\n\nfunction getTerrain(\n imageData: Uint8Array,\n width: number,\n height: number,\n elevationDecoder: ElevationDecoder,\n tesselator: 'martini' | 'delatin'\n) {\n const {rScaler, bScaler, gScaler, offset} = elevationDecoder;\n\n // From Martini demo\n // https://observablehq.com/@mourner/martin-real-time-rtin-terrain-mesh\n const terrain = new Float32Array((width + 1) * (height + 1));\n // decode terrain values\n for (let i = 0, y = 0; y < height; y++) {\n for (let x = 0; x < width; x++, i++) {\n const k = i * 4;\n const r = imageData[k + 0];\n const g = imageData[k + 1];\n const b = imageData[k + 2];\n terrain[i + y] = r * rScaler + g * gScaler + b * bScaler + offset;\n }\n }\n\n if (tesselator === 'martini') {\n // backfill bottom border\n for (let i = (width + 1) * width, x = 0; x < width; x++, i++) {\n terrain[i] = terrain[i - width - 1];\n }\n // backfill right border\n for (let i = height, y = 0; y < height + 1; y++, i += height + 1) {\n terrain[i] = terrain[i - 1];\n }\n }\n\n return terrain;\n}\n\nfunction getMeshAttributes(\n vertices,\n terrain: Uint8Array,\n width: number,\n height: number,\n bounds: number[]\n) {\n const gridSize = width + 1;\n const numOfVerticies = vertices.length / 2;\n // vec3. x, y in pixels, z in meters\n const positions = new Float32Array(numOfVerticies * 3);\n // vec2. 1 to 1 relationship with position. represents the uv on the texture image. 0,0 to 1,1.\n const texCoords = new Float32Array(numOfVerticies * 2);\n\n const [minX, minY, maxX, maxY] = bounds || [0, 0, width, height];\n const xScale = (maxX - minX) / width;\n const yScale = (maxY - minY) / height;\n\n for (let i = 0; i < numOfVerticies; i++) {\n const x = vertices[i * 2];\n const y = vertices[i * 2 + 1];\n const pixelIdx = y * gridSize + x;\n\n positions[3 * i + 0] = x * xScale + minX;\n positions[3 * i + 1] = -y * yScale + maxY;\n positions[3 * i + 2] = terrain[pixelIdx];\n\n texCoords[2 * i + 0] = x / width;\n texCoords[2 * i + 1] = y / height;\n }\n\n return {\n POSITION: {value: positions, size: 3},\n TEXCOORD_0: {value: texCoords, size: 2}\n // NORMAL: {}, - optional, but creates the high poly look with lighting\n };\n}\n"],"mappings":"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"}
@@ -1293,7 +1293,7 @@
1293
1293
  }
1294
1294
 
1295
1295
  // src/lib/utils/version.ts
1296
- var VERSION = true ? "4.0.0-beta.7" : "latest";
1296
+ var VERSION = true ? "4.0.0" : "latest";
1297
1297
 
1298
1298
  // src/terrain-loader.ts
1299
1299
  var TerrainLoader = {
@@ -1293,7 +1293,7 @@
1293
1293
  }
1294
1294
 
1295
1295
  // src/lib/utils/version.ts
1296
- var VERSION = true ? "4.0.0-beta.7" : "latest";
1296
+ var VERSION = true ? "4.0.0" : "latest";
1297
1297
 
1298
1298
  // src/terrain-loader.ts
1299
1299
  var TerrainLoader = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@loaders.gl/terrain",
3
- "version": "4.0.0-beta.7",
3
+ "version": "4.0.0",
4
4
  "description": "Framework-independent loader for terrain raster formats",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -43,10 +43,10 @@
43
43
  },
44
44
  "dependencies": {
45
45
  "@babel/runtime": "^7.3.1",
46
- "@loaders.gl/images": "4.0.0-beta.7",
47
- "@loaders.gl/loader-utils": "4.0.0-beta.7",
48
- "@loaders.gl/schema": "4.0.0-beta.7",
46
+ "@loaders.gl/images": "4.0.0",
47
+ "@loaders.gl/loader-utils": "4.0.0",
48
+ "@loaders.gl/schema": "4.0.0",
49
49
  "@mapbox/martini": "^0.2.0"
50
50
  },
51
- "gitHead": "5b6cab0ab5d73212cfa37fa5da6e25ad7ef83fe5"
51
+ "gitHead": "9b4211dc0ecd4134a1638ac0a29c5ea9008fd971"
52
52
  }
@@ -1,4 +1,5 @@
1
1
  // loaders.gl, MIT license
2
+ // Copyright (c) vis.gl contributors
2
3
 
3
4
  import {getMeshBoundingBox} from '@loaders.gl/schema';
4
5
  import Martini from '@mapbox/martini';