@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,328 +0,0 @@
|
|
|
1
|
-
import { TextureDemTriangles } from "./texture-dem-triangles";
|
|
2
|
-
import { RADIAN, radianToMercatorXY } from "../../Math/methods";
|
|
3
|
-
import { mergeMeshes } from "../../Math/tessellation/tile-merger";
|
|
4
|
-
import { createTriangleTessellationMeta, getAllPoints, partialTessellation } from "../../Math/tessellation/triangle-tessellation-meta";
|
|
5
|
-
/**
|
|
6
|
-
* Loads a plugin with test data for TextureDemTriangles
|
|
7
|
-
*/
|
|
8
|
-
function test1(zoomLevel, p1, p2, p3) {
|
|
9
|
-
const triangleMeta = createTriangleTessellationMeta(p1, p2, p3);
|
|
10
|
-
const { vec3s, longLats, indices } = getAllPoints(triangleMeta, zoomLevel);
|
|
11
|
-
return { vec3s, longLats, indices };
|
|
12
|
-
}
|
|
13
|
-
function partialTest(bboxZooms, p1, p2, p3) {
|
|
14
|
-
const triangleMeta = createTriangleTessellationMeta(p1, p2, p3);
|
|
15
|
-
return partialTessellation(triangleMeta, bboxZooms, 5);
|
|
16
|
-
}
|
|
17
|
-
function antalyaTestTriangle() {
|
|
18
|
-
const p1 = [30.5391 * RADIAN, 36.9083 * RADIAN];
|
|
19
|
-
const p2 = [32.9271 * RADIAN, 36.9083 * RADIAN];
|
|
20
|
-
const p3 = [31.7331 * RADIAN, 35.8145 * RADIAN];
|
|
21
|
-
const bboxZooms = [
|
|
22
|
-
// 12 zoom level
|
|
23
|
-
{
|
|
24
|
-
bbox: {
|
|
25
|
-
min: [30.5391 * RADIAN, 35.8145 * RADIAN],
|
|
26
|
-
max: [32.9271 * RADIAN, 36.9083 * RADIAN]
|
|
27
|
-
}, zoom: 15
|
|
28
|
-
},
|
|
29
|
-
// 11 zoom level
|
|
30
|
-
// {
|
|
31
|
-
// bbox: {
|
|
32
|
-
// min: [30.5391 * RADIAN, 35.8145 * RADIAN],
|
|
33
|
-
// max: [32.9271 * RADIAN, 36.9083 * RADIAN]
|
|
34
|
-
// }, zoom: 11
|
|
35
|
-
// },
|
|
36
|
-
];
|
|
37
|
-
return partialTest(bboxZooms, p1, p2, p3);
|
|
38
|
-
}
|
|
39
|
-
function loadVec3sLongLatsIndices(gl, bufferInfo, data) {
|
|
40
|
-
// Calculate total sizes
|
|
41
|
-
let totalVec3s = 0;
|
|
42
|
-
let totalLongLats = 0;
|
|
43
|
-
let totalIndices = 0;
|
|
44
|
-
for (const item of data) {
|
|
45
|
-
totalVec3s += item.vec3s.length;
|
|
46
|
-
totalLongLats += item.longLats.length;
|
|
47
|
-
totalIndices += item.indices.length;
|
|
48
|
-
}
|
|
49
|
-
// Pre-allocate arrays
|
|
50
|
-
const vec3s = new Float32Array(totalVec3s);
|
|
51
|
-
const longLats = new Float32Array(totalLongLats);
|
|
52
|
-
const indices = new Uint32Array(totalIndices);
|
|
53
|
-
let vec3Offset = 0;
|
|
54
|
-
let longLatOffset = 0;
|
|
55
|
-
let indexOffset = 0;
|
|
56
|
-
let vertexOffset = 0;
|
|
57
|
-
for (const item of data) {
|
|
58
|
-
// Copy vec3s
|
|
59
|
-
vec3s.set(item.vec3s, vec3Offset);
|
|
60
|
-
vec3Offset += item.vec3s.length;
|
|
61
|
-
// Copy longLats
|
|
62
|
-
longLats.set(item.longLats, longLatOffset);
|
|
63
|
-
longLatOffset += item.longLats.length;
|
|
64
|
-
// Copy and adjust indices
|
|
65
|
-
for (let i = 0; i < item.indices.length; i++) {
|
|
66
|
-
indices[indexOffset + i] = item.indices[i] + vertexOffset;
|
|
67
|
-
}
|
|
68
|
-
indexOffset += item.indices.length;
|
|
69
|
-
vertexOffset += item.vec3s.length / 3; // Each vertex has 3 components
|
|
70
|
-
}
|
|
71
|
-
gl.bindBuffer(gl.ARRAY_BUFFER, bufferInfo.pos3dBufferInfo.buffer);
|
|
72
|
-
gl.bufferData(gl.ARRAY_BUFFER, vec3s, gl.STATIC_DRAW);
|
|
73
|
-
gl.bindBuffer(gl.ARRAY_BUFFER, bufferInfo.longLatBufferInfo.buffer);
|
|
74
|
-
gl.bufferData(gl.ARRAY_BUFFER, longLats, gl.STATIC_DRAW);
|
|
75
|
-
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, bufferInfo.elementBufferInfo.buffer);
|
|
76
|
-
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);
|
|
77
|
-
}
|
|
78
|
-
const createTestBBOXES = () => {
|
|
79
|
-
const bboxes = [];
|
|
80
|
-
for (let i = 0; i < 6; i++) {
|
|
81
|
-
const north = Math.random() * Math.PI / 2 / 1.4; // random latitude
|
|
82
|
-
const west = Math.random() * -1 * Math.PI / 10; // random longitude
|
|
83
|
-
const south = north - Math.PI / 30; // random latitude
|
|
84
|
-
const east = west + Math.PI / 30; // random longitude
|
|
85
|
-
const ll = [west, north]; // random northWest
|
|
86
|
-
const ur = [east, south]; // random southEast
|
|
87
|
-
//
|
|
88
|
-
bboxes.push({ ll, ur });
|
|
89
|
-
}
|
|
90
|
-
return bboxes;
|
|
91
|
-
};
|
|
92
|
-
const demTextureBBOX = createTestBBOXES();
|
|
93
|
-
function showTextureBBoxes(bboxes, demData = []) {
|
|
94
|
-
for (let i = 0; i < bboxes.length; i++) {
|
|
95
|
-
const bbox = bboxes[i];
|
|
96
|
-
console.log(`Texture BBOX ${i}: LL(${(bbox.ll[0] * 180 / Math.PI).toFixed(2)}, ${(bbox.ll[1] * 180 / Math.PI).toFixed(2)}) UR(${(bbox.ur[0] * 180 / Math.PI).toFixed(2)}, ${(bbox.ur[1] * 180 / Math.PI).toFixed(2)})`);
|
|
97
|
-
if (demData.length > i) {
|
|
98
|
-
const dem = demData[i];
|
|
99
|
-
let demStr = "DEM: \n";
|
|
100
|
-
for (let j = 0; j < dem.length; j++) {
|
|
101
|
-
demStr += dem[j].toFixed(1) + " ";
|
|
102
|
-
if ((j + 1) % 5 === 0) {
|
|
103
|
-
demStr += "\n";
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
console.log(demStr);
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
const createTestDemTextures = () => {
|
|
111
|
-
const textures = [];
|
|
112
|
-
for (let i = 0; i < 6; i++) {
|
|
113
|
-
const texture = [];
|
|
114
|
-
for (let j = 0; j < 5 * 5; j++) {
|
|
115
|
-
const value = 100 * Math.random(); // random elevation value
|
|
116
|
-
texture.push(value);
|
|
117
|
-
}
|
|
118
|
-
textures.push(texture);
|
|
119
|
-
}
|
|
120
|
-
return textures;
|
|
121
|
-
};
|
|
122
|
-
// TODO: NAME IT longlat degree or radian
|
|
123
|
-
export function createBuffersAndFill(gl, vec3s, longLats, indices) {
|
|
124
|
-
const positionBuffer = gl.createBuffer();
|
|
125
|
-
const longLatBuffer = gl.createBuffer();
|
|
126
|
-
const indexBuffer = gl.createBuffer();
|
|
127
|
-
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
|
|
128
|
-
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vec3s), gl.STATIC_DRAW);
|
|
129
|
-
gl.bindBuffer(gl.ARRAY_BUFFER, longLatBuffer);
|
|
130
|
-
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(longLats), gl.STATIC_DRAW);
|
|
131
|
-
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);
|
|
132
|
-
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), gl.STATIC_DRAW);
|
|
133
|
-
return {
|
|
134
|
-
buffers: {
|
|
135
|
-
positionBuffer,
|
|
136
|
-
longLatBuffer,
|
|
137
|
-
indexBuffer
|
|
138
|
-
}
|
|
139
|
-
};
|
|
140
|
-
}
|
|
141
|
-
export class TextureDemTrianglesTestPlugin {
|
|
142
|
-
globe = null;
|
|
143
|
-
textureDemTriangles = null;
|
|
144
|
-
vao = null;
|
|
145
|
-
drawOptions = null;
|
|
146
|
-
_lastTilesUniqueIdentifier = "";
|
|
147
|
-
bufferInfo = null;
|
|
148
|
-
id;
|
|
149
|
-
uboTriangleStyle = null;
|
|
150
|
-
uboStringStyle = null;
|
|
151
|
-
showDemPoints = false;
|
|
152
|
-
bboxZooms = [];
|
|
153
|
-
constructor(id) {
|
|
154
|
-
this.id = id;
|
|
155
|
-
this.bboxZooms = [];
|
|
156
|
-
}
|
|
157
|
-
init(globe) {
|
|
158
|
-
this.globe = globe;
|
|
159
|
-
this.textureDemTriangles = new TextureDemTriangles(globe);
|
|
160
|
-
// set bboxes and dem textures
|
|
161
|
-
const demTextures = createTestDemTextures();
|
|
162
|
-
// const demTextureBBOX = createTestBBOXES();
|
|
163
|
-
this.textureDemTriangles.setDemTextures(demTextures, demTextureBBOX);
|
|
164
|
-
//
|
|
165
|
-
// const baseZoom = 5;
|
|
166
|
-
showTextureBBoxes(demTextureBBOX, demTextures);
|
|
167
|
-
this.uboTriangleStyle = this.textureDemTriangles.createUBO();
|
|
168
|
-
this.uboStringStyle = this.textureDemTriangles.createUBO();
|
|
169
|
-
this.uboTriangleStyle.updateSingle("u_color", new Float32Array([1.0, 0.0, 0.0, 0.0]));
|
|
170
|
-
this.uboStringStyle.updateSingle("u_color", new Float32Array([.3, .3, .0, 1.0]));
|
|
171
|
-
const elementBuffer = globe.gl.createBuffer();
|
|
172
|
-
const bufferInfo = {
|
|
173
|
-
pos3dBufferInfo: {
|
|
174
|
-
buffer: globe.gl.createBuffer(),
|
|
175
|
-
stride: 0,
|
|
176
|
-
offset: 0,
|
|
177
|
-
},
|
|
178
|
-
longLatBufferInfo: {
|
|
179
|
-
buffer: globe.gl.createBuffer(),
|
|
180
|
-
stride: 0,
|
|
181
|
-
offset: 0,
|
|
182
|
-
},
|
|
183
|
-
elementBufferInfo: {
|
|
184
|
-
buffer: elementBuffer,
|
|
185
|
-
stride: 0,
|
|
186
|
-
offset: 0,
|
|
187
|
-
},
|
|
188
|
-
drawOptions: {
|
|
189
|
-
drawRange: { count: 0, first: 0 },
|
|
190
|
-
drawMode: globe.gl.TRIANGLES,
|
|
191
|
-
elementBuffer: elementBuffer,
|
|
192
|
-
elementBufferIndexType: globe.gl.UNSIGNED_INT
|
|
193
|
-
},
|
|
194
|
-
drawOptionsPoint: {
|
|
195
|
-
drawRange: { count: 0, first: 0 },
|
|
196
|
-
drawMode: globe.gl.POINTS,
|
|
197
|
-
},
|
|
198
|
-
};
|
|
199
|
-
this.vao = this.textureDemTriangles.createVAO(bufferInfo.pos3dBufferInfo, bufferInfo.longLatBufferInfo);
|
|
200
|
-
this.bufferInfo = bufferInfo;
|
|
201
|
-
this.setZoom(5);
|
|
202
|
-
}
|
|
203
|
-
setUniform(key, value) {
|
|
204
|
-
if (this.uboTriangleStyle) {
|
|
205
|
-
this.uboTriangleStyle.updateSingle(key, value);
|
|
206
|
-
}
|
|
207
|
-
if (this.uboStringStyle) {
|
|
208
|
-
this.uboStringStyle.updateSingle(key, value);
|
|
209
|
-
}
|
|
210
|
-
this.globe?.DrawRender();
|
|
211
|
-
}
|
|
212
|
-
setZoom(zoomLevel) {
|
|
213
|
-
this.bboxZooms = demTextureBBOX.map((bbox, index) => {
|
|
214
|
-
return {
|
|
215
|
-
bbox: {
|
|
216
|
-
min: bbox.ll,
|
|
217
|
-
max: bbox.ur,
|
|
218
|
-
}, zoom: index + zoomLevel + 1
|
|
219
|
-
};
|
|
220
|
-
});
|
|
221
|
-
// all world - FIX: Convert to radians
|
|
222
|
-
this.bboxZooms.push({
|
|
223
|
-
bbox: {
|
|
224
|
-
min: [-180 * RADIAN, -90 * RADIAN], // ✓ Now radians
|
|
225
|
-
max: [180 * RADIAN, 90 * RADIAN] // ✓ Now radians
|
|
226
|
-
},
|
|
227
|
-
zoom: zoomLevel
|
|
228
|
-
});
|
|
229
|
-
if (!this.globe || !this.textureDemTriangles || !this.bufferInfo)
|
|
230
|
-
return;
|
|
231
|
-
// const p1: LongLatRadian = [-20 * Math.PI / 180, 50 * Math.PI / 180];
|
|
232
|
-
// const p2: LongLatRadian = [20 * Math.PI / 180, 50 * Math.PI / 180];
|
|
233
|
-
// const p3: LongLatRadian = [0, -10 * Math.PI / 180];
|
|
234
|
-
const p1 = [-60 * Math.PI / 180, 60 * Math.PI / 180];
|
|
235
|
-
const p2 = [60 * Math.PI / 180, 60 * Math.PI / 180];
|
|
236
|
-
const p3 = [0, -60 * Math.PI / 180];
|
|
237
|
-
const bigTriangle = partialTest(this.bboxZooms, p1, p2, p3);
|
|
238
|
-
const bufferInfo = this.bufferInfo;
|
|
239
|
-
const antalya = antalyaTestTriangle();
|
|
240
|
-
loadVec3sLongLatsIndices(this.globe.gl, bufferInfo, [
|
|
241
|
-
bigTriangle,
|
|
242
|
-
antalya
|
|
243
|
-
]);
|
|
244
|
-
bufferInfo.drawOptions.drawRange.first = 0;
|
|
245
|
-
bufferInfo.drawOptions.drawRange.count = antalya.indices.length + bigTriangle.indices.length;
|
|
246
|
-
bufferInfo.drawOptionsPoint.drawRange.first = 0;
|
|
247
|
-
bufferInfo.drawOptionsPoint.drawRange.count = (antalya.longLats.length + bigTriangle.longLats.length) / 2;
|
|
248
|
-
}
|
|
249
|
-
setShowDemPoints(show) {
|
|
250
|
-
this.showDemPoints = show;
|
|
251
|
-
}
|
|
252
|
-
draw3D() {
|
|
253
|
-
if (!this.globe || !this.textureDemTriangles || !this.vao || !this.bufferInfo)
|
|
254
|
-
return;
|
|
255
|
-
const gl = this.globe.gl;
|
|
256
|
-
this._prepareDem();
|
|
257
|
-
gl.frontFace(gl.CW);
|
|
258
|
-
// @ts-ignore
|
|
259
|
-
this.textureDemTriangles.draw(this.vao, this.bufferInfo.drawOptions, this.uboTriangleStyle);
|
|
260
|
-
if (this.showDemPoints) {
|
|
261
|
-
// @ts-ignore
|
|
262
|
-
this.textureDemTriangles.draw(this.vao, this.bufferInfo.drawOptionsPoint, this.uboStringStyle);
|
|
263
|
-
}
|
|
264
|
-
gl.frontFace(gl.CCW);
|
|
265
|
-
}
|
|
266
|
-
_prepareDem() {
|
|
267
|
-
if (!this.globe || !this.textureDemTriangles)
|
|
268
|
-
return;
|
|
269
|
-
const drawnTiles = this.globe.api_GetDrawedTilesInfo();
|
|
270
|
-
if (this._checkTileChange(drawnTiles))
|
|
271
|
-
return;
|
|
272
|
-
const mergedTiles = mergeMeshes(drawnTiles, 12, 5, 4);
|
|
273
|
-
// let I = 6;
|
|
274
|
-
for (const tile of mergedTiles) {
|
|
275
|
-
const bbox = globeBBoxToXYBBOX(tile.bbox);
|
|
276
|
-
// Validation: Check if values are in expected radian range
|
|
277
|
-
// if (Math.abs(bbox.northWest[0]) > Math.PI * 2 || Math.abs(bbox.northWest[1]) > Math.PI) {
|
|
278
|
-
// console.error(`⚠️ BBOX out of radian range! Raw bbox:`, tile.bbox);
|
|
279
|
-
// }
|
|
280
|
-
if (bbox.ll[0] > bbox.ur[0]) {
|
|
281
|
-
console.warn(`⚠️ BBOX longitudes seem incorrect! ll longitude is greater than ur longitude. Raw bbox:`, bbox);
|
|
282
|
-
}
|
|
283
|
-
if (bbox.ll[1] > bbox.ur[1]) {
|
|
284
|
-
console.warn(`⚠️ BBOX latitudes seem incorrect! ll latitude is greater than ur latitude. Raw bbox:`, bbox);
|
|
285
|
-
}
|
|
286
|
-
// console.log(` BBox LL (${(bbox.ll[0]).toFixed(2)}°, ${(bbox.ll[1]).toFixed(2)}°) UR (${(bbox.ur[0]).toFixed(2)}°, ${(bbox.ur[1]).toFixed(2)}°), Cover: ${tile.coverRatio.x.toFixed(2)}x${tile.coverRatio.y.toFixed(2)}`);
|
|
287
|
-
// console.log(`${I} Cover: ${tile.coverRatio.x.toFixed(2)} ${tile.coverRatio.y.toFixed(2)}`);
|
|
288
|
-
// I--;
|
|
289
|
-
}
|
|
290
|
-
// console.log("...............................")
|
|
291
|
-
this.textureDemTriangles.setDemTextures(mergedTiles.map(t => Array.from(t.mesh)), mergedTiles.map(t => globeBBoxToXYBBOX(t.bbox)), mergedTiles.map(t => ({ x: t.coverRatio.x, y: t.coverRatio.y })));
|
|
292
|
-
}
|
|
293
|
-
_checkTileChange(drawnTiles) {
|
|
294
|
-
let maxLevel = 0;
|
|
295
|
-
let minLevel = Number.MAX_VALUE;
|
|
296
|
-
const tileMap = new Map();
|
|
297
|
-
for (const tile of drawnTiles) {
|
|
298
|
-
if (tile.level > maxLevel) {
|
|
299
|
-
maxLevel = tile.level;
|
|
300
|
-
}
|
|
301
|
-
if (tile.level < minLevel) {
|
|
302
|
-
minLevel = tile.level;
|
|
303
|
-
}
|
|
304
|
-
if (!tileMap.has(tile.level)) {
|
|
305
|
-
tileMap.set(tile.level, []);
|
|
306
|
-
}
|
|
307
|
-
tileMap.get(tile.level).push(tile);
|
|
308
|
-
}
|
|
309
|
-
let tilesUniqueId = "";
|
|
310
|
-
for (let level = minLevel; level <= maxLevel; level++) {
|
|
311
|
-
const tiles = tileMap.get(level);
|
|
312
|
-
if (!tiles)
|
|
313
|
-
continue;
|
|
314
|
-
tilesUniqueId += `L${level}_C${tiles.length}_`;
|
|
315
|
-
}
|
|
316
|
-
if (tilesUniqueId === this._lastTilesUniqueIdentifier)
|
|
317
|
-
return true;
|
|
318
|
-
this._lastTilesUniqueIdentifier = tilesUniqueId;
|
|
319
|
-
return false;
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
function globeBBoxToXYBBOX(t) {
|
|
323
|
-
// this code scales Y to linear integration
|
|
324
|
-
return {
|
|
325
|
-
ll: radianToMercatorXY([t.ll.x * RADIAN, t.ll.y * RADIAN]), // west longitude, north latitude
|
|
326
|
-
ur: radianToMercatorXY([t.ur.x * RADIAN, t.ur.y * RADIAN]) // east longitude, south latitude
|
|
327
|
-
};
|
|
328
|
-
}
|
|
@@ -1,268 +0,0 @@
|
|
|
1
|
-
import { createProgram } from "../../util/webglobjectbuilders";
|
|
2
|
-
import { CameraUniformBlockTotemCache, CameraUniformBlockString } from "../totems/camerauniformblock";
|
|
3
|
-
import { cartesian3DToGLPosition, } from "../../util/shaderfunctions/geometrytransformations";
|
|
4
|
-
import { isPointInBBox } from "../../util/shaderfunctions/geometrytransformations";
|
|
5
|
-
import { drawArrays } from "../../util/gl-util/draw-options/methods";
|
|
6
|
-
import { attributeLoader } from "../../util/gl-util/buffer/attribute-loader";
|
|
7
|
-
import { WORLD_RADIUS_3D } from "../../Math/constants";
|
|
8
|
-
import { UniformBlockManager } from "../../util/gl-util/uniform-block/manager";
|
|
9
|
-
const uniformBindingPoints = {
|
|
10
|
-
camera: 0,
|
|
11
|
-
style: 1,
|
|
12
|
-
};
|
|
13
|
-
const styleBlockManager = new UniformBlockManager('Style', [
|
|
14
|
-
{ name: "u_color", type: "vec4", value: new Float32Array([0.0, 0.0, 0.0, 0.0]) },
|
|
15
|
-
{ name: "u_pointSize", type: "float", value: new Float32Array([1.0]) },
|
|
16
|
-
{ name: "u_opacity", type: "float", value: new Float32Array([1.0]) },
|
|
17
|
-
], uniformBindingPoints.style);
|
|
18
|
-
const vertexShaderSource = `#version 300 es
|
|
19
|
-
#pragma vscode_glsllint_stage : vert
|
|
20
|
-
|
|
21
|
-
precision highp float;
|
|
22
|
-
precision highp sampler2DArray;
|
|
23
|
-
|
|
24
|
-
${CameraUniformBlockString}
|
|
25
|
-
|
|
26
|
-
${cartesian3DToGLPosition}
|
|
27
|
-
in vec3 a_position;
|
|
28
|
-
in vec2 a_xy;
|
|
29
|
-
uniform sampler2DArray u_demTexture; // <-- changed from array to single
|
|
30
|
-
uniform vec4 u_demTextureBBOX[6];
|
|
31
|
-
uniform vec2 u_textureDataCoverRatio[6];
|
|
32
|
-
uniform int u_breakLoopIndex;
|
|
33
|
-
|
|
34
|
-
${styleBlockManager.glslCode()}
|
|
35
|
-
// Todo: light direction.
|
|
36
|
-
out vec4 v_color;
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
${isPointInBBox}
|
|
40
|
-
|
|
41
|
-
void main() {
|
|
42
|
-
|
|
43
|
-
float elevation = ${WORLD_RADIUS_3D}; // default elevation at sea level
|
|
44
|
-
float altitude = 0.0;
|
|
45
|
-
v_color = vec4(1.0, 1.0, 1.0, 1.0); // default color white
|
|
46
|
-
|
|
47
|
-
for (int i = 0; i < 6; i++) {
|
|
48
|
-
if (isPointInBBox(a_xy, u_demTextureBBOX[i])) {
|
|
49
|
-
vec2 uv = (a_xy - u_demTextureBBOX[i].xy) / (u_demTextureBBOX[i].zw - u_demTextureBBOX[i].xy);
|
|
50
|
-
// uv.y = 1.0 - uv.y; // flip y coordinate
|
|
51
|
-
// rescale and transform uv to fit in the texture data cover bbox
|
|
52
|
-
uv *= u_textureDataCoverRatio[i];
|
|
53
|
-
altitude = texture(u_demTexture, vec3(uv, float(i))).r;
|
|
54
|
-
if (altitude != 0.0) {
|
|
55
|
-
break;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
if (u_color.a > 0.0) {
|
|
60
|
-
v_color = u_color;
|
|
61
|
-
} else {
|
|
62
|
-
if ( altitude > 0.00001 ) {
|
|
63
|
-
v_color = mix(vec4(1.0, 1.0, 1.0, 1.0), vec4(1.0, 0.2, 0.2, 1.0), altitude / 2.0); // color from white to red based on altitude
|
|
64
|
-
} else {
|
|
65
|
-
// white
|
|
66
|
-
v_color = vec4(1.0, 1.0, 1.0, 0.5);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
v_color.a *= u_opacity;
|
|
70
|
-
vec3 position = a_position * (elevation + altitude * 2.0);
|
|
71
|
-
gl_Position = cartesian3DToGLPosition(position);
|
|
72
|
-
gl_PointSize = 6.0; //u_pointSize;
|
|
73
|
-
}
|
|
74
|
-
`;
|
|
75
|
-
const fragmentShaderSource = `#version 300 es
|
|
76
|
-
#pragma vscode_glsllint_stage : frag
|
|
77
|
-
|
|
78
|
-
precision highp float;
|
|
79
|
-
in vec4 v_color;
|
|
80
|
-
out vec4 outColor;
|
|
81
|
-
void main() {
|
|
82
|
-
outColor = v_color;
|
|
83
|
-
}
|
|
84
|
-
`;
|
|
85
|
-
function resCalculation(sourceResolution, mergeCount) {
|
|
86
|
-
return sourceResolution + (mergeCount - 1) * (sourceResolution - 1);
|
|
87
|
-
}
|
|
88
|
-
const RESOLUTION = resCalculation(5, 12); // 5 is tile dimension length, 12 is merge count
|
|
89
|
-
export class TextureDemTriangles {
|
|
90
|
-
globe;
|
|
91
|
-
gl;
|
|
92
|
-
program;
|
|
93
|
-
// Later an injection will handle demTextures and demTextureBBOX
|
|
94
|
-
texture;
|
|
95
|
-
// demTextures: WebGLTexture[] = [];
|
|
96
|
-
// demTextureBBOX: Float32Array = new Float32Array(6 * 4); // 6 bounding boxes
|
|
97
|
-
cameraUniformBlock;
|
|
98
|
-
_publishedUBOs = [];
|
|
99
|
-
locations = {
|
|
100
|
-
attributes: {
|
|
101
|
-
a_position: -1,
|
|
102
|
-
a_xy: -1,
|
|
103
|
-
},
|
|
104
|
-
uniforms: {
|
|
105
|
-
u_demTexture: -1,
|
|
106
|
-
u_demTextureBBOX: -1,
|
|
107
|
-
u_textureDataCoverRatio: -1,
|
|
108
|
-
u_style: -1,
|
|
109
|
-
u_breakLoopIndex: -1,
|
|
110
|
-
}
|
|
111
|
-
};
|
|
112
|
-
constructor(globe) {
|
|
113
|
-
this.globe = globe;
|
|
114
|
-
this.gl = globe.gl;
|
|
115
|
-
this.program = createProgram(this.gl, vertexShaderSource, fragmentShaderSource);
|
|
116
|
-
this.cameraUniformBlock = CameraUniformBlockTotemCache.get(this.globe);
|
|
117
|
-
this.cameraUniformBlock.assignBindingPoint(this.program, uniformBindingPoints.camera);
|
|
118
|
-
// get attribute locations
|
|
119
|
-
this.locations.attributes.a_position = this.gl.getAttribLocation(this.program, 'a_position');
|
|
120
|
-
this.locations.attributes.a_xy = this.gl.getAttribLocation(this.program, 'a_xy');
|
|
121
|
-
// get uniform locations
|
|
122
|
-
this.locations.uniforms.u_demTexture = this.gl.getUniformLocation(this.program, 'u_demTexture');
|
|
123
|
-
this.locations.uniforms.u_demTextureBBOX = this.gl.getUniformLocation(this.program, 'u_demTextureBBOX');
|
|
124
|
-
this.locations.uniforms.u_textureDataCoverRatio = this.gl.getUniformLocation(this.program, 'u_textureDataCoverRatio');
|
|
125
|
-
this.locations.uniforms.u_breakLoopIndex = this.gl.getUniformLocation(this.program, 'u_breakLoopIndex');
|
|
126
|
-
this.locations.uniforms.u_style = this.gl.getUniformBlockIndex(this.program, 'Style');
|
|
127
|
-
this.gl.uniformBlockBinding(this.program, this.locations.uniforms.u_style, uniformBindingPoints.style);
|
|
128
|
-
// create 3d texture
|
|
129
|
-
const texture = this.gl.createTexture();
|
|
130
|
-
this.gl.bindTexture(this.gl.TEXTURE_2D_ARRAY, texture);
|
|
131
|
-
// Calculate correct size: tileDimensionLength + (mergeCount - 1) * (tileDimensionLength - 1)
|
|
132
|
-
// For tileDimensionLength=5, mergeCount=8: 5 + 7*4 = RESOLUTION
|
|
133
|
-
this.gl.texStorage3D(this.gl.TEXTURE_2D_ARRAY, 1, this.gl.R32F, RESOLUTION, RESOLUTION, 6);
|
|
134
|
-
// set texture parameters
|
|
135
|
-
const ext = this.gl.getExtension('OES_texture_float_linear');
|
|
136
|
-
console.log('OES_texture_float_linear extension:', ext);
|
|
137
|
-
this.gl.texParameteri(this.gl.TEXTURE_2D_ARRAY, this.gl.TEXTURE_MIN_FILTER, this.gl.LINEAR);
|
|
138
|
-
this.gl.texParameteri(this.gl.TEXTURE_2D_ARRAY, this.gl.TEXTURE_MAG_FILTER, this.gl.LINEAR);
|
|
139
|
-
this.gl.texParameteri(this.gl.TEXTURE_2D_ARRAY, this.gl.TEXTURE_WRAP_S, this.gl.CLAMP_TO_EDGE);
|
|
140
|
-
this.gl.texParameteri(this.gl.TEXTURE_2D_ARRAY, this.gl.TEXTURE_WRAP_T, this.gl.CLAMP_TO_EDGE);
|
|
141
|
-
this.gl.bindTexture(this.gl.TEXTURE_2D_ARRAY, null);
|
|
142
|
-
this.texture = texture;
|
|
143
|
-
}
|
|
144
|
-
createVAO(pos3dBufferInfo, longLatBufferInfo) {
|
|
145
|
-
const vao = this.gl.createVertexArray();
|
|
146
|
-
this.gl.bindVertexArray(vao);
|
|
147
|
-
attributeLoader(this.gl, pos3dBufferInfo, this.locations.attributes.a_position, 3);
|
|
148
|
-
attributeLoader(this.gl, longLatBufferInfo, this.locations.attributes.a_xy, 2);
|
|
149
|
-
this.gl.bindVertexArray(null);
|
|
150
|
-
return vao;
|
|
151
|
-
}
|
|
152
|
-
setDemTextures(demTexturesData, demTextureBBOX, coverRatio) {
|
|
153
|
-
// Add validation for maximum layers
|
|
154
|
-
const maxLayers = this.gl.getParameter(this.gl.MAX_ARRAY_TEXTURE_LAYERS);
|
|
155
|
-
if (demTexturesData.length > Math.min(maxLayers, 6)) {
|
|
156
|
-
console.error(`Too many DEM textures: ${demTexturesData.length}, max supported: ${Math.min(maxLayers, 6)}`);
|
|
157
|
-
return;
|
|
158
|
-
}
|
|
159
|
-
// bind textures to texture units
|
|
160
|
-
const gl = this.gl;
|
|
161
|
-
gl.bindTexture(gl.TEXTURE_2D_ARRAY, this.texture);
|
|
162
|
-
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);
|
|
163
|
-
// turn off premultiply alpha
|
|
164
|
-
gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);
|
|
165
|
-
// bind and upload each texture to the 3D texture array
|
|
166
|
-
for (let i = 0; i < demTexturesData.length; i++) {
|
|
167
|
-
const data = demTexturesData[i];
|
|
168
|
-
if (data.length === RESOLUTION * RESOLUTION) { // <-- FIXED
|
|
169
|
-
gl.texSubImage3D(gl.TEXTURE_2D_ARRAY, 0, 0, 0, i, RESOLUTION, RESOLUTION, 1, gl.RED, gl.FLOAT, new Float32Array(data));
|
|
170
|
-
}
|
|
171
|
-
else {
|
|
172
|
-
console.warn(`DEM texture ${i} has incorrect size: ${data.length}, expected: ${RESOLUTION * RESOLUTION}`);
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
// set uniform for texture units
|
|
176
|
-
const bboxVec4Array = new Float32Array(6 * 4);
|
|
177
|
-
for (let i = 0; i < demTextureBBOX.length; i++) {
|
|
178
|
-
const bbox = demTextureBBOX[i];
|
|
179
|
-
bboxVec4Array[i * 4 + 0] = bbox.ll[0];
|
|
180
|
-
bboxVec4Array[i * 4 + 1] = bbox.ll[1];
|
|
181
|
-
bboxVec4Array[i * 4 + 2] = bbox.ur[0];
|
|
182
|
-
bboxVec4Array[i * 4 + 3] = bbox.ur[1];
|
|
183
|
-
}
|
|
184
|
-
const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM);
|
|
185
|
-
gl.useProgram(this.program);
|
|
186
|
-
gl.uniform4fv(this.locations.uniforms.u_demTextureBBOX, bboxVec4Array);
|
|
187
|
-
if (coverRatio) {
|
|
188
|
-
gl.uniform2fv(this.locations.uniforms.u_textureDataCoverRatio, new Float32Array(coverRatio.flatMap(ratio => [ratio.x, ratio.y])));
|
|
189
|
-
}
|
|
190
|
-
else {
|
|
191
|
-
gl.uniform2fv(this.locations.uniforms.u_textureDataCoverRatio, new Float32Array(12).fill(1.0));
|
|
192
|
-
}
|
|
193
|
-
gl.bindTexture(gl.TEXTURE_2D_ARRAY, null);
|
|
194
|
-
gl.uniform1i(this.locations.uniforms.u_breakLoopIndex, demTexturesData.length);
|
|
195
|
-
gl.useProgram(currentProgram);
|
|
196
|
-
}
|
|
197
|
-
createUBO(bufferReadType = "STATIC_DRAW") {
|
|
198
|
-
const ubo = styleBlockManager.createUBO(this.gl, bufferReadType);
|
|
199
|
-
this._publishedUBOs.push(ubo);
|
|
200
|
-
return ubo;
|
|
201
|
-
}
|
|
202
|
-
free() {
|
|
203
|
-
this.gl.deleteProgram(this.program);
|
|
204
|
-
this.gl.deleteTexture(this.texture);
|
|
205
|
-
this._publishedUBOs.forEach(ubo => ubo.free());
|
|
206
|
-
this._publishedUBOs = [];
|
|
207
|
-
CameraUniformBlockTotemCache.release(this.globe);
|
|
208
|
-
}
|
|
209
|
-
draw(vao, drawOptions, ubo) {
|
|
210
|
-
const gl = this.gl;
|
|
211
|
-
gl.useProgram(this.program);
|
|
212
|
-
this.cameraUniformBlock.bind(uniformBindingPoints.camera);
|
|
213
|
-
// TURN OFF flip y for texture
|
|
214
|
-
// gl.disable(gl.DEPTH_TEST);
|
|
215
|
-
// gl.depthMask(false);
|
|
216
|
-
// gl.depthRange(0.0, 0.01); // Use near 1% of depth range
|
|
217
|
-
// Step 3: Optionally: Set depth func to ALWAYS (to ignore previous depth)
|
|
218
|
-
// This ensures your new geometry passes depth test regardless of prior depth values
|
|
219
|
-
gl.activeTexture(gl.TEXTURE0);
|
|
220
|
-
gl.bindTexture(gl.TEXTURE_2D_ARRAY, this.texture);
|
|
221
|
-
gl.uniform1i(this.locations.uniforms.u_demTexture, 0); // texture unit 0
|
|
222
|
-
// bind VAO and draw
|
|
223
|
-
gl.bindVertexArray(vao);
|
|
224
|
-
// bind UBO for style
|
|
225
|
-
ubo.bind();
|
|
226
|
-
drawOnTopBegin(gl);
|
|
227
|
-
drawArrays(gl, gl.POINTS, drawOptions);
|
|
228
|
-
drawOnTopEnd(gl);
|
|
229
|
-
gl.bindVertexArray(null);
|
|
230
|
-
gl.bindTexture(gl.TEXTURE_2D_ARRAY, null);
|
|
231
|
-
gl.useProgram(null);
|
|
232
|
-
ubo.unbind();
|
|
233
|
-
this.cameraUniformBlock.unbind(uniformBindingPoints.camera);
|
|
234
|
-
}
|
|
235
|
-
_getUniformBlockOffset(name) {
|
|
236
|
-
// hardcoded offsets based on std140 layout rules
|
|
237
|
-
const offsets = {
|
|
238
|
-
'u_color': 0,
|
|
239
|
-
};
|
|
240
|
-
const result = offsets[name];
|
|
241
|
-
if (result === undefined) {
|
|
242
|
-
throw new Error(`Unknown uniform block member: ${name}, names are: ${Object.keys(offsets).join(", ")}`);
|
|
243
|
-
}
|
|
244
|
-
return result;
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
function drawOnTopBegin(gl) {
|
|
248
|
-
gl.disable(gl.DEPTH_TEST);
|
|
249
|
-
// gl.enable(gl.POLYGON_OFFSET_FILL);
|
|
250
|
-
// // Use an offset to "nudge" the depth value slightly closer or farther.
|
|
251
|
-
// // Common values are gl.polygonOffset(1.0, 1.0) or gl.polygonOffset(0.RESOLUTION, 0.RESOLUTION)
|
|
252
|
-
// gl.polygonOffset(1.0, 1.0);
|
|
253
|
-
// gl.depthRange(0.0, 0.0001); // Use near 0.01% of depth range
|
|
254
|
-
// gl.enable(gl.POLYGON_OFFSET_FILL);
|
|
255
|
-
// You will need to experiment with these values!
|
|
256
|
-
// A good starting point is -1.0, -1.0.
|
|
257
|
-
// Negative values "pull" the fragments closer to the camera.
|
|
258
|
-
// gl.polygonOffset(-1.0, -1.0);
|
|
259
|
-
// gl.enable(gl.POLYGON_OFFSET_FILL);
|
|
260
|
-
// gl.polygonOffset(-1.0, -2.0);
|
|
261
|
-
}
|
|
262
|
-
function drawOnTopEnd(gl) {
|
|
263
|
-
gl.enable(gl.DEPTH_TEST);
|
|
264
|
-
// gl.disable(gl.POLYGON_OFFSET_FILL);
|
|
265
|
-
// gl.disable(gl.POLYGON_OFFSET_FILL);
|
|
266
|
-
// gl.depthRange(0.0, 1.0); // Restore full depth range
|
|
267
|
-
// gl.disable(gl.POLYGON_OFFSET_FILL);
|
|
268
|
-
}
|