@openglobus/og 1.0.0-rc35 → 1.0.0-rc36
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/lib/Globe.d.ts +1 -0
- package/lib/assets/RasterWorker.worker-BLX-1P4n.js.map +1 -0
- package/lib/assets/RgbTerrainWorker.worker-Bxbv73rB.js.map +1 -0
- package/lib/assets/TerrainWorker.worker-DIGKd23M.js.map +1 -1
- package/lib/camera/Camera.d.ts +1 -1
- package/lib/camera/PlanetCamera.d.ts +9 -0
- package/lib/control/PoweredBy.d.ts +15 -0
- package/lib/control/TouchNavigation.d.ts +1 -0
- package/lib/control/depthCamera/DepthCamera.d.ts +1 -0
- package/lib/control/entityEditor/ProjectorEditorView.d.ts +2 -0
- package/lib/control/index.d.ts +1 -0
- package/lib/index.d.ts +3 -3
- package/lib/layer/GeoTIFFLayer.d.ts +0 -7
- package/lib/layer/geotiff/GeoTIFFReader.d.ts +17 -1
- package/lib/layer/geotiff/warp.d.ts +25 -0
- package/lib/og.css +1 -1
- package/lib/og.es.js +1 -1
- package/lib/og.es.js.map +1 -1
- package/lib/renderer/Renderer.d.ts +2 -0
- package/lib/renderer/projectors/Projector.d.ts +49 -3
- package/lib/renderer/projectors/ProjectorManager.d.ts +88 -5
- package/lib/segment/Segment.d.ts +1 -0
- package/lib/shaders/common/uniforms.d.ts +7 -0
- package/lib/terrain/EmptyTerrain.d.ts +16 -1
- package/lib/terrain/GeoTiffTerrain.d.ts +46 -0
- package/lib/terrain/GlobusTerrain.d.ts +2 -1
- package/lib/terrain/ProceduralTerrain.d.ts +49 -12
- package/lib/terrain/RgbTerrain.d.ts +6 -1
- package/lib/terrain/index.d.ts +5 -3
- package/lib/terrain/terrainUtils.d.ts +46 -0
- package/lib/utils/LRUCache.d.ts +39 -0
- package/lib/utils/RasterWorker.d.ts +36 -0
- package/lib/utils/RasterWorker.worker.d.ts +1 -0
- package/package.json +4 -4
- package/lib/assets/RgbTerrainWorker.worker-BL6dQGZ3.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TerrainWorker.worker-DIGKd23M.js","names":["_around","Uint8Array","compareNeighbours","pixels","around","a","b","ha","hb","_deviations","Float32Array","sampleSubGrid","grid","size","row0","col0","cells","gridSize","out","outOffset","peaks","noDataHeight","NaN","gs","outGs","step","i","src","dst","j","half","inner","rowStart","cols","isPeak","offset","scale","pr0","Math","max","ceil","pr1","min","floor","pc0","pc1","length","fill","pr","p","end","hi","m","y","ci","fy","top","bottom","vertexRow","x","cj","fx","k","h00","h01","h10","h11","surface","h","deviation","v","abs","keepPeaks","getMeshHeights","elevations","fileGridSize","last","r","row","Int32Array","count","c","findPeaks","checkNoDataValue","noDataValues","value","arr","start","binarySearchFast","Vec3","z","this","doubleToTwoFloats","high","low","doubleHigh","fround","prototype","sub","add","cross","normalize","sqrt","distance","blerp","fQ11","fQ21","fQ12","fQ22","_tempVec","_rtcTempVec","_tempHigh","_tempLow","_meshHeights","self","onmessage","e","data","this_plainVertices","this_plainNormals","this_normalMapVertices","this_normalMapNormals","heightFactor","id","rtc_x","relativeCenter","rtc_y","rtc_z","xmin","xmax","ymin","ymax","zmin","zmax","r2min","Infinity","r2max","fileGridSize_one","fileGridSize_one_x2","tgs","dg","hf","normalMapNormals","normalMapVertices","vInd","noDataInd","gsgs3","terrainVertices","Float64Array","terrainVerticesHigh","terrainVerticesLow","noDataVertices","nv","nn","meshHeights","hInd0","vInd0","currElv","h0","v0","currVert","nextVert","nextElv","eps","mv","meshElv","mh","r2_v0","rtc_v0","hInd1","vInd1","elv","h1","v1","hInd2","vInd2","h2","v2","hInd3","vInd3","h3","v3","e10","e20","e30","sw","ne","n0","oneSize","gsgs","fgsOne","ii","ij","qii","qij","hlt_ind","hrt_ind","hlb_ind","hrb_ind","h_lt","h_rt","h_lb","h_rb","i3","r2_tmp","set","v0ind","v1ind","v2ind","v3ind","postMessage","bounds","radiusRange","buffer","t","e","n","r","o","a","l","y","u","z","s","f","x","M","c","w","d","m","v","p","A","b","g","F","V","N","q","C","U","h","_","S","k","D","I","i","P","H","j","B","E","G","J","K","O","Q","T","W","X","Y","Z","$","tt","et","rt","at","nt","ot","lt","it","st","ft","ht","yt","ut","zt","xt","Mt","ct","wt","dt","mt","vt","pt","At","bt"],"sources":["../../src/terrain/terrainUtils.ts","../../src/utils/TerrainWorker.worker.js"],"sourcesContent":["import type { TypedArray } from \"../utils/shared\";\nimport type { Extent } from \"../Extent\";\n\nexport const RGB_ENCODING_CUSTOM = -1;\nexport const RGB_ENCODING_RGB = 0;\nexport const RGB_ENCODING_TERRARIUM = 1;\n\n/** Segment grid sizes by zoom of the elevation terrains. */\nexport const TERRAIN_GRID_SIZE_BY_ZOOM = [\n 64, 32, 16, 8, 8, 8, 16, 16, 16, 32, 32, 32, 32, 32, 32, 64, 64, 64, 32, 32, 16, 8\n];\n\n/** Writes a row of pixel heights, NaN for no data pixels. */\nexport type DecodeHeightsRowFunc = (row: number, outHeights: Float32Array) => void;\n\nexport interface IRgbDecodeParams {\n encoding: number;\n minHeight: number;\n resolution: number;\n heightFactor: number;\n noDataValues: number[] | TypedArray;\n parentData: number[] | TypedArray | null;\n parentOffsetX: number;\n parentOffsetY: number;\n parentZoomDiff: number;\n skipPositiveHeights: boolean;\n}\n\nexport interface IRgbHeightsParams {\n decode: IRgbDecodeParams;\n size: number;\n gridSize: number;\n levels: number;\n noDataHeight: number;\n}\n\n/**\n * Returns pixel grid cells for the image size, 2^n and (2^n + 1) sizes only.\n * @param {number} size - Image size.\n * @returns {number} -\n */\nexport function getGridCells(size: number): number {\n return (size & (size - 1)) === 0 ? size : size - 1;\n}\n\n/**\n * Returns vertex grid cells for the image size. 2^n images have vertices at the pixel centers and corners,\n * (2^n + 1) images are the grid itself.\n * @param {number} size - Image size.\n * @returns {number} -\n */\nexport function getVertexGridCells(size: number): number {\n let cells = getGridCells(size);\n return cells === size ? cells * 2 : cells;\n}\n\n/**\n * Returns subdivision levels of the image tile. Native zoom levels are not finer than the image pixels,\n * finer data comes with their own tiles. Levels above the native zooms go down to the vertex grid.\n * @param {number} size - Image size.\n * @param {number} gridSize - Tile grid size.\n * @param {number} tileZoom - Image tile zoom.\n * @param {number} maxZoom - Maximal terrain zoom.\n * @param {number} maxNativeZoom - Maximal zoom of the terrain tiles.\n * @returns {number} -\n */\nexport function getSubdivisionLevels(\n size: number,\n gridSize: number,\n tileZoom: number,\n maxZoom: number,\n maxNativeZoom: number\n): number {\n let pixelCells = getGridCells(size),\n vertexCells = getVertexGridCells(size),\n levels = 0;\n\n for (let k = 1; tileZoom + k <= maxZoom; k++) {\n if ((tileZoom + k > maxNativeZoom ? vertexCells : pixelCells) >> k < gridSize) {\n break;\n }\n levels = k;\n }\n\n return levels;\n}\n\nfunction isNoDataValue(noDataValues: number[] | TypedArray, ndMin: number, ndMax: number, h: number): boolean {\n if (h > 50000) {\n return true;\n }\n if (h <= ndMin || h >= ndMax) {\n return false;\n }\n let start = 0,\n end = noDataValues.length - 1;\n while (start <= end) {\n let k = (start + end) >> 1;\n if (Math.abs(noDataValues[k] - h) < 1e-3) {\n return true;\n } else if (noDataValues[k] < h) {\n start = k + 1;\n } else {\n end = k - 1;\n }\n }\n return false;\n}\n\nexport function getParentHeight(\n oneByDz2: number,\n offsetX: number,\n offsetY: number,\n heights: TypedArray | number[],\n i: number,\n j: number,\n skipPositiveHeights?: boolean\n) {\n let parentGridSize = Math.sqrt(heights.length);\n let pi = Math.floor(offsetY * oneByDz2 * parentGridSize + i * oneByDz2),\n pj = Math.floor(offsetX * oneByDz2 * parentGridSize + j * oneByDz2);\n let h = heights[pi * parentGridSize + pj];\n return skipPositiveHeights ? (h > 0 ? 0 : h) : h;\n}\n\n/**\n * Decodes \"rgb\" or \"terrarium\" encoded pixel row heights.\n * @param {number[] | TypedArray} rgbaData - Image RGBA data.\n * @param {number} row - Pixel row.\n * @param {number} size - Image size.\n * @param {number} parentScale - Parent grid cells by image grid cells.\n * @param {IRgbDecodeParams} p - Decode parameters.\n * @param {Float32Array} outHeights - Row heights.\n * @param {number} noDataHeight - Height for no data pixels.\n */\nexport function decodeRgbHeightsRow(\n rgbaData: number[] | TypedArray,\n row: number,\n size: number,\n parentScale: number,\n p: IRgbDecodeParams,\n outHeights: Float32Array,\n noDataHeight: number\n) {\n let ndv = p.noDataValues,\n ndMin = ndv.length ? ndv[0] - 1e-3 : 0,\n ndMax = ndv.length ? ndv[ndv.length - 1] + 1e-3 : 0;\n\n let isTerrarium = p.encoding === RGB_ENCODING_TERRARIUM,\n minHeight = p.minHeight,\n resolution = p.resolution,\n heightFactor = p.heightFactor,\n parentData = p.parentData;\n\n let pi = Math.floor(row * parentScale);\n\n for (let j = 0, k4 = row * size * 4; j < size; j++, k4 += 4) {\n let r = rgbaData[k4],\n g = rgbaData[k4 + 1],\n b = rgbaData[k4 + 2];\n\n let height = isTerrarium\n ? r * 256 + g + b / 256 - 32768\n : r === 255\n ? minHeight\n : minHeight + resolution * (r * 65536 + g * 256 + b);\n\n height *= heightFactor;\n\n let isNoData = isNoDataValue(ndv, ndMin, ndMax, height);\n\n if ((isNoData || height === 0) && parentData) {\n height = getParentHeight(\n p.parentZoomDiff,\n p.parentOffsetX,\n p.parentOffsetY,\n parentData,\n pi,\n Math.floor(j * parentScale),\n p.skipPositiveHeights\n );\n isNoData = isNoDataValue(ndv, ndMin, ndMax, height);\n }\n\n outHeights[j] = isNoData ? noDataHeight : height;\n }\n}\n\n/**\n * Returns the height at the tile edge, extrapolated from the edge pixel p0 inwards through p1 and p2.\n * The slope is limited (minmod), so peaks, pits and slope breaks at the edge are not overshot.\n * @param {number} p0 - Edge pixel height.\n * @param {number} p1 - Next pixel height.\n * @param {number} p2 - Pixel height after the next.\n * @returns {number} -\n */\nexport function getEdgeHeight(p0: number, p1: number, p2: number): number {\n let s0 = p0 - p1,\n s1 = p1 - p2;\n return p0 + 0.5 * (s0 * s1 <= 0 ? 0 : Math.abs(s0) < Math.abs(s1) ? s0 : s1);\n}\n\n/**\n * Returns the ground height at the point of the tile heights grid, on the grid triangles as they are rendered.\n * @param {number} x - Point x in the tile extent projection.\n * @param {number} y - Point y in the tile extent projection.\n * @param {Extent} extent - Tile extent.\n * @param {number[] | TypedArray} heights - Tile heights grid, rows from north to south.\n * @returns {number} -\n */\nexport function getGroundHeight(x: number, y: number, extent: Extent, heights: number[] | TypedArray): number {\n let gs = Math.sqrt(heights.length),\n cells = gs - 1,\n col = ((x - extent.southWest.lon) / extent.getWidth()) * cells,\n row = ((extent.northEast.lat - y) / extent.getHeight()) * cells,\n j = Math.min(Math.max(Math.floor(col), 0), cells - 1),\n i = Math.min(Math.max(Math.floor(row), 0), cells - 1),\n fx = col - j,\n fy = 1 - (row - i);\n\n /*\n v2-----------v3\n | \\ |\n | \\ |\n | \\ |\n v0-----------v1\n */\n let k = i * gs + j,\n h2 = heights[k],\n h3 = heights[k + 1],\n h0 = heights[k + gs],\n h1 = heights[k + gs + 1];\n\n return fx + fy <= 1 ? h0 + fx * (h1 - h0) + fy * (h2 - h0) : h3 + (1 - fx) * (h2 - h3) + (1 - fy) * (h1 - h3);\n}\n\n/**\n * Writes the pixel row heights at the vertex columns: the edges, the pixel corners and, with half pixel steps,\n * the pixel centers.\n */\nfunction interpolateRow(pixels: Float32Array, offset: number, size: number, halfSteps: number, out: Float32Array) {\n let last = offset + size - 1;\n\n out[0] = getEdgeHeight(pixels[offset], pixels[Math.min(offset + 1, last)], pixels[Math.min(offset + 2, last)]);\n\n out[(size * 2) / halfSteps] = getEdgeHeight(\n pixels[last],\n pixels[Math.max(last - 1, offset)],\n pixels[Math.max(last - 2, offset)]\n );\n\n if (halfSteps === 1) {\n let prev = pixels[offset];\n out[1] = prev;\n for (let k = 1; k < size; k++) {\n let h = pixels[offset + k];\n out[k * 2] = 0.5 * (prev + h);\n out[k * 2 + 1] = h;\n prev = h;\n }\n } else {\n for (let k = 1; k < size; k++) {\n out[k] = 0.5 * (pixels[offset + k - 1] + pixels[offset + k]);\n }\n }\n}\n\n/**\n * Converts size x size pixel heights to the vertex grid in the pixel corners, (size + 1) x (size + 1),\n * or in the pixel centers and corners, (2 * size + 1) x (2 * size + 1). Pixel center vertices keep the pixel heights.\n * @param {Float32Array} pixels - Pixel heights, NaN for no data.\n * @param {number} size - Image size.\n * @param {number} noDataHeight - Height for vertices without data around.\n * @param {boolean} [pixelCenters=true] - Vertices at the pixel centers too.\n * @returns {Float32Array} -\n */\nexport function createVertexGrid(\n pixels: Float32Array,\n size: number,\n noDataHeight: number,\n pixelCenters: boolean = true\n): Float32Array {\n let halfSteps = pixelCenters ? 1 : 2,\n gs = (size * 2) / halfSteps + 1,\n last = size - 1;\n\n // Heights at the vertex columns of the last three pixel rows, pixel row r is kept at (r % 3)\n let columns = new Float32Array(gs * 3),\n rowColumns = [columns.subarray(0, gs), columns.subarray(gs, gs * 2), columns.subarray(gs * 2)],\n lastRow = -1;\n\n let out = new Float32Array(gs * gs);\n\n for (let vi = 0; vi < gs; vi++) {\n let u = vi * halfSteps,\n k = u >> 1,\n dst = vi * gs;\n\n let needRow = u === 0 ? Math.min(2, last) : Math.min(k, last);\n\n while (lastRow < needRow) {\n lastRow++;\n interpolateRow(pixels, lastRow * size, size, halfSteps, rowColumns[lastRow % 3]);\n }\n\n if (u & 1) {\n out.set(rowColumns[k % 3], dst);\n } else if (k === 0 || k === size) {\n let c0 = rowColumns[(k === 0 ? 0 : last) % 3],\n c1 = rowColumns[(k === 0 ? Math.min(1, last) : Math.max(last - 1, 0)) % 3],\n c2 = rowColumns[(k === 0 ? Math.min(2, last) : Math.max(last - 2, 0)) % 3];\n\n for (let vj = 0; vj < gs; vj++) {\n out[dst + vj] = getEdgeHeight(c0[vj], c1[vj], c2[vj]);\n }\n } else {\n let c0 = rowColumns[(k - 1) % 3],\n c1 = rowColumns[k % 3];\n\n for (let vj = 0; vj < gs; vj++) {\n out[dst + vj] = 0.5 * (c0[vj] + c1[vj]);\n }\n }\n\n for (let vj = 0; vj < gs; vj++) {\n if (out[dst + vj] !== out[dst + vj]) {\n out[dst + vj] = averagePixels(pixels, size, u, vj * halfSteps, noDataHeight);\n }\n }\n }\n\n return out;\n}\n\nfunction averagePixels(pixels: Float32Array, size: number, ui: number, uj: number, noDataHeight: number): number {\n let last = size - 1,\n ki = ui >> 1,\n kj = uj >> 1,\n sum = 0,\n count = 0;\n\n for (let i = Math.max(ki - 1, 0), i1 = Math.min(ki + (ui & 1), last); i <= i1; i++) {\n for (let j = Math.max(kj - 1, 0), j1 = Math.min(kj + (uj & 1), last); j <= j1; j++) {\n let h = pixels[i * size + j];\n if (h === h) {\n sum += h;\n count++;\n }\n }\n }\n\n return count ? sum / count : noDataHeight;\n}\n\n/** Peak and pit pixels, and their place in the vertex grid. */\nexport interface IGridPeaks {\n pixels: Float32Array;\n size: number;\n /** Peaks by pixel rows, columns of row r are cols[rowStart[r]] ... cols[rowStart[r + 1] - 1]. */\n rowStart: Int32Array;\n cols: Int32Array;\n /** 1 for peaks, 0 for pits. */\n isPeak: Uint8Array;\n /** Pixel p is at (p + offset) * scale vertex. */\n offset: number;\n scale: number;\n}\n\nconst HIGHER_AROUND = 1,\n LOWER_AROUND = 2;\n\nlet _around = new Uint8Array(0);\n\n/** Marks pixels a and b with the neighbour higher or lower flags, NaN pixels are not compared. */\nfunction compareNeighbours(pixels: Float32Array, around: Uint8Array, a: number, b: number) {\n let ha = pixels[a],\n hb = pixels[b];\n\n if (hb > ha) {\n around[a] |= HIGHER_AROUND;\n around[b] |= LOWER_AROUND;\n } else if (hb < ha) {\n around[a] |= LOWER_AROUND;\n around[b] |= HIGHER_AROUND;\n }\n}\n\n/**\n * Finds the pixels that are not lower (peaks) or not higher (pits) than the pixels around,\n * and differ from at least one of them.\n * @param {Float32Array} pixels - Pixel heights, NaN for no data.\n * @param {number} size - Image size.\n * @param {number} offset - Pixel p is at (p + offset) * scale vertex of the grid.\n * @param {number} scale - Grid vertices by pixel.\n * @returns {IGridPeaks} -\n */\nexport function findPeaks(pixels: Float32Array, size: number, offset: number, scale: number): IGridPeaks {\n let last = size - 1,\n length = size * size;\n\n if (_around.length < length) {\n _around = new Uint8Array(length);\n } else {\n _around.fill(0, 0, length);\n }\n\n let around = _around;\n\n // Every neighbour pair is compared once, in 2x2 squares a b / c d: a-b, a-c, a-d and b-c\n for (let r = 0; r < last; r++) {\n let row = r * size;\n for (let k = row, end = row + last; k < end; k++) {\n compareNeighbours(pixels, around, k, k + 1);\n compareNeighbours(pixels, around, k, k + size);\n compareNeighbours(pixels, around, k, k + size + 1);\n compareNeighbours(pixels, around, k + 1, k + size);\n }\n compareNeighbours(pixels, around, row + last, row + last + size);\n }\n for (let k = last * size, end = k + last; k < end; k++) {\n compareNeighbours(pixels, around, k, k + 1);\n }\n\n let rowStart = new Int32Array(size + 1),\n count = 0;\n\n for (let k = 0; k < length; k++) {\n if (around[k] === HIGHER_AROUND || around[k] === LOWER_AROUND) {\n count++;\n }\n }\n\n let cols = new Int32Array(count),\n isPeak = new Uint8Array(count);\n\n count = 0;\n\n for (let r = 0; r < size; r++) {\n rowStart[r] = count;\n for (let c = 0, k = r * size; c < size; c++, k++) {\n if (around[k] === HIGHER_AROUND || around[k] === LOWER_AROUND) {\n cols[count] = c;\n isPeak[count] = around[k] === LOWER_AROUND ? 1 : 0;\n count++;\n }\n }\n }\n\n rowStart[size] = count;\n\n return { pixels, size, rowStart, cols, isPeak, offset, scale };\n}\n\n// Peak deviations of the sampled grid vertices, reused\nlet _deviations = new Float32Array(0);\n\n/**\n * Takes (gridSize + 1) x (gridSize + 1) vertices of the cells x cells square starting at\n * the row0, col0 vertex of the (size + 1) x (size + 1) grid. Cells must be gridSize multiplied by a power of two.\n *\n * With peaks, peaks and pits are moved to the nearest inner vertices, slopes and edge vertices stay sampled.\n */\nexport function sampleSubGrid(\n grid: Float32Array,\n size: number,\n row0: number,\n col0: number,\n cells: number,\n gridSize: number,\n out: Float32Array = new Float32Array((gridSize + 1) * (gridSize + 1)),\n outOffset: number = 0,\n peaks: IGridPeaks | null = null,\n noDataHeight: number = NaN\n): Float32Array {\n let gs = size + 1,\n outGs = gridSize + 1,\n step = cells / gridSize;\n\n for (let i = 0; i < outGs; i++) {\n let src = (row0 + i * step) * gs + col0,\n dst = outOffset + i * outGs;\n for (let j = 0; j < outGs; j++) {\n out[dst + j] = grid[src + j * step];\n }\n }\n\n if (peaks && step > 1 && gridSize > 1) {\n keepPeaks(grid, gs, row0, col0, cells, gridSize, out, outOffset, peaks, noDataHeight);\n }\n\n return out;\n}\n\nfunction keepPeaks(\n grid: Float32Array,\n gs: number,\n row0: number,\n col0: number,\n cells: number,\n gridSize: number,\n out: Float32Array,\n outOffset: number,\n peaks: IGridPeaks,\n noDataHeight: number\n) {\n let outGs = gridSize + 1,\n step = cells / gridSize,\n half = step >> 1,\n inner = gridSize - 1,\n { pixels, size, rowStart, cols, isPeak, offset, scale } = peaks;\n\n // Pixels in the square\n let pr0 = Math.max(Math.ceil(row0 / scale - offset), 0),\n pr1 = Math.min(Math.floor((row0 + cells) / scale - offset), size - 1),\n pc0 = Math.max(Math.ceil(col0 / scale - offset), 0),\n pc1 = Math.min(Math.floor((col0 + cells) / scale - offset), size - 1);\n\n if (_deviations.length < outGs * outGs) {\n _deviations = new Float32Array(outGs * outGs);\n }\n\n _deviations.fill(0, 0, outGs * outGs);\n\n for (let pr = pr0; pr <= pr1; pr++) {\n let p = rowStart[pr],\n end = rowStart[pr + 1];\n\n for (let hi = end; p < hi;) {\n let m = (p + hi) >> 1;\n if (cols[m] < pc0) {\n p = m + 1;\n } else {\n hi = m;\n }\n }\n\n if (p === end || cols[p] > pc1) {\n continue;\n }\n\n let y = (pr + offset) * scale - row0,\n ci = Math.min(Math.floor(y / step), inner),\n fy = y / step - ci,\n i = Math.min(Math.max(Math.floor((y + half) / step), 1), inner),\n top = (row0 + ci * step) * gs + col0,\n bottom = top + step * gs,\n vertexRow = (row0 + i * step) * gs + col0;\n\n for (; p < end && cols[p] <= pc1; p++) {\n let x = (cols[p] + offset) * scale - col0,\n cj = Math.min(Math.floor(x / step), inner),\n fx = x / step - cj,\n k = cj * step;\n\n let h00 = grid[top + k],\n h01 = grid[top + k + step],\n h10 = grid[bottom + k],\n h11 = grid[bottom + k + step];\n\n if (h00 === noDataHeight || h01 === noDataHeight || h10 === noDataHeight || h11 === noDataHeight) {\n continue;\n }\n\n let surface = (1 - fy) * ((1 - fx) * h00 + fx * h01) + fy * ((1 - fx) * h10 + fx * h11),\n h = pixels[pr * size + cols[p]],\n deviation = isPeak[p] ? h - surface : surface - h;\n\n if (deviation <= 0 || h === noDataHeight) {\n continue;\n }\n\n let j = Math.min(Math.max(Math.floor((x + half) / step), 1), inner),\n v = i * outGs + j;\n\n if (deviation > _deviations[v] && deviation > Math.abs(surface - grid[vertexRow + j * step])) {\n _deviations[v] = deviation;\n out[outOffset + v] = h;\n }\n }\n }\n}\n\n/**\n * Returns (gridSize + 1) x (gridSize + 1) mesh heights of (fileGridSize + 1) x (fileGridSize + 1) elevations,\n * their peaks and pits are moved to the nearest mesh vertices.\n * @param {Float32Array} elevations - Elevations grid, rows from north to south.\n * @param {number} fileGridSize - Elevations grid size.\n * @param {number} gridSize - Mesh grid size, fileGridSize divided by a power of two.\n * @param {number} noDataHeight - Height of no data elevations.\n * @param {Float32Array} [out] - Mesh heights.\n * @returns {Float32Array} -\n */\nexport function getMeshHeights(\n elevations: Float32Array,\n fileGridSize: number,\n gridSize: number,\n noDataHeight: number,\n out: Float32Array = new Float32Array((gridSize + 1) * (gridSize + 1))\n): Float32Array {\n return sampleSubGrid(\n elevations,\n fileGridSize,\n 0,\n 0,\n fileGridSize,\n gridSize,\n out,\n 0,\n findPeaks(elevations, fileGridSize + 1, 0, 1),\n noDataHeight\n );\n}\n\n/**\n * Creates the tile heights grid and its subdivision levels, each tile is (gridSize + 1) x (gridSize + 1).\n * Output order is the tile itself, then 2x2 tiles of the first level, 4x4 of the second and so on, row by row.\n * Peaks and pits of the pixels stay in all the levels.\n * @param {number} size - Image size, 2^n or (2^n + 1).\n * @param {number} gridSize - Tile grid size.\n * @param {number} levels - Subdivision levels.\n * @param {DecodeHeightsRowFunc} decodeRow - Decodes pixel row heights, NaN for no data.\n * @param {number} noDataHeight - Height for vertices without data.\n * @returns {Float32Array} -\n */\nexport function createHeightsLevels(\n size: number,\n gridSize: number,\n levels: number,\n decodeRow: DecodeHeightsRowFunc,\n noDataHeight: number\n): Float32Array {\n let pixels = new Float32Array(size * size);\n\n for (let row = 0; row < size; row++) {\n decodeRow(row, pixels.subarray(row * size, (row + 1) * size));\n }\n\n let grid: Float32Array, cells: number, peaks: IGridPeaks;\n\n if (getGridCells(size) === size) {\n // Vertices at the pixel centers are needed when the last level is finer than the pixels\n let pixelCenters = size >> levels < gridSize;\n grid = createVertexGrid(pixels, size, noDataHeight, pixelCenters);\n cells = pixelCenters ? size * 2 : size;\n peaks = findPeaks(pixels, size, 0.5, cells / size);\n } else {\n peaks = findPeaks(pixels, size, 0, 1);\n for (let k = 0; k < pixels.length; k++) {\n if (pixels[k] !== pixels[k]) {\n pixels[k] = noDataHeight;\n }\n }\n grid = pixels;\n cells = size - 1;\n }\n\n let tileLength = (gridSize + 1) * (gridSize + 1),\n tilesCount = 0;\n\n for (let k = 0; k <= levels; k++) {\n tilesCount += 1 << (2 * k);\n }\n\n let out = new Float32Array(tilesCount * tileLength);\n\n for (let k = 0, c = cells, offset = 0; k <= levels; k++, c >>= 1) {\n let d = 1 << k;\n for (let i = 0; i < d; i++) {\n for (let j = 0; j < d; j++) {\n sampleSubGrid(grid, cells, i * c, j * c, c, gridSize, out, offset, peaks, noDataHeight);\n offset += tileLength;\n }\n }\n }\n\n return out;\n}\n","\"use strict\";\n//\n//Terrain worker\n//\nimport { getMeshHeights } from \"../terrain/terrainUtils\";\n\nfunction binarySearchFast(arr, x) {\n let start = 0,\n end = arr.length - 1;\n while (start <= end) {\n let k = Math.floor((start + end) * 0.5);\n if (Math.abs(arr[k] - x) < 1e-3) return k;\n else if (arr[k] < x) start = k + 1;\n else end = k - 1;\n }\n return -1;\n}\n\nfunction checkNoDataValue(noDataValues, value) {\n return binarySearchFast(noDataValues, value) !== -1;\n}\n\nvar Vec3 = function (x, y, z) {\n this.x = x;\n this.y = y;\n this.z = z;\n};\n\nvar doubleToTwoFloats = function (v, high, low) {\n let x = v.x,\n y = v.y,\n z = v.z;\n\n var doubleHigh;\n\n if (x >= 0.0) {\n doubleHigh = Math.floor(x / 65536.0) * 65536.0;\n high.x = Math.fround(doubleHigh);\n low.x = Math.fround(x - doubleHigh);\n } else {\n doubleHigh = Math.floor(-x / 65536.0) * 65536.0;\n high.x = Math.fround(-doubleHigh);\n low.x = Math.fround(x + doubleHigh);\n }\n\n if (y >= 0.0) {\n doubleHigh = Math.floor(y / 65536.0) * 65536.0;\n high.y = Math.fround(doubleHigh);\n low.y = Math.fround(y - doubleHigh);\n } else {\n doubleHigh = Math.floor(-y / 65536.0) * 65536.0;\n high.y = Math.fround(-doubleHigh);\n low.y = Math.fround(y + doubleHigh);\n }\n\n if (z >= 0.0) {\n doubleHigh = Math.floor(z / 65536.0) * 65536.0;\n high.z = Math.fround(doubleHigh);\n low.z = Math.fround(z - doubleHigh);\n } else {\n doubleHigh = Math.floor(-z / 65536.0) * 65536.0;\n high.z = Math.fround(-doubleHigh);\n low.z = Math.fround(z + doubleHigh);\n }\n};\n\nVec3.prototype.sub = function (v) {\n return new Vec3(this.x - v.x, this.y - v.y, this.z - v.z);\n};\n\nVec3.prototype.add = function (v) {\n return new Vec3(this.x + v.x, this.y + v.y, this.z + v.z);\n};\n\nVec3.prototype.cross = function (v) {\n return new Vec3(this.y * v.z - this.z * v.y, this.z * v.x - this.x * v.z, this.x * v.y - this.y * v.x);\n};\n\nVec3.prototype.normalize = function () {\n var x = this.x,\n y = this.y,\n z = this.z;\n var length = 1.0 / Math.sqrt(x * x + y * y + z * z);\n this.x = x * length;\n this.y = y * length;\n this.z = z * length;\n return this;\n};\n\nVec3.prototype.distance = function (v) {\n return this.sub(v).length();\n};\n\nVec3.prototype.length = function () {\n return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);\n};\n\nvar blerp = function (x, y, fQ11, fQ21, fQ12, fQ22) {\n return fQ11 * (1.0 - x) * (1.0 - y) + fQ21 * x * (1.0 - y) + fQ12 * (1.0 - x) * y + fQ22 * x * y;\n};\n\nvar _tempVec = new Vec3(0.0, 0.0, 0.0);\nvar _rtcTempVec = new Vec3(0.0, 0.0, 0.0);\n\nvar _tempHigh = new Vec3(0.0, 0.0, 0.0),\n _tempLow = new Vec3(0.0, 0.0, 0.0);\n\nvar _meshHeights = new Float32Array(0);\n\nself.onmessage = function (e) {\n var elevations = e.data.elevations,\n this_plainVertices = e.data.this_plainVertices,\n this_plainNormals = e.data.this_plainNormals,\n this_normalMapVertices = e.data.this_normalMapVertices,\n this_normalMapNormals = e.data.this_normalMapNormals,\n heightFactor = e.data.heightFactor,\n gridSize = e.data.gridSize,\n noDataValues = e.data.noDataValues,\n id = e.data.id;\n\n let rtc_x = e.data.relativeCenter[0],\n rtc_y = e.data.relativeCenter[1],\n rtc_z = e.data.relativeCenter[2];\n\n var xmin = 549755748352.0,\n xmax = -549755748352.0,\n ymin = 549755748352.0,\n ymax = -549755748352.0,\n zmin = 549755748352.0,\n zmax = -549755748352.0;\n\n // Squared geocentric distance of the same vertices. The axis aligned bounds above cannot tell\n // relief from segment size, because the box of a tilted patch is far larger than the patch, so\n // the radius range is accumulated here instead. Kept squared to avoid a root per vertex.\n var r2min = Infinity,\n r2max = -Infinity;\n\n const fileGridSize = Math.sqrt(elevations.length) - 1;\n\n const fileGridSize_one = fileGridSize + 1;\n const fileGridSize_one_x2 = fileGridSize_one * fileGridSize_one;\n const tgs = gridSize;\n const dg = fileGridSize / tgs;\n const gs = tgs + 1;\n const hf = heightFactor;\n\n var vInd = 0,\n noDataInd = 0;\n\n var gsgs3 = gs * gs * 3;\n\n var terrainVertices = new Float64Array(gsgs3),\n terrainVerticesHigh = new Float32Array(gsgs3),\n terrainVerticesLow = new Float32Array(gsgs3),\n noDataVertices = new Uint8Array(gs * gs);\n\n var normalMapNormals, normalMapVertices;\n\n var nv = this_normalMapVertices,\n nn = this_normalMapNormals;\n\n if (fileGridSize >= tgs) {\n normalMapNormals = new Float32Array(fileGridSize_one_x2 * 3);\n normalMapVertices = new Float64Array(fileGridSize_one_x2 * 3);\n\n // Mesh heights keep the elevations peaks and pits, moved to the nearest mesh vertices\n let meshHeights = null;\n if (dg > 1) {\n if (_meshHeights.length !== gs * gs) {\n _meshHeights = new Float32Array(gs * gs);\n }\n meshHeights = getMeshHeights(\n elevations,\n fileGridSize,\n tgs,\n noDataValues.length ? noDataValues[0] : NaN,\n _meshHeights\n );\n }\n\n for (let k = 0; k < fileGridSize_one_x2; k++) {\n var j = k % fileGridSize_one,\n i = ~~(k / fileGridSize_one);\n\n //\n // V0\n //\n var hInd0 = k;\n var vInd0 = hInd0 * 3;\n var currElv = elevations[hInd0];\n if (checkNoDataValue(noDataValues, currElv)) {\n currElv = 0.0;\n }\n var h0 = hf * currElv;\n var v0 = new Vec3(\n rtc_x + nv[vInd0] + h0 * nn[vInd0],\n rtc_y + nv[vInd0 + 1] + h0 * nn[vInd0 + 1],\n rtc_z + nv[vInd0 + 2] + h0 * nn[vInd0 + 2]\n );\n\n normalMapVertices[vInd0] = v0.x - rtc_x;\n normalMapVertices[vInd0 + 1] = v0.y - rtc_y;\n normalMapVertices[vInd0 + 2] = v0.z - rtc_z;\n\n //\n // The vertex goes into screen buffer\n if (i % dg === 0 && j % dg === 0) {\n let currVert = new Vec3(rtc_x + nv[vInd0], rtc_y + nv[vInd0 + 1], rtc_z + nv[vInd0 + 2]);\n let nextVert = new Vec3(rtc_x + nv[vInd0 + 3], rtc_y + nv[vInd0 + 4], rtc_z + nv[vInd0 + 5]);\n\n let nextElv = elevations[hInd0 + 1];\n if (checkNoDataValue(noDataValues, nextElv)) {\n nextElv = 0.0;\n }\n\n let eps = false;\n if (noDataValues.length === 0) {\n let step = currVert.distance(nextVert);\n let deltaElv = Math.abs(currElv - nextElv);\n eps = deltaElv / step > 10.0 || currElv < -5000;\n }\n\n let mv = v0;\n if (meshHeights) {\n let meshElv = meshHeights[(i / dg) * gs + j / dg];\n // Only the vertices a peak or pit is moved to\n if (meshElv !== elevations[hInd0] && !checkNoDataValue(noDataValues, meshElv)) {\n let mh = hf * meshElv;\n mv = new Vec3(\n rtc_x + nv[vInd0] + mh * nn[vInd0],\n rtc_y + nv[vInd0 + 1] + mh * nn[vInd0 + 1],\n rtc_z + nv[vInd0 + 2] + mh * nn[vInd0 + 2]\n );\n }\n }\n\n if (eps) {\n noDataVertices[noDataInd] = 1;\n } else {\n noDataVertices[noDataInd] = 0;\n if (mv.x < xmin) xmin = mv.x;\n if (mv.x > xmax) xmax = mv.x;\n if (mv.y < ymin) ymin = mv.y;\n if (mv.y > ymax) ymax = mv.y;\n if (mv.z < zmin) zmin = mv.z;\n if (mv.z > zmax) zmax = mv.z;\n\n let r2_v0 = mv.x * mv.x + mv.y * mv.y + mv.z * mv.z;\n if (r2_v0 < r2min) r2min = r2_v0;\n if (r2_v0 > r2max) r2max = r2_v0;\n }\n\n let rtc_v0 = new Vec3(mv.x - rtc_x, mv.y - rtc_y, mv.z - rtc_z);\n doubleToTwoFloats(rtc_v0, _tempHigh, _tempLow);\n\n terrainVerticesHigh[vInd] = _tempHigh.x;\n terrainVerticesLow[vInd] = _tempLow.x;\n terrainVertices[vInd++] = rtc_v0.x;\n\n terrainVerticesHigh[vInd] = _tempHigh.y;\n terrainVerticesLow[vInd] = _tempLow.y;\n terrainVertices[vInd++] = rtc_v0.y;\n\n terrainVerticesHigh[vInd] = _tempHigh.z;\n terrainVerticesLow[vInd] = _tempLow.z;\n terrainVertices[vInd++] = rtc_v0.z;\n\n noDataInd++;\n }\n\n if (i !== fileGridSize && j !== fileGridSize) {\n //\n // V1\n //\n var hInd1 = k + 1;\n var vInd1 = hInd1 * 3;\n var elv = elevations[hInd1];\n if (checkNoDataValue(noDataValues, elv)) {\n elv = 0.0;\n }\n var h1 = hf * elv;\n var v1 = new Vec3(\n rtc_x + nv[vInd1] + h1 * nn[vInd1],\n rtc_y + nv[vInd1 + 1] + h1 * nn[vInd1 + 1],\n rtc_z + nv[vInd1 + 2] + h1 * nn[vInd1 + 2]\n );\n\n normalMapVertices[vInd1] = v1.x - rtc_x;\n normalMapVertices[vInd1 + 1] = v1.y - rtc_y;\n normalMapVertices[vInd1 + 2] = v1.z - rtc_z;\n\n //\n // V2\n //\n var hInd2 = k + fileGridSize_one;\n var vInd2 = hInd2 * 3;\n elv = elevations[hInd2];\n if (checkNoDataValue(noDataValues, elv)) {\n elv = 0.0;\n }\n var h2 = hf * elv;\n var v2 = new Vec3(\n rtc_x + nv[vInd2] + h2 * nn[vInd2],\n rtc_y + nv[vInd2 + 1] + h2 * nn[vInd2 + 1],\n rtc_z + nv[vInd2 + 2] + h2 * nn[vInd2 + 2]\n );\n\n normalMapVertices[vInd2] = v2.x - rtc_x;\n normalMapVertices[vInd2 + 1] = v2.y - rtc_y;\n normalMapVertices[vInd2 + 2] = v2.z - rtc_z;\n\n //\n // V3\n //\n var hInd3 = k + fileGridSize_one + 1;\n var vInd3 = hInd3 * 3;\n elv = elevations[hInd3];\n if (checkNoDataValue(noDataValues, elv)) {\n elv = 0.0;\n }\n var h3 = hf * elv;\n var v3 = new Vec3(\n rtc_x + nv[vInd3] + h3 * nn[vInd3],\n rtc_y + nv[vInd3 + 1] + h3 * nn[vInd3 + 1],\n rtc_z + nv[vInd3 + 2] + h3 * nn[vInd3 + 2]\n );\n\n normalMapVertices[vInd3] = v3.x - rtc_x;\n normalMapVertices[vInd3 + 1] = v3.y - rtc_y;\n normalMapVertices[vInd3 + 2] = v3.z - rtc_z;\n\n //\n // Normal\n //\n var e10 = v1.sub(v0),\n e20 = v2.sub(v0),\n e30 = v3.sub(v0);\n\n var sw = e20.cross(e30).normalize();\n var ne = e30.cross(e10).normalize();\n var n0 = ne.add(sw).normalize();\n\n normalMapNormals[vInd0] += n0.x;\n normalMapNormals[vInd0 + 1] += n0.y;\n normalMapNormals[vInd0 + 2] += n0.z;\n\n normalMapNormals[vInd1] += ne.x;\n normalMapNormals[vInd1 + 1] += ne.y;\n normalMapNormals[vInd1 + 2] += ne.z;\n\n normalMapNormals[vInd2] += sw.x;\n normalMapNormals[vInd2 + 1] += sw.y;\n normalMapNormals[vInd2 + 2] += sw.z;\n\n normalMapNormals[vInd3] += n0.x;\n normalMapNormals[vInd3 + 1] += n0.y;\n normalMapNormals[vInd3 + 2] += n0.z;\n }\n }\n } else {\n normalMapNormals = new Float32Array(gsgs3);\n normalMapVertices = new Float64Array(gsgs3);\n\n var oneSize = tgs / fileGridSize;\n var gsgs = gsgs3 / 3;\n var fgsOne = fileGridSize + 1;\n\n for (let i = 0; i < gsgs; i++) {\n let ii = Math.floor(i / gs),\n ij = i % gs;\n\n let qii = ii % oneSize,\n qij = ij % oneSize;\n\n let hlt_ind = Math.floor(ii / oneSize) * fgsOne + Math.floor(ij / oneSize);\n\n if (ij === tgs) {\n hlt_ind -= 1;\n qij = oneSize;\n }\n\n if (ii === tgs) {\n hlt_ind -= fgsOne;\n qii = oneSize;\n }\n\n let hrt_ind = hlt_ind + 1,\n hlb_ind = hlt_ind + fgsOne,\n hrb_ind = hlb_ind + 1;\n\n let h_lt = elevations[hlt_ind],\n h_rt = elevations[hrt_ind],\n h_lb = elevations[hlb_ind],\n h_rb = elevations[hrb_ind];\n\n if (checkNoDataValue(noDataValues, h_lt)) {\n h_lt = 0.0;\n }\n\n if (checkNoDataValue(noDataValues, h_rt)) {\n h_rt = 0.0;\n }\n\n if (checkNoDataValue(noDataValues, h_lb)) {\n h_lb = 0.0;\n }\n\n if (checkNoDataValue(noDataValues, h_rb)) {\n h_rb = 0.0;\n }\n\n let hi = blerp(qij / oneSize, qii / oneSize, h_lt, h_rt, h_lb, h_rb);\n\n let i3 = i * 3;\n\n _rtcTempVec.x = this_plainVertices[i3] + hi * this_plainNormals[i3];\n _rtcTempVec.y = this_plainVertices[i3 + 1] + hi * this_plainNormals[i3 + 1];\n _rtcTempVec.z = this_plainVertices[i3 + 2] + hi * this_plainNormals[i3 + 2];\n\n doubleToTwoFloats(_rtcTempVec, _tempHigh, _tempLow);\n\n terrainVertices[i3] = _rtcTempVec.x;\n terrainVertices[i3 + 1] = _rtcTempVec.y;\n terrainVertices[i3 + 2] = _rtcTempVec.z;\n\n terrainVerticesHigh[i3] = _tempHigh.x;\n terrainVerticesHigh[i3 + 1] = _tempHigh.y;\n terrainVerticesHigh[i3 + 2] = _tempHigh.z;\n\n terrainVerticesLow[i3] = _tempLow.x;\n terrainVerticesLow[i3 + 1] = _tempLow.y;\n terrainVerticesLow[i3 + 2] = _tempLow.z;\n\n _tempVec.x = _rtcTempVec.x + rtc_x;\n _tempVec.y = _rtcTempVec.y + rtc_y;\n _tempVec.z = _rtcTempVec.z + rtc_z;\n\n if (_tempVec.x < xmin) xmin = _tempVec.x;\n if (_tempVec.x > xmax) xmax = _tempVec.x;\n if (_tempVec.y < ymin) ymin = _tempVec.y;\n if (_tempVec.y > ymax) ymax = _tempVec.y;\n if (_tempVec.z < zmin) zmin = _tempVec.z;\n if (_tempVec.z > zmax) zmax = _tempVec.z;\n\n let r2_tmp = _tempVec.x * _tempVec.x + _tempVec.y * _tempVec.y + _tempVec.z * _tempVec.z;\n if (r2_tmp < r2min) r2min = r2_tmp;\n if (r2_tmp > r2max) r2max = r2_tmp;\n }\n\n normalMapVertices.set(terrainVertices);\n\n for (let k = 0; k < gsgs; k++) {\n let j = k % gs,\n i = ~~(k / gs);\n\n if (i !== tgs && j !== tgs) {\n let v0ind = k * 3,\n v1ind = v0ind + 3,\n v2ind = v0ind + gs * 3,\n v3ind = v2ind + 3;\n\n let v0 = new Vec3(\n terrainVertices[v0ind] + rtc_x,\n terrainVertices[v0ind + 1] + rtc_y,\n terrainVertices[v0ind + 2] + rtc_z\n ),\n v1 = new Vec3(\n terrainVertices[v1ind] + rtc_x,\n terrainVertices[v1ind + 1] + rtc_y,\n terrainVertices[v1ind + 2] + rtc_z\n ),\n v2 = new Vec3(\n terrainVertices[v2ind] + rtc_x,\n terrainVertices[v2ind + 1] + rtc_y,\n terrainVertices[v2ind + 2] + rtc_z\n ),\n v3 = new Vec3(\n terrainVertices[v3ind] + rtc_x,\n terrainVertices[v3ind + 1] + rtc_y,\n terrainVertices[v3ind + 2] + rtc_z\n );\n\n let e10 = v1.sub(v0).normalize(),\n e20 = v2.sub(v0).normalize(),\n e30 = v3.sub(v0).normalize();\n\n let sw = e20.cross(e30).normalize();\n let ne = e30.cross(e10).normalize();\n let n0 = ne.add(sw).normalize();\n\n normalMapNormals[v0ind] += n0.x;\n normalMapNormals[v0ind + 1] += n0.y;\n normalMapNormals[v0ind + 2] += n0.z;\n\n normalMapNormals[v1ind] += ne.x;\n normalMapNormals[v1ind + 1] += ne.y;\n normalMapNormals[v1ind + 2] += ne.z;\n\n normalMapNormals[v2ind] += sw.x;\n normalMapNormals[v2ind + 1] += sw.y;\n normalMapNormals[v2ind + 2] += sw.z;\n\n normalMapNormals[v3ind] += n0.x;\n normalMapNormals[v3ind + 1] += n0.y;\n normalMapNormals[v3ind + 2] += n0.z;\n }\n }\n }\n\n self.postMessage(\n {\n id: id,\n normalMapNormals: normalMapNormals,\n normalMapVertices: normalMapVertices,\n terrainVertices: terrainVertices,\n terrainVerticesHigh: terrainVerticesHigh,\n terrainVerticesLow: terrainVerticesLow,\n noDataVertices: noDataVertices,\n bounds: [xmin, ymin, zmin, xmax, ymax, zmax],\n radiusRange: r2max >= r2min ? [Math.sqrt(r2min), Math.sqrt(r2max)] : null,\n relativeCenter: e.data.relativeCenter\n },\n [\n normalMapNormals.buffer,\n normalMapVertices.buffer,\n terrainVertices.buffer,\n terrainVerticesHigh.buffer,\n terrainVerticesLow.buffer,\n noDataVertices.buffer\n ]\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TerrainWorker.worker-DIGKd23M.js","names":["_around","Uint8Array","compareNeighbours","pixels","around","a","b","ha","hb","_deviations","Float32Array","sampleSubGrid","grid","size","row0","col0","cells","gridSize","out","outOffset","peaks","noDataHeight","NaN","gs","outGs","step","i","src","dst","j","half","inner","rowStart","cols","isPeak","offset","scale","pr0","Math","max","ceil","pr1","min","floor","pc0","pc1","length","fill","pr","p","end","hi","m","y","ci","fy","top","bottom","vertexRow","x","cj","fx","k","h00","h01","h10","h11","surface","h","deviation","v","abs","keepPeaks","getMeshHeights","elevations","fileGridSize","last","r","row","Int32Array","count","c","findPeaks","checkNoDataValue","noDataValues","value","arr","start","binarySearchFast","Vec3","z","this","doubleToTwoFloats","high","low","doubleHigh","fround","prototype","sub","add","cross","normalize","sqrt","distance","blerp","fQ11","fQ21","fQ12","fQ22","_tempVec","_rtcTempVec","_tempHigh","_tempLow","_meshHeights","self","onmessage","e","data","this_plainVertices","this_plainNormals","this_normalMapVertices","this_normalMapNormals","heightFactor","id","rtc_x","relativeCenter","rtc_y","rtc_z","xmin","xmax","ymin","ymax","zmin","zmax","r2min","Infinity","r2max","fileGridSize_one","fileGridSize_one_x2","tgs","dg","hf","normalMapNormals","normalMapVertices","vInd","noDataInd","gsgs3","terrainVertices","Float64Array","terrainVerticesHigh","terrainVerticesLow","noDataVertices","nv","nn","meshHeights","hInd0","vInd0","currElv","h0","v0","currVert","nextVert","nextElv","eps","mv","meshElv","mh","r2_v0","rtc_v0","hInd1","vInd1","elv","h1","v1","hInd2","vInd2","h2","v2","hInd3","vInd3","h3","v3","e10","e20","e30","sw","ne","n0","oneSize","gsgs","fgsOne","ii","ij","qii","qij","hlt_ind","hrt_ind","hlb_ind","hrb_ind","h_lt","h_rt","h_lb","h_rb","i3","r2_tmp","set","v0ind","v1ind","v2ind","v3ind","postMessage","bounds","radiusRange","buffer","t","e","n","r","o","a","l","y","u","z","s","f","x","M","c","w","d","m","v","p","A","b","g","F","V","N","q","C","U","h","_","S","k","D","I","i","P","H","j","B","E","G","J","K","O","Q","T","W","X","Y","Z","$","tt","et","rt","at","nt","ot","lt","it","st","ft","ht","yt","ut","zt","xt","Mt","ct","wt","dt","mt","vt","pt","At","bt"],"sources":["../../src/terrain/terrainUtils.ts","../../src/utils/TerrainWorker.worker.js"],"sourcesContent":["import type { TypedArray } from \"../utils/shared\";\nimport type { Extent } from \"../Extent\";\n\nexport const RGB_ENCODING_CUSTOM = -1;\nexport const RGB_ENCODING_RGB = 0;\nexport const RGB_ENCODING_TERRARIUM = 1;\n\n/** Segment grid sizes by zoom of the elevation terrains. */\nexport const TERRAIN_GRID_SIZE_BY_ZOOM = [\n 64, 32, 16, 8, 8, 8, 16, 16, 16, 32, 32, 32, 32, 32, 32, 64, 64, 64, 32, 32, 16, 8\n];\n\n/** Writes a row of pixel heights, NaN for no data pixels. */\nexport type DecodeHeightsRowFunc = (row: number, outHeights: Float32Array) => void;\n\nexport interface IRgbDecodeParams {\n encoding: number;\n minHeight: number;\n resolution: number;\n heightFactor: number;\n noDataValues: number[] | TypedArray;\n parentData: number[] | TypedArray | null;\n parentOffsetX: number;\n parentOffsetY: number;\n parentZoomDiff: number;\n skipPositiveHeights: boolean;\n}\n\nexport interface IRgbHeightsParams {\n decode: IRgbDecodeParams;\n size: number;\n gridSize: number;\n levels: number;\n noDataHeight: number;\n}\n\n/**\n * Returns pixel grid cells for the image size, 2^n and (2^n + 1) sizes only.\n * @param {number} size - Image size.\n * @returns {number} -\n */\nexport function getGridCells(size: number): number {\n return (size & (size - 1)) === 0 ? size : size - 1;\n}\n\n/**\n * Returns vertex grid cells for the image size. 2^n images have vertices at the pixel centers and corners,\n * (2^n + 1) images are the grid itself.\n * @param {number} size - Image size.\n * @returns {number} -\n */\nexport function getVertexGridCells(size: number): number {\n let cells = getGridCells(size);\n return cells === size ? cells * 2 : cells;\n}\n\n/**\n * Returns subdivision levels of the image tile. Native zoom levels are not finer than the image pixels,\n * finer data comes with their own tiles. Levels above the native zooms go down to the vertex grid.\n * @param {number} size - Image size.\n * @param {number} gridSize - Tile grid size.\n * @param {number} tileZoom - Image tile zoom.\n * @param {number} maxZoom - Maximal terrain zoom.\n * @param {number} maxNativeZoom - Maximal zoom of the terrain tiles.\n * @returns {number} -\n */\nexport function getSubdivisionLevels(\n size: number,\n gridSize: number,\n tileZoom: number,\n maxZoom: number,\n maxNativeZoom: number\n): number {\n let pixelCells = getGridCells(size),\n vertexCells = getVertexGridCells(size),\n levels = 0;\n\n for (let k = 1; tileZoom + k <= maxZoom; k++) {\n if ((tileZoom + k > maxNativeZoom ? vertexCells : pixelCells) >> k < gridSize) {\n break;\n }\n levels = k;\n }\n\n return levels;\n}\n\nfunction isNoDataValue(noDataValues: number[] | TypedArray, ndMin: number, ndMax: number, h: number): boolean {\n if (h > 50000) {\n return true;\n }\n if (h <= ndMin || h >= ndMax) {\n return false;\n }\n let start = 0,\n end = noDataValues.length - 1;\n while (start <= end) {\n let k = (start + end) >> 1;\n if (Math.abs(noDataValues[k] - h) < 1e-3) {\n return true;\n } else if (noDataValues[k] < h) {\n start = k + 1;\n } else {\n end = k - 1;\n }\n }\n return false;\n}\n\nexport function getParentHeight(\n oneByDz2: number,\n offsetX: number,\n offsetY: number,\n heights: TypedArray | number[],\n i: number,\n j: number,\n skipPositiveHeights?: boolean\n) {\n let parentGridSize = Math.sqrt(heights.length);\n let pi = Math.floor(offsetY * oneByDz2 * parentGridSize + i * oneByDz2),\n pj = Math.floor(offsetX * oneByDz2 * parentGridSize + j * oneByDz2);\n let h = heights[pi * parentGridSize + pj];\n return skipPositiveHeights ? (h > 0 ? 0 : h) : h;\n}\n\n/**\n * Decodes \"rgb\" or \"terrarium\" encoded pixel row heights.\n * @param {number[] | TypedArray} rgbaData - Image RGBA data.\n * @param {number} row - Pixel row.\n * @param {number} size - Image size.\n * @param {number} parentScale - Parent grid cells by image grid cells.\n * @param {IRgbDecodeParams} p - Decode parameters.\n * @param {Float32Array} outHeights - Row heights.\n * @param {number} noDataHeight - Height for no data pixels.\n */\nexport function decodeRgbHeightsRow(\n rgbaData: number[] | TypedArray,\n row: number,\n size: number,\n parentScale: number,\n p: IRgbDecodeParams,\n outHeights: Float32Array,\n noDataHeight: number\n) {\n let ndv = p.noDataValues,\n ndMin = ndv.length ? ndv[0] - 1e-3 : 0,\n ndMax = ndv.length ? ndv[ndv.length - 1] + 1e-3 : 0;\n\n let isTerrarium = p.encoding === RGB_ENCODING_TERRARIUM,\n minHeight = p.minHeight,\n resolution = p.resolution,\n heightFactor = p.heightFactor,\n parentData = p.parentData;\n\n let pi = Math.floor(row * parentScale);\n\n for (let j = 0, k4 = row * size * 4; j < size; j++, k4 += 4) {\n let r = rgbaData[k4],\n g = rgbaData[k4 + 1],\n b = rgbaData[k4 + 2];\n\n let height = isTerrarium\n ? r * 256 + g + b / 256 - 32768\n : r === 255\n ? minHeight\n : minHeight + resolution * (r * 65536 + g * 256 + b);\n\n height *= heightFactor;\n\n let isNoData = isNoDataValue(ndv, ndMin, ndMax, height);\n\n if ((isNoData || height === 0) && parentData) {\n height = getParentHeight(\n p.parentZoomDiff,\n p.parentOffsetX,\n p.parentOffsetY,\n parentData,\n pi,\n Math.floor(j * parentScale),\n p.skipPositiveHeights\n );\n isNoData = isNoDataValue(ndv, ndMin, ndMax, height);\n }\n\n outHeights[j] = isNoData ? noDataHeight : height;\n }\n}\n\n/**\n * Returns the height at the tile edge, extrapolated from the edge pixel p0 inwards through p1 and p2.\n * The slope is limited (minmod), so peaks, pits and slope breaks at the edge are not overshot.\n * @param {number} p0 - Edge pixel height.\n * @param {number} p1 - Next pixel height.\n * @param {number} p2 - Pixel height after the next.\n * @returns {number} -\n */\nexport function getEdgeHeight(p0: number, p1: number, p2: number): number {\n let s0 = p0 - p1,\n s1 = p1 - p2;\n return p0 + 0.5 * (s0 * s1 <= 0 ? 0 : Math.abs(s0) < Math.abs(s1) ? s0 : s1);\n}\n\n/**\n * Returns the ground height at the point of the tile heights grid, on the grid triangles as they are rendered.\n * @param {number} x - Point x in the tile extent projection.\n * @param {number} y - Point y in the tile extent projection.\n * @param {Extent} extent - Tile extent.\n * @param {number[] | TypedArray} heights - Tile heights grid, rows from north to south.\n * @returns {number} -\n */\nexport function getGroundHeight(x: number, y: number, extent: Extent, heights: number[] | TypedArray): number {\n let gs = Math.sqrt(heights.length),\n cells = gs - 1,\n col = ((x - extent.southWest.lon) / extent.getWidth()) * cells,\n row = ((extent.northEast.lat - y) / extent.getHeight()) * cells,\n j = Math.min(Math.max(Math.floor(col), 0), cells - 1),\n i = Math.min(Math.max(Math.floor(row), 0), cells - 1),\n fx = col - j,\n fy = 1 - (row - i);\n\n /*\n v2-----------v3\n | \\ |\n | \\ |\n | \\ |\n v0-----------v1\n */\n let k = i * gs + j,\n h2 = heights[k],\n h3 = heights[k + 1],\n h0 = heights[k + gs],\n h1 = heights[k + gs + 1];\n\n return fx + fy <= 1 ? h0 + fx * (h1 - h0) + fy * (h2 - h0) : h3 + (1 - fx) * (h2 - h3) + (1 - fy) * (h1 - h3);\n}\n\n/**\n * Writes the pixel row heights at the vertex columns: the edges, the pixel corners and, with half pixel steps,\n * the pixel centers.\n */\nfunction interpolateRow(pixels: Float32Array, offset: number, size: number, halfSteps: number, out: Float32Array) {\n let last = offset + size - 1;\n\n out[0] = getEdgeHeight(pixels[offset], pixels[Math.min(offset + 1, last)], pixels[Math.min(offset + 2, last)]);\n\n out[(size * 2) / halfSteps] = getEdgeHeight(\n pixels[last],\n pixels[Math.max(last - 1, offset)],\n pixels[Math.max(last - 2, offset)]\n );\n\n if (halfSteps === 1) {\n let prev = pixels[offset];\n out[1] = prev;\n for (let k = 1; k < size; k++) {\n let h = pixels[offset + k];\n out[k * 2] = 0.5 * (prev + h);\n out[k * 2 + 1] = h;\n prev = h;\n }\n } else {\n for (let k = 1; k < size; k++) {\n out[k] = 0.5 * (pixels[offset + k - 1] + pixels[offset + k]);\n }\n }\n}\n\n/**\n * Converts size x size pixel heights to the vertex grid in the pixel corners, (size + 1) x (size + 1),\n * or in the pixel centers and corners, (2 * size + 1) x (2 * size + 1). Pixel center vertices keep the pixel heights.\n * @param {Float32Array} pixels - Pixel heights, NaN for no data.\n * @param {number} size - Image size.\n * @param {number} noDataHeight - Height for vertices without data around.\n * @param {boolean} [pixelCenters=true] - Vertices at the pixel centers too.\n * @returns {Float32Array} -\n */\nexport function createVertexGrid(\n pixels: Float32Array,\n size: number,\n noDataHeight: number,\n pixelCenters: boolean = true\n): Float32Array {\n let halfSteps = pixelCenters ? 1 : 2,\n gs = (size * 2) / halfSteps + 1,\n last = size - 1;\n\n // Heights at the vertex columns of the last three pixel rows, pixel row r is kept at (r % 3)\n let columns = new Float32Array(gs * 3),\n rowColumns = [columns.subarray(0, gs), columns.subarray(gs, gs * 2), columns.subarray(gs * 2)],\n lastRow = -1;\n\n let out = new Float32Array(gs * gs);\n\n for (let vi = 0; vi < gs; vi++) {\n let u = vi * halfSteps,\n k = u >> 1,\n dst = vi * gs;\n\n let needRow = u === 0 ? Math.min(2, last) : Math.min(k, last);\n\n while (lastRow < needRow) {\n lastRow++;\n interpolateRow(pixels, lastRow * size, size, halfSteps, rowColumns[lastRow % 3]);\n }\n\n if (u & 1) {\n out.set(rowColumns[k % 3], dst);\n } else if (k === 0 || k === size) {\n let c0 = rowColumns[(k === 0 ? 0 : last) % 3],\n c1 = rowColumns[(k === 0 ? Math.min(1, last) : Math.max(last - 1, 0)) % 3],\n c2 = rowColumns[(k === 0 ? Math.min(2, last) : Math.max(last - 2, 0)) % 3];\n\n for (let vj = 0; vj < gs; vj++) {\n out[dst + vj] = getEdgeHeight(c0[vj], c1[vj], c2[vj]);\n }\n } else {\n let c0 = rowColumns[(k - 1) % 3],\n c1 = rowColumns[k % 3];\n\n for (let vj = 0; vj < gs; vj++) {\n out[dst + vj] = 0.5 * (c0[vj] + c1[vj]);\n }\n }\n\n for (let vj = 0; vj < gs; vj++) {\n if (out[dst + vj] !== out[dst + vj]) {\n out[dst + vj] = averagePixels(pixels, size, u, vj * halfSteps, noDataHeight);\n }\n }\n }\n\n return out;\n}\n\nfunction averagePixels(pixels: Float32Array, size: number, ui: number, uj: number, noDataHeight: number): number {\n let last = size - 1,\n ki = ui >> 1,\n kj = uj >> 1,\n sum = 0,\n count = 0;\n\n for (let i = Math.max(ki - 1, 0), i1 = Math.min(ki + (ui & 1), last); i <= i1; i++) {\n for (let j = Math.max(kj - 1, 0), j1 = Math.min(kj + (uj & 1), last); j <= j1; j++) {\n let h = pixels[i * size + j];\n if (h === h) {\n sum += h;\n count++;\n }\n }\n }\n\n return count ? sum / count : noDataHeight;\n}\n\n/** Peak and pit pixels, and their place in the vertex grid. */\nexport interface IGridPeaks {\n pixels: Float32Array;\n size: number;\n /** Peaks by pixel rows, columns of row r are cols[rowStart[r]] ... cols[rowStart[r + 1] - 1]. */\n rowStart: Int32Array;\n cols: Int32Array;\n /** 1 for peaks, 0 for pits. */\n isPeak: Uint8Array;\n /** Pixel p is at (p + offset) * scale vertex. */\n offset: number;\n scale: number;\n}\n\nconst HIGHER_AROUND = 1,\n LOWER_AROUND = 2;\n\nlet _around = new Uint8Array(0);\n\n/** Marks pixels a and b with the neighbour higher or lower flags, NaN pixels are not compared. */\nfunction compareNeighbours(pixels: Float32Array, around: Uint8Array, a: number, b: number) {\n let ha = pixels[a],\n hb = pixels[b];\n\n if (hb > ha) {\n around[a] |= HIGHER_AROUND;\n around[b] |= LOWER_AROUND;\n } else if (hb < ha) {\n around[a] |= LOWER_AROUND;\n around[b] |= HIGHER_AROUND;\n }\n}\n\n/**\n * Finds the pixels that are not lower (peaks) or not higher (pits) than the pixels around,\n * and differ from at least one of them.\n * @param {Float32Array} pixels - Pixel heights, NaN for no data.\n * @param {number} size - Image size.\n * @param {number} offset - Pixel p is at (p + offset) * scale vertex of the grid.\n * @param {number} scale - Grid vertices by pixel.\n * @returns {IGridPeaks} -\n */\nexport function findPeaks(pixels: Float32Array, size: number, offset: number, scale: number): IGridPeaks {\n let last = size - 1,\n length = size * size;\n\n if (_around.length < length) {\n _around = new Uint8Array(length);\n } else {\n _around.fill(0, 0, length);\n }\n\n let around = _around;\n\n // Every neighbour pair is compared once, in 2x2 squares a b / c d: a-b, a-c, a-d and b-c\n for (let r = 0; r < last; r++) {\n let row = r * size;\n for (let k = row, end = row + last; k < end; k++) {\n compareNeighbours(pixels, around, k, k + 1);\n compareNeighbours(pixels, around, k, k + size);\n compareNeighbours(pixels, around, k, k + size + 1);\n compareNeighbours(pixels, around, k + 1, k + size);\n }\n compareNeighbours(pixels, around, row + last, row + last + size);\n }\n for (let k = last * size, end = k + last; k < end; k++) {\n compareNeighbours(pixels, around, k, k + 1);\n }\n\n let rowStart = new Int32Array(size + 1),\n count = 0;\n\n for (let k = 0; k < length; k++) {\n if (around[k] === HIGHER_AROUND || around[k] === LOWER_AROUND) {\n count++;\n }\n }\n\n let cols = new Int32Array(count),\n isPeak = new Uint8Array(count);\n\n count = 0;\n\n for (let r = 0; r < size; r++) {\n rowStart[r] = count;\n for (let c = 0, k = r * size; c < size; c++, k++) {\n if (around[k] === HIGHER_AROUND || around[k] === LOWER_AROUND) {\n cols[count] = c;\n isPeak[count] = around[k] === LOWER_AROUND ? 1 : 0;\n count++;\n }\n }\n }\n\n rowStart[size] = count;\n\n return { pixels, size, rowStart, cols, isPeak, offset, scale };\n}\n\n// Peak deviations of the sampled grid vertices, reused\nlet _deviations = new Float32Array(0);\n\n/**\n * Takes (gridSize + 1) x (gridSize + 1) vertices of the cells x cells square starting at\n * the row0, col0 vertex of the (size + 1) x (size + 1) grid. Cells must be gridSize multiplied by a power of two.\n *\n * With peaks, peaks and pits are moved to the nearest inner vertices, slopes and edge vertices stay sampled.\n */\nexport function sampleSubGrid(\n grid: Float32Array,\n size: number,\n row0: number,\n col0: number,\n cells: number,\n gridSize: number,\n out: Float32Array = new Float32Array((gridSize + 1) * (gridSize + 1)),\n outOffset: number = 0,\n peaks: IGridPeaks | null = null,\n noDataHeight: number = NaN\n): Float32Array {\n let gs = size + 1,\n outGs = gridSize + 1,\n step = cells / gridSize;\n\n for (let i = 0; i < outGs; i++) {\n let src = (row0 + i * step) * gs + col0,\n dst = outOffset + i * outGs;\n for (let j = 0; j < outGs; j++) {\n out[dst + j] = grid[src + j * step];\n }\n }\n\n if (peaks && step > 1 && gridSize > 1) {\n keepPeaks(grid, gs, row0, col0, cells, gridSize, out, outOffset, peaks, noDataHeight);\n }\n\n return out;\n}\n\nfunction keepPeaks(\n grid: Float32Array,\n gs: number,\n row0: number,\n col0: number,\n cells: number,\n gridSize: number,\n out: Float32Array,\n outOffset: number,\n peaks: IGridPeaks,\n noDataHeight: number\n) {\n let outGs = gridSize + 1,\n step = cells / gridSize,\n half = step >> 1,\n inner = gridSize - 1,\n { pixels, size, rowStart, cols, isPeak, offset, scale } = peaks;\n\n // Pixels in the square\n let pr0 = Math.max(Math.ceil(row0 / scale - offset), 0),\n pr1 = Math.min(Math.floor((row0 + cells) / scale - offset), size - 1),\n pc0 = Math.max(Math.ceil(col0 / scale - offset), 0),\n pc1 = Math.min(Math.floor((col0 + cells) / scale - offset), size - 1);\n\n if (_deviations.length < outGs * outGs) {\n _deviations = new Float32Array(outGs * outGs);\n }\n\n _deviations.fill(0, 0, outGs * outGs);\n\n for (let pr = pr0; pr <= pr1; pr++) {\n let p = rowStart[pr],\n end = rowStart[pr + 1];\n\n for (let hi = end; p < hi;) {\n let m = (p + hi) >> 1;\n if (cols[m] < pc0) {\n p = m + 1;\n } else {\n hi = m;\n }\n }\n\n if (p === end || cols[p] > pc1) {\n continue;\n }\n\n let y = (pr + offset) * scale - row0,\n ci = Math.min(Math.floor(y / step), inner),\n fy = y / step - ci,\n i = Math.min(Math.max(Math.floor((y + half) / step), 1), inner),\n top = (row0 + ci * step) * gs + col0,\n bottom = top + step * gs,\n vertexRow = (row0 + i * step) * gs + col0;\n\n for (; p < end && cols[p] <= pc1; p++) {\n let x = (cols[p] + offset) * scale - col0,\n cj = Math.min(Math.floor(x / step), inner),\n fx = x / step - cj,\n k = cj * step;\n\n let h00 = grid[top + k],\n h01 = grid[top + k + step],\n h10 = grid[bottom + k],\n h11 = grid[bottom + k + step];\n\n if (h00 === noDataHeight || h01 === noDataHeight || h10 === noDataHeight || h11 === noDataHeight) {\n continue;\n }\n\n let surface = (1 - fy) * ((1 - fx) * h00 + fx * h01) + fy * ((1 - fx) * h10 + fx * h11),\n h = pixels[pr * size + cols[p]],\n deviation = isPeak[p] ? h - surface : surface - h;\n\n if (deviation <= 0 || h === noDataHeight) {\n continue;\n }\n\n let j = Math.min(Math.max(Math.floor((x + half) / step), 1), inner),\n v = i * outGs + j;\n\n if (deviation > _deviations[v] && deviation > Math.abs(surface - grid[vertexRow + j * step])) {\n _deviations[v] = deviation;\n out[outOffset + v] = h;\n }\n }\n }\n}\n\n/**\n * Returns (gridSize + 1) x (gridSize + 1) mesh heights of (fileGridSize + 1) x (fileGridSize + 1) elevations,\n * their peaks and pits are moved to the nearest mesh vertices.\n * @param {Float32Array} elevations - Elevations grid, rows from north to south.\n * @param {number} fileGridSize - Elevations grid size.\n * @param {number} gridSize - Mesh grid size, fileGridSize divided by a power of two.\n * @param {number} noDataHeight - Height of no data elevations.\n * @param {Float32Array} [out] - Mesh heights.\n * @returns {Float32Array} -\n */\nexport function getMeshHeights(\n elevations: Float32Array,\n fileGridSize: number,\n gridSize: number,\n noDataHeight: number,\n out: Float32Array = new Float32Array((gridSize + 1) * (gridSize + 1))\n): Float32Array {\n return sampleSubGrid(\n elevations,\n fileGridSize,\n 0,\n 0,\n fileGridSize,\n gridSize,\n out,\n 0,\n findPeaks(elevations, fileGridSize + 1, 0, 1),\n noDataHeight\n );\n}\n\n/**\n * Tile pixels, the source of its subdivision level tiles made one by one with createLevelHeights.\n */\nexport interface IHeightsLevelsSource {\n /** Pixel heights, NaN for no data. (2^n + 1) images are the vertex grid, no data are noDataHeight there. */\n pixels: Float32Array;\n size: number;\n gridSize: number;\n levels: number;\n noDataHeight: number;\n /** Peaks of the (2^n + 1) vertex grid, 2^n images find them around every level tile. */\n peaks: IGridPeaks | null;\n}\n\n// Vertices at the pixel centers are needed when the last level is not coarser than the pixels,\n// pixel corners alone would average its peaks and pits away\nfunction isPixelCentersGrid(size: number, gridSize: number, levels: number): boolean {\n return size >> levels <= gridSize;\n}\n\n/**\n * Decodes the tile pixels for its subdivision level tiles.\n * @param {number} size - Image size, 2^n or (2^n + 1).\n * @param {number} gridSize - Tile grid size.\n * @param {number} levels - Subdivision levels.\n * @param {DecodeHeightsRowFunc} decodeRow - Decodes pixel row heights, NaN for no data.\n * @param {number} noDataHeight - Height for vertices without data.\n * @returns {IHeightsLevelsSource} -\n */\nexport function createHeightsLevelsSource(\n size: number,\n gridSize: number,\n levels: number,\n decodeRow: DecodeHeightsRowFunc,\n noDataHeight: number\n): IHeightsLevelsSource {\n let pixels = new Float32Array(size * size),\n peaks: IGridPeaks | null = null;\n\n for (let row = 0; row < size; row++) {\n decodeRow(row, pixels.subarray(row * size, (row + 1) * size));\n }\n\n if (getGridCells(size) !== size) {\n peaks = findPeaks(pixels, size, 0, 1);\n for (let k = 0; k < pixels.length; k++) {\n if (pixels[k] !== pixels[k]) {\n pixels[k] = noDataHeight;\n }\n }\n }\n\n return { pixels, size, gridSize, levels, noDataHeight, peaks };\n}\n\n// Pixels around a level tile in its window: vertices and peaks depend on the next pixels only, at the image\n// edges the window is shifted inside and keeps the three pixels the edge vertices are extrapolated from\nconst LEVEL_TILE_MARGIN = 1;\n\n/**\n * Returns the heights of the level tile in the row i and the column j, the same as createHeightsLevels makes.\n * 2^n images make the vertex grid and find the peaks in the window of the tile pixels with a margin around,\n * so a tile costs its own pixels only.\n * @param {IHeightsLevelsSource} source - Tile pixels.\n * @param {number} level - Subdivision level, 0 is the tile itself.\n * @param {number} i - Level tile row, from the north.\n * @param {number} j - Level tile column, from the west.\n * @param {Float32Array} [out] - Level tile heights.\n * @returns {Float32Array} -\n */\nexport function createLevelHeights(\n source: IHeightsLevelsSource,\n level: number,\n i: number,\n j: number,\n out: Float32Array = new Float32Array((source.gridSize + 1) * (source.gridSize + 1))\n): Float32Array {\n let { pixels, size, gridSize, levels, noDataHeight, peaks } = source;\n\n if (peaks) {\n let c = (size - 1) >> level;\n return sampleSubGrid(pixels, size - 1, i * c, j * c, c, gridSize, out, 0, peaks, noDataHeight);\n }\n\n let pixelCenters = isPixelCentersGrid(size, gridSize, levels),\n scale = pixelCenters ? 2 : 1,\n tilePixels = size >> level,\n w = Math.min(tilePixels + 2 * LEVEL_TILE_MARGIN, size),\n row0 = Math.min(Math.max(i * tilePixels - LEVEL_TILE_MARGIN, 0), size - w),\n col0 = Math.min(Math.max(j * tilePixels - LEVEL_TILE_MARGIN, 0), size - w);\n\n let windowPixels = pixels;\n\n if (w < size) {\n windowPixels = new Float32Array(w * w);\n for (let r = 0; r < w; r++) {\n let src = (row0 + r) * size + col0;\n windowPixels.set(pixels.subarray(src, src + w), r * w);\n }\n }\n\n return sampleSubGrid(\n createVertexGrid(windowPixels, w, noDataHeight, pixelCenters),\n w * scale,\n (i * tilePixels - row0) * scale,\n (j * tilePixels - col0) * scale,\n tilePixels * scale,\n gridSize,\n out,\n 0,\n findPeaks(windowPixels, w, 0.5, scale),\n noDataHeight\n );\n}\n\n/**\n * Returns the (gridSize + 1) x (gridSize + 1) heights of the tile pixels, peaks and pits stay. Subdivision levels\n * the pixels are kept for change the vertex grid, so the tile is made as its level 0.\n * @param {Float32Array} pixels - Pixel heights, rows from north to south, NaN for no data.\n * @param {number} size - Image size, 2^n or (2^n + 1).\n * @param {number} gridSize - Tile grid size.\n * @param {number} levels - Subdivision levels of the tile pixels.\n * @param {number} noDataHeight - Height for vertices without data.\n * @returns {Float32Array} -\n */\nexport function createTileHeights(\n pixels: Float32Array,\n size: number,\n gridSize: number,\n levels: number,\n noDataHeight: number\n): Float32Array {\n let decodeRow = (row: number, out: Float32Array) => out.set(pixels.subarray(row * size, (row + 1) * size));\n\n if (!levels) {\n return createHeightsLevels(size, gridSize, 0, decodeRow, noDataHeight);\n }\n\n return createLevelHeights(createHeightsLevelsSource(size, gridSize, levels, decodeRow, noDataHeight), 0, 0, 0);\n}\n\n/**\n * Creates the tile heights grid and its subdivision levels, each tile is (gridSize + 1) x (gridSize + 1).\n * Output order is the tile itself, then 2x2 tiles of the first level, 4x4 of the second and so on, row by row.\n * Peaks and pits of the pixels stay in all the levels.\n * @param {number} size - Image size, 2^n or (2^n + 1).\n * @param {number} gridSize - Tile grid size.\n * @param {number} levels - Subdivision levels.\n * @param {DecodeHeightsRowFunc} decodeRow - Decodes pixel row heights, NaN for no data.\n * @param {number} noDataHeight - Height for vertices without data.\n * @returns {Float32Array} -\n */\nexport function createHeightsLevels(\n size: number,\n gridSize: number,\n levels: number,\n decodeRow: DecodeHeightsRowFunc,\n noDataHeight: number\n): Float32Array {\n let source = createHeightsLevelsSource(size, gridSize, levels, decodeRow, noDataHeight),\n pixels = source.pixels;\n\n let grid: Float32Array, cells: number, peaks: IGridPeaks;\n\n if (source.peaks) {\n grid = pixels;\n cells = size - 1;\n peaks = source.peaks;\n } else {\n let pixelCenters = isPixelCentersGrid(size, gridSize, levels);\n grid = createVertexGrid(pixels, size, noDataHeight, pixelCenters);\n cells = pixelCenters ? size * 2 : size;\n peaks = findPeaks(pixels, size, 0.5, cells / size);\n }\n\n let tileLength = (gridSize + 1) * (gridSize + 1),\n tilesCount = 0;\n\n for (let k = 0; k <= levels; k++) {\n tilesCount += 1 << (2 * k);\n }\n\n let out = new Float32Array(tilesCount * tileLength);\n\n for (let k = 0, c = cells, offset = 0; k <= levels; k++, c >>= 1) {\n let d = 1 << k;\n for (let i = 0; i < d; i++) {\n for (let j = 0; j < d; j++) {\n sampleSubGrid(grid, cells, i * c, j * c, c, gridSize, out, offset, peaks, noDataHeight);\n offset += tileLength;\n }\n }\n }\n\n return out;\n}\n","\"use strict\";\n//\n//Terrain worker\n//\nimport { getMeshHeights } from \"../terrain/terrainUtils\";\n\nfunction binarySearchFast(arr, x) {\n let start = 0,\n end = arr.length - 1;\n while (start <= end) {\n let k = Math.floor((start + end) * 0.5);\n if (Math.abs(arr[k] - x) < 1e-3) return k;\n else if (arr[k] < x) start = k + 1;\n else end = k - 1;\n }\n return -1;\n}\n\nfunction checkNoDataValue(noDataValues, value) {\n return binarySearchFast(noDataValues, value) !== -1;\n}\n\nvar Vec3 = function (x, y, z) {\n this.x = x;\n this.y = y;\n this.z = z;\n};\n\nvar doubleToTwoFloats = function (v, high, low) {\n let x = v.x,\n y = v.y,\n z = v.z;\n\n var doubleHigh;\n\n if (x >= 0.0) {\n doubleHigh = Math.floor(x / 65536.0) * 65536.0;\n high.x = Math.fround(doubleHigh);\n low.x = Math.fround(x - doubleHigh);\n } else {\n doubleHigh = Math.floor(-x / 65536.0) * 65536.0;\n high.x = Math.fround(-doubleHigh);\n low.x = Math.fround(x + doubleHigh);\n }\n\n if (y >= 0.0) {\n doubleHigh = Math.floor(y / 65536.0) * 65536.0;\n high.y = Math.fround(doubleHigh);\n low.y = Math.fround(y - doubleHigh);\n } else {\n doubleHigh = Math.floor(-y / 65536.0) * 65536.0;\n high.y = Math.fround(-doubleHigh);\n low.y = Math.fround(y + doubleHigh);\n }\n\n if (z >= 0.0) {\n doubleHigh = Math.floor(z / 65536.0) * 65536.0;\n high.z = Math.fround(doubleHigh);\n low.z = Math.fround(z - doubleHigh);\n } else {\n doubleHigh = Math.floor(-z / 65536.0) * 65536.0;\n high.z = Math.fround(-doubleHigh);\n low.z = Math.fround(z + doubleHigh);\n }\n};\n\nVec3.prototype.sub = function (v) {\n return new Vec3(this.x - v.x, this.y - v.y, this.z - v.z);\n};\n\nVec3.prototype.add = function (v) {\n return new Vec3(this.x + v.x, this.y + v.y, this.z + v.z);\n};\n\nVec3.prototype.cross = function (v) {\n return new Vec3(this.y * v.z - this.z * v.y, this.z * v.x - this.x * v.z, this.x * v.y - this.y * v.x);\n};\n\nVec3.prototype.normalize = function () {\n var x = this.x,\n y = this.y,\n z = this.z;\n var length = 1.0 / Math.sqrt(x * x + y * y + z * z);\n this.x = x * length;\n this.y = y * length;\n this.z = z * length;\n return this;\n};\n\nVec3.prototype.distance = function (v) {\n return this.sub(v).length();\n};\n\nVec3.prototype.length = function () {\n return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);\n};\n\nvar blerp = function (x, y, fQ11, fQ21, fQ12, fQ22) {\n return fQ11 * (1.0 - x) * (1.0 - y) + fQ21 * x * (1.0 - y) + fQ12 * (1.0 - x) * y + fQ22 * x * y;\n};\n\nvar _tempVec = new Vec3(0.0, 0.0, 0.0);\nvar _rtcTempVec = new Vec3(0.0, 0.0, 0.0);\n\nvar _tempHigh = new Vec3(0.0, 0.0, 0.0),\n _tempLow = new Vec3(0.0, 0.0, 0.0);\n\nvar _meshHeights = new Float32Array(0);\n\nself.onmessage = function (e) {\n var elevations = e.data.elevations,\n this_plainVertices = e.data.this_plainVertices,\n this_plainNormals = e.data.this_plainNormals,\n this_normalMapVertices = e.data.this_normalMapVertices,\n this_normalMapNormals = e.data.this_normalMapNormals,\n heightFactor = e.data.heightFactor,\n gridSize = e.data.gridSize,\n noDataValues = e.data.noDataValues,\n id = e.data.id;\n\n let rtc_x = e.data.relativeCenter[0],\n rtc_y = e.data.relativeCenter[1],\n rtc_z = e.data.relativeCenter[2];\n\n var xmin = 549755748352.0,\n xmax = -549755748352.0,\n ymin = 549755748352.0,\n ymax = -549755748352.0,\n zmin = 549755748352.0,\n zmax = -549755748352.0;\n\n // Squared geocentric distance of the same vertices. The axis aligned bounds above cannot tell\n // relief from segment size, because the box of a tilted patch is far larger than the patch, so\n // the radius range is accumulated here instead. Kept squared to avoid a root per vertex.\n var r2min = Infinity,\n r2max = -Infinity;\n\n const fileGridSize = Math.sqrt(elevations.length) - 1;\n\n const fileGridSize_one = fileGridSize + 1;\n const fileGridSize_one_x2 = fileGridSize_one * fileGridSize_one;\n const tgs = gridSize;\n const dg = fileGridSize / tgs;\n const gs = tgs + 1;\n const hf = heightFactor;\n\n var vInd = 0,\n noDataInd = 0;\n\n var gsgs3 = gs * gs * 3;\n\n var terrainVertices = new Float64Array(gsgs3),\n terrainVerticesHigh = new Float32Array(gsgs3),\n terrainVerticesLow = new Float32Array(gsgs3),\n noDataVertices = new Uint8Array(gs * gs);\n\n var normalMapNormals, normalMapVertices;\n\n var nv = this_normalMapVertices,\n nn = this_normalMapNormals;\n\n if (fileGridSize >= tgs) {\n normalMapNormals = new Float32Array(fileGridSize_one_x2 * 3);\n normalMapVertices = new Float64Array(fileGridSize_one_x2 * 3);\n\n // Mesh heights keep the elevations peaks and pits, moved to the nearest mesh vertices\n let meshHeights = null;\n if (dg > 1) {\n if (_meshHeights.length !== gs * gs) {\n _meshHeights = new Float32Array(gs * gs);\n }\n meshHeights = getMeshHeights(\n elevations,\n fileGridSize,\n tgs,\n noDataValues.length ? noDataValues[0] : NaN,\n _meshHeights\n );\n }\n\n for (let k = 0; k < fileGridSize_one_x2; k++) {\n var j = k % fileGridSize_one,\n i = ~~(k / fileGridSize_one);\n\n //\n // V0\n //\n var hInd0 = k;\n var vInd0 = hInd0 * 3;\n var currElv = elevations[hInd0];\n if (checkNoDataValue(noDataValues, currElv)) {\n currElv = 0.0;\n }\n var h0 = hf * currElv;\n var v0 = new Vec3(\n rtc_x + nv[vInd0] + h0 * nn[vInd0],\n rtc_y + nv[vInd0 + 1] + h0 * nn[vInd0 + 1],\n rtc_z + nv[vInd0 + 2] + h0 * nn[vInd0 + 2]\n );\n\n normalMapVertices[vInd0] = v0.x - rtc_x;\n normalMapVertices[vInd0 + 1] = v0.y - rtc_y;\n normalMapVertices[vInd0 + 2] = v0.z - rtc_z;\n\n //\n // The vertex goes into screen buffer\n if (i % dg === 0 && j % dg === 0) {\n let currVert = new Vec3(rtc_x + nv[vInd0], rtc_y + nv[vInd0 + 1], rtc_z + nv[vInd0 + 2]);\n let nextVert = new Vec3(rtc_x + nv[vInd0 + 3], rtc_y + nv[vInd0 + 4], rtc_z + nv[vInd0 + 5]);\n\n let nextElv = elevations[hInd0 + 1];\n if (checkNoDataValue(noDataValues, nextElv)) {\n nextElv = 0.0;\n }\n\n let eps = false;\n if (noDataValues.length === 0) {\n let step = currVert.distance(nextVert);\n let deltaElv = Math.abs(currElv - nextElv);\n eps = deltaElv / step > 10.0 || currElv < -5000;\n }\n\n let mv = v0;\n if (meshHeights) {\n let meshElv = meshHeights[(i / dg) * gs + j / dg];\n // Only the vertices a peak or pit is moved to\n if (meshElv !== elevations[hInd0] && !checkNoDataValue(noDataValues, meshElv)) {\n let mh = hf * meshElv;\n mv = new Vec3(\n rtc_x + nv[vInd0] + mh * nn[vInd0],\n rtc_y + nv[vInd0 + 1] + mh * nn[vInd0 + 1],\n rtc_z + nv[vInd0 + 2] + mh * nn[vInd0 + 2]\n );\n }\n }\n\n if (eps) {\n noDataVertices[noDataInd] = 1;\n } else {\n noDataVertices[noDataInd] = 0;\n if (mv.x < xmin) xmin = mv.x;\n if (mv.x > xmax) xmax = mv.x;\n if (mv.y < ymin) ymin = mv.y;\n if (mv.y > ymax) ymax = mv.y;\n if (mv.z < zmin) zmin = mv.z;\n if (mv.z > zmax) zmax = mv.z;\n\n let r2_v0 = mv.x * mv.x + mv.y * mv.y + mv.z * mv.z;\n if (r2_v0 < r2min) r2min = r2_v0;\n if (r2_v0 > r2max) r2max = r2_v0;\n }\n\n let rtc_v0 = new Vec3(mv.x - rtc_x, mv.y - rtc_y, mv.z - rtc_z);\n doubleToTwoFloats(rtc_v0, _tempHigh, _tempLow);\n\n terrainVerticesHigh[vInd] = _tempHigh.x;\n terrainVerticesLow[vInd] = _tempLow.x;\n terrainVertices[vInd++] = rtc_v0.x;\n\n terrainVerticesHigh[vInd] = _tempHigh.y;\n terrainVerticesLow[vInd] = _tempLow.y;\n terrainVertices[vInd++] = rtc_v0.y;\n\n terrainVerticesHigh[vInd] = _tempHigh.z;\n terrainVerticesLow[vInd] = _tempLow.z;\n terrainVertices[vInd++] = rtc_v0.z;\n\n noDataInd++;\n }\n\n if (i !== fileGridSize && j !== fileGridSize) {\n //\n // V1\n //\n var hInd1 = k + 1;\n var vInd1 = hInd1 * 3;\n var elv = elevations[hInd1];\n if (checkNoDataValue(noDataValues, elv)) {\n elv = 0.0;\n }\n var h1 = hf * elv;\n var v1 = new Vec3(\n rtc_x + nv[vInd1] + h1 * nn[vInd1],\n rtc_y + nv[vInd1 + 1] + h1 * nn[vInd1 + 1],\n rtc_z + nv[vInd1 + 2] + h1 * nn[vInd1 + 2]\n );\n\n normalMapVertices[vInd1] = v1.x - rtc_x;\n normalMapVertices[vInd1 + 1] = v1.y - rtc_y;\n normalMapVertices[vInd1 + 2] = v1.z - rtc_z;\n\n //\n // V2\n //\n var hInd2 = k + fileGridSize_one;\n var vInd2 = hInd2 * 3;\n elv = elevations[hInd2];\n if (checkNoDataValue(noDataValues, elv)) {\n elv = 0.0;\n }\n var h2 = hf * elv;\n var v2 = new Vec3(\n rtc_x + nv[vInd2] + h2 * nn[vInd2],\n rtc_y + nv[vInd2 + 1] + h2 * nn[vInd2 + 1],\n rtc_z + nv[vInd2 + 2] + h2 * nn[vInd2 + 2]\n );\n\n normalMapVertices[vInd2] = v2.x - rtc_x;\n normalMapVertices[vInd2 + 1] = v2.y - rtc_y;\n normalMapVertices[vInd2 + 2] = v2.z - rtc_z;\n\n //\n // V3\n //\n var hInd3 = k + fileGridSize_one + 1;\n var vInd3 = hInd3 * 3;\n elv = elevations[hInd3];\n if (checkNoDataValue(noDataValues, elv)) {\n elv = 0.0;\n }\n var h3 = hf * elv;\n var v3 = new Vec3(\n rtc_x + nv[vInd3] + h3 * nn[vInd3],\n rtc_y + nv[vInd3 + 1] + h3 * nn[vInd3 + 1],\n rtc_z + nv[vInd3 + 2] + h3 * nn[vInd3 + 2]\n );\n\n normalMapVertices[vInd3] = v3.x - rtc_x;\n normalMapVertices[vInd3 + 1] = v3.y - rtc_y;\n normalMapVertices[vInd3 + 2] = v3.z - rtc_z;\n\n //\n // Normal\n //\n var e10 = v1.sub(v0),\n e20 = v2.sub(v0),\n e30 = v3.sub(v0);\n\n var sw = e20.cross(e30).normalize();\n var ne = e30.cross(e10).normalize();\n var n0 = ne.add(sw).normalize();\n\n normalMapNormals[vInd0] += n0.x;\n normalMapNormals[vInd0 + 1] += n0.y;\n normalMapNormals[vInd0 + 2] += n0.z;\n\n normalMapNormals[vInd1] += ne.x;\n normalMapNormals[vInd1 + 1] += ne.y;\n normalMapNormals[vInd1 + 2] += ne.z;\n\n normalMapNormals[vInd2] += sw.x;\n normalMapNormals[vInd2 + 1] += sw.y;\n normalMapNormals[vInd2 + 2] += sw.z;\n\n normalMapNormals[vInd3] += n0.x;\n normalMapNormals[vInd3 + 1] += n0.y;\n normalMapNormals[vInd3 + 2] += n0.z;\n }\n }\n } else {\n normalMapNormals = new Float32Array(gsgs3);\n normalMapVertices = new Float64Array(gsgs3);\n\n var oneSize = tgs / fileGridSize;\n var gsgs = gsgs3 / 3;\n var fgsOne = fileGridSize + 1;\n\n for (let i = 0; i < gsgs; i++) {\n let ii = Math.floor(i / gs),\n ij = i % gs;\n\n let qii = ii % oneSize,\n qij = ij % oneSize;\n\n let hlt_ind = Math.floor(ii / oneSize) * fgsOne + Math.floor(ij / oneSize);\n\n if (ij === tgs) {\n hlt_ind -= 1;\n qij = oneSize;\n }\n\n if (ii === tgs) {\n hlt_ind -= fgsOne;\n qii = oneSize;\n }\n\n let hrt_ind = hlt_ind + 1,\n hlb_ind = hlt_ind + fgsOne,\n hrb_ind = hlb_ind + 1;\n\n let h_lt = elevations[hlt_ind],\n h_rt = elevations[hrt_ind],\n h_lb = elevations[hlb_ind],\n h_rb = elevations[hrb_ind];\n\n if (checkNoDataValue(noDataValues, h_lt)) {\n h_lt = 0.0;\n }\n\n if (checkNoDataValue(noDataValues, h_rt)) {\n h_rt = 0.0;\n }\n\n if (checkNoDataValue(noDataValues, h_lb)) {\n h_lb = 0.0;\n }\n\n if (checkNoDataValue(noDataValues, h_rb)) {\n h_rb = 0.0;\n }\n\n let hi = blerp(qij / oneSize, qii / oneSize, h_lt, h_rt, h_lb, h_rb);\n\n let i3 = i * 3;\n\n _rtcTempVec.x = this_plainVertices[i3] + hi * this_plainNormals[i3];\n _rtcTempVec.y = this_plainVertices[i3 + 1] + hi * this_plainNormals[i3 + 1];\n _rtcTempVec.z = this_plainVertices[i3 + 2] + hi * this_plainNormals[i3 + 2];\n\n doubleToTwoFloats(_rtcTempVec, _tempHigh, _tempLow);\n\n terrainVertices[i3] = _rtcTempVec.x;\n terrainVertices[i3 + 1] = _rtcTempVec.y;\n terrainVertices[i3 + 2] = _rtcTempVec.z;\n\n terrainVerticesHigh[i3] = _tempHigh.x;\n terrainVerticesHigh[i3 + 1] = _tempHigh.y;\n terrainVerticesHigh[i3 + 2] = _tempHigh.z;\n\n terrainVerticesLow[i3] = _tempLow.x;\n terrainVerticesLow[i3 + 1] = _tempLow.y;\n terrainVerticesLow[i3 + 2] = _tempLow.z;\n\n _tempVec.x = _rtcTempVec.x + rtc_x;\n _tempVec.y = _rtcTempVec.y + rtc_y;\n _tempVec.z = _rtcTempVec.z + rtc_z;\n\n if (_tempVec.x < xmin) xmin = _tempVec.x;\n if (_tempVec.x > xmax) xmax = _tempVec.x;\n if (_tempVec.y < ymin) ymin = _tempVec.y;\n if (_tempVec.y > ymax) ymax = _tempVec.y;\n if (_tempVec.z < zmin) zmin = _tempVec.z;\n if (_tempVec.z > zmax) zmax = _tempVec.z;\n\n let r2_tmp = _tempVec.x * _tempVec.x + _tempVec.y * _tempVec.y + _tempVec.z * _tempVec.z;\n if (r2_tmp < r2min) r2min = r2_tmp;\n if (r2_tmp > r2max) r2max = r2_tmp;\n }\n\n normalMapVertices.set(terrainVertices);\n\n for (let k = 0; k < gsgs; k++) {\n let j = k % gs,\n i = ~~(k / gs);\n\n if (i !== tgs && j !== tgs) {\n let v0ind = k * 3,\n v1ind = v0ind + 3,\n v2ind = v0ind + gs * 3,\n v3ind = v2ind + 3;\n\n let v0 = new Vec3(\n terrainVertices[v0ind] + rtc_x,\n terrainVertices[v0ind + 1] + rtc_y,\n terrainVertices[v0ind + 2] + rtc_z\n ),\n v1 = new Vec3(\n terrainVertices[v1ind] + rtc_x,\n terrainVertices[v1ind + 1] + rtc_y,\n terrainVertices[v1ind + 2] + rtc_z\n ),\n v2 = new Vec3(\n terrainVertices[v2ind] + rtc_x,\n terrainVertices[v2ind + 1] + rtc_y,\n terrainVertices[v2ind + 2] + rtc_z\n ),\n v3 = new Vec3(\n terrainVertices[v3ind] + rtc_x,\n terrainVertices[v3ind + 1] + rtc_y,\n terrainVertices[v3ind + 2] + rtc_z\n );\n\n let e10 = v1.sub(v0).normalize(),\n e20 = v2.sub(v0).normalize(),\n e30 = v3.sub(v0).normalize();\n\n let sw = e20.cross(e30).normalize();\n let ne = e30.cross(e10).normalize();\n let n0 = ne.add(sw).normalize();\n\n normalMapNormals[v0ind] += n0.x;\n normalMapNormals[v0ind + 1] += n0.y;\n normalMapNormals[v0ind + 2] += n0.z;\n\n normalMapNormals[v1ind] += ne.x;\n normalMapNormals[v1ind + 1] += ne.y;\n normalMapNormals[v1ind + 2] += ne.z;\n\n normalMapNormals[v2ind] += sw.x;\n normalMapNormals[v2ind + 1] += sw.y;\n normalMapNormals[v2ind + 2] += sw.z;\n\n normalMapNormals[v3ind] += n0.x;\n normalMapNormals[v3ind + 1] += n0.y;\n normalMapNormals[v3ind + 2] += n0.z;\n }\n }\n }\n\n self.postMessage(\n {\n id: id,\n normalMapNormals: normalMapNormals,\n normalMapVertices: normalMapVertices,\n terrainVertices: terrainVertices,\n terrainVerticesHigh: terrainVerticesHigh,\n terrainVerticesLow: terrainVerticesLow,\n noDataVertices: noDataVertices,\n bounds: [xmin, ymin, zmin, xmax, ymax, zmax],\n radiusRange: r2max >= r2min ? [Math.sqrt(r2min), Math.sqrt(r2max)] : null,\n relativeCenter: e.data.relativeCenter\n },\n [\n normalMapNormals.buffer,\n normalMapVertices.buffer,\n terrainVertices.buffer,\n terrainVerticesHigh.buffer,\n terrainVerticesLow.buffer,\n noDataVertices.buffer\n ]\n );\n};\n"],"mappings":"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"}
|
package/lib/camera/Camera.d.ts
CHANGED
|
@@ -37,7 +37,7 @@ export interface IFlyBaseParams {
|
|
|
37
37
|
startCallback?: Function;
|
|
38
38
|
frameCallback?: Function;
|
|
39
39
|
}
|
|
40
|
-
export declare const DEFAULT_FLIGHT_DURATION =
|
|
40
|
+
export declare const DEFAULT_FLIGHT_DURATION = 2000;
|
|
41
41
|
export declare const DEFAULT_EASING: EasingFunction;
|
|
42
42
|
type CameraFrame = {
|
|
43
43
|
eye: Vec3;
|
|
@@ -201,6 +201,15 @@ declare class PlanetCamera extends Camera {
|
|
|
201
201
|
*/
|
|
202
202
|
flyDistance(cartesian: Vec3, distance?: number, params?: IPlanetFlyCartesianParams): void;
|
|
203
203
|
flyCartesian(cartesian: Vec3, params?: IPlanetFlyCartesianParams): void;
|
|
204
|
+
/**
|
|
205
|
+
* Returns the flight orientation during the flight.
|
|
206
|
+
* @protected
|
|
207
|
+
*/
|
|
208
|
+
protected _createFlightOrientation(eye_b: Vec3, n_b: Vec3, v_b: Vec3): (eye: Vec3, t: number, down: number) => {
|
|
209
|
+
n: Vec3;
|
|
210
|
+
u: Vec3;
|
|
211
|
+
v: Vec3;
|
|
212
|
+
};
|
|
204
213
|
stopFlying(): void;
|
|
205
214
|
/**
|
|
206
215
|
* Rotates around planet to the left.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Control } from "./Control";
|
|
2
|
+
import type { IControlParams } from "./Control";
|
|
3
|
+
/**
|
|
4
|
+
* Small permanent "Powered by OpenGlobus" label with a link to the project website.
|
|
5
|
+
* It lives in the attributions container next to the layer attributions, and unlike
|
|
6
|
+
* them it is never rebuilt by {@link Planet.updateAttributionsList}.
|
|
7
|
+
* @class
|
|
8
|
+
* @extends {Control}
|
|
9
|
+
*/
|
|
10
|
+
export declare class PoweredBy extends Control {
|
|
11
|
+
el: HTMLElement | null;
|
|
12
|
+
constructor(options?: IControlParams);
|
|
13
|
+
oninit(): void;
|
|
14
|
+
onremove(): void;
|
|
15
|
+
}
|
|
@@ -75,6 +75,7 @@ export declare class TouchNavigation extends Control {
|
|
|
75
75
|
private _onCameraFly;
|
|
76
76
|
protected onTouchStart(e: ITouchState): void;
|
|
77
77
|
protected _startTouchOne(e: ITouchState): void;
|
|
78
|
+
protected _getTargetPoint(p: Vec2): Vec3 | null;
|
|
78
79
|
stopRotation(): void;
|
|
79
80
|
protected onDoubleTouch(e: ITouchState): void;
|
|
80
81
|
protected onTouchEnd(e: ITouchState): void;
|
|
@@ -83,6 +83,7 @@ export declare class DepthCamera {
|
|
|
83
83
|
protected _prevCameraFrustumEntityPitch: number;
|
|
84
84
|
protected _prevCameraFrustumEntityYaw: number;
|
|
85
85
|
protected _prevCameraFrustumEntityRoll: number;
|
|
86
|
+
protected _prevFrustumScale: Vec3;
|
|
86
87
|
constructor(params?: IDepthCameraParams);
|
|
87
88
|
get initialized(): boolean;
|
|
88
89
|
get showFrustum(): boolean;
|
|
@@ -9,6 +9,7 @@ interface IProjectorEditorViewParams extends IViewParams {
|
|
|
9
9
|
}
|
|
10
10
|
export declare class ProjectorEditorView extends View<Projector> {
|
|
11
11
|
protected _enabledView: Checkbox;
|
|
12
|
+
protected _sourceEnabledView: Checkbox;
|
|
12
13
|
protected _colorView: Color;
|
|
13
14
|
protected _opacityView: Input;
|
|
14
15
|
protected _priorityView: Input;
|
|
@@ -23,6 +24,7 @@ export declare class ProjectorEditorView extends View<Projector> {
|
|
|
23
24
|
remove(): void;
|
|
24
25
|
protected _onTitleBarChange: (isCollapsed: boolean) => void;
|
|
25
26
|
protected _onChangeEnabled: (enabled: boolean) => void;
|
|
27
|
+
protected _onChangeSourceEnabled: (enabled: boolean) => void;
|
|
26
28
|
protected _onChangeColor: (color: string) => void;
|
|
27
29
|
protected _onChangeOpacity: (value: string) => void;
|
|
28
30
|
protected _onChangePriority: (value: string) => void;
|
package/lib/control/index.d.ts
CHANGED
|
@@ -12,6 +12,7 @@ export * from "./LayerSwitcher";
|
|
|
12
12
|
export * from "./Lighting";
|
|
13
13
|
export * from "./Navigation";
|
|
14
14
|
export * from "./OrthoSwitcher";
|
|
15
|
+
export * from "./PoweredBy";
|
|
15
16
|
export * from "./RulerSwitcher";
|
|
16
17
|
export * from "./ScaleControl";
|
|
17
18
|
export * from "./ShowFps";
|
package/lib/index.d.ts
CHANGED
|
@@ -19,7 +19,7 @@ export type { IControlParams } from "./control/Control";
|
|
|
19
19
|
export type { IMouseState, ITouchState } from "./renderer/RendererEvents";
|
|
20
20
|
export type { IDeferredShadingPass } from "./renderer/IDeferredShadingPass";
|
|
21
21
|
export type { ITransparencyPass } from "./renderer/ITransparencyPass";
|
|
22
|
-
export type {
|
|
22
|
+
export type { ProjectorSource, ProjectorSourceKind, ProjectorRenderMode, IProjectorParams } from "./renderer/projectors/Projector";
|
|
23
23
|
export { Projector } from "./renderer/projectors/Projector";
|
|
24
24
|
export type { IShadowMapParams } from "./renderer/shadows/ShadowMap";
|
|
25
25
|
export { ShadowMap } from "./renderer/shadows/ShadowMap";
|
|
@@ -64,9 +64,9 @@ import { Loader, type IResponse } from "./utils/Loader";
|
|
|
64
64
|
import { EarthQuadTreeStrategy, EquiQuadTreeStrategy, QuadTreeStrategy, quadTreeStrategyType, Wgs84QuadTreeStrategy } from "./quadTree/index";
|
|
65
65
|
import { Object3d } from "./Object3d";
|
|
66
66
|
import { Handler, ShaderProgram, Framebuffer, Multisample } from "./webgl/index";
|
|
67
|
-
import { EmptyTerrain, GlobusTerrain, RgbTerrain, BilTerrain, GlobusRgbTerrain, MapterhornTerrain, ProceduralTerrain, rgbToHeightByEncoding, rgbToHeightRgb, rgbToHeightTerrarium, resolveRgbToHeightFunc } from "./terrain/index";
|
|
67
|
+
import { EmptyTerrain, GlobusTerrain, RgbTerrain, BilTerrain, GlobusRgbTerrain, MapterhornTerrain, ProceduralTerrain, GeoTiffTerrain, rgbToHeightByEncoding, rgbToHeightRgb, rgbToHeightTerrarium, resolveRgbToHeightFunc } from "./terrain/index";
|
|
68
68
|
import { MoveAxisEntity } from "./control/entityGizmo/MoveAxisEntity";
|
|
69
69
|
import { Gltf } from "./utils/gltf/gltfParser";
|
|
70
70
|
import { Easing } from "./utils/easing";
|
|
71
71
|
import type { EasingFunction } from "./utils/easing";
|
|
72
|
-
export { bv, jd, math, mercator, utils, input, control, scene, quadTreeStrategyType, wgs84, moon, mars, terrain, layer, ui, webgl, Easing, EasingFunction, Framebuffer, EmptyTerrain, GlobusTerrain, RgbTerrain, GlobusRgbTerrain, MapterhornTerrain, ProceduralTerrain, rgbToHeightByEncoding, rgbToHeightRgb, rgbToHeightTerrarium, resolveRgbToHeightFunc, BilTerrain, Camera, Ellipsoid, Planet, PlanetCamera, ShaderProgram, Handler, Multisample, Renderer, Clock, TimelineModel, Events, EventsHandler, createEvents, Extent, LonLat, Scene, Line2, Line3, Mat3, Mat4, Plane, Quat, Ray, Vec2, Vec3, Vec4, Geoid, Popup, QuadTreeStrategy, EquiQuadTreeStrategy, EarthQuadTreeStrategy, Wgs84QuadTreeStrategy, Object3d, Gltf, MoveAxisEntity, Loader, IResponse };
|
|
72
|
+
export { bv, jd, math, mercator, utils, input, control, scene, quadTreeStrategyType, wgs84, moon, mars, terrain, layer, ui, webgl, Easing, EasingFunction, Framebuffer, EmptyTerrain, GlobusTerrain, RgbTerrain, GlobusRgbTerrain, MapterhornTerrain, ProceduralTerrain, GeoTiffTerrain, rgbToHeightByEncoding, rgbToHeightRgb, rgbToHeightTerrarium, resolveRgbToHeightFunc, BilTerrain, Camera, Ellipsoid, Planet, PlanetCamera, ShaderProgram, Handler, Multisample, Renderer, Clock, TimelineModel, Events, EventsHandler, createEvents, Extent, LonLat, Scene, Line2, Line3, Mat3, Mat4, Plane, Quat, Ray, Vec2, Vec3, Vec4, Geoid, Popup, QuadTreeStrategy, EquiQuadTreeStrategy, EarthQuadTreeStrategy, Wgs84QuadTreeStrategy, Object3d, Gltf, MoveAxisEntity, Loader, IResponse };
|
|
@@ -66,13 +66,6 @@ export declare class GeoTIFFLayer extends BaseTileMaterialLayer {
|
|
|
66
66
|
clear(): void;
|
|
67
67
|
redraw(): void;
|
|
68
68
|
private _reapplyRenderOptions;
|
|
69
|
-
/**
|
|
70
|
-
* Opens the source. If its CRS is unresolved, fetches the projection
|
|
71
|
-
* from the EPSG registry and reopens the source with it.
|
|
72
|
-
*
|
|
73
|
-
* Projections provided via `projFunc` or registered in {@link proj4}
|
|
74
|
-
* are already resolved and require no lookup.
|
|
75
|
-
*/
|
|
76
69
|
private _readSource;
|
|
77
70
|
private _initSource;
|
|
78
71
|
private _initSources;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { GeoTIFF, GeoTIFFImage, Pool } from "geotiff";
|
|
2
2
|
import { Extent } from "../../Extent";
|
|
3
|
+
import { type IProjectionHelper } from "./utm";
|
|
3
4
|
import { Proj } from "../../proj/Proj";
|
|
4
5
|
import type { DecodedTileData, GeoTIFFSource, IGeoTIFFMetadata, IGeoTIFFReader, IGeoTIFFReaderParams, IGeoTIFFRenderOptions, ProjFunc } from "./types";
|
|
5
6
|
export declare function parseCrsCode(crs?: number | string): number | undefined;
|
|
@@ -45,9 +46,15 @@ export declare class GeoTIFFReader implements IGeoTIFFReader {
|
|
|
45
46
|
* @param tileSize - Output tile size in pixels.
|
|
46
47
|
* @param readSamples - Band indexes to read.
|
|
47
48
|
* @param segmentProj - Projection of the segment the tile belongs to, EPSG:3857 by default.
|
|
49
|
+
* @returns Tile rasters, null for a tile out of the raster. A failed read rejects.
|
|
48
50
|
*/
|
|
49
51
|
readTileRasters(tileExtentLonLat: Extent, zoomLevel: number, tileSize?: number, readSamples?: number[], segmentProj?: Proj): Promise<DecodedTileData | null>;
|
|
50
52
|
private _readTileRasters;
|
|
53
|
+
/**
|
|
54
|
+
* Returns the projection helper of the CRS, null if there is none. A projection that proj4 does not know is
|
|
55
|
+
* taken from the EPSG registry first, so the source is read once. Lon/lat and Web Mercator need no helper.
|
|
56
|
+
*/
|
|
57
|
+
protected _resolveProjection(crsCode: number): Promise<IProjectionHelper | null>;
|
|
51
58
|
/**
|
|
52
59
|
* Projects a lon/lat point into the raster coordinates, normalized to 0..1.
|
|
53
60
|
*/
|
|
@@ -67,7 +74,16 @@ export declare class GeoTIFFReader implements IGeoTIFFReader {
|
|
|
67
74
|
*/
|
|
68
75
|
private _createTileGrid;
|
|
69
76
|
private _selectOverviewIndex;
|
|
70
|
-
|
|
77
|
+
/**
|
|
78
|
+
* Returns the image column and row of the tile when tile pixels match the source grid, so its rows are copied
|
|
79
|
+
* without resampling; otherwise null.
|
|
80
|
+
*/
|
|
81
|
+
private _getAlignedOrigin;
|
|
82
|
+
/**
|
|
83
|
+
* Returns the tile rasters copied from the window rows starting at the origin, the same as the nearest
|
|
84
|
+
* resampling gives; tile pixels out of the image stay NaN.
|
|
85
|
+
*/
|
|
86
|
+
private _copyRasters;
|
|
71
87
|
/**
|
|
72
88
|
* NoData value that masks pixels, or null when masking is turned off.
|
|
73
89
|
* Layer options take precedence over the file metadata.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { TypedArray } from "geotiff";
|
|
2
|
+
/**
|
|
3
|
+
* Tile resampling data, the window rasters and the grid of the source positions of the tile pixels.
|
|
4
|
+
*/
|
|
5
|
+
export interface IWarpParams {
|
|
6
|
+
/** Window rasters, one by band. */
|
|
7
|
+
rasters: TypedArray[];
|
|
8
|
+
/** Source positions of the grid nodes, normalized to 0..1, v grows down the raster rows. */
|
|
9
|
+
gridU: Float64Array;
|
|
10
|
+
gridV: Float64Array;
|
|
11
|
+
gridSize: number;
|
|
12
|
+
imgWidth: number;
|
|
13
|
+
imgHeight: number;
|
|
14
|
+
window: [number, number, number, number];
|
|
15
|
+
tileSize: number;
|
|
16
|
+
bilinear: boolean;
|
|
17
|
+
nodata: number | null;
|
|
18
|
+
/** Valid pixels of the window, if the file has a mask. */
|
|
19
|
+
maskRaster?: TypedArray | null;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Returns the tile rasters resampled from the window rasters, the nearest or bilinear. Tile pixels out of
|
|
23
|
+
* the image, of no data or out of the mask are NaN.
|
|
24
|
+
*/
|
|
25
|
+
export declare function warpRasters(p: IWarpParams): Float32Array[];
|