/** * @license * Cesium - https://github.com/CesiumGS/cesium * Version 1.117 * * Copyright 2011-2022 Cesium Contributors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * Columbus View (Pat. Pend.) * * Portions licensed separately. * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. */ import { WallGeometryLibrary_default } from "./chunk-UAJEGIWA.js"; import "./chunk-ZWPIM77Q.js"; import "./chunk-2CSEEWHN.js"; import { VertexFormat_default } from "./chunk-4KIUON73.js"; import "./chunk-V7JB576Q.js"; import "./chunk-CYAJYEKW.js"; import "./chunk-G7CJQKKD.js"; import "./chunk-FOZQIHZK.js"; import { IndexDatatype_default } from "./chunk-WWP3I7R5.js"; import { GeometryAttributes_default } from "./chunk-RL73GOEF.js"; import { GeometryAttribute_default, Geometry_default, PrimitiveType_default } from "./chunk-34DGOKCO.js"; import { BoundingSphere_default } from "./chunk-NI2R52QD.js"; import "./chunk-I5TDPPC4.js"; import { ComponentDatatype_default } from "./chunk-TMMOULW3.js"; import { Cartesian3_default, Ellipsoid_default } from "./chunk-C5CE4OG6.js"; import { Math_default } from "./chunk-4PHPQRSH.js"; import "./chunk-PEABJLCK.js"; import "./chunk-WFICTTOE.js"; import { defaultValue_default } from "./chunk-UCPPWV64.js"; import { DeveloperError_default } from "./chunk-U4IMCOF5.js"; import { defined_default } from "./chunk-BDUJXBVF.js"; // packages/engine/Source/Core/WallGeometry.js var scratchCartesian3Position1 = new Cartesian3_default(); var scratchCartesian3Position2 = new Cartesian3_default(); var scratchCartesian3Position4 = new Cartesian3_default(); var scratchCartesian3Position5 = new Cartesian3_default(); var scratchBitangent = new Cartesian3_default(); var scratchTangent = new Cartesian3_default(); var scratchNormal = new Cartesian3_default(); function WallGeometry(options) { options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); const wallPositions = options.positions; const maximumHeights = options.maximumHeights; const minimumHeights = options.minimumHeights; if (!defined_default(wallPositions)) { throw new DeveloperError_default("options.positions is required."); } if (defined_default(maximumHeights) && maximumHeights.length !== wallPositions.length) { throw new DeveloperError_default( "options.positions and options.maximumHeights must have the same length." ); } if (defined_default(minimumHeights) && minimumHeights.length !== wallPositions.length) { throw new DeveloperError_default( "options.positions and options.minimumHeights must have the same length." ); } const vertexFormat = defaultValue_default(options.vertexFormat, VertexFormat_default.DEFAULT); const granularity = defaultValue_default( options.granularity, Math_default.RADIANS_PER_DEGREE ); const ellipsoid = defaultValue_default(options.ellipsoid, Ellipsoid_default.WGS84); this._positions = wallPositions; this._minimumHeights = minimumHeights; this._maximumHeights = maximumHeights; this._vertexFormat = VertexFormat_default.clone(vertexFormat); this._granularity = granularity; this._ellipsoid = Ellipsoid_default.clone(ellipsoid); this._workerName = "createWallGeometry"; let numComponents = 1 + wallPositions.length * Cartesian3_default.packedLength + 2; if (defined_default(minimumHeights)) { numComponents += minimumHeights.length; } if (defined_default(maximumHeights)) { numComponents += maximumHeights.length; } this.packedLength = numComponents + Ellipsoid_default.packedLength + VertexFormat_default.packedLength + 1; } WallGeometry.pack = function(value, array, startingIndex) { if (!defined_default(value)) { throw new DeveloperError_default("value is required"); } if (!defined_default(array)) { throw new DeveloperError_default("array is required"); } startingIndex = defaultValue_default(startingIndex, 0); let i; const positions = value._positions; let length = positions.length; array[startingIndex++] = length; for (i = 0; i < length; ++i, startingIndex += Cartesian3_default.packedLength) { Cartesian3_default.pack(positions[i], array, startingIndex); } const minimumHeights = value._minimumHeights; length = defined_default(minimumHeights) ? minimumHeights.length : 0; array[startingIndex++] = length; if (defined_default(minimumHeights)) { for (i = 0; i < length; ++i) { array[startingIndex++] = minimumHeights[i]; } } const maximumHeights = value._maximumHeights; length = defined_default(maximumHeights) ? maximumHeights.length : 0; array[startingIndex++] = length; if (defined_default(maximumHeights)) { for (i = 0; i < length; ++i) { array[startingIndex++] = maximumHeights[i]; } } Ellipsoid_default.pack(value._ellipsoid, array, startingIndex); startingIndex += Ellipsoid_default.packedLength; VertexFormat_default.pack(value._vertexFormat, array, startingIndex); startingIndex += VertexFormat_default.packedLength; array[startingIndex] = value._granularity; return array; }; var scratchEllipsoid = Ellipsoid_default.clone(Ellipsoid_default.UNIT_SPHERE); var scratchVertexFormat = new VertexFormat_default(); var scratchOptions = { positions: void 0, minimumHeights: void 0, maximumHeights: void 0, ellipsoid: scratchEllipsoid, vertexFormat: scratchVertexFormat, granularity: void 0 }; WallGeometry.unpack = function(array, startingIndex, result) { if (!defined_default(array)) { throw new DeveloperError_default("array is required"); } startingIndex = defaultValue_default(startingIndex, 0); let i; let length = array[startingIndex++]; const positions = new Array(length); for (i = 0; i < length; ++i, startingIndex += Cartesian3_default.packedLength) { positions[i] = Cartesian3_default.unpack(array, startingIndex); } length = array[startingIndex++]; let minimumHeights; if (length > 0) { minimumHeights = new Array(length); for (i = 0; i < length; ++i) { minimumHeights[i] = array[startingIndex++]; } } length = array[startingIndex++]; let maximumHeights; if (length > 0) { maximumHeights = new Array(length); for (i = 0; i < length; ++i) { maximumHeights[i] = array[startingIndex++]; } } const ellipsoid = Ellipsoid_default.unpack(array, startingIndex, scratchEllipsoid); startingIndex += Ellipsoid_default.packedLength; const vertexFormat = VertexFormat_default.unpack( array, startingIndex, scratchVertexFormat ); startingIndex += VertexFormat_default.packedLength; const granularity = array[startingIndex]; if (!defined_default(result)) { scratchOptions.positions = positions; scratchOptions.minimumHeights = minimumHeights; scratchOptions.maximumHeights = maximumHeights; scratchOptions.granularity = granularity; return new WallGeometry(scratchOptions); } result._positions = positions; result._minimumHeights = minimumHeights; result._maximumHeights = maximumHeights; result._ellipsoid = Ellipsoid_default.clone(ellipsoid, result._ellipsoid); result._vertexFormat = VertexFormat_default.clone(vertexFormat, result._vertexFormat); result._granularity = granularity; return result; }; WallGeometry.fromConstantHeights = function(options) { options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT); const positions = options.positions; if (!defined_default(positions)) { throw new DeveloperError_default("options.positions is required."); } let minHeights; let maxHeights; const min = options.minimumHeight; const max = options.maximumHeight; const doMin = defined_default(min); const doMax = defined_default(max); if (doMin || doMax) { const length = positions.length; minHeights = doMin ? new Array(length) : void 0; maxHeights = doMax ? new Array(length) : void 0; for (let i = 0; i < length; ++i) { if (doMin) { minHeights[i] = min; } if (doMax) { maxHeights[i] = max; } } } const newOptions = { positions, maximumHeights: maxHeights, minimumHeights: minHeights, ellipsoid: options.ellipsoid, vertexFormat: options.vertexFormat }; return new WallGeometry(newOptions); }; WallGeometry.createGeometry = function(wallGeometry) { const wallPositions = wallGeometry._positions; const minimumHeights = wallGeometry._minimumHeights; const maximumHeights = wallGeometry._maximumHeights; const vertexFormat = wallGeometry._vertexFormat; const granularity = wallGeometry._granularity; const ellipsoid = wallGeometry._ellipsoid; const pos = WallGeometryLibrary_default.computePositions( ellipsoid, wallPositions, maximumHeights, minimumHeights, granularity, true ); if (!defined_default(pos)) { return; } const bottomPositions = pos.bottomPositions; const topPositions = pos.topPositions; const numCorners = pos.numCorners; let length = topPositions.length; let size = length * 2; const positions = vertexFormat.position ? new Float64Array(size) : void 0; const normals = vertexFormat.normal ? new Float32Array(size) : void 0; const tangents = vertexFormat.tangent ? new Float32Array(size) : void 0; const bitangents = vertexFormat.bitangent ? new Float32Array(size) : void 0; const textureCoordinates = vertexFormat.st ? new Float32Array(size / 3 * 2) : void 0; let positionIndex = 0; let normalIndex = 0; let bitangentIndex = 0; let tangentIndex = 0; let stIndex = 0; let normal = scratchNormal; let tangent = scratchTangent; let bitangent = scratchBitangent; let recomputeNormal = true; length /= 3; let i; let s = 0; const ds = 1 / (length - numCorners - 1); for (i = 0; i < length; ++i) { const i3 = i * 3; const topPosition = Cartesian3_default.fromArray( topPositions, i3, scratchCartesian3Position1 ); const bottomPosition = Cartesian3_default.fromArray( bottomPositions, i3, scratchCartesian3Position2 ); if (vertexFormat.position) { positions[positionIndex++] = bottomPosition.x; positions[positionIndex++] = bottomPosition.y; positions[positionIndex++] = bottomPosition.z; positions[positionIndex++] = topPosition.x; positions[positionIndex++] = topPosition.y; positions[positionIndex++] = topPosition.z; } if (vertexFormat.st) { textureCoordinates[stIndex++] = s; textureCoordinates[stIndex++] = 0; textureCoordinates[stIndex++] = s; textureCoordinates[stIndex++] = 1; } if (vertexFormat.normal || vertexFormat.tangent || vertexFormat.bitangent) { let nextTop = Cartesian3_default.clone( Cartesian3_default.ZERO, scratchCartesian3Position5 ); const groundPosition = Cartesian3_default.subtract( topPosition, ellipsoid.geodeticSurfaceNormal( topPosition, scratchCartesian3Position2 ), scratchCartesian3Position2 ); if (i + 1 < length) { nextTop = Cartesian3_default.fromArray( topPositions, i3 + 3, scratchCartesian3Position5 ); } if (recomputeNormal) { const scalednextPosition = Cartesian3_default.subtract( nextTop, topPosition, scratchCartesian3Position4 ); const scaledGroundPosition = Cartesian3_default.subtract( groundPosition, topPosition, scratchCartesian3Position1 ); normal = Cartesian3_default.normalize( Cartesian3_default.cross(scaledGroundPosition, scalednextPosition, normal), normal ); recomputeNormal = false; } if (Cartesian3_default.equalsEpsilon(topPosition, nextTop, Math_default.EPSILON10)) { recomputeNormal = true; } else { s += ds; if (vertexFormat.tangent) { tangent = Cartesian3_default.normalize( Cartesian3_default.subtract(nextTop, topPosition, tangent), tangent ); } if (vertexFormat.bitangent) { bitangent = Cartesian3_default.normalize( Cartesian3_default.cross(normal, tangent, bitangent), bitangent ); } } if (vertexFormat.normal) { normals[normalIndex++] = normal.x; normals[normalIndex++] = normal.y; normals[normalIndex++] = normal.z; normals[normalIndex++] = normal.x; normals[normalIndex++] = normal.y; normals[normalIndex++] = normal.z; } if (vertexFormat.tangent) { tangents[tangentIndex++] = tangent.x; tangents[tangentIndex++] = tangent.y; tangents[tangentIndex++] = tangent.z; tangents[tangentIndex++] = tangent.x; tangents[tangentIndex++] = tangent.y; tangents[tangentIndex++] = tangent.z; } if (vertexFormat.bitangent) { bitangents[bitangentIndex++] = bitangent.x; bitangents[bitangentIndex++] = bitangent.y; bitangents[bitangentIndex++] = bitangent.z; bitangents[bitangentIndex++] = bitangent.x; bitangents[bitangentIndex++] = bitangent.y; bitangents[bitangentIndex++] = bitangent.z; } } } const attributes = new GeometryAttributes_default(); if (vertexFormat.position) { attributes.position = new GeometryAttribute_default({ componentDatatype: ComponentDatatype_default.DOUBLE, componentsPerAttribute: 3, values: positions }); } if (vertexFormat.normal) { attributes.normal = new GeometryAttribute_default({ componentDatatype: ComponentDatatype_default.FLOAT, componentsPerAttribute: 3, values: normals }); } if (vertexFormat.tangent) { attributes.tangent = new GeometryAttribute_default({ componentDatatype: ComponentDatatype_default.FLOAT, componentsPerAttribute: 3, values: tangents }); } if (vertexFormat.bitangent) { attributes.bitangent = new GeometryAttribute_default({ componentDatatype: ComponentDatatype_default.FLOAT, componentsPerAttribute: 3, values: bitangents }); } if (vertexFormat.st) { attributes.st = new GeometryAttribute_default({ componentDatatype: ComponentDatatype_default.FLOAT, componentsPerAttribute: 2, values: textureCoordinates }); } const numVertices = size / 3; size -= 6 * (numCorners + 1); const indices = IndexDatatype_default.createTypedArray(numVertices, size); let edgeIndex = 0; for (i = 0; i < numVertices - 2; i += 2) { const LL = i; const LR = i + 2; const pl = Cartesian3_default.fromArray( positions, LL * 3, scratchCartesian3Position1 ); const pr = Cartesian3_default.fromArray( positions, LR * 3, scratchCartesian3Position2 ); if (Cartesian3_default.equalsEpsilon(pl, pr, Math_default.EPSILON10)) { continue; } const UL = i + 1; const UR = i + 3; indices[edgeIndex++] = UL; indices[edgeIndex++] = LL; indices[edgeIndex++] = UR; indices[edgeIndex++] = UR; indices[edgeIndex++] = LL; indices[edgeIndex++] = LR; } return new Geometry_default({ attributes, indices, primitiveType: PrimitiveType_default.TRIANGLES, boundingSphere: new BoundingSphere_default.fromVertices(positions) }); }; var WallGeometry_default = WallGeometry; // packages/engine/Source/Workers/createWallGeometry.js function createWallGeometry(wallGeometry, offset) { if (defined_default(offset)) { wallGeometry = WallGeometry_default.unpack(wallGeometry, offset); } wallGeometry._ellipsoid = Ellipsoid_default.clone(wallGeometry._ellipsoid); return WallGeometry_default.createGeometry(wallGeometry); } var createWallGeometry_default = createWallGeometry; export { createWallGeometry_default as default };