@pirireis/webglobeplugins 0.17.1 → 1.0.2
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/Math/{angle-calculation.js → angle-calculation.ts} +18 -14
- package/Math/{arc-cdf-points.js → arc-cdf-points.ts} +329 -272
- package/Math/{arc-generate-points-exponantial.js → arc-generate-points-exponantial.ts} +299 -254
- package/Math/{arc.js → arc.ts} +421 -292
- package/Math/bounds/line-bbox.js +225 -186
- package/Math/{circle-cdf-points.js → circle-cdf-points.ts} +143 -78
- package/Math/{circle.js → circle.ts} +49 -33
- package/Math/{constants.js → constants.ts} +12 -4
- package/Math/contour/{quadtreecontours.js → quadtreecontours.ts} +371 -300
- package/Math/contour/quadtreecontours1.js +336 -298
- package/Math/{finite-line-2d.js → finite-line-2d.ts} +68 -58
- package/Math/haversine.ts +33 -0
- package/Math/index.js +0 -1
- package/Math/juction/{arc-plane.js → arc-plane.ts} +203 -143
- package/Math/juction/{line-sphere.js → line-sphere.ts} +32 -22
- package/Math/juction/{plane-plane.js → plane-plane.ts} +62 -53
- package/Math/{line.js → line.ts} +84 -52
- package/Math/matrix4.ts +0 -0
- package/Math/mesh/mapbox-delaunay.d.ts +74 -0
- package/Math/{methods.js → methods.ts} +182 -113
- package/Math/{plane.js → plane.ts} +92 -56
- package/Math/{quaternion.js → quaternion.ts} +128 -106
- package/Math/roadmap.md +10 -0
- package/Math/templete-shapes/{grid-visually-equal.js → grid-visually-equal.ts} +118 -65
- package/Math/tessellation/constants.ts +1 -0
- package/Math/tessellation/methods.ts +79 -0
- package/Math/tessellation/nearest-value-padding.ts +147 -0
- package/Math/tessellation/roadmap.md +48 -0
- package/Math/tessellation/spherical-triangle-area.ts +127 -0
- package/Math/tessellation/tile-merger.ts +578 -0
- package/Math/tessellation/triangle-tessellation.ts +533 -0
- package/Math/tessellation/types.ts +1 -0
- package/Math/types.ts +68 -0
- package/Math/utils.js +3 -2
- package/Math/{vec3.js → vec3.ts} +227 -151
- package/Math/xyz-tile.ts +26 -0
- package/algorithms/search-binary.js +14 -16
- package/altitude-locator/adaptors.js +0 -1
- package/altitude-locator/keymethod.js +0 -1
- package/altitude-locator/plugin.js +445 -345
- package/altitude-locator/types.js +26 -21
- package/compass-rose/compass-rose-padding-flat.js +274 -230
- package/compass-rose/{compass-text-writer.js → compass-text-writer.ts} +210 -155
- package/compass-rose/index.js +3 -3
- package/{constants.js → constants.ts} +8 -6
- package/heatwave/datamanager.js +168 -149
- package/heatwave/heatwave.js +261 -206
- package/heatwave/index.js +5 -5
- package/heatwave/isobar.js +340 -303
- package/heatwave/{texture-point-sampler.js → texture-point-sampler.ts} +220 -187
- package/investigation-tools/draw/tiles/adapters.ts +133 -0
- package/investigation-tools/draw/tiles/{tiles.js → tiles.ts} +162 -128
- package/jest.config.js +6 -7
- package/package.json +1 -1
- package/pin/pin-object-array1.js +381 -300
- package/pin/pin-point-totem1.js +77 -60
- package/programs/arrowfield/arrow-field.js +89 -60
- package/programs/arrowfield/logic.js +173 -141
- package/programs/data2legend/density-to-legend.js +86 -68
- package/programs/data2legend/point-to-density-texture.js +84 -67
- package/programs/float2legendwithratio/index.js +3 -2
- package/programs/float2legendwithratio/logic.js +144 -118
- package/programs/float2legendwithratio/object.js +141 -104
- package/programs/helpers/blender.js +73 -58
- package/programs/helpers/{fadeaway.js → fadeaway.ts} +73 -55
- package/programs/index.js +19 -20
- package/programs/line-on-globe/circle-accurate-3d.js +112 -85
- package/programs/line-on-globe/circle-accurate-flat.js +200 -148
- package/programs/line-on-globe/degree-padding-around-circle-3d.js +134 -102
- package/programs/line-on-globe/index.js +0 -1
- package/programs/line-on-globe/lines-color-instanced-flat.js +99 -80
- package/programs/line-on-globe/linestrip/data.ts +29 -0
- package/programs/line-on-globe/linestrip/{linestrip.js → linestrip.ts} +152 -93
- package/programs/line-on-globe/{naive-accurate-flexible.js → naive-accurate-flexible.ts} +175 -126
- package/programs/line-on-globe/util.js +8 -5
- package/programs/picking/pickable-polygon-renderer.js +129 -98
- package/programs/picking/pickable-renderer.js +130 -98
- package/programs/point-on-globe/element-globe-surface-glow.js +122 -93
- package/programs/point-on-globe/element-point-glow.js +114 -80
- package/programs/point-on-globe/square-pixel-point.js +139 -120
- package/programs/polygon-on-globe/roadmap.md +8 -0
- package/programs/polygon-on-globe/texture-dem-triangles.ts +290 -0
- package/programs/{programcache.js → programcache.ts} +134 -126
- package/programs/rings/index.js +1 -1
- package/programs/rings/partial-ring/{piece-of-pie.js → piece-of-pie.ts} +222 -152
- package/programs/totems/camera-totem-attactment-interface.ts +4 -0
- package/programs/totems/{camerauniformblock.js → camerauniformblock.ts} +326 -230
- package/programs/totems/{canvas-webglobe-info.js → canvas-webglobe-info.ts} +147 -132
- package/programs/totems/dem-textures-manager.ts +368 -0
- package/programs/totems/{globe-changes.js → globe-changes.ts} +79 -59
- package/programs/totems/gpu-selection-uniform-block.js +127 -99
- package/programs/totems/{index.js → index.ts} +2 -2
- package/programs/two-d/pixel-padding-for-compass.js +101 -87
- package/programs/util.js +19 -14
- package/programs/vectorfields/logics/{constants.js → constants.ts} +5 -4
- package/programs/vectorfields/logics/drawrectangleparticles.ts +182 -0
- package/programs/vectorfields/logics/index.js +4 -2
- package/programs/vectorfields/logics/particle-ubo.ts +23 -0
- package/programs/vectorfields/logics/{pixelbased.js → pixelbased.ts} +119 -84
- package/programs/vectorfields/logics/ubo.js +57 -51
- package/programs/vectorfields/{pingpongbuffermanager.js → pingpongbuffermanager.ts} +113 -73
- package/publish.bat +62 -0
- package/range-tools-on-terrain/bearing-line/{adapters.js → adapters.ts} +154 -114
- package/range-tools-on-terrain/bearing-line/{plugin.js → plugin.ts} +569 -457
- package/range-tools-on-terrain/bearing-line/types.ts +65 -0
- package/range-tools-on-terrain/circle-line-chain/{adapters.js → adapters.ts} +104 -85
- package/range-tools-on-terrain/circle-line-chain/{chain-list-map.js → chain-list-map.ts} +446 -382
- package/range-tools-on-terrain/circle-line-chain/{plugin.js → plugin.ts} +607 -464
- package/range-tools-on-terrain/circle-line-chain/types.ts +43 -0
- package/range-tools-on-terrain/range-ring/{adapters.js → adapters.ts} +114 -93
- package/range-tools-on-terrain/range-ring/{enum.js → enum.ts} +2 -2
- package/range-tools-on-terrain/range-ring/{plugin.js → plugin.ts} +444 -377
- package/range-tools-on-terrain/range-ring/rangeringangletext.ts +396 -0
- package/range-tools-on-terrain/range-ring/types.ts +30 -0
- package/semiplugins/interface.ts +14 -0
- package/semiplugins/lightweight/{line-plugin.js → line-plugin.ts} +342 -221
- package/semiplugins/lightweight/{piece-of-pie-plugin.js → piece-of-pie-plugin.ts} +275 -200
- package/semiplugins/shape-on-terrain/{arc-plugin.js → arc-plugin.ts} +616 -481
- package/semiplugins/shape-on-terrain/{circle-plugin.js → circle-plugin.ts} +588 -444
- package/semiplugins/shape-on-terrain/goal.md +12 -0
- package/semiplugins/shape-on-terrain/{padding-1-degree.js → padding-1-degree.ts} +713 -539
- package/semiplugins/shape-on-terrain/terrain-polygon/adapters.ts +69 -0
- package/semiplugins/shape-on-terrain/terrain-polygon/data/cache-shortcuts.md +20 -0
- package/semiplugins/shape-on-terrain/terrain-polygon/data/cache.ts +149 -0
- package/semiplugins/shape-on-terrain/terrain-polygon/data/index-polygon-map.ts +58 -0
- package/semiplugins/shape-on-terrain/terrain-polygon/data/manager.ts +4 -0
- package/semiplugins/shape-on-terrain/terrain-polygon/data/master-worker.js +196 -0
- package/semiplugins/shape-on-terrain/terrain-polygon/data/master-worker.ts +209 -0
- package/semiplugins/shape-on-terrain/terrain-polygon/data/polygon-to-triangles.ts +144 -0
- package/semiplugins/shape-on-terrain/terrain-polygon/data/random.ts +165 -0
- package/semiplugins/shape-on-terrain/terrain-polygon/data/readme.md +5 -0
- package/semiplugins/shape-on-terrain/terrain-polygon/data/types.ts +37 -0
- package/semiplugins/shape-on-terrain/terrain-polygon/data/worker-contact.ts +81 -0
- package/semiplugins/shape-on-terrain/terrain-polygon/data/worker.js +146 -0
- package/semiplugins/shape-on-terrain/terrain-polygon/notes.md +90 -0
- package/semiplugins/shape-on-terrain/terrain-polygon/terrain-polygon.ts +265 -0
- package/semiplugins/shape-on-terrain/terrain-polygon/types.ts +69 -0
- package/semiplugins/shell/bbox-renderer/index.ts +2 -0
- package/semiplugins/shell/bbox-renderer/{logic.js → logic.ts} +273 -249
- package/semiplugins/shell/bbox-renderer/object.ts +129 -0
- package/semiplugins/type.ts +8 -0
- package/semiplugins/utility/{container-plugin.js → container-plugin.ts} +126 -94
- package/semiplugins/utility/{object-pass-container-plugin.js → object-pass-container-plugin.ts} +101 -80
- package/shaders/fragment-toy/firework.js +1 -1
- package/shaders/fragment-toy/singularity.js +5 -2
- package/terrain-plugin.mmd +83 -0
- package/tests/Math/arc-sampling-test.js +367 -0
- package/tests/Math/arc-sampling-test.ts +429 -0
- package/tests/Math/arc.test.ts +77 -0
- package/tests/Math/junction/arc-limit.test.ts +7 -0
- package/tests/Math/junction/arc-plane-points.test.ts +196 -0
- package/tests/Math/junction/arc-plane.test.ts +172 -0
- package/tests/Math/junction/line-sphere.test.ts +127 -0
- package/tests/Math/junction/plane-plane.test.ts +91 -0
- package/tests/Math/plane-test.ts +17 -0
- package/tests/Math/plane.test.ts +43 -0
- package/tests/Math/vec3.test.ts +33 -0
- package/tracks/point-heat-map/adaptors/timetracksplugin-format-to-this.js +78 -63
- package/tracks/point-heat-map/index.js +0 -1
- package/tracks/point-heat-map/plugin-webworker.js +148 -121
- package/tracks/point-heat-map/point-to-heat-map-flow.js +150 -121
- package/tracks/point-heat-map/readme.md +15 -0
- package/tracks/point-tracks/key-methods.js +3 -2
- package/tracks/point-tracks/plugin.js +487 -394
- package/tracks/timetracks/adaptors-line-strip.js +79 -65
- package/tracks/timetracks/plugin-line-strip.js +295 -240
- package/tracks/timetracks/program-line-strip.js +495 -411
- package/tracks/timetracks/programpoint-line-strip.js +137 -109
- package/tracks/timetracks/readme.md +1 -0
- package/tsconfig.json +22 -0
- package/types/@pirireis/webglobe.d.ts +102 -0
- package/types/delaunator.d.ts +40 -0
- package/types/earcut.d.ts +11 -0
- package/types/rbush.d.ts +57 -0
- package/types.ts +319 -0
- package/util/account/bufferoffsetmanager.js +209 -176
- package/util/account/create-buffermap-orchastration.ts +85 -0
- package/util/account/index.js +6 -3
- package/util/account/single-attribute-buffer-management/{buffer-manager.js → buffer-manager.ts} +151 -117
- package/util/account/single-attribute-buffer-management/{buffer-orchestrator.js → buffer-orchestrator.ts} +238 -212
- package/util/account/single-attribute-buffer-management/{buffer-orchestrator1.js → buffer-orchestrator1.ts} +184 -159
- package/util/account/single-attribute-buffer-management/{index.js → index.ts} +11 -4
- package/util/account/single-attribute-buffer-management/{object-store.js → object-store.ts} +76 -55
- package/util/account/single-attribute-buffer-management/types.ts +43 -0
- package/util/account/util.js +22 -18
- package/util/algorithms/index.js +0 -1
- package/util/algorithms/search-binary.js +26 -25
- package/util/build-strategy/{static-dynamic.js → static-dynamic.ts} +50 -41
- package/util/check/index.js +0 -1
- package/util/check/typecheck.ts +74 -0
- package/util/{frame-counter-trigger.js → frame-counter-trigger.ts} +99 -84
- package/util/geometry/{index.js → index.ts} +155 -121
- package/util/gl-util/buffer/{attribute-loader.js → attribute-loader.ts} +84 -62
- package/util/gl-util/buffer/{index.js → index.ts} +6 -3
- package/util/gl-util/draw-options/{methods.js → methods.ts} +47 -32
- package/util/gl-util/uniform-block/{manager.js → manager.ts} +232 -190
- package/util/{webglobe/gldefaultstates.js → globe-default-gl-states.ts} +5 -4
- package/util/helper-methods.ts +9 -0
- package/util/index.js +9 -10
- package/util/interpolation/index.js +0 -1
- package/util/interpolation/timetrack/index.js +9 -2
- package/util/interpolation/timetrack/timetrack-interpolator.js +94 -79
- package/util/interpolation/timetrack/web-worker.js +51 -46
- package/util/picking/{fence.js → fence.ts} +47 -41
- package/util/picking/picker-displayer.ts +226 -0
- package/util/programs/draw-from-pixel-coords.js +201 -164
- package/util/programs/{draw-texture-on-canvas.js → draw-texture-on-canvas.ts} +92 -67
- package/util/programs/supersampletotextures.js +130 -97
- package/util/programs/texturetoglobe.js +153 -128
- package/util/shaderfunctions/{geometrytransformations.js → geometrytransformations.ts} +169 -41
- package/util/shaderfunctions/index.js +2 -2
- package/util/shaderfunctions/nodata.js +4 -2
- package/util/shaderfunctions/noisefunctions.js +10 -7
- package/util/{webglobjectbuilders.js → webglobjectbuilders.ts} +446 -358
- package/vectorfield/arrowfield/adaptor.js +11 -11
- package/vectorfield/arrowfield/index.js +3 -3
- package/vectorfield/arrowfield/plugin.js +128 -83
- package/vectorfield/waveparticles/adaptor.js +16 -15
- package/vectorfield/waveparticles/index.js +3 -3
- package/vectorfield/waveparticles/plugin.ts +506 -0
- package/vectorfield/wind/adapters/image-to-fields.ts +74 -0
- package/vectorfield/wind/adapters/types.ts +12 -0
- package/vectorfield/wind/{imagetovectorfieldandmagnitude.js → imagetovectorfieldandmagnitude.ts} +78 -56
- package/vectorfield/wind/index.js +5 -5
- package/vectorfield/wind/plugin-persistant copy.ts +461 -0
- package/vectorfield/wind/plugin-persistant.ts +483 -0
- package/vectorfield/wind/plugin.js +883 -685
- package/vectorfield/wind/vectorfieldimage.js +27 -23
- package/write-text/{context-text-bulk.js → context-text-bulk.ts} +285 -200
- package/write-text/context-text3.ts +252 -0
- package/write-text/{context-text4.js → context-text4.ts} +231 -146
- package/write-text/context-textDELETE.js +125 -94
- package/write-text/objectarraylabels/{index.js → index.ts} +2 -2
- package/write-text/objectarraylabels/objectarraylabels.d.ts +72 -0
- package/write-text/objectarraylabels/objectarraylabels.js +247 -200
- package/Math/matrix4.js +0 -1
- package/Math/tessellation/earcut/adapters.js +0 -37
- package/Math/tessellation/hybrid-triangle-tessellation-meta.js +0 -123
- package/Math/tessellation/methods.js +0 -46
- package/Math/tessellation/shred-input.js +0 -18
- package/Math/tessellation/tile-merger.js +0 -298
- package/Math/tessellation/tiler.js +0 -50
- package/Math/tessellation/triangle-tessellation-meta.js +0 -523
- package/Math/tessellation/triangle-tessellation.js +0 -14
- package/Math/tessellation/types.js +0 -1
- package/Math/tessellation/zoom-catch.js +0 -1
- package/Math/types.js +0 -1
- package/investigation-tools/draw/tiles/adapters.js +0 -67
- package/programs/line-on-globe/linestrip/data.js +0 -4
- package/programs/polygon-on-globe/texture-dem-triangle-test-plugin-triangle.js +0 -328
- package/programs/polygon-on-globe/texture-dem-triangles.js +0 -268
- package/programs/vectorfields/logics/drawrectangleparticles.js +0 -114
- package/programs/vectorfields/logics/drawrectangleparticles1.js +0 -112
- package/programs/vectorfields/logics/ubo-new.js +0 -25
- package/range-tools-on-terrain/bearing-line/types.js +0 -1
- package/range-tools-on-terrain/circle-line-chain/types.js +0 -1
- package/range-tools-on-terrain/range-ring/rangeringangletext.js +0 -331
- package/range-tools-on-terrain/range-ring/types.js +0 -9
- package/semiplugins/interface.js +0 -1
- package/semiplugins/shape-on-terrain/terrain-cover/texture-dem-cover.js +0 -1
- package/semiplugins/shell/bbox-renderer/index.js +0 -2
- package/semiplugins/shell/bbox-renderer/object.js +0 -65
- package/semiplugins/type.js +0 -1
- package/types.js +0 -19
- package/util/account/create-buffermap-orchastration.js +0 -39
- package/util/account/single-attribute-buffer-management/types.js +0 -1
- package/util/check/typecheck.js +0 -66
- package/util/gl-util/uniform-block/types.js +0 -1
- package/util/picking/picker-displayer.js +0 -134
- package/util/webglobe/index.js +0 -2
- package/vectorfield/waveparticles/plugin.js +0 -290
- package/write-text/context-text3.js +0 -167
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import earcut from "earcut";
|
|
2
|
-
import { createTriangleTessellationMeta } from "./triangle-tessellation-meta";
|
|
3
|
-
function shredInput(vertices, holes, zoomLevel) {
|
|
4
|
-
const result = [];
|
|
5
|
-
const triangles = earcut(vertices, holes, 2);
|
|
6
|
-
for (let i = 0; i < triangles.length; i += 3) {
|
|
7
|
-
const idx1 = triangles[i] * 2;
|
|
8
|
-
const idx2 = triangles[i + 1] * 2;
|
|
9
|
-
const idx3 = triangles[i + 2] * 2;
|
|
10
|
-
const p1 = [vertices[idx1], vertices[idx1 + 1]];
|
|
11
|
-
const p2 = [vertices[idx2], vertices[idx2 + 1]];
|
|
12
|
-
const p3 = [vertices[idx3], vertices[idx3 + 1]];
|
|
13
|
-
const triangleMeta = createTriangleTessellationMeta(p1, p2, p3);
|
|
14
|
-
result.push(triangleMeta);
|
|
15
|
-
}
|
|
16
|
-
// cut triangles into smaller pieces based on zoom level...
|
|
17
|
-
return result;
|
|
18
|
-
}
|
|
@@ -1,298 +0,0 @@
|
|
|
1
|
-
function displayTileMetaData(tilesMetaData) {
|
|
2
|
-
// show maxZoom minZoom
|
|
3
|
-
console.log(`Max Level: ${tilesMetaData.maxLevel}
|
|
4
|
-
Min Level: ${tilesMetaData.minLevel}`);
|
|
5
|
-
}
|
|
6
|
-
function keyMethod(row, column, level) {
|
|
7
|
-
return `${level}_${row}_${column}`;
|
|
8
|
-
}
|
|
9
|
-
function calculateParentTile(row, column, level) {
|
|
10
|
-
return {
|
|
11
|
-
row: Math.floor(row / 2),
|
|
12
|
-
column: Math.floor(column / 2),
|
|
13
|
-
level: level - 1
|
|
14
|
-
};
|
|
15
|
-
}
|
|
16
|
-
function createMapAndMetaData(tiles) {
|
|
17
|
-
const tileMap = new Map();
|
|
18
|
-
let maxLevel = -Infinity;
|
|
19
|
-
let minLevel = Infinity;
|
|
20
|
-
const tileLimitsByZoom = new Map();
|
|
21
|
-
for (const tile of tiles) {
|
|
22
|
-
const key = keyMethod(tile.row, tile.column, tile.level);
|
|
23
|
-
tileMap.set(key, tile);
|
|
24
|
-
if (tile.level > maxLevel) {
|
|
25
|
-
maxLevel = tile.level;
|
|
26
|
-
}
|
|
27
|
-
if (tile.level < minLevel) {
|
|
28
|
-
minLevel = tile.level;
|
|
29
|
-
}
|
|
30
|
-
if (!tileLimitsByZoom.has(tile.level)) {
|
|
31
|
-
tileLimitsByZoom.set(tile.level, {
|
|
32
|
-
minRow: tile.row,
|
|
33
|
-
maxRow: tile.row,
|
|
34
|
-
minCol: tile.column,
|
|
35
|
-
maxCol: tile.column
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
else {
|
|
39
|
-
const limits = tileLimitsByZoom.get(tile.level);
|
|
40
|
-
if (tile.row < limits.minRow)
|
|
41
|
-
limits.minRow = tile.row;
|
|
42
|
-
if (tile.row > limits.maxRow)
|
|
43
|
-
limits.maxRow = tile.row;
|
|
44
|
-
if (tile.column < limits.minCol)
|
|
45
|
-
limits.minCol = tile.column;
|
|
46
|
-
if (tile.column > limits.maxCol)
|
|
47
|
-
limits.maxCol = tile.column;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
return {
|
|
51
|
-
tileMap,
|
|
52
|
-
maxLevel,
|
|
53
|
-
minLevel,
|
|
54
|
-
tileLimitsByZoom
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
function populateTileIntoHigherZoomLevel(tileMesh, tileDimensionLength, targetDimensionLength) {
|
|
58
|
-
const newMesh = new Array(targetDimensionLength).fill(0).map(() => new Float32Array(targetDimensionLength));
|
|
59
|
-
// use linear interpolation to populate
|
|
60
|
-
for (let row = 0; row < targetDimensionLength; row++) {
|
|
61
|
-
for (let col = 0; col < targetDimensionLength; col++) {
|
|
62
|
-
const srcRow = row * (tileDimensionLength - 1) / (targetDimensionLength - 1);
|
|
63
|
-
const srcCol = col * (tileDimensionLength - 1) / (targetDimensionLength - 1);
|
|
64
|
-
const srcRowLow = Math.floor(srcRow);
|
|
65
|
-
const srcRowHigh = Math.min(Math.ceil(srcRow), tileDimensionLength - 1);
|
|
66
|
-
const srcColLow = Math.floor(srcCol);
|
|
67
|
-
const srcColHigh = Math.min(Math.ceil(srcCol), tileDimensionLength - 1);
|
|
68
|
-
const topLeft = tileMesh[srcRowLow][srcColLow];
|
|
69
|
-
const topRight = tileMesh[srcRowLow][srcColHigh];
|
|
70
|
-
const bottomLeft = tileMesh[srcRowHigh][srcColLow];
|
|
71
|
-
const bottomRight = tileMesh[srcRowHigh][srcColHigh];
|
|
72
|
-
const top = topLeft + (topRight - topLeft) * (srcCol - srcColLow);
|
|
73
|
-
const bottom = bottomLeft + (bottomRight - bottomLeft) * (srcCol - srcColLow);
|
|
74
|
-
newMesh[row][col] = top + (bottom - top) * (srcRow - srcRowLow);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
return newMesh;
|
|
78
|
-
}
|
|
79
|
-
// This function is correct, assuming its inputs are prepared properly.
|
|
80
|
-
// This function is correct, assuming its inputs are prepared properly.
|
|
81
|
-
function moveMeshToMergedMesh(targetMesh, targetDimensionLength, sourceMesh, sourceDimensionLength, startX, startY) {
|
|
82
|
-
for (let row = 0; row < sourceDimensionLength; row++) {
|
|
83
|
-
for (let col = 0; col < sourceDimensionLength; col++) {
|
|
84
|
-
const targetIndex = (startY + row) * targetDimensionLength + (startX + col);
|
|
85
|
-
// Check if source value exists
|
|
86
|
-
if (sourceMesh[row] === undefined || sourceMesh[row][col] === undefined) {
|
|
87
|
-
console.warn(`Source data missing at [${row}][${col}]`);
|
|
88
|
-
continue;
|
|
89
|
-
}
|
|
90
|
-
const value = sourceMesh[row][col];
|
|
91
|
-
if (isNaN(value)) {
|
|
92
|
-
console.warn(`NaN value found in source mesh at row: ${row}, col: ${col}`);
|
|
93
|
-
}
|
|
94
|
-
;
|
|
95
|
-
if (targetIndex >= targetMesh.length) {
|
|
96
|
-
console.warn(`⚠️ Target index out of bounds: ${targetIndex} >= ${targetMesh.length}`);
|
|
97
|
-
continue;
|
|
98
|
-
}
|
|
99
|
-
targetMesh[targetIndex] = value;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
function limitCheck(limit, limitRange = 12) {
|
|
104
|
-
const rowRange = limit.maxRow - limit.minRow + 1;
|
|
105
|
-
const colRange = limit.maxCol - limit.minCol + 1;
|
|
106
|
-
if (rowRange > limitRange || colRange > limitRange) {
|
|
107
|
-
console.warn(`Tile limit range exceeded: Row Range = ${rowRange}, Col Range = ${colRange}, Limit Range = ${limitRange}`);
|
|
108
|
-
throw new Error("Tile limit range exceeded");
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
function mergeTiles(tilesMetaData, mergeCount = 8, tileDimensionLength = 5, processLimit = 6) {
|
|
112
|
-
const mergedMeshDimLength = tileDimensionLength * mergeCount - (mergeCount - 1);
|
|
113
|
-
const processedTiles = new Set();
|
|
114
|
-
const result = [];
|
|
115
|
-
for (let zoom = tilesMetaData.maxLevel; zoom >= tilesMetaData.minLevel; zoom--) {
|
|
116
|
-
let processedTileCountFromCurrentLevel = 0;
|
|
117
|
-
let processedTileCountFromParentLevel = 0;
|
|
118
|
-
if (tilesMetaData.maxLevel - zoom >= processLimit) {
|
|
119
|
-
break;
|
|
120
|
-
}
|
|
121
|
-
const limits = tilesMetaData.tileLimitsByZoom.get(zoom);
|
|
122
|
-
const mergedMesh = new Float32Array(mergedMeshDimLength * mergedMeshDimLength).fill(0);
|
|
123
|
-
const bboxLimit = {
|
|
124
|
-
ur: { x: -Infinity, y: -Infinity },
|
|
125
|
-
ll: { x: Infinity, y: Infinity }
|
|
126
|
-
};
|
|
127
|
-
if (!limits)
|
|
128
|
-
continue;
|
|
129
|
-
limitCheck(limits, 12);
|
|
130
|
-
for (let row = limits.minRow; row <= limits.maxRow; row++) {
|
|
131
|
-
for (let col = limits.minCol; col <= limits.maxCol; col++) {
|
|
132
|
-
const key = keyMethod(row, col, zoom);
|
|
133
|
-
if (processedTiles.has(key)) {
|
|
134
|
-
continue;
|
|
135
|
-
}
|
|
136
|
-
const tile = tilesMetaData.tileMap.get(key);
|
|
137
|
-
if (tile) {
|
|
138
|
-
// move tile mesh to merged mesh
|
|
139
|
-
moveMeshToMergedMesh(mergedMesh, mergedMeshDimLength, tile.mesh, tileDimensionLength, (row - limits.minRow) * (tileDimensionLength - 1), (col - limits.minCol) * (tileDimensionLength - 1));
|
|
140
|
-
// moveMeshToMergedMesh2(
|
|
141
|
-
// mergedMesh, mergedMeshDimLength,
|
|
142
|
-
// (row + col) % 2 === 0 ? 0.1 : 0,
|
|
143
|
-
// tileDimensionLength,
|
|
144
|
-
// (row - limits.minRow) * (tileDimensionLength - 1), (col - limits.minCol) * (tileDimensionLength - 1)
|
|
145
|
-
// );
|
|
146
|
-
processedTiles.add(key);
|
|
147
|
-
processedTileCountFromCurrentLevel++;
|
|
148
|
-
// update bbox
|
|
149
|
-
if (tile.bbox.ll.x < bboxLimit.ll.x)
|
|
150
|
-
bboxLimit.ll.x = tile.bbox.ll.x;
|
|
151
|
-
if (tile.bbox.ll.y < bboxLimit.ll.y)
|
|
152
|
-
bboxLimit.ll.y = tile.bbox.ll.y;
|
|
153
|
-
if (tile.bbox.ur.x > bboxLimit.ur.x)
|
|
154
|
-
bboxLimit.ur.x = tile.bbox.ur.x;
|
|
155
|
-
if (tile.bbox.ur.y > bboxLimit.ur.y)
|
|
156
|
-
bboxLimit.ur.y = tile.bbox.ur.y;
|
|
157
|
-
/**
|
|
158
|
-
} else {
|
|
159
|
-
// try to find parent tile
|
|
160
|
-
const parent = calculateParentTile(row, col, zoom);
|
|
161
|
-
const parentKey = keyMethod(parent.row, parent.column, parent.level);
|
|
162
|
-
const parentTile = tilesMetaData.tileMap.get(parentKey);
|
|
163
|
-
|
|
164
|
-
if (parentTile) {
|
|
165
|
-
// Parent's 4 children at current zoom level
|
|
166
|
-
const parentTopLeftChildRow = parent.row * 2;
|
|
167
|
-
const parentTopLeftChildCol = parent.column * 2;
|
|
168
|
-
const topLeftChildKey = keyMethod(parentTopLeftChildRow, parentTopLeftChildCol, zoom);
|
|
169
|
-
|
|
170
|
-
// Only process parent once
|
|
171
|
-
if (!processedTiles.has(topLeftChildKey)) {
|
|
172
|
-
// Check if parent's area is within or overlaps the current limits
|
|
173
|
-
const parentBottomRightChildRow = parentTopLeftChildRow + 1;
|
|
174
|
-
const parentBottomRightChildCol = parentTopLeftChildCol + 1;
|
|
175
|
-
|
|
176
|
-
// Check if parent's children overlap with current zoom's limits
|
|
177
|
-
if (parentTopLeftChildRow > limits.maxRow ||
|
|
178
|
-
parentBottomRightChildRow < limits.minRow ||
|
|
179
|
-
parentTopLeftChildCol > limits.maxCol ||
|
|
180
|
-
parentBottomRightChildCol < limits.minCol) {
|
|
181
|
-
// Parent doesn't overlap, skip
|
|
182
|
-
processedTiles.add(key);
|
|
183
|
-
continue;
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
// Upscale parent to cover all 4 children
|
|
187
|
-
const parentTileUpscaledMesh = populateTileIntoHigherZoomLevel(
|
|
188
|
-
parentTile.mesh,
|
|
189
|
-
tileDimensionLength,
|
|
190
|
-
tileDimensionLength * 2 - 1
|
|
191
|
-
);
|
|
192
|
-
|
|
193
|
-
// Calculate destination position (parent's top-left child position)
|
|
194
|
-
// Clamp to limits to handle edge cases
|
|
195
|
-
const actualStartRow = Math.max(parentTopLeftChildRow, limits.minRow);
|
|
196
|
-
const actualStartCol = Math.max(parentTopLeftChildCol, limits.minCol);
|
|
197
|
-
|
|
198
|
-
const destRow = (actualStartRow - limits.minRow) * (tileDimensionLength - 1);
|
|
199
|
-
const destCol = (actualStartCol - limits.minCol) * (tileDimensionLength - 1);
|
|
200
|
-
|
|
201
|
-
// Calculate source offset if parent starts before limits
|
|
202
|
-
const srcRowOffset = (actualStartRow - parentTopLeftChildRow) * (tileDimensionLength - 1);
|
|
203
|
-
const srcColOffset = (actualStartCol - parentTopLeftChildCol) * (tileDimensionLength - 1);
|
|
204
|
-
|
|
205
|
-
// Calculate how much to copy
|
|
206
|
-
const actualEndRow = Math.min(parentBottomRightChildRow, limits.maxRow);
|
|
207
|
-
const actualEndCol = Math.min(parentBottomRightChildCol, limits.maxCol);
|
|
208
|
-
|
|
209
|
-
const copyRows = (actualEndRow - actualStartRow + 1) * (tileDimensionLength - 1);
|
|
210
|
-
const copyCols = (actualEndCol - actualStartCol + 1) * (tileDimensionLength - 1);
|
|
211
|
-
|
|
212
|
-
// Copy only the visible portion
|
|
213
|
-
moveMeshToMergedMeshPartial(
|
|
214
|
-
mergedMesh,
|
|
215
|
-
mergedMeshDimLength,
|
|
216
|
-
parentTileUpscaledMesh,
|
|
217
|
-
tileDimensionLength * 2 - 1,
|
|
218
|
-
destRow,
|
|
219
|
-
destCol,
|
|
220
|
-
srcRowOffset,
|
|
221
|
-
srcColOffset,
|
|
222
|
-
copyRows,
|
|
223
|
-
copyCols
|
|
224
|
-
);
|
|
225
|
-
|
|
226
|
-
// Mark all 4 child positions as processed (even if out of bounds)
|
|
227
|
-
for (let dr = 0; dr < 2; dr++) {
|
|
228
|
-
for (let dc = 0; dc < 2; dc++) {
|
|
229
|
-
const childRow = parentTopLeftChildRow + dr;
|
|
230
|
-
const childCol = parentTopLeftChildCol + dc;
|
|
231
|
-
const childKey = keyMethod(childRow, childCol, zoom);
|
|
232
|
-
processedTiles.add(childKey);
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
processedTileCountFromParentLevel++;
|
|
237
|
-
|
|
238
|
-
// Update bbox (use actual parent bbox, not child bbox)
|
|
239
|
-
if (parentTile.bbox.ll.x < bboxLimit.ll.x) bboxLimit.ll.x = parentTile.bbox.ll.x;
|
|
240
|
-
if (parentTile.bbox.ll.y < bboxLimit.ll.y) bboxLimit.ll.y = parentTile.bbox.ll.y;
|
|
241
|
-
if (parentTile.bbox.ur.x > bboxLimit.ur.x) bboxLimit.ur.x = parentTile.bbox.ur.x;
|
|
242
|
-
if (parentTile.bbox.ur.y > bboxLimit.ur.y) bboxLimit.ur.y = parentTile.bbox.ur.y;
|
|
243
|
-
} else {
|
|
244
|
-
// Already processed via parent
|
|
245
|
-
processedTiles.add(key);
|
|
246
|
-
}
|
|
247
|
-
} else {
|
|
248
|
-
// No parent available
|
|
249
|
-
processedTiles.add(key);
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
*/
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
const rowRatio = (limits.maxRow - limits.minRow + 1) / mergeCount;
|
|
257
|
-
const colRatio = (limits.maxCol - limits.minCol + 1) / mergeCount;
|
|
258
|
-
// console.log(`Zoom ${zoom}: Processed ${processedTileCountFromCurrentLevel} from current level, ${processedTileCountFromParentLevel} from parent level. Coverage: ${(rowRatio * 100).toFixed(1)}% x ${(colRatio * 100).toFixed(1)}%`);
|
|
259
|
-
result.push({ mesh: mergedMesh, bbox: bboxLimit, zoom: zoom, coverRatio: { x: rowRatio, y: colRatio } });
|
|
260
|
-
}
|
|
261
|
-
return result;
|
|
262
|
-
}
|
|
263
|
-
export function mergeMeshes(tiles, mergeCount = 12, tileDimensionLength = 5, processLimit = 6) {
|
|
264
|
-
// filter out tiles with NaN values
|
|
265
|
-
// return returnTop6tiles(tiles);
|
|
266
|
-
const tilesMetaData = createMapAndMetaData(tiles);
|
|
267
|
-
const mergedTiles = mergeTiles(tilesMetaData, mergeCount, tileDimensionLength, processLimit);
|
|
268
|
-
return mergedTiles;
|
|
269
|
-
}
|
|
270
|
-
function returnTop6tiles(tiles) {
|
|
271
|
-
const tilesMetaData = createMapAndMetaData(tiles);
|
|
272
|
-
const hightestZoom = tilesMetaData.maxLevel;
|
|
273
|
-
const result = [];
|
|
274
|
-
let counter = 6;
|
|
275
|
-
function tileToMergedTileInfo(tile) {
|
|
276
|
-
const mesh = new Float32Array(tile.mesh[0].length * tile.mesh[0].length);
|
|
277
|
-
for (let row = 0; row < tile.mesh[0].length; row++) {
|
|
278
|
-
for (let col = 0; col < tile.mesh[0].length; col++) {
|
|
279
|
-
mesh[row * tile.mesh[0].length + col] = tile.mesh[0][row * tile.mesh[0].length + col];
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
return {
|
|
283
|
-
mesh: mesh,
|
|
284
|
-
zoom: tile.level,
|
|
285
|
-
bbox: tile.bbox,
|
|
286
|
-
coverRatio: { x: 1, y: 1 },
|
|
287
|
-
};
|
|
288
|
-
}
|
|
289
|
-
for (const tile of tiles) {
|
|
290
|
-
if (counter === 0)
|
|
291
|
-
break;
|
|
292
|
-
if (tile.level === hightestZoom) {
|
|
293
|
-
result.push(tileToMergedTileInfo(tile));
|
|
294
|
-
counter--;
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
return result;
|
|
298
|
-
}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
// /**
|
|
3
|
-
// * Find length in x and y for a tile in given zoom level (in wgs84)
|
|
4
|
-
// * Find tile cuts for given line represented by two points
|
|
5
|
-
// * Find inner position of point in tile
|
|
6
|
-
// *
|
|
7
|
-
// */
|
|
8
|
-
// import { LongLat } from "../../types";
|
|
9
|
-
// export function tileLength(zoom: number): LongLat {
|
|
10
|
-
// const tileSize = 256; // in pixels
|
|
11
|
-
// const worldSize = tileSize * Math.pow(2, zoom);
|
|
12
|
-
// const latLength = 180 / worldSize;
|
|
13
|
-
// const lonLength = 360 / worldSize;
|
|
14
|
-
// return [lonLength, latLength];
|
|
15
|
-
// }
|
|
16
|
-
// // export function tileCuts(p1: LongLat, p2: LongLat, zoom: number): LongLat[] {
|
|
17
|
-
// // const cuts: LongLat[] = [];
|
|
18
|
-
// // const tileSize = 256;
|
|
19
|
-
// // const worldSize = tileSize * Math.pow(2, zoom);
|
|
20
|
-
// // const latLength = 180 / worldSize;
|
|
21
|
-
// // const lonLength = 360 / worldSize;
|
|
22
|
-
// // const x1 = (p1[0] + 180) / lonLength;
|
|
23
|
-
// // const y1 = (90 - p1[1]) / latLength;
|
|
24
|
-
// // const x2 = (p2[0] + 180) / lonLength;
|
|
25
|
-
// // const y2 = (90 - p2[1]) / latLength;
|
|
26
|
-
// // const dx = x2 - x1;
|
|
27
|
-
// // const dy = y2 - y1;
|
|
28
|
-
// // const steps = Math.max(Math.abs(dx), Math.abs(dy));
|
|
29
|
-
// // const xStep = dx / steps;
|
|
30
|
-
// // const yStep = dy / steps;
|
|
31
|
-
// // let x = x1;
|
|
32
|
-
// // let y = y1;
|
|
33
|
-
// // for (let i = 0; i <= steps; i++) {
|
|
34
|
-
// // const tileX = Math.floor(x);
|
|
35
|
-
// // const tileY = Math.floor(y);
|
|
36
|
-
// // const cutX = tileX * lonLength - 180;
|
|
37
|
-
// // const cutY = 90 - tileY * latLength;
|
|
38
|
-
// // const cut: LongLat = [cutX, cutY];
|
|
39
|
-
// // if (cuts.length === 0 || (cuts[cuts.length - 1][0] !== cut[0] || cuts[cuts.length - 1][1] !== cut[1])) {
|
|
40
|
-
// // cuts.push(cut);
|
|
41
|
-
// // }
|
|
42
|
-
// // x += xStep;
|
|
43
|
-
// // y += yStep;
|
|
44
|
-
// // }
|
|
45
|
-
// // return cuts;
|
|
46
|
-
// // }
|
|
47
|
-
// // function fillTriangle(p1: LongLat, p2: LongLat, p3: LongLat, zoom: number): {positions:LongLat[], indices:number[]} {
|
|
48
|
-
// // // this function fills the triangle triangle iteratively
|
|
49
|
-
// // //
|
|
50
|
-
// // }
|