@tangram.gl/tangram-renderer 0.0.0-stage → 0.0.1
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/README.md +60 -2
- package/dist/core.js +36923 -0
- package/dist/core.js.map +6 -0
- package/dist/index.js +32 -0
- package/dist/loaders-gl-worker.js +82 -0
- package/dist/loaders-gl-worker.js.map +6 -0
- package/dist/map-logic.js +2 -0
- package/dist/map-logic.js.map +6 -0
- package/dist/projected-basemaps-worker.js +3 -0
- package/dist/projected-basemaps-worker.js.map +6 -0
- package/dist/shader-modules.js +141 -0
- package/dist/shader-modules.js.map +6 -0
- package/dist/style-schema.js +126 -0
- package/dist/style-schema.js.map +6 -0
- package/dist/tangram-style.schema.json +882 -0
- package/dist/tangram.debug.mjs +37139 -0
- package/dist/tangram.debug.mjs.map +6 -0
- package/dist/tangram.min.mjs +4950 -0
- package/dist/types/builders/earcut.d.ts +15 -0
- package/dist/types/core.d.ts +29 -0
- package/dist/types/gl/constants.d.ts +2 -0
- package/dist/types/gl/globe_mesh.d.ts +48 -0
- package/dist/types/gl/glsl.d.ts +17 -0
- package/dist/types/gl/vertex-constants.d.ts +4 -0
- package/dist/types/gl/vertex-types.d.ts +34 -0
- package/dist/types/gl/vertex_data.d.ts +32 -0
- package/dist/types/gl/vertex_elements.d.ts +8 -0
- package/dist/types/gl/vertex_layout.d.ts +32 -0
- package/dist/types/glsl.d.ts +14 -0
- package/dist/types/gpu/luma_device_renderer.d.ts +66 -0
- package/dist/types/gpu/resource_lifecycle.d.ts +4 -0
- package/dist/types/gpu/tangram_gpu_backend.d.ts +151 -0
- package/dist/types/index.d.ts +155 -0
- package/dist/types/lights/light-definitions.d.ts +121 -0
- package/dist/types/map-logic/draped-terrain-bounds.d.ts +41 -0
- package/dist/types/map-logic/globe-terrain-preparation.d.ts +85 -0
- package/dist/types/map-logic/globe-terrain.d.ts +54 -0
- package/dist/types/map-logic/index.d.ts +33 -0
- package/dist/types/map-logic/label-identity.d.ts +22 -0
- package/dist/types/map-logic/label-placement.d.ts +32 -0
- package/dist/types/map-logic/screen-bounds.d.ts +15 -0
- package/dist/types/map-logic/terrain-data.d.ts +55 -0
- package/dist/types/map-logic/terrain-error.d.ts +51 -0
- package/dist/types/map-logic/terrain-ground-topology.d.ts +26 -0
- package/dist/types/map-logic/terrain-height-field.d.ts +59 -0
- package/dist/types/map-logic/terrain-navigation.d.ts +27 -0
- package/dist/types/map-logic/terrain-neighborhood.d.ts +5 -0
- package/dist/types/map-logic/terrain-query.d.ts +33 -0
- package/dist/types/map-logic/terrain-resource-budget.d.ts +51 -0
- package/dist/types/map-logic/terrain-transition-topology.d.ts +23 -0
- package/dist/types/map-logic/tile-build-queue.d.ts +51 -0
- package/dist/types/map-logic/tile-cache-policy.d.ts +46 -0
- package/dist/types/map-logic/tile-residency.d.ts +17 -0
- package/dist/types/map-logic/triangle-query-index.d.ts +87 -0
- package/dist/types/procedures/js-yaml.d.ts +15 -0
- package/dist/types/procedures/mesh-projector.d.ts +107 -0
- package/dist/types/procedures/mvt-dependencies.d.ts +20 -0
- package/dist/types/procedures/projected-coordinate-transform.d.ts +27 -0
- package/dist/types/procedures/projection-batch-executor.d.ts +53 -0
- package/dist/types/procedures/scene-yaml-legacy.d.ts +6 -0
- package/dist/types/procedures/terrain-draping.d.ts +165 -0
- package/dist/types/procedures/terrain-globe.d.ts +6 -0
- package/dist/types/procedures/terrain-styled-topology.d.ts +34 -0
- package/dist/types/procedures/web-mercator-legacy.d.ts +4 -0
- package/dist/types/procedures/web-mercator-math.d.ts +4 -0
- package/dist/types/scene/globals.d.ts +11 -0
- package/dist/types/scene/ground_footprint.d.ts +16 -0
- package/dist/types/scene/host_frame.d.ts +54 -0
- package/dist/types/scene/projection_math.d.ts +52 -0
- package/dist/types/scene/scene-resource-types.d.ts +177 -0
- package/dist/types/scene/scene_bundle.d.ts +69 -0
- package/dist/types/scene/visibility_adapter.d.ts +106 -0
- package/dist/types/selection/draped-terrain-surface.d.ts +78 -0
- package/dist/types/selection/terrain_surface.d.ts +149 -0
- package/dist/types/shader-modules/globe-horizon.d.ts +15 -0
- package/dist/types/shader-modules/height-decode.d.ts +13 -0
- package/dist/types/shader-modules/hillshade.d.ts +13 -0
- package/dist/types/shader-modules/index.d.ts +6 -0
- package/dist/types/shader-modules/planar.d.ts +12 -0
- package/dist/types/shader-modules/sphere-map.d.ts +13 -0
- package/dist/types/shader-modules/triplanar.d.ts +15 -0
- package/dist/types/sources/decoded_tile_store.d.ts +95 -0
- package/dist/types/sources/tile_source_metadata.d.ts +32 -0
- package/dist/types/styles/text/fontfaceobserver.d.ts +10 -0
- package/dist/types/tile/tile_id.d.ts +37 -0
- package/dist/types/tile/tile_traversal_adapter.d.ts +63 -0
- package/dist/types/types.d.ts +293 -0
- package/dist/types/utils/geo.d.ts +57 -0
- package/dist/types/utils/hash.d.ts +1 -0
- package/dist/types/utils/log.d.ts +27 -0
- package/dist/types/utils/props.d.ts +6 -0
- package/dist/types/utils/subscribe.d.ts +10 -0
- package/dist/types/utils/thread.d.ts +6 -0
- package/dist/types/utils/urls.d.ts +26 -0
- package/dist/types/utils/utils.d.ts +26 -0
- package/dist/types/utils/version.d.ts +2 -0
- package/dist/types/utils/worker-types.d.ts +68 -0
- package/dist/types/utils/worker_broker.d.ts +3 -0
- package/package.json +103 -3
- package/src/builders/common.ts +41 -0
- package/src/builders/earcut.d.ts +15 -0
- package/src/builders/geometry-types.ts +60 -0
- package/src/builders/points.ts +115 -0
- package/src/builders/polygons.ts +225 -0
- package/src/builders/polylines.ts +682 -0
- package/src/builders/wireframe.ts +31 -0
- package/src/core.d.ts +29 -0
- package/src/core.ts +33 -0
- package/src/experimental/loaders-gl-worker.ts +19 -0
- package/src/experimental/projected-basemaps-worker.ts +13 -0
- package/src/experimental/projected-mesh-cache.ts +137 -0
- package/src/experimental/projected-mesh-domain.ts +110 -0
- package/src/experimental/projected-mesh-refinement.ts +193 -0
- package/src/experimental/projected-mesh.ts +399 -0
- package/src/experimental/projected-normal.ts +26 -0
- package/src/experimental/projected-symbol-mesh.ts +74 -0
- package/src/gl/constants.ts +18 -0
- package/src/gl/context.ts +103 -0
- package/src/gl/extensions.ts +30 -0
- package/src/gl/globe_mesh.ts +285 -0
- package/src/gl/glsl.ts +257 -0
- package/src/gl/mesh-types.ts +56 -0
- package/src/gl/render_state.ts +111 -0
- package/src/gl/shader_program.ts +1310 -0
- package/src/gl/texture.ts +814 -0
- package/src/gl/uniform_buffer.ts +340 -0
- package/src/gl/vao.ts +154 -0
- package/src/gl/vbo_mesh.ts +349 -0
- package/src/gl/vertex-constants.ts +19 -0
- package/src/gl/vertex-types.ts +35 -0
- package/src/gl/vertex_data.ts +126 -0
- package/src/gl/vertex_elements.ts +54 -0
- package/src/gl/vertex_layout.ts +241 -0
- package/src/glsl.d.ts +14 -0
- package/src/gpu/luma_device_renderer.ts +579 -0
- package/src/gpu/pixel_readback.ts +51 -0
- package/src/gpu/resource_lifecycle.ts +32 -0
- package/src/gpu/tangram_gpu_backend.ts +195 -0
- package/src/index.d.ts +155 -0
- package/src/index.ts +105 -0
- package/src/labels/collision-types.ts +94 -0
- package/src/labels/collision.ts +273 -0
- package/src/labels/collision_grid.ts +61 -0
- package/src/labels/intersect.ts +30 -0
- package/src/labels/label-types.ts +91 -0
- package/src/labels/label.ts +207 -0
- package/src/labels/label_line.ts +801 -0
- package/src/labels/label_point.ts +131 -0
- package/src/labels/main-pass-types.ts +73 -0
- package/src/labels/main_pass.ts +221 -0
- package/src/labels/point_anchor.ts +100 -0
- package/src/labels/point_placement.ts +150 -0
- package/src/labels/projected-pass.ts +259 -0
- package/src/labels/repeat_group.ts +72 -0
- package/src/lights/ambient_light.glsl +18 -0
- package/src/lights/directional_light.glsl +39 -0
- package/src/lights/geographic-lights.ts +21 -0
- package/src/lights/light-definitions.ts +285 -0
- package/src/lights/light.ts +590 -0
- package/src/lights/lighting-uniforms.ts +80 -0
- package/src/lights/lighting-wgsl.ts +116 -0
- package/src/lights/material.glsl +237 -0
- package/src/lights/material.ts +145 -0
- package/src/lights/native-falloff.ts +37 -0
- package/src/lights/point_light.glsl +96 -0
- package/src/lights/spot_light.glsl +111 -0
- package/src/map-logic/draped-terrain-bounds.ts +71 -0
- package/src/map-logic/globe-terrain-preparation.ts +217 -0
- package/src/map-logic/globe-terrain.ts +296 -0
- package/src/map-logic/index.ts +37 -0
- package/src/map-logic/label-identity.ts +36 -0
- package/src/map-logic/label-placement.ts +117 -0
- package/src/map-logic/screen-bounds.ts +34 -0
- package/src/map-logic/terrain-data.ts +107 -0
- package/src/map-logic/terrain-error.ts +134 -0
- package/src/map-logic/terrain-ground-topology.ts +164 -0
- package/src/map-logic/terrain-height-field.ts +254 -0
- package/src/map-logic/terrain-navigation.ts +50 -0
- package/src/map-logic/terrain-neighborhood.ts +43 -0
- package/src/map-logic/terrain-query.ts +51 -0
- package/src/map-logic/terrain-resource-budget.ts +124 -0
- package/src/map-logic/terrain-transition-topology.ts +164 -0
- package/src/map-logic/tile-build-queue.ts +110 -0
- package/src/map-logic/tile-cache-policy.ts +89 -0
- package/src/map-logic/tile-residency.ts +50 -0
- package/src/map-logic/triangle-query-index.ts +265 -0
- package/src/procedures/js-yaml.d.ts +15 -0
- package/src/procedures/mesh-projector.ts +191 -0
- package/src/procedures/mlt-loaders.ts +55 -0
- package/src/procedures/mvt-dependencies.d.ts +20 -0
- package/src/procedures/mvt-legacy.ts +150 -0
- package/src/procedures/mvt-loaders.ts +53 -0
- package/src/procedures/mvt-parser.ts +48 -0
- package/src/procedures/mvt-properties.ts +36 -0
- package/src/procedures/mvt-tile-provider.ts +72 -0
- package/src/procedures/pmtiles-loader.ts +75 -0
- package/src/procedures/projected-coordinate-transform.ts +79 -0
- package/src/procedures/projection-batch-executor.ts +140 -0
- package/src/procedures/scene-yaml-legacy.ts +16 -0
- package/src/procedures/scene-yaml-loaders.ts +10 -0
- package/src/procedures/terrain-draping.ts +713 -0
- package/src/procedures/terrain-globe.ts +32 -0
- package/src/procedures/terrain-styled-topology.ts +184 -0
- package/src/procedures/web-mercator-legacy.ts +24 -0
- package/src/procedures/web-mercator-math.ts +50 -0
- package/src/scene/camera.ts +298 -0
- package/src/scene/camera_base.ts +116 -0
- package/src/scene/classic_scene.ts +20 -0
- package/src/scene/external_camera.ts +101 -0
- package/src/scene/globals.ts +120 -0
- package/src/scene/ground_footprint.ts +139 -0
- package/src/scene/host_frame.ts +326 -0
- package/src/scene/projected_tile_lod.ts +125 -0
- package/src/scene/projection_math.ts +142 -0
- package/src/scene/projection_shaders.ts +183 -0
- package/src/scene/renderer.ts +516 -0
- package/src/scene/scene-resource-types.ts +174 -0
- package/src/scene/scene.ts +2378 -0
- package/src/scene/scene_bundle.ts +304 -0
- package/src/scene/scene_debug.ts +129 -0
- package/src/scene/scene_loader.ts +402 -0
- package/src/scene/scene_worker.ts +528 -0
- package/src/scene/view.ts +683 -0
- package/src/scene/visibility_adapter.ts +319 -0
- package/src/scene/worker_url.ts +15 -0
- package/src/selection/draped-terrain-surface.ts +377 -0
- package/src/selection/selection-types.ts +79 -0
- package/src/selection/selection.ts +542 -0
- package/src/selection/selection_fragment.glsl +18 -0
- package/src/selection/selection_globals.glsl +9 -0
- package/src/selection/selection_pixels.ts +59 -0
- package/src/selection/selection_vertex.glsl +15 -0
- package/src/selection/terrain_surface.ts +298 -0
- package/src/shader-modules/globe-horizon.ts +52 -0
- package/src/shader-modules/height-decode.ts +41 -0
- package/src/shader-modules/hillshade.ts +70 -0
- package/src/shader-modules/index.ts +10 -0
- package/src/shader-modules/planar.ts +24 -0
- package/src/shader-modules/sphere-map.ts +38 -0
- package/src/shader-modules/triplanar.ts +45 -0
- package/src/sources/aligned_tile_source.ts +122 -0
- package/src/sources/data_source.ts +655 -0
- package/src/sources/decoded_tile_store.ts +245 -0
- package/src/sources/geojson.ts +300 -0
- package/src/sources/mvt.ts +247 -0
- package/src/sources/raster.ts +341 -0
- package/src/sources/shared_tile_source_adapter.ts +117 -0
- package/src/sources/sources.ts +10 -0
- package/src/sources/tile_source_adapter.ts +84 -0
- package/src/sources/tile_source_metadata.ts +65 -0
- package/src/sources/tile_source_state.ts +112 -0
- package/src/sources/topojson.ts +90 -0
- package/src/styles/feature_annotations.ts +16 -0
- package/src/styles/filter.ts +190 -0
- package/src/styles/geometry-style-types.ts +209 -0
- package/src/styles/globe_visibility_wgsl.ts +22 -0
- package/src/styles/layer-types.ts +45 -0
- package/src/styles/layer.ts +586 -0
- package/src/styles/lines/dasharray.ts +49 -0
- package/src/styles/lines/lines.ts +707 -0
- package/src/styles/lines/lines_wgsl.ts +224 -0
- package/src/styles/points/point-runtime-types.ts +125 -0
- package/src/styles/points/points.ts +1079 -0
- package/src/styles/points/points_fragment.glsl +126 -0
- package/src/styles/points/points_vertex.glsl +230 -0
- package/src/styles/points/points_wgsl.ts +189 -0
- package/src/styles/polygons/polygons.ts +268 -0
- package/src/styles/polygons/polygons_fragment.glsl +173 -0
- package/src/styles/polygons/polygons_vertex.glsl +213 -0
- package/src/styles/polygons/polygons_wgsl.ts +127 -0
- package/src/styles/property-types.ts +125 -0
- package/src/styles/raster/raster.ts +33 -0
- package/src/styles/raster/raster_globals.glsl +46 -0
- package/src/styles/style-mixing-types.ts +101 -0
- package/src/styles/style-runtime-types.ts +220 -0
- package/src/styles/style-schema.ts +133 -0
- package/src/styles/style.ts +1033 -0
- package/src/styles/style_globals.glsl +69 -0
- package/src/styles/style_manager.ts +464 -0
- package/src/styles/style_parser.ts +620 -0
- package/src/styles/text/font_manager.ts +180 -0
- package/src/styles/text/fontfaceobserver.d.ts +10 -0
- package/src/styles/text/text-types.ts +220 -0
- package/src/styles/text/text.ts +378 -0
- package/src/styles/text/text_canvas.ts +773 -0
- package/src/styles/text/text_labels.ts +436 -0
- package/src/styles/text/text_segments.ts +142 -0
- package/src/styles/text/text_settings.ts +228 -0
- package/src/styles/text/text_wgsl.ts +159 -0
- package/src/styles/text/text_wrap.ts +194 -0
- package/src/tile/globe_tile_preload.ts +40 -0
- package/src/tile/tangram_tileset_2d.ts +108 -0
- package/src/tile/tile-build-types.ts +155 -0
- package/src/tile/tile.ts +807 -0
- package/src/tile/tile_id.ts +172 -0
- package/src/tile/tile_manager.ts +889 -0
- package/src/tile/tile_pyramid.ts +119 -0
- package/src/tile/tile_resource_cache.ts +91 -0
- package/src/tile/tile_traversal_adapter.ts +132 -0
- package/src/types.ts +332 -0
- package/src/utils/debounce.ts +17 -0
- package/src/utils/debug_settings.ts +43 -0
- package/src/utils/errors.ts +12 -0
- package/src/utils/functions.ts +95 -0
- package/src/utils/geo.ts +364 -0
- package/src/utils/hash.ts +14 -0
- package/src/utils/log.ts +108 -0
- package/src/utils/media_capture.ts +193 -0
- package/src/utils/merge.ts +44 -0
- package/src/utils/obb.ts +134 -0
- package/src/utils/props.ts +43 -0
- package/src/utils/slice.ts +14 -0
- package/src/utils/subscribe.ts +58 -0
- package/src/utils/task.ts +154 -0
- package/src/utils/thread.ts +26 -0
- package/src/utils/urls.ts +223 -0
- package/src/utils/utils.ts +310 -0
- package/src/utils/vector.ts +197 -0
- package/src/utils/version.ts +8 -0
- package/src/utils/worker-types.ts +79 -0
- package/src/utils/worker_broker.ts +523 -0
package/package.json
CHANGED
|
@@ -1,6 +1,106 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tangram.gl/tangram-renderer",
|
|
3
|
-
"version": "0.0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Tangram vector-tile scene renderer powered by luma.gl",
|
|
5
|
+
"homepage": "https://vis.gl/tangram.gl/",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "dist/index.js",
|
|
8
|
+
"module": "dist/index.js",
|
|
9
|
+
"types": "dist/types/index.d.ts",
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"types": "./dist/types/index.d.ts",
|
|
13
|
+
"import": "./dist/index.js",
|
|
14
|
+
"default": "./dist/index.js"
|
|
15
|
+
},
|
|
16
|
+
"./dist/*": "./dist/*",
|
|
17
|
+
"./core": {
|
|
18
|
+
"types": "./dist/types/core.d.ts",
|
|
19
|
+
"import": "./dist/core.js",
|
|
20
|
+
"default": "./dist/core.js"
|
|
21
|
+
},
|
|
22
|
+
"./style-schema": {
|
|
23
|
+
"import": "./dist/style-schema.js"
|
|
24
|
+
},
|
|
25
|
+
"./map-logic": {
|
|
26
|
+
"types": "./dist/types/map-logic/index.d.ts",
|
|
27
|
+
"import": "./dist/map-logic.js",
|
|
28
|
+
"default": "./dist/map-logic.js"
|
|
29
|
+
},
|
|
30
|
+
"./experimental/shader-modules": {
|
|
31
|
+
"types": "./dist/types/shader-modules/index.d.ts",
|
|
32
|
+
"import": "./dist/shader-modules.js",
|
|
33
|
+
"default": "./dist/shader-modules.js"
|
|
34
|
+
},
|
|
35
|
+
"./tangram-style.schema.json": "./dist/tangram-style.schema.json"
|
|
36
|
+
},
|
|
37
|
+
"files": [
|
|
38
|
+
"dist",
|
|
39
|
+
"src"
|
|
40
|
+
],
|
|
41
|
+
"sideEffects": true,
|
|
42
|
+
"repository": {
|
|
43
|
+
"type": "git",
|
|
44
|
+
"url": "https://github.com/visgl/tangram.gl.git",
|
|
45
|
+
"directory": "modules/tangram-renderer"
|
|
46
|
+
},
|
|
47
|
+
"license": "MIT",
|
|
48
|
+
"publishConfig": {
|
|
49
|
+
"access": "public"
|
|
50
|
+
},
|
|
51
|
+
"scripts": {
|
|
52
|
+
"build": "yarn build:types && node scripts/build.mjs && yarn build:entry && yarn build:map-logic && yarn build:shader-modules && yarn build:style-schema && yarn generate-style-schema && yarn build:loaders-gl-worker && yarn build:projection-worker && yarn build:size",
|
|
53
|
+
"build:types": "node ../../scripts/build-package-types.mjs modules/tangram-renderer index.d.ts core.d.ts types.ts map-logic/index.ts shader-modules/index.ts",
|
|
54
|
+
"build:shader-modules": "yarn --cwd ../.. ocular-bundle modules/tangram-renderer/src/shader-modules/index.ts --format=esm --output=modules/tangram-renderer/dist/shader-modules.js --externals=@tangram.gl/tangram-layers --sourcemap=true --sourcesContent=false",
|
|
55
|
+
"build:map-logic": "yarn --cwd ../.. ocular-bundle modules/tangram-renderer/src/map-logic/index.ts --format=esm --output=modules/tangram-renderer/dist/map-logic.js --externals=@tangram.gl/tangram-layers --sourcemap=true --sourcesContent=false",
|
|
56
|
+
"build:projection-worker": "yarn --cwd ../.. ocular-bundle modules/tangram-renderer/src/experimental/projected-basemaps-worker.ts --format=iife --globalName=TangramProjectedBasemaps --output=modules/tangram-renderer/dist/projected-basemaps-worker.js --externals=@tangram.gl/tangram-layers --sourcemap=true --sourcesContent=false",
|
|
57
|
+
"build:entry": "node scripts/write-package-entry.mjs",
|
|
58
|
+
"build:style-schema": "yarn --cwd ../.. ocular-bundle modules/tangram-renderer/src/styles/style-schema.ts --env=dev --format=esm --output=modules/tangram-renderer/dist/style-schema.js --externals=zod --sourcemap=true --sourcesContent=false",
|
|
59
|
+
"build:loaders-gl-worker": "yarn --cwd ../.. ocular-bundle modules/tangram-renderer/src/experimental/loaders-gl-worker.ts --format=iife --globalName=TangramLoadersGL --output=modules/tangram-renderer/dist/loaders-gl-worker.js --externals=@tangram.gl/tangram-layers --sourcemap=true --sourcesContent=false",
|
|
60
|
+
"generate-style-schema": "node scripts/generate-style-schema.mjs",
|
|
61
|
+
"build:size": "gzip dist/tangram.min.mjs -c | wc -c | awk '{kb=$1/1000; print kb}' OFMT='Renderer ESM:\\t%.0f KB (min/gzip)'",
|
|
62
|
+
"prepack": "yarn build",
|
|
63
|
+
"watch": "node scripts/build.mjs --watch",
|
|
64
|
+
"test-build-worker": "node scripts/build.mjs --test-worker"
|
|
65
|
+
},
|
|
66
|
+
"devDependencies": {
|
|
67
|
+
"@loaders.gl/config": "5.0.0-alpha.11",
|
|
68
|
+
"@loaders.gl/core": "5.0.0-alpha.11",
|
|
69
|
+
"@loaders.gl/loader-utils": "5.0.0-alpha.11",
|
|
70
|
+
"@loaders.gl/mlt": "5.0.0-alpha.11",
|
|
71
|
+
"@loaders.gl/mvt": "5.0.0-alpha.11",
|
|
72
|
+
"@loaders.gl/pmtiles": "5.0.0-alpha.11",
|
|
73
|
+
"@loaders.gl/tiles": "5.0.0-alpha.11",
|
|
74
|
+
"@math.gl/geospatial": "5.0.0-alpha.18",
|
|
75
|
+
"@math.gl/projection": "5.0.0-alpha.18",
|
|
76
|
+
"esbuild": "^0.28.1"
|
|
77
|
+
},
|
|
78
|
+
"dependencies": {
|
|
79
|
+
"@luma.gl/core": "^9.4.2",
|
|
80
|
+
"@luma.gl/shadertools": "^9.4.2",
|
|
81
|
+
"@mapbox/vector-tile": "1.3.0",
|
|
82
|
+
"@math.gl/core": "5.0.0-alpha.18",
|
|
83
|
+
"@math.gl/culling": "5.0.0-alpha.18",
|
|
84
|
+
"@math.gl/web-mercator": "5.0.0-alpha.18",
|
|
85
|
+
"core-js": "^3.39.0",
|
|
86
|
+
"csscolorparser": "1.0.3",
|
|
87
|
+
"earcut": "2.2.2",
|
|
88
|
+
"fontfaceobserver": "2.0.7",
|
|
89
|
+
"geojson-vt": "3.2.1",
|
|
90
|
+
"gl-shader-errors": "1.0.3",
|
|
91
|
+
"js-yaml": "https://github.com/tangrams/js-yaml.git#read-only",
|
|
92
|
+
"jszip": "^3.10.1",
|
|
93
|
+
"pbf": "3.1.0",
|
|
94
|
+
"quickselect": "3.0.0",
|
|
95
|
+
"topojson-client": "https://github.com/tangrams/topojson-client.git#read-only",
|
|
96
|
+
"zod": "^4.1.12"
|
|
97
|
+
},
|
|
98
|
+
"peerDependencies": {
|
|
99
|
+
"@math.gl/projection": "5.0.0-alpha.18"
|
|
100
|
+
},
|
|
101
|
+
"peerDependenciesMeta": {
|
|
102
|
+
"@math.gl/projection": {
|
|
103
|
+
"optional": true
|
|
104
|
+
}
|
|
105
|
+
}
|
|
6
106
|
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// Tangram
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) 2013-2016 Brett Camper and Mapzen
|
|
4
|
+
// Copyright (c) 2026 vis.gl contributors
|
|
5
|
+
|
|
6
|
+
// Geometry building functions
|
|
7
|
+
import Geo from '../utils/geo';
|
|
8
|
+
|
|
9
|
+
export const tile_bounds = [
|
|
10
|
+
{ x: 0, y: 0},
|
|
11
|
+
{ x: Geo.tile_scale, y: -Geo.tile_scale } // TODO: correct for flipped y-axis?
|
|
12
|
+
];
|
|
13
|
+
|
|
14
|
+
export const default_uvs = [0, 0, 1, 1];
|
|
15
|
+
|
|
16
|
+
// Tests if a line segment (from point A to B) is outside the tile bounds
|
|
17
|
+
// (within a certain tolerance to account for geometry nearly on tile edges)
|
|
18
|
+
export function outsideTile (_a: number[], _b: number[], tolerance: number): boolean {
|
|
19
|
+
let tile_min = tile_bounds[0];
|
|
20
|
+
let tile_max = tile_bounds[1];
|
|
21
|
+
|
|
22
|
+
// TODO: fix flipped Y coords here, confusing with 'max' reference
|
|
23
|
+
if ((_a[0] <= tile_min.x + tolerance && _b[0] <= tile_min.x + tolerance) ||
|
|
24
|
+
(_a[0] >= tile_max.x - tolerance && _b[0] >= tile_max.x - tolerance) ||
|
|
25
|
+
(_a[1] >= tile_min.y - tolerance && _b[1] >= tile_min.y - tolerance) ||
|
|
26
|
+
(_a[1] <= tile_max.y + tolerance && _b[1] <= tile_max.y + tolerance)) {
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function isCoordOutsideTile (coord: number[], tolerance = 0): boolean {
|
|
34
|
+
let tile_min = tile_bounds[0];
|
|
35
|
+
let tile_max = tile_bounds[1];
|
|
36
|
+
|
|
37
|
+
return coord[0] <= tile_min.x + tolerance ||
|
|
38
|
+
coord[0] >= tile_max.x - tolerance ||
|
|
39
|
+
coord[1] >= tile_min.y - tolerance ||
|
|
40
|
+
coord[1] <= tile_max.y + tolerance;
|
|
41
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// tangram-layers
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
4
|
+
|
|
5
|
+
declare module 'earcut' {
|
|
6
|
+
type EarcutResult = number[];
|
|
7
|
+
|
|
8
|
+
interface EarcutFunction {
|
|
9
|
+
(vertices: number[], holes?: number[], dimensions?: number): EarcutResult;
|
|
10
|
+
flatten(data: number[][][]): {vertices: number[]; holes: number[]; dimensions: number};
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const earcut: EarcutFunction;
|
|
14
|
+
export default earcut;
|
|
15
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
// tangram-layers
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
4
|
+
|
|
5
|
+
/** Tile-local coordinates; additional height components are retained by builders. */
|
|
6
|
+
export type GeometryCoordinate = number[];
|
|
7
|
+
/** One ordered polyline or closed polygon ring. */
|
|
8
|
+
export type GeometryLine = GeometryCoordinate[];
|
|
9
|
+
/** Polygon rings may carry area metadata assigned during source preprocessing. */
|
|
10
|
+
export type GeometryRing = GeometryLine & {area?: number};
|
|
11
|
+
/** Polygon exterior followed by holes in source winding order. */
|
|
12
|
+
export type GeometryPolygon = GeometryRing[];
|
|
13
|
+
/** Builder sink shared by real packed buffers and deterministic geometry fixtures. */
|
|
14
|
+
export interface GeometryVertexData {
|
|
15
|
+
vertex_count: number;
|
|
16
|
+
vertex_elements: {push(index: number): void};
|
|
17
|
+
addVertex(vertex: number[]): void;
|
|
18
|
+
}
|
|
19
|
+
/** Resolved line geometry parameters, independent of authored property caches. */
|
|
20
|
+
export interface PolylineStyle {
|
|
21
|
+
width: number;
|
|
22
|
+
cap?: 'butt' | 'square' | 'round';
|
|
23
|
+
join?: 'miter' | 'bevel' | 'round';
|
|
24
|
+
miter_limit?: number;
|
|
25
|
+
texcoord_width: number;
|
|
26
|
+
offset: number;
|
|
27
|
+
}
|
|
28
|
+
/** Attribute component indices; portable untextured lines explicitly disable UV writes. */
|
|
29
|
+
export interface PolylineVertexIndices {
|
|
30
|
+
a_extrude: number;
|
|
31
|
+
a_offset?: number;
|
|
32
|
+
a_texcoord?: number | null;
|
|
33
|
+
/** Optional CPU-projection source normals and authored stroke dimensions. */
|
|
34
|
+
a_projected_normals?: number;
|
|
35
|
+
a_projected_widths?: number;
|
|
36
|
+
}
|
|
37
|
+
/** Per-build mutable state; deferred segments retain the same geometry sink. */
|
|
38
|
+
export interface PolylineBuildContext {
|
|
39
|
+
closed_polygon: boolean | undefined;
|
|
40
|
+
remove_tile_edges: boolean | undefined;
|
|
41
|
+
tile_edge_tolerance: number;
|
|
42
|
+
miter_len_sq: number | undefined;
|
|
43
|
+
join_type: number;
|
|
44
|
+
cap_type: number;
|
|
45
|
+
vertex_data: GeometryVertexData;
|
|
46
|
+
vertex_template: number[];
|
|
47
|
+
half_width: number;
|
|
48
|
+
extrude_index: number;
|
|
49
|
+
offset_index: number | undefined;
|
|
50
|
+
v_scale: number | undefined;
|
|
51
|
+
texcoord_index: number | null | undefined;
|
|
52
|
+
texcoord_width: number;
|
|
53
|
+
offset: number;
|
|
54
|
+
geom_count: number;
|
|
55
|
+
extra_lines?: GeometryLine[];
|
|
56
|
+
/** Adjacent source normals retained only by opt-in projected line layouts. */
|
|
57
|
+
projected_normals_index?: number;
|
|
58
|
+
projected_widths_index?: number;
|
|
59
|
+
projected_normals?: number[];
|
|
60
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
// Tangram
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) 2013-2016 Brett Camper and Mapzen
|
|
4
|
+
|
|
5
|
+
// Point builders
|
|
6
|
+
|
|
7
|
+
import { default_uvs } from './common';
|
|
8
|
+
import type VertexData from '../gl/vertex_data';
|
|
9
|
+
|
|
10
|
+
type VertexIndex = Record<string, number>;
|
|
11
|
+
|
|
12
|
+
// Scaling values to encode fractional values with fixed-point integer attributes
|
|
13
|
+
const pre_angles_normalize = 128 / Math.PI;
|
|
14
|
+
const angles_normalize = 16384 / Math.PI;
|
|
15
|
+
const offsets_normalize = 64;
|
|
16
|
+
const texcoord_normalize = 65535;
|
|
17
|
+
const size_normalize = 128; // width/height are 8.8 fixed-point, but are halved (so multiply by 128 instead of 256)
|
|
18
|
+
|
|
19
|
+
// These index values map a 4-element vertex position counter from this pattern (used for size and UVs):
|
|
20
|
+
// [min_x, min_y, max_x, max_y]
|
|
21
|
+
// to this pattern:
|
|
22
|
+
// [min_x, min_y],
|
|
23
|
+
// [max_x, min_y],
|
|
24
|
+
// [max_x, max_y],
|
|
25
|
+
// [min_x, max_y]
|
|
26
|
+
const ix = [0, 2, 2, 0];
|
|
27
|
+
const iy = [1, 1, 3, 3];
|
|
28
|
+
const shape = new Array(4); // single, reusable allocation
|
|
29
|
+
|
|
30
|
+
// Build a billboard sprite quad centered on a point. Sprites are intended to be drawn in screenspace, and have
|
|
31
|
+
// properties for width, height, angle, and texture UVs. Curved label segment sprites have additional properties
|
|
32
|
+
// for interpolating their position and angle across zooms.
|
|
33
|
+
export function buildQuadForPoint (
|
|
34
|
+
point: number[],
|
|
35
|
+
vertex_data: VertexData,
|
|
36
|
+
vertex_template: number[],
|
|
37
|
+
vindex: VertexIndex,
|
|
38
|
+
size: number[],
|
|
39
|
+
offset: number[],
|
|
40
|
+
offsets: number[] | null,
|
|
41
|
+
pre_angles: number[] | null,
|
|
42
|
+
angle: number,
|
|
43
|
+
angles: number[] | null,
|
|
44
|
+
texcoords: number[] | undefined,
|
|
45
|
+
curve: boolean) {
|
|
46
|
+
|
|
47
|
+
// Half-sized point dimensions in fixed point
|
|
48
|
+
const w2 = size[0] * size_normalize;
|
|
49
|
+
const h2 = size[1] * size_normalize;
|
|
50
|
+
shape[0] = -w2;
|
|
51
|
+
shape[1] = -h2;
|
|
52
|
+
shape[2] = w2;
|
|
53
|
+
shape[3] = h2;
|
|
54
|
+
|
|
55
|
+
const uvs = texcoords || default_uvs;
|
|
56
|
+
|
|
57
|
+
const vertex_elements = vertex_data.vertex_elements;
|
|
58
|
+
let element_offset = vertex_data.vertex_count;
|
|
59
|
+
|
|
60
|
+
for (let p=0; p < 4; p++) {
|
|
61
|
+
vertex_template[vindex.a_position + 0] = point[0];
|
|
62
|
+
vertex_template[vindex.a_position + 1] = point[1];
|
|
63
|
+
|
|
64
|
+
vertex_template[vindex.a_shape + 0] = shape[ix[p]];
|
|
65
|
+
vertex_template[vindex.a_shape + 1] = shape[iy[p]];
|
|
66
|
+
vertex_template[vindex.a_shape + 2] = angle;
|
|
67
|
+
|
|
68
|
+
vertex_template[vindex.a_offset + 0] = offset[0];
|
|
69
|
+
vertex_template[vindex.a_offset + 1] = offset[1];
|
|
70
|
+
|
|
71
|
+
// Add texcoords
|
|
72
|
+
if (vindex.a_texcoord) {
|
|
73
|
+
vertex_template[vindex.a_texcoord + 0] = uvs[ix[p]] * texcoord_normalize;
|
|
74
|
+
vertex_template[vindex.a_texcoord + 1] = uvs[iy[p]] * texcoord_normalize;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Add curved label segment props
|
|
78
|
+
if (curve) {
|
|
79
|
+
if (!pre_angles || !angles || !offsets) throw new TypeError('Curved quads require per-segment angle and offset samples');
|
|
80
|
+
// 1 byte (signed) range: [-127, 128]
|
|
81
|
+
// actual range: [-2pi, 2pi]
|
|
82
|
+
// total: multiply by 128 / (2 PI)
|
|
83
|
+
vertex_template[vindex.a_pre_angles + 0] = pre_angles_normalize * pre_angles[0];
|
|
84
|
+
vertex_template[vindex.a_pre_angles + 1] = pre_angles_normalize * pre_angles[1];
|
|
85
|
+
vertex_template[vindex.a_pre_angles + 2] = pre_angles_normalize * pre_angles[2];
|
|
86
|
+
vertex_template[vindex.a_pre_angles + 3] = pre_angles_normalize * pre_angles[3];
|
|
87
|
+
|
|
88
|
+
// 2 byte (signed) of resolution [-32767, 32768]
|
|
89
|
+
// actual range: [-2pi, 2pi]
|
|
90
|
+
// total: multiply by 32768 / (2 PI) = 16384 / PI
|
|
91
|
+
vertex_template[vindex.a_angles + 0] = angles_normalize * angles[0];
|
|
92
|
+
vertex_template[vindex.a_angles + 1] = angles_normalize * angles[1];
|
|
93
|
+
vertex_template[vindex.a_angles + 2] = angles_normalize * angles[2];
|
|
94
|
+
vertex_template[vindex.a_angles + 3] = angles_normalize * angles[3];
|
|
95
|
+
|
|
96
|
+
// offset range can be [0, 65535]
|
|
97
|
+
// actual range: [0, 1024]
|
|
98
|
+
vertex_template[vindex.a_offsets + 0] = offsets_normalize * offsets[0];
|
|
99
|
+
vertex_template[vindex.a_offsets + 1] = offsets_normalize * offsets[1];
|
|
100
|
+
vertex_template[vindex.a_offsets + 2] = offsets_normalize * offsets[2];
|
|
101
|
+
vertex_template[vindex.a_offsets + 3] = offsets_normalize * offsets[3];
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
vertex_data.addVertex(vertex_template);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
vertex_elements.push(element_offset + 0);
|
|
108
|
+
vertex_elements.push(element_offset + 1);
|
|
109
|
+
vertex_elements.push(element_offset + 2);
|
|
110
|
+
vertex_elements.push(element_offset + 2);
|
|
111
|
+
vertex_elements.push(element_offset + 3);
|
|
112
|
+
vertex_elements.push(element_offset + 0);
|
|
113
|
+
|
|
114
|
+
return 2; // geom count is always two triangles, for one quad
|
|
115
|
+
}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
// Tangram
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) 2013-2016 Brett Camper and Mapzen
|
|
4
|
+
// Copyright (c) 2026 vis.gl contributors
|
|
5
|
+
|
|
6
|
+
// Polygon builders
|
|
7
|
+
|
|
8
|
+
import Geo from '../utils/geo';
|
|
9
|
+
import Vector from '../utils/vector';
|
|
10
|
+
import { default_uvs, outsideTile } from './common';
|
|
11
|
+
|
|
12
|
+
import earcut from 'earcut';
|
|
13
|
+
import quickselect from 'quickselect';
|
|
14
|
+
import type {GeometryPolygon, GeometryVertexData} from './geometry-types';
|
|
15
|
+
|
|
16
|
+
const up_vec3 = [0, 0, 1];
|
|
17
|
+
|
|
18
|
+
type PolygonCoordinates = GeometryPolygon;
|
|
19
|
+
type VertexData = GeometryVertexData;
|
|
20
|
+
type PolygonBuildOptions = {
|
|
21
|
+
texcoord_index?: number;
|
|
22
|
+
texcoord_scale?: number[];
|
|
23
|
+
texcoord_normalize?: number;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* To tesselate flat 2D polygons.
|
|
29
|
+
* The x & y coordinates will be set as first two elements of provided vertex_template.
|
|
30
|
+
* @param {Array.<Array.<Array.<Array.<number>>>>} polygons The polygons to tesselate.
|
|
31
|
+
* @param {VertexData} vertex_data The VertexData were to store the results
|
|
32
|
+
* @param {Array.<number>} vertex_template The vertex template to use
|
|
33
|
+
* @param {Object} options The texture coordinate options to apply
|
|
34
|
+
* @return {number} the number of the resulting geometries (triangles)
|
|
35
|
+
*/
|
|
36
|
+
export function buildPolygons (
|
|
37
|
+
polygons: PolygonCoordinates[], vertex_data: VertexData, vertex_template: number[],
|
|
38
|
+
{ texcoord_index, texcoord_scale, texcoord_normalize }: PolygonBuildOptions) {
|
|
39
|
+
const normalizedTextureScale = texcoord_normalize || 1;
|
|
40
|
+
|
|
41
|
+
let vertex_elements = vertex_data.vertex_elements,
|
|
42
|
+
num_polygons = polygons.length,
|
|
43
|
+
geom_count = 0,
|
|
44
|
+
min_u = 0, min_v = 0, max_u = 0, max_v = 0,
|
|
45
|
+
min_x = 0, min_y = 0, max_x = 0, max_y = 0,
|
|
46
|
+
span_x = 0, span_y = 0, scale_u = 0, scale_v = 0;
|
|
47
|
+
|
|
48
|
+
if (texcoord_index) {
|
|
49
|
+
[min_u, min_v, max_u, max_v] = texcoord_scale || default_uvs;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
for (let p = 0; p < num_polygons; p++) {
|
|
53
|
+
|
|
54
|
+
const max_rings = 500;
|
|
55
|
+
let polygon = polygons[p];
|
|
56
|
+
|
|
57
|
+
if (polygon.length > max_rings) {
|
|
58
|
+
polygon = [...polygon]; // copy to avoid modifying original
|
|
59
|
+
quickselect(polygon, max_rings, 1, polygon.length - 1, (a, b) => b.area! - a.area!);
|
|
60
|
+
polygon = polygon.slice(0, max_rings);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const indices = triangulatePolygon(earcut.flatten(polygon));
|
|
64
|
+
const num_indices = indices.length;
|
|
65
|
+
const element_offset = vertex_data.vertex_count;
|
|
66
|
+
|
|
67
|
+
// The vertices and vertex-elements must not be added if earcut returns no indices:
|
|
68
|
+
if (num_indices) {
|
|
69
|
+
|
|
70
|
+
// Find polygon extents to calculate UVs, fit them to the axis-aligned bounding box:
|
|
71
|
+
if (texcoord_index) {
|
|
72
|
+
[min_x, min_y, max_x, max_y] = Geo.findBoundingBox(polygon),
|
|
73
|
+
span_x = max_x - min_x,
|
|
74
|
+
span_y = max_y - min_y,
|
|
75
|
+
scale_u = (max_u - min_u) / span_x,
|
|
76
|
+
scale_v = (max_v - min_v) / span_y;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
for (let ring_index = 0; ring_index < polygon.length; ring_index++) {
|
|
80
|
+
// Add vertex data:
|
|
81
|
+
let polygon_ring = polygon[ring_index];
|
|
82
|
+
for (let i = 0; i < polygon_ring.length; i++) {
|
|
83
|
+
let vertex = polygon_ring[i];
|
|
84
|
+
vertex_template[0] = vertex[0];
|
|
85
|
+
vertex_template[1] = vertex[1];
|
|
86
|
+
|
|
87
|
+
// Add UVs:
|
|
88
|
+
if (texcoord_index) {
|
|
89
|
+
vertex_template[texcoord_index + 0] = ((vertex[0] - min_x) * scale_u + min_u) * normalizedTextureScale;
|
|
90
|
+
vertex_template[texcoord_index + 1] = ((vertex[1] - min_y) * scale_v + min_v) * normalizedTextureScale;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
vertex_data.addVertex(vertex_template);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Add element indices:
|
|
98
|
+
for (let i = 0; i < num_indices; i++) {
|
|
99
|
+
vertex_elements.push(element_offset + indices[i]);
|
|
100
|
+
}
|
|
101
|
+
geom_count += num_indices / 3;
|
|
102
|
+
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return geom_count;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
// Tesselate and extrude a flat 2D polygon into a simple 3D model with fixed height and add to GL vertex buffer
|
|
110
|
+
export function buildExtrudedPolygons (
|
|
111
|
+
polygons: PolygonCoordinates[],
|
|
112
|
+
z: number, height: number, min_height: number,
|
|
113
|
+
vertex_data: VertexData, vertex_template: number[],
|
|
114
|
+
normal_index: number,
|
|
115
|
+
normal_normalize: number,
|
|
116
|
+
{
|
|
117
|
+
remove_tile_edges,
|
|
118
|
+
tile_edge_tolerance,
|
|
119
|
+
texcoord_index,
|
|
120
|
+
texcoord_scale,
|
|
121
|
+
texcoord_normalize,
|
|
122
|
+
winding
|
|
123
|
+
}: PolygonBuildOptions & {
|
|
124
|
+
remove_tile_edges?: boolean;
|
|
125
|
+
tile_edge_tolerance?: number;
|
|
126
|
+
normal_index?: number;
|
|
127
|
+
winding?: string;
|
|
128
|
+
}) {
|
|
129
|
+
const normalizedTextureScale = texcoord_normalize || 1;
|
|
130
|
+
|
|
131
|
+
// Top
|
|
132
|
+
var min_z = z + (min_height || 0);
|
|
133
|
+
var max_z = z + height;
|
|
134
|
+
vertex_template[2] = max_z;
|
|
135
|
+
var geom_count = buildPolygons(polygons, vertex_data, vertex_template, { texcoord_index, texcoord_scale, texcoord_normalize });
|
|
136
|
+
|
|
137
|
+
var vertex_elements = vertex_data.vertex_elements;
|
|
138
|
+
var element_offset = vertex_data.vertex_count;
|
|
139
|
+
|
|
140
|
+
// Walls
|
|
141
|
+
// Fit UVs to wall quad
|
|
142
|
+
let texcoords: number[][] = [];
|
|
143
|
+
if (texcoord_index) {
|
|
144
|
+
var [min_u, min_v, max_u, max_v] = texcoord_scale || default_uvs;
|
|
145
|
+
texcoords = [
|
|
146
|
+
[min_u, max_v],
|
|
147
|
+
[min_u, min_v],
|
|
148
|
+
[max_u, min_v],
|
|
149
|
+
[max_u, max_v]
|
|
150
|
+
];
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
var num_polygons = polygons.length;
|
|
154
|
+
for (var p=0; p < num_polygons; p++) {
|
|
155
|
+
var polygon = polygons[p];
|
|
156
|
+
|
|
157
|
+
for (var q=0; q < polygon.length; q++) {
|
|
158
|
+
var contour = polygon[q];
|
|
159
|
+
|
|
160
|
+
for (var w=0; w < contour.length - 1; w++) {
|
|
161
|
+
if (remove_tile_edges && outsideTile(contour[w], contour[w+1], tile_edge_tolerance || 0)) {
|
|
162
|
+
continue; // don't extrude tile edges
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// Wall order is dependent on winding order, so that normals face outward
|
|
166
|
+
let w0, w1;
|
|
167
|
+
if (winding === 'CCW') {
|
|
168
|
+
w0 = w;
|
|
169
|
+
w1 = w+1;
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
w0 = w+1;
|
|
173
|
+
w1 = w;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Two triangles for the quad formed by each vertex pair, going from bottom to top height
|
|
177
|
+
var wall_vertices = [
|
|
178
|
+
[contour[w1][0], contour[w1][1], max_z],
|
|
179
|
+
[contour[w1][0], contour[w1][1], min_z],
|
|
180
|
+
[contour[w0][0], contour[w0][1], min_z],
|
|
181
|
+
[contour[w0][0], contour[w0][1], max_z]
|
|
182
|
+
];
|
|
183
|
+
|
|
184
|
+
// Calc the normal of the wall from up vector and one segment of the wall triangles
|
|
185
|
+
let wall_vec = Vector.normalize([contour[w1][0] - contour[w0][0], contour[w1][1] - contour[w0][1], 0]);
|
|
186
|
+
let normal = Vector.cross(up_vec3, wall_vec) as number[]; // Three-dimensional inputs produce a vector, not a 2D scalar.
|
|
187
|
+
|
|
188
|
+
// Update vertex template with current surface normal
|
|
189
|
+
vertex_template[normal_index + 0] = normal[0] * normal_normalize;
|
|
190
|
+
vertex_template[normal_index + 1] = normal[1] * normal_normalize;
|
|
191
|
+
vertex_template[normal_index + 2] = normal[2] * normal_normalize;
|
|
192
|
+
|
|
193
|
+
for (var wv=0; wv < wall_vertices.length; wv++) {
|
|
194
|
+
vertex_template[0] = wall_vertices[wv][0];
|
|
195
|
+
vertex_template[1] = wall_vertices[wv][1];
|
|
196
|
+
vertex_template[2] = wall_vertices[wv][2];
|
|
197
|
+
|
|
198
|
+
if (texcoord_index) {
|
|
199
|
+
vertex_template[texcoord_index + 0] = texcoords[wv][0] * normalizedTextureScale;
|
|
200
|
+
vertex_template[texcoord_index + 1] = texcoords[wv][1] * normalizedTextureScale;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
vertex_data.addVertex(vertex_template);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
vertex_elements.push(element_offset + 0);
|
|
207
|
+
vertex_elements.push(element_offset + 1);
|
|
208
|
+
vertex_elements.push(element_offset + 2);
|
|
209
|
+
vertex_elements.push(element_offset + 2);
|
|
210
|
+
vertex_elements.push(element_offset + 3);
|
|
211
|
+
vertex_elements.push(element_offset + 0);
|
|
212
|
+
|
|
213
|
+
element_offset += 4;
|
|
214
|
+
geom_count += 2;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
return geom_count;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// Triangulation using earcut
|
|
222
|
+
// https://github.com/mapbox/earcut
|
|
223
|
+
export function triangulatePolygon (data: {vertices: number[]; holes: number[]; dimensions: number}) {
|
|
224
|
+
return earcut(data.vertices, data.holes, data.dimensions);
|
|
225
|
+
}
|