1607 lines
56 KiB
JavaScript
1607 lines
56 KiB
JavaScript
|
/**
|
||
|
* @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 {
|
||
|
WebMercatorProjection_default
|
||
|
} from "./chunk-WEGCQ5DY.js";
|
||
|
import {
|
||
|
ArcType_default
|
||
|
} from "./chunk-YLZTCEBJ.js";
|
||
|
import {
|
||
|
EncodedCartesian3_default
|
||
|
} from "./chunk-AOFMPKUB.js";
|
||
|
import {
|
||
|
EllipsoidGeodesic_default
|
||
|
} from "./chunk-2CSEEWHN.js";
|
||
|
import {
|
||
|
arrayRemoveDuplicates_default
|
||
|
} from "./chunk-V7JB576Q.js";
|
||
|
import {
|
||
|
EllipsoidRhumbLine_default
|
||
|
} from "./chunk-CYAJYEKW.js";
|
||
|
import {
|
||
|
IntersectionTests_default
|
||
|
} from "./chunk-G7CJQKKD.js";
|
||
|
import {
|
||
|
Plane_default
|
||
|
} from "./chunk-FOZQIHZK.js";
|
||
|
import {
|
||
|
GeometryAttribute_default,
|
||
|
Geometry_default
|
||
|
} from "./chunk-34DGOKCO.js";
|
||
|
import {
|
||
|
BoundingSphere_default,
|
||
|
GeographicProjection_default
|
||
|
} from "./chunk-NI2R52QD.js";
|
||
|
import {
|
||
|
Quaternion_default,
|
||
|
Rectangle_default,
|
||
|
Resource_default,
|
||
|
buildModuleUrl_default
|
||
|
} from "./chunk-I5TDPPC4.js";
|
||
|
import {
|
||
|
ComponentDatatype_default
|
||
|
} from "./chunk-TMMOULW3.js";
|
||
|
import {
|
||
|
Cartesian2_default,
|
||
|
Cartesian3_default,
|
||
|
Cartographic_default,
|
||
|
Ellipsoid_default,
|
||
|
Matrix3_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 {
|
||
|
Check_default,
|
||
|
DeveloperError_default
|
||
|
} from "./chunk-U4IMCOF5.js";
|
||
|
import {
|
||
|
defined_default
|
||
|
} from "./chunk-BDUJXBVF.js";
|
||
|
|
||
|
// packages/engine/Source/Core/GeographicTilingScheme.js
|
||
|
function GeographicTilingScheme(options) {
|
||
|
options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT);
|
||
|
this._ellipsoid = defaultValue_default(options.ellipsoid, Ellipsoid_default.WGS84);
|
||
|
this._rectangle = defaultValue_default(options.rectangle, Rectangle_default.MAX_VALUE);
|
||
|
this._projection = new GeographicProjection_default(this._ellipsoid);
|
||
|
this._numberOfLevelZeroTilesX = defaultValue_default(
|
||
|
options.numberOfLevelZeroTilesX,
|
||
|
2
|
||
|
);
|
||
|
this._numberOfLevelZeroTilesY = defaultValue_default(
|
||
|
options.numberOfLevelZeroTilesY,
|
||
|
1
|
||
|
);
|
||
|
}
|
||
|
Object.defineProperties(GeographicTilingScheme.prototype, {
|
||
|
/**
|
||
|
* Gets the ellipsoid that is tiled by this tiling scheme.
|
||
|
* @memberof GeographicTilingScheme.prototype
|
||
|
* @type {Ellipsoid}
|
||
|
*/
|
||
|
ellipsoid: {
|
||
|
get: function() {
|
||
|
return this._ellipsoid;
|
||
|
}
|
||
|
},
|
||
|
/**
|
||
|
* Gets the rectangle, in radians, covered by this tiling scheme.
|
||
|
* @memberof GeographicTilingScheme.prototype
|
||
|
* @type {Rectangle}
|
||
|
*/
|
||
|
rectangle: {
|
||
|
get: function() {
|
||
|
return this._rectangle;
|
||
|
}
|
||
|
},
|
||
|
/**
|
||
|
* Gets the map projection used by this tiling scheme.
|
||
|
* @memberof GeographicTilingScheme.prototype
|
||
|
* @type {MapProjection}
|
||
|
*/
|
||
|
projection: {
|
||
|
get: function() {
|
||
|
return this._projection;
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
GeographicTilingScheme.prototype.getNumberOfXTilesAtLevel = function(level) {
|
||
|
return this._numberOfLevelZeroTilesX << level;
|
||
|
};
|
||
|
GeographicTilingScheme.prototype.getNumberOfYTilesAtLevel = function(level) {
|
||
|
return this._numberOfLevelZeroTilesY << level;
|
||
|
};
|
||
|
GeographicTilingScheme.prototype.rectangleToNativeRectangle = function(rectangle, result) {
|
||
|
Check_default.defined("rectangle", rectangle);
|
||
|
const west = Math_default.toDegrees(rectangle.west);
|
||
|
const south = Math_default.toDegrees(rectangle.south);
|
||
|
const east = Math_default.toDegrees(rectangle.east);
|
||
|
const north = Math_default.toDegrees(rectangle.north);
|
||
|
if (!defined_default(result)) {
|
||
|
return new Rectangle_default(west, south, east, north);
|
||
|
}
|
||
|
result.west = west;
|
||
|
result.south = south;
|
||
|
result.east = east;
|
||
|
result.north = north;
|
||
|
return result;
|
||
|
};
|
||
|
GeographicTilingScheme.prototype.tileXYToNativeRectangle = function(x, y, level, result) {
|
||
|
const rectangleRadians = this.tileXYToRectangle(x, y, level, result);
|
||
|
rectangleRadians.west = Math_default.toDegrees(rectangleRadians.west);
|
||
|
rectangleRadians.south = Math_default.toDegrees(rectangleRadians.south);
|
||
|
rectangleRadians.east = Math_default.toDegrees(rectangleRadians.east);
|
||
|
rectangleRadians.north = Math_default.toDegrees(rectangleRadians.north);
|
||
|
return rectangleRadians;
|
||
|
};
|
||
|
GeographicTilingScheme.prototype.tileXYToRectangle = function(x, y, level, result) {
|
||
|
const rectangle = this._rectangle;
|
||
|
const xTiles = this.getNumberOfXTilesAtLevel(level);
|
||
|
const yTiles = this.getNumberOfYTilesAtLevel(level);
|
||
|
const xTileWidth = rectangle.width / xTiles;
|
||
|
const west = x * xTileWidth + rectangle.west;
|
||
|
const east = (x + 1) * xTileWidth + rectangle.west;
|
||
|
const yTileHeight = rectangle.height / yTiles;
|
||
|
const north = rectangle.north - y * yTileHeight;
|
||
|
const south = rectangle.north - (y + 1) * yTileHeight;
|
||
|
if (!defined_default(result)) {
|
||
|
result = new Rectangle_default(west, south, east, north);
|
||
|
}
|
||
|
result.west = west;
|
||
|
result.south = south;
|
||
|
result.east = east;
|
||
|
result.north = north;
|
||
|
return result;
|
||
|
};
|
||
|
GeographicTilingScheme.prototype.positionToTileXY = function(position, level, result) {
|
||
|
const rectangle = this._rectangle;
|
||
|
if (!Rectangle_default.contains(rectangle, position)) {
|
||
|
return void 0;
|
||
|
}
|
||
|
const xTiles = this.getNumberOfXTilesAtLevel(level);
|
||
|
const yTiles = this.getNumberOfYTilesAtLevel(level);
|
||
|
const xTileWidth = rectangle.width / xTiles;
|
||
|
const yTileHeight = rectangle.height / yTiles;
|
||
|
let longitude = position.longitude;
|
||
|
if (rectangle.east < rectangle.west) {
|
||
|
longitude += Math_default.TWO_PI;
|
||
|
}
|
||
|
let xTileCoordinate = (longitude - rectangle.west) / xTileWidth | 0;
|
||
|
if (xTileCoordinate >= xTiles) {
|
||
|
xTileCoordinate = xTiles - 1;
|
||
|
}
|
||
|
let yTileCoordinate = (rectangle.north - position.latitude) / yTileHeight | 0;
|
||
|
if (yTileCoordinate >= yTiles) {
|
||
|
yTileCoordinate = yTiles - 1;
|
||
|
}
|
||
|
if (!defined_default(result)) {
|
||
|
return new Cartesian2_default(xTileCoordinate, yTileCoordinate);
|
||
|
}
|
||
|
result.x = xTileCoordinate;
|
||
|
result.y = yTileCoordinate;
|
||
|
return result;
|
||
|
};
|
||
|
var GeographicTilingScheme_default = GeographicTilingScheme;
|
||
|
|
||
|
// packages/engine/Source/Core/ApproximateTerrainHeights.js
|
||
|
var scratchDiagonalCartesianNE = new Cartesian3_default();
|
||
|
var scratchDiagonalCartesianSW = new Cartesian3_default();
|
||
|
var scratchDiagonalCartographic = new Cartographic_default();
|
||
|
var scratchCenterCartesian = new Cartesian3_default();
|
||
|
var scratchSurfaceCartesian = new Cartesian3_default();
|
||
|
var scratchBoundingSphere = new BoundingSphere_default();
|
||
|
var tilingScheme = new GeographicTilingScheme_default();
|
||
|
var scratchCorners = [
|
||
|
new Cartographic_default(),
|
||
|
new Cartographic_default(),
|
||
|
new Cartographic_default(),
|
||
|
new Cartographic_default()
|
||
|
];
|
||
|
var scratchTileXY = new Cartesian2_default();
|
||
|
var ApproximateTerrainHeights = {};
|
||
|
ApproximateTerrainHeights.initialize = function() {
|
||
|
let initPromise = ApproximateTerrainHeights._initPromise;
|
||
|
if (defined_default(initPromise)) {
|
||
|
return initPromise;
|
||
|
}
|
||
|
initPromise = Resource_default.fetchJson(
|
||
|
buildModuleUrl_default("Assets/approximateTerrainHeights.json")
|
||
|
).then(function(json) {
|
||
|
ApproximateTerrainHeights._terrainHeights = json;
|
||
|
});
|
||
|
ApproximateTerrainHeights._initPromise = initPromise;
|
||
|
return initPromise;
|
||
|
};
|
||
|
ApproximateTerrainHeights.getMinimumMaximumHeights = function(rectangle, ellipsoid) {
|
||
|
Check_default.defined("rectangle", rectangle);
|
||
|
if (!defined_default(ApproximateTerrainHeights._terrainHeights)) {
|
||
|
throw new DeveloperError_default(
|
||
|
"You must call ApproximateTerrainHeights.initialize and wait for the promise to resolve before using this function"
|
||
|
);
|
||
|
}
|
||
|
ellipsoid = defaultValue_default(ellipsoid, Ellipsoid_default.WGS84);
|
||
|
const xyLevel = getTileXYLevel(rectangle);
|
||
|
let minTerrainHeight = ApproximateTerrainHeights._defaultMinTerrainHeight;
|
||
|
let maxTerrainHeight = ApproximateTerrainHeights._defaultMaxTerrainHeight;
|
||
|
if (defined_default(xyLevel)) {
|
||
|
const key = `${xyLevel.level}-${xyLevel.x}-${xyLevel.y}`;
|
||
|
const heights = ApproximateTerrainHeights._terrainHeights[key];
|
||
|
if (defined_default(heights)) {
|
||
|
minTerrainHeight = heights[0];
|
||
|
maxTerrainHeight = heights[1];
|
||
|
}
|
||
|
ellipsoid.cartographicToCartesian(
|
||
|
Rectangle_default.northeast(rectangle, scratchDiagonalCartographic),
|
||
|
scratchDiagonalCartesianNE
|
||
|
);
|
||
|
ellipsoid.cartographicToCartesian(
|
||
|
Rectangle_default.southwest(rectangle, scratchDiagonalCartographic),
|
||
|
scratchDiagonalCartesianSW
|
||
|
);
|
||
|
Cartesian3_default.midpoint(
|
||
|
scratchDiagonalCartesianSW,
|
||
|
scratchDiagonalCartesianNE,
|
||
|
scratchCenterCartesian
|
||
|
);
|
||
|
const surfacePosition = ellipsoid.scaleToGeodeticSurface(
|
||
|
scratchCenterCartesian,
|
||
|
scratchSurfaceCartesian
|
||
|
);
|
||
|
if (defined_default(surfacePosition)) {
|
||
|
const distance = Cartesian3_default.distance(
|
||
|
scratchCenterCartesian,
|
||
|
surfacePosition
|
||
|
);
|
||
|
minTerrainHeight = Math.min(minTerrainHeight, -distance);
|
||
|
} else {
|
||
|
minTerrainHeight = ApproximateTerrainHeights._defaultMinTerrainHeight;
|
||
|
}
|
||
|
}
|
||
|
minTerrainHeight = Math.max(
|
||
|
ApproximateTerrainHeights._defaultMinTerrainHeight,
|
||
|
minTerrainHeight
|
||
|
);
|
||
|
return {
|
||
|
minimumTerrainHeight: minTerrainHeight,
|
||
|
maximumTerrainHeight: maxTerrainHeight
|
||
|
};
|
||
|
};
|
||
|
ApproximateTerrainHeights.getBoundingSphere = function(rectangle, ellipsoid) {
|
||
|
Check_default.defined("rectangle", rectangle);
|
||
|
if (!defined_default(ApproximateTerrainHeights._terrainHeights)) {
|
||
|
throw new DeveloperError_default(
|
||
|
"You must call ApproximateTerrainHeights.initialize and wait for the promise to resolve before using this function"
|
||
|
);
|
||
|
}
|
||
|
ellipsoid = defaultValue_default(ellipsoid, Ellipsoid_default.WGS84);
|
||
|
const xyLevel = getTileXYLevel(rectangle);
|
||
|
let maxTerrainHeight = ApproximateTerrainHeights._defaultMaxTerrainHeight;
|
||
|
if (defined_default(xyLevel)) {
|
||
|
const key = `${xyLevel.level}-${xyLevel.x}-${xyLevel.y}`;
|
||
|
const heights = ApproximateTerrainHeights._terrainHeights[key];
|
||
|
if (defined_default(heights)) {
|
||
|
maxTerrainHeight = heights[1];
|
||
|
}
|
||
|
}
|
||
|
const result = BoundingSphere_default.fromRectangle3D(rectangle, ellipsoid, 0);
|
||
|
BoundingSphere_default.fromRectangle3D(
|
||
|
rectangle,
|
||
|
ellipsoid,
|
||
|
maxTerrainHeight,
|
||
|
scratchBoundingSphere
|
||
|
);
|
||
|
return BoundingSphere_default.union(result, scratchBoundingSphere, result);
|
||
|
};
|
||
|
function getTileXYLevel(rectangle) {
|
||
|
Cartographic_default.fromRadians(
|
||
|
rectangle.east,
|
||
|
rectangle.north,
|
||
|
0,
|
||
|
scratchCorners[0]
|
||
|
);
|
||
|
Cartographic_default.fromRadians(
|
||
|
rectangle.west,
|
||
|
rectangle.north,
|
||
|
0,
|
||
|
scratchCorners[1]
|
||
|
);
|
||
|
Cartographic_default.fromRadians(
|
||
|
rectangle.east,
|
||
|
rectangle.south,
|
||
|
0,
|
||
|
scratchCorners[2]
|
||
|
);
|
||
|
Cartographic_default.fromRadians(
|
||
|
rectangle.west,
|
||
|
rectangle.south,
|
||
|
0,
|
||
|
scratchCorners[3]
|
||
|
);
|
||
|
let lastLevelX = 0, lastLevelY = 0;
|
||
|
let currentX = 0, currentY = 0;
|
||
|
const maxLevel = ApproximateTerrainHeights._terrainHeightsMaxLevel;
|
||
|
let i;
|
||
|
for (i = 0; i <= maxLevel; ++i) {
|
||
|
let failed = false;
|
||
|
for (let j = 0; j < 4; ++j) {
|
||
|
const corner = scratchCorners[j];
|
||
|
tilingScheme.positionToTileXY(corner, i, scratchTileXY);
|
||
|
if (j === 0) {
|
||
|
currentX = scratchTileXY.x;
|
||
|
currentY = scratchTileXY.y;
|
||
|
} else if (currentX !== scratchTileXY.x || currentY !== scratchTileXY.y) {
|
||
|
failed = true;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
if (failed) {
|
||
|
break;
|
||
|
}
|
||
|
lastLevelX = currentX;
|
||
|
lastLevelY = currentY;
|
||
|
}
|
||
|
if (i === 0) {
|
||
|
return void 0;
|
||
|
}
|
||
|
return {
|
||
|
x: lastLevelX,
|
||
|
y: lastLevelY,
|
||
|
level: i > maxLevel ? maxLevel : i - 1
|
||
|
};
|
||
|
}
|
||
|
ApproximateTerrainHeights._terrainHeightsMaxLevel = 6;
|
||
|
ApproximateTerrainHeights._defaultMaxTerrainHeight = 9e3;
|
||
|
ApproximateTerrainHeights._defaultMinTerrainHeight = -1e5;
|
||
|
ApproximateTerrainHeights._terrainHeights = void 0;
|
||
|
ApproximateTerrainHeights._initPromise = void 0;
|
||
|
Object.defineProperties(ApproximateTerrainHeights, {
|
||
|
/**
|
||
|
* Determines if the terrain heights are initialized and ready to use. To initialize the terrain heights,
|
||
|
* call {@link ApproximateTerrainHeights#initialize} and wait for the returned promise to resolve.
|
||
|
* @type {boolean}
|
||
|
* @readonly
|
||
|
* @memberof ApproximateTerrainHeights
|
||
|
*/
|
||
|
initialized: {
|
||
|
get: function() {
|
||
|
return defined_default(ApproximateTerrainHeights._terrainHeights);
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
var ApproximateTerrainHeights_default = ApproximateTerrainHeights;
|
||
|
|
||
|
// packages/engine/Source/Core/GroundPolylineGeometry.js
|
||
|
var PROJECTIONS = [GeographicProjection_default, WebMercatorProjection_default];
|
||
|
var PROJECTION_COUNT = PROJECTIONS.length;
|
||
|
var MITER_BREAK_SMALL = Math.cos(Math_default.toRadians(30));
|
||
|
var MITER_BREAK_LARGE = Math.cos(Math_default.toRadians(150));
|
||
|
var WALL_INITIAL_MIN_HEIGHT = 0;
|
||
|
var WALL_INITIAL_MAX_HEIGHT = 1e3;
|
||
|
function GroundPolylineGeometry(options) {
|
||
|
options = defaultValue_default(options, defaultValue_default.EMPTY_OBJECT);
|
||
|
const positions = options.positions;
|
||
|
if (!defined_default(positions) || positions.length < 2) {
|
||
|
throw new DeveloperError_default("At least two positions are required.");
|
||
|
}
|
||
|
if (defined_default(options.arcType) && options.arcType !== ArcType_default.GEODESIC && options.arcType !== ArcType_default.RHUMB) {
|
||
|
throw new DeveloperError_default(
|
||
|
"Valid options for arcType are ArcType.GEODESIC and ArcType.RHUMB."
|
||
|
);
|
||
|
}
|
||
|
this.width = defaultValue_default(options.width, 1);
|
||
|
this._positions = positions;
|
||
|
this.granularity = defaultValue_default(options.granularity, 9999);
|
||
|
this.loop = defaultValue_default(options.loop, false);
|
||
|
this.arcType = defaultValue_default(options.arcType, ArcType_default.GEODESIC);
|
||
|
this._ellipsoid = Ellipsoid_default.WGS84;
|
||
|
this._projectionIndex = 0;
|
||
|
this._workerName = "createGroundPolylineGeometry";
|
||
|
this._scene3DOnly = false;
|
||
|
}
|
||
|
Object.defineProperties(GroundPolylineGeometry.prototype, {
|
||
|
/**
|
||
|
* The number of elements used to pack the object into an array.
|
||
|
* @memberof GroundPolylineGeometry.prototype
|
||
|
* @type {number}
|
||
|
* @readonly
|
||
|
* @private
|
||
|
*/
|
||
|
packedLength: {
|
||
|
get: function() {
|
||
|
return 1 + this._positions.length * 3 + 1 + 1 + 1 + Ellipsoid_default.packedLength + 1 + 1;
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
GroundPolylineGeometry.setProjectionAndEllipsoid = function(groundPolylineGeometry, mapProjection) {
|
||
|
let projectionIndex = 0;
|
||
|
for (let i = 0; i < PROJECTION_COUNT; i++) {
|
||
|
if (mapProjection instanceof PROJECTIONS[i]) {
|
||
|
projectionIndex = i;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
groundPolylineGeometry._projectionIndex = projectionIndex;
|
||
|
groundPolylineGeometry._ellipsoid = mapProjection.ellipsoid;
|
||
|
};
|
||
|
var cart3Scratch1 = new Cartesian3_default();
|
||
|
var cart3Scratch2 = new Cartesian3_default();
|
||
|
var cart3Scratch3 = new Cartesian3_default();
|
||
|
function computeRightNormal(start, end, maxHeight, ellipsoid, result) {
|
||
|
const startBottom = getPosition(ellipsoid, start, 0, cart3Scratch1);
|
||
|
const startTop = getPosition(ellipsoid, start, maxHeight, cart3Scratch2);
|
||
|
const endBottom = getPosition(ellipsoid, end, 0, cart3Scratch3);
|
||
|
const up = direction(startTop, startBottom, cart3Scratch2);
|
||
|
const forward = direction(endBottom, startBottom, cart3Scratch3);
|
||
|
Cartesian3_default.cross(forward, up, result);
|
||
|
return Cartesian3_default.normalize(result, result);
|
||
|
}
|
||
|
var interpolatedCartographicScratch = new Cartographic_default();
|
||
|
var interpolatedBottomScratch = new Cartesian3_default();
|
||
|
var interpolatedTopScratch = new Cartesian3_default();
|
||
|
var interpolatedNormalScratch = new Cartesian3_default();
|
||
|
function interpolateSegment(start, end, minHeight, maxHeight, granularity, arcType, ellipsoid, normalsArray, bottomPositionsArray, topPositionsArray, cartographicsArray) {
|
||
|
if (granularity === 0) {
|
||
|
return;
|
||
|
}
|
||
|
let ellipsoidLine;
|
||
|
if (arcType === ArcType_default.GEODESIC) {
|
||
|
ellipsoidLine = new EllipsoidGeodesic_default(start, end, ellipsoid);
|
||
|
} else if (arcType === ArcType_default.RHUMB) {
|
||
|
ellipsoidLine = new EllipsoidRhumbLine_default(start, end, ellipsoid);
|
||
|
}
|
||
|
const surfaceDistance = ellipsoidLine.surfaceDistance;
|
||
|
if (surfaceDistance < granularity) {
|
||
|
return;
|
||
|
}
|
||
|
const interpolatedNormal = computeRightNormal(
|
||
|
start,
|
||
|
end,
|
||
|
maxHeight,
|
||
|
ellipsoid,
|
||
|
interpolatedNormalScratch
|
||
|
);
|
||
|
const segments = Math.ceil(surfaceDistance / granularity);
|
||
|
const interpointDistance = surfaceDistance / segments;
|
||
|
let distanceFromStart = interpointDistance;
|
||
|
const pointsToAdd = segments - 1;
|
||
|
let packIndex = normalsArray.length;
|
||
|
for (let i = 0; i < pointsToAdd; i++) {
|
||
|
const interpolatedCartographic = ellipsoidLine.interpolateUsingSurfaceDistance(
|
||
|
distanceFromStart,
|
||
|
interpolatedCartographicScratch
|
||
|
);
|
||
|
const interpolatedBottom = getPosition(
|
||
|
ellipsoid,
|
||
|
interpolatedCartographic,
|
||
|
minHeight,
|
||
|
interpolatedBottomScratch
|
||
|
);
|
||
|
const interpolatedTop = getPosition(
|
||
|
ellipsoid,
|
||
|
interpolatedCartographic,
|
||
|
maxHeight,
|
||
|
interpolatedTopScratch
|
||
|
);
|
||
|
Cartesian3_default.pack(interpolatedNormal, normalsArray, packIndex);
|
||
|
Cartesian3_default.pack(interpolatedBottom, bottomPositionsArray, packIndex);
|
||
|
Cartesian3_default.pack(interpolatedTop, topPositionsArray, packIndex);
|
||
|
cartographicsArray.push(interpolatedCartographic.latitude);
|
||
|
cartographicsArray.push(interpolatedCartographic.longitude);
|
||
|
packIndex += 3;
|
||
|
distanceFromStart += interpointDistance;
|
||
|
}
|
||
|
}
|
||
|
var heightlessCartographicScratch = new Cartographic_default();
|
||
|
function getPosition(ellipsoid, cartographic, height, result) {
|
||
|
Cartographic_default.clone(cartographic, heightlessCartographicScratch);
|
||
|
heightlessCartographicScratch.height = height;
|
||
|
return Cartographic_default.toCartesian(
|
||
|
heightlessCartographicScratch,
|
||
|
ellipsoid,
|
||
|
result
|
||
|
);
|
||
|
}
|
||
|
GroundPolylineGeometry.pack = function(value, array, startingIndex) {
|
||
|
Check_default.typeOf.object("value", value);
|
||
|
Check_default.defined("array", array);
|
||
|
let index = defaultValue_default(startingIndex, 0);
|
||
|
const positions = value._positions;
|
||
|
const positionsLength = positions.length;
|
||
|
array[index++] = positionsLength;
|
||
|
for (let i = 0; i < positionsLength; ++i) {
|
||
|
const cartesian = positions[i];
|
||
|
Cartesian3_default.pack(cartesian, array, index);
|
||
|
index += 3;
|
||
|
}
|
||
|
array[index++] = value.granularity;
|
||
|
array[index++] = value.loop ? 1 : 0;
|
||
|
array[index++] = value.arcType;
|
||
|
Ellipsoid_default.pack(value._ellipsoid, array, index);
|
||
|
index += Ellipsoid_default.packedLength;
|
||
|
array[index++] = value._projectionIndex;
|
||
|
array[index++] = value._scene3DOnly ? 1 : 0;
|
||
|
return array;
|
||
|
};
|
||
|
GroundPolylineGeometry.unpack = function(array, startingIndex, result) {
|
||
|
Check_default.defined("array", array);
|
||
|
let index = defaultValue_default(startingIndex, 0);
|
||
|
const positionsLength = array[index++];
|
||
|
const positions = new Array(positionsLength);
|
||
|
for (let i = 0; i < positionsLength; i++) {
|
||
|
positions[i] = Cartesian3_default.unpack(array, index);
|
||
|
index += 3;
|
||
|
}
|
||
|
const granularity = array[index++];
|
||
|
const loop = array[index++] === 1;
|
||
|
const arcType = array[index++];
|
||
|
const ellipsoid = Ellipsoid_default.unpack(array, index);
|
||
|
index += Ellipsoid_default.packedLength;
|
||
|
const projectionIndex = array[index++];
|
||
|
const scene3DOnly = array[index++] === 1;
|
||
|
if (!defined_default(result)) {
|
||
|
result = new GroundPolylineGeometry({
|
||
|
positions
|
||
|
});
|
||
|
}
|
||
|
result._positions = positions;
|
||
|
result.granularity = granularity;
|
||
|
result.loop = loop;
|
||
|
result.arcType = arcType;
|
||
|
result._ellipsoid = ellipsoid;
|
||
|
result._projectionIndex = projectionIndex;
|
||
|
result._scene3DOnly = scene3DOnly;
|
||
|
return result;
|
||
|
};
|
||
|
function direction(target, origin, result) {
|
||
|
Cartesian3_default.subtract(target, origin, result);
|
||
|
Cartesian3_default.normalize(result, result);
|
||
|
return result;
|
||
|
}
|
||
|
function tangentDirection(target, origin, up, result) {
|
||
|
result = direction(target, origin, result);
|
||
|
result = Cartesian3_default.cross(result, up, result);
|
||
|
result = Cartesian3_default.normalize(result, result);
|
||
|
result = Cartesian3_default.cross(up, result, result);
|
||
|
return result;
|
||
|
}
|
||
|
var toPreviousScratch = new Cartesian3_default();
|
||
|
var toNextScratch = new Cartesian3_default();
|
||
|
var forwardScratch = new Cartesian3_default();
|
||
|
var vertexUpScratch = new Cartesian3_default();
|
||
|
var cosine90 = 0;
|
||
|
var cosine180 = -1;
|
||
|
function computeVertexMiterNormal(previousBottom, vertexBottom, vertexTop, nextBottom, result) {
|
||
|
const up = direction(vertexTop, vertexBottom, vertexUpScratch);
|
||
|
const toPrevious = tangentDirection(
|
||
|
previousBottom,
|
||
|
vertexBottom,
|
||
|
up,
|
||
|
toPreviousScratch
|
||
|
);
|
||
|
const toNext = tangentDirection(nextBottom, vertexBottom, up, toNextScratch);
|
||
|
if (Math_default.equalsEpsilon(
|
||
|
Cartesian3_default.dot(toPrevious, toNext),
|
||
|
cosine180,
|
||
|
Math_default.EPSILON5
|
||
|
)) {
|
||
|
result = Cartesian3_default.cross(up, toPrevious, result);
|
||
|
result = Cartesian3_default.normalize(result, result);
|
||
|
return result;
|
||
|
}
|
||
|
result = Cartesian3_default.add(toNext, toPrevious, result);
|
||
|
result = Cartesian3_default.normalize(result, result);
|
||
|
const forward = Cartesian3_default.cross(up, result, forwardScratch);
|
||
|
if (Cartesian3_default.dot(toNext, forward) < cosine90) {
|
||
|
result = Cartesian3_default.negate(result, result);
|
||
|
}
|
||
|
return result;
|
||
|
}
|
||
|
var XZ_PLANE = Plane_default.fromPointNormal(Cartesian3_default.ZERO, Cartesian3_default.UNIT_Y);
|
||
|
var previousBottomScratch = new Cartesian3_default();
|
||
|
var vertexBottomScratch = new Cartesian3_default();
|
||
|
var vertexTopScratch = new Cartesian3_default();
|
||
|
var nextBottomScratch = new Cartesian3_default();
|
||
|
var vertexNormalScratch = new Cartesian3_default();
|
||
|
var intersectionScratch = new Cartesian3_default();
|
||
|
var cartographicScratch0 = new Cartographic_default();
|
||
|
var cartographicScratch1 = new Cartographic_default();
|
||
|
var cartographicIntersectionScratch = new Cartographic_default();
|
||
|
GroundPolylineGeometry.createGeometry = function(groundPolylineGeometry) {
|
||
|
const compute2dAttributes = !groundPolylineGeometry._scene3DOnly;
|
||
|
let loop = groundPolylineGeometry.loop;
|
||
|
const ellipsoid = groundPolylineGeometry._ellipsoid;
|
||
|
const granularity = groundPolylineGeometry.granularity;
|
||
|
const arcType = groundPolylineGeometry.arcType;
|
||
|
const projection = new PROJECTIONS[groundPolylineGeometry._projectionIndex](
|
||
|
ellipsoid
|
||
|
);
|
||
|
const minHeight = WALL_INITIAL_MIN_HEIGHT;
|
||
|
const maxHeight = WALL_INITIAL_MAX_HEIGHT;
|
||
|
let index;
|
||
|
let i;
|
||
|
const positions = groundPolylineGeometry._positions;
|
||
|
const positionsLength = positions.length;
|
||
|
if (positionsLength === 2) {
|
||
|
loop = false;
|
||
|
}
|
||
|
let p0;
|
||
|
let p1;
|
||
|
let c0;
|
||
|
let c1;
|
||
|
const rhumbLine = new EllipsoidRhumbLine_default(void 0, void 0, ellipsoid);
|
||
|
let intersection;
|
||
|
let intersectionCartographic;
|
||
|
let intersectionLongitude;
|
||
|
const splitPositions = [positions[0]];
|
||
|
for (i = 0; i < positionsLength - 1; i++) {
|
||
|
p0 = positions[i];
|
||
|
p1 = positions[i + 1];
|
||
|
intersection = IntersectionTests_default.lineSegmentPlane(
|
||
|
p0,
|
||
|
p1,
|
||
|
XZ_PLANE,
|
||
|
intersectionScratch
|
||
|
);
|
||
|
if (defined_default(intersection) && !Cartesian3_default.equalsEpsilon(intersection, p0, Math_default.EPSILON7) && !Cartesian3_default.equalsEpsilon(intersection, p1, Math_default.EPSILON7)) {
|
||
|
if (groundPolylineGeometry.arcType === ArcType_default.GEODESIC) {
|
||
|
splitPositions.push(Cartesian3_default.clone(intersection));
|
||
|
} else if (groundPolylineGeometry.arcType === ArcType_default.RHUMB) {
|
||
|
intersectionLongitude = ellipsoid.cartesianToCartographic(
|
||
|
intersection,
|
||
|
cartographicScratch0
|
||
|
).longitude;
|
||
|
c0 = ellipsoid.cartesianToCartographic(p0, cartographicScratch0);
|
||
|
c1 = ellipsoid.cartesianToCartographic(p1, cartographicScratch1);
|
||
|
rhumbLine.setEndPoints(c0, c1);
|
||
|
intersectionCartographic = rhumbLine.findIntersectionWithLongitude(
|
||
|
intersectionLongitude,
|
||
|
cartographicIntersectionScratch
|
||
|
);
|
||
|
intersection = ellipsoid.cartographicToCartesian(
|
||
|
intersectionCartographic,
|
||
|
intersectionScratch
|
||
|
);
|
||
|
if (defined_default(intersection) && !Cartesian3_default.equalsEpsilon(intersection, p0, Math_default.EPSILON7) && !Cartesian3_default.equalsEpsilon(intersection, p1, Math_default.EPSILON7)) {
|
||
|
splitPositions.push(Cartesian3_default.clone(intersection));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
splitPositions.push(p1);
|
||
|
}
|
||
|
if (loop) {
|
||
|
p0 = positions[positionsLength - 1];
|
||
|
p1 = positions[0];
|
||
|
intersection = IntersectionTests_default.lineSegmentPlane(
|
||
|
p0,
|
||
|
p1,
|
||
|
XZ_PLANE,
|
||
|
intersectionScratch
|
||
|
);
|
||
|
if (defined_default(intersection) && !Cartesian3_default.equalsEpsilon(intersection, p0, Math_default.EPSILON7) && !Cartesian3_default.equalsEpsilon(intersection, p1, Math_default.EPSILON7)) {
|
||
|
if (groundPolylineGeometry.arcType === ArcType_default.GEODESIC) {
|
||
|
splitPositions.push(Cartesian3_default.clone(intersection));
|
||
|
} else if (groundPolylineGeometry.arcType === ArcType_default.RHUMB) {
|
||
|
intersectionLongitude = ellipsoid.cartesianToCartographic(
|
||
|
intersection,
|
||
|
cartographicScratch0
|
||
|
).longitude;
|
||
|
c0 = ellipsoid.cartesianToCartographic(p0, cartographicScratch0);
|
||
|
c1 = ellipsoid.cartesianToCartographic(p1, cartographicScratch1);
|
||
|
rhumbLine.setEndPoints(c0, c1);
|
||
|
intersectionCartographic = rhumbLine.findIntersectionWithLongitude(
|
||
|
intersectionLongitude,
|
||
|
cartographicIntersectionScratch
|
||
|
);
|
||
|
intersection = ellipsoid.cartographicToCartesian(
|
||
|
intersectionCartographic,
|
||
|
intersectionScratch
|
||
|
);
|
||
|
if (defined_default(intersection) && !Cartesian3_default.equalsEpsilon(intersection, p0, Math_default.EPSILON7) && !Cartesian3_default.equalsEpsilon(intersection, p1, Math_default.EPSILON7)) {
|
||
|
splitPositions.push(Cartesian3_default.clone(intersection));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
let cartographicsLength = splitPositions.length;
|
||
|
let cartographics = new Array(cartographicsLength);
|
||
|
for (i = 0; i < cartographicsLength; i++) {
|
||
|
const cartographic = Cartographic_default.fromCartesian(
|
||
|
splitPositions[i],
|
||
|
ellipsoid
|
||
|
);
|
||
|
cartographic.height = 0;
|
||
|
cartographics[i] = cartographic;
|
||
|
}
|
||
|
cartographics = arrayRemoveDuplicates_default(
|
||
|
cartographics,
|
||
|
Cartographic_default.equalsEpsilon
|
||
|
);
|
||
|
cartographicsLength = cartographics.length;
|
||
|
if (cartographicsLength < 2) {
|
||
|
return void 0;
|
||
|
}
|
||
|
const cartographicsArray = [];
|
||
|
const normalsArray = [];
|
||
|
const bottomPositionsArray = [];
|
||
|
const topPositionsArray = [];
|
||
|
let previousBottom = previousBottomScratch;
|
||
|
let vertexBottom = vertexBottomScratch;
|
||
|
let vertexTop = vertexTopScratch;
|
||
|
let nextBottom = nextBottomScratch;
|
||
|
let vertexNormal = vertexNormalScratch;
|
||
|
const startCartographic = cartographics[0];
|
||
|
const nextCartographic = cartographics[1];
|
||
|
const prestartCartographic = cartographics[cartographicsLength - 1];
|
||
|
previousBottom = getPosition(
|
||
|
ellipsoid,
|
||
|
prestartCartographic,
|
||
|
minHeight,
|
||
|
previousBottom
|
||
|
);
|
||
|
nextBottom = getPosition(ellipsoid, nextCartographic, minHeight, nextBottom);
|
||
|
vertexBottom = getPosition(
|
||
|
ellipsoid,
|
||
|
startCartographic,
|
||
|
minHeight,
|
||
|
vertexBottom
|
||
|
);
|
||
|
vertexTop = getPosition(ellipsoid, startCartographic, maxHeight, vertexTop);
|
||
|
if (loop) {
|
||
|
vertexNormal = computeVertexMiterNormal(
|
||
|
previousBottom,
|
||
|
vertexBottom,
|
||
|
vertexTop,
|
||
|
nextBottom,
|
||
|
vertexNormal
|
||
|
);
|
||
|
} else {
|
||
|
vertexNormal = computeRightNormal(
|
||
|
startCartographic,
|
||
|
nextCartographic,
|
||
|
maxHeight,
|
||
|
ellipsoid,
|
||
|
vertexNormal
|
||
|
);
|
||
|
}
|
||
|
Cartesian3_default.pack(vertexNormal, normalsArray, 0);
|
||
|
Cartesian3_default.pack(vertexBottom, bottomPositionsArray, 0);
|
||
|
Cartesian3_default.pack(vertexTop, topPositionsArray, 0);
|
||
|
cartographicsArray.push(startCartographic.latitude);
|
||
|
cartographicsArray.push(startCartographic.longitude);
|
||
|
interpolateSegment(
|
||
|
startCartographic,
|
||
|
nextCartographic,
|
||
|
minHeight,
|
||
|
maxHeight,
|
||
|
granularity,
|
||
|
arcType,
|
||
|
ellipsoid,
|
||
|
normalsArray,
|
||
|
bottomPositionsArray,
|
||
|
topPositionsArray,
|
||
|
cartographicsArray
|
||
|
);
|
||
|
for (i = 1; i < cartographicsLength - 1; ++i) {
|
||
|
previousBottom = Cartesian3_default.clone(vertexBottom, previousBottom);
|
||
|
vertexBottom = Cartesian3_default.clone(nextBottom, vertexBottom);
|
||
|
const vertexCartographic = cartographics[i];
|
||
|
getPosition(ellipsoid, vertexCartographic, maxHeight, vertexTop);
|
||
|
getPosition(ellipsoid, cartographics[i + 1], minHeight, nextBottom);
|
||
|
computeVertexMiterNormal(
|
||
|
previousBottom,
|
||
|
vertexBottom,
|
||
|
vertexTop,
|
||
|
nextBottom,
|
||
|
vertexNormal
|
||
|
);
|
||
|
index = normalsArray.length;
|
||
|
Cartesian3_default.pack(vertexNormal, normalsArray, index);
|
||
|
Cartesian3_default.pack(vertexBottom, bottomPositionsArray, index);
|
||
|
Cartesian3_default.pack(vertexTop, topPositionsArray, index);
|
||
|
cartographicsArray.push(vertexCartographic.latitude);
|
||
|
cartographicsArray.push(vertexCartographic.longitude);
|
||
|
interpolateSegment(
|
||
|
cartographics[i],
|
||
|
cartographics[i + 1],
|
||
|
minHeight,
|
||
|
maxHeight,
|
||
|
granularity,
|
||
|
arcType,
|
||
|
ellipsoid,
|
||
|
normalsArray,
|
||
|
bottomPositionsArray,
|
||
|
topPositionsArray,
|
||
|
cartographicsArray
|
||
|
);
|
||
|
}
|
||
|
const endCartographic = cartographics[cartographicsLength - 1];
|
||
|
const preEndCartographic = cartographics[cartographicsLength - 2];
|
||
|
vertexBottom = getPosition(
|
||
|
ellipsoid,
|
||
|
endCartographic,
|
||
|
minHeight,
|
||
|
vertexBottom
|
||
|
);
|
||
|
vertexTop = getPosition(ellipsoid, endCartographic, maxHeight, vertexTop);
|
||
|
if (loop) {
|
||
|
const postEndCartographic = cartographics[0];
|
||
|
previousBottom = getPosition(
|
||
|
ellipsoid,
|
||
|
preEndCartographic,
|
||
|
minHeight,
|
||
|
previousBottom
|
||
|
);
|
||
|
nextBottom = getPosition(
|
||
|
ellipsoid,
|
||
|
postEndCartographic,
|
||
|
minHeight,
|
||
|
nextBottom
|
||
|
);
|
||
|
vertexNormal = computeVertexMiterNormal(
|
||
|
previousBottom,
|
||
|
vertexBottom,
|
||
|
vertexTop,
|
||
|
nextBottom,
|
||
|
vertexNormal
|
||
|
);
|
||
|
} else {
|
||
|
vertexNormal = computeRightNormal(
|
||
|
preEndCartographic,
|
||
|
endCartographic,
|
||
|
maxHeight,
|
||
|
ellipsoid,
|
||
|
vertexNormal
|
||
|
);
|
||
|
}
|
||
|
index = normalsArray.length;
|
||
|
Cartesian3_default.pack(vertexNormal, normalsArray, index);
|
||
|
Cartesian3_default.pack(vertexBottom, bottomPositionsArray, index);
|
||
|
Cartesian3_default.pack(vertexTop, topPositionsArray, index);
|
||
|
cartographicsArray.push(endCartographic.latitude);
|
||
|
cartographicsArray.push(endCartographic.longitude);
|
||
|
if (loop) {
|
||
|
interpolateSegment(
|
||
|
endCartographic,
|
||
|
startCartographic,
|
||
|
minHeight,
|
||
|
maxHeight,
|
||
|
granularity,
|
||
|
arcType,
|
||
|
ellipsoid,
|
||
|
normalsArray,
|
||
|
bottomPositionsArray,
|
||
|
topPositionsArray,
|
||
|
cartographicsArray
|
||
|
);
|
||
|
index = normalsArray.length;
|
||
|
for (i = 0; i < 3; ++i) {
|
||
|
normalsArray[index + i] = normalsArray[i];
|
||
|
bottomPositionsArray[index + i] = bottomPositionsArray[i];
|
||
|
topPositionsArray[index + i] = topPositionsArray[i];
|
||
|
}
|
||
|
cartographicsArray.push(startCartographic.latitude);
|
||
|
cartographicsArray.push(startCartographic.longitude);
|
||
|
}
|
||
|
return generateGeometryAttributes(
|
||
|
loop,
|
||
|
projection,
|
||
|
bottomPositionsArray,
|
||
|
topPositionsArray,
|
||
|
normalsArray,
|
||
|
cartographicsArray,
|
||
|
compute2dAttributes
|
||
|
);
|
||
|
};
|
||
|
var lineDirectionScratch = new Cartesian3_default();
|
||
|
var matrix3Scratch = new Matrix3_default();
|
||
|
var quaternionScratch = new Quaternion_default();
|
||
|
function breakMiter(endGeometryNormal, startBottom, endBottom, endTop) {
|
||
|
const lineDirection = direction(endBottom, startBottom, lineDirectionScratch);
|
||
|
const dot = Cartesian3_default.dot(lineDirection, endGeometryNormal);
|
||
|
if (dot > MITER_BREAK_SMALL || dot < MITER_BREAK_LARGE) {
|
||
|
const vertexUp = direction(endTop, endBottom, vertexUpScratch);
|
||
|
const angle = dot < MITER_BREAK_LARGE ? Math_default.PI_OVER_TWO : -Math_default.PI_OVER_TWO;
|
||
|
const quaternion = Quaternion_default.fromAxisAngle(
|
||
|
vertexUp,
|
||
|
angle,
|
||
|
quaternionScratch
|
||
|
);
|
||
|
const rotationMatrix = Matrix3_default.fromQuaternion(quaternion, matrix3Scratch);
|
||
|
Matrix3_default.multiplyByVector(
|
||
|
rotationMatrix,
|
||
|
endGeometryNormal,
|
||
|
endGeometryNormal
|
||
|
);
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
var endPosCartographicScratch = new Cartographic_default();
|
||
|
var normalStartpointScratch = new Cartesian3_default();
|
||
|
var normalEndpointScratch = new Cartesian3_default();
|
||
|
function projectNormal(projection, cartographic, normal, projectedPosition, result) {
|
||
|
const position = Cartographic_default.toCartesian(
|
||
|
cartographic,
|
||
|
projection._ellipsoid,
|
||
|
normalStartpointScratch
|
||
|
);
|
||
|
let normalEndpoint = Cartesian3_default.add(position, normal, normalEndpointScratch);
|
||
|
let flipNormal = false;
|
||
|
const ellipsoid = projection._ellipsoid;
|
||
|
let normalEndpointCartographic = ellipsoid.cartesianToCartographic(
|
||
|
normalEndpoint,
|
||
|
endPosCartographicScratch
|
||
|
);
|
||
|
if (Math.abs(cartographic.longitude - normalEndpointCartographic.longitude) > Math_default.PI_OVER_TWO) {
|
||
|
flipNormal = true;
|
||
|
normalEndpoint = Cartesian3_default.subtract(
|
||
|
position,
|
||
|
normal,
|
||
|
normalEndpointScratch
|
||
|
);
|
||
|
normalEndpointCartographic = ellipsoid.cartesianToCartographic(
|
||
|
normalEndpoint,
|
||
|
endPosCartographicScratch
|
||
|
);
|
||
|
}
|
||
|
normalEndpointCartographic.height = 0;
|
||
|
const normalEndpointProjected = projection.project(
|
||
|
normalEndpointCartographic,
|
||
|
result
|
||
|
);
|
||
|
result = Cartesian3_default.subtract(
|
||
|
normalEndpointProjected,
|
||
|
projectedPosition,
|
||
|
result
|
||
|
);
|
||
|
result.z = 0;
|
||
|
result = Cartesian3_default.normalize(result, result);
|
||
|
if (flipNormal) {
|
||
|
Cartesian3_default.negate(result, result);
|
||
|
}
|
||
|
return result;
|
||
|
}
|
||
|
var adjustHeightNormalScratch = new Cartesian3_default();
|
||
|
var adjustHeightOffsetScratch = new Cartesian3_default();
|
||
|
function adjustHeights(bottom, top, minHeight, maxHeight, adjustHeightBottom, adjustHeightTop) {
|
||
|
const adjustHeightNormal = Cartesian3_default.subtract(
|
||
|
top,
|
||
|
bottom,
|
||
|
adjustHeightNormalScratch
|
||
|
);
|
||
|
Cartesian3_default.normalize(adjustHeightNormal, adjustHeightNormal);
|
||
|
const distanceForBottom = minHeight - WALL_INITIAL_MIN_HEIGHT;
|
||
|
let adjustHeightOffset = Cartesian3_default.multiplyByScalar(
|
||
|
adjustHeightNormal,
|
||
|
distanceForBottom,
|
||
|
adjustHeightOffsetScratch
|
||
|
);
|
||
|
Cartesian3_default.add(bottom, adjustHeightOffset, adjustHeightBottom);
|
||
|
const distanceForTop = maxHeight - WALL_INITIAL_MAX_HEIGHT;
|
||
|
adjustHeightOffset = Cartesian3_default.multiplyByScalar(
|
||
|
adjustHeightNormal,
|
||
|
distanceForTop,
|
||
|
adjustHeightOffsetScratch
|
||
|
);
|
||
|
Cartesian3_default.add(top, adjustHeightOffset, adjustHeightTop);
|
||
|
}
|
||
|
var nudgeDirectionScratch = new Cartesian3_default();
|
||
|
function nudgeXZ(start, end) {
|
||
|
const startToXZdistance = Plane_default.getPointDistance(XZ_PLANE, start);
|
||
|
const endToXZdistance = Plane_default.getPointDistance(XZ_PLANE, end);
|
||
|
let offset = nudgeDirectionScratch;
|
||
|
if (Math_default.equalsEpsilon(startToXZdistance, 0, Math_default.EPSILON2)) {
|
||
|
offset = direction(end, start, offset);
|
||
|
Cartesian3_default.multiplyByScalar(offset, Math_default.EPSILON2, offset);
|
||
|
Cartesian3_default.add(start, offset, start);
|
||
|
} else if (Math_default.equalsEpsilon(endToXZdistance, 0, Math_default.EPSILON2)) {
|
||
|
offset = direction(start, end, offset);
|
||
|
Cartesian3_default.multiplyByScalar(offset, Math_default.EPSILON2, offset);
|
||
|
Cartesian3_default.add(end, offset, end);
|
||
|
}
|
||
|
}
|
||
|
function nudgeCartographic(start, end) {
|
||
|
const absStartLon = Math.abs(start.longitude);
|
||
|
const absEndLon = Math.abs(end.longitude);
|
||
|
if (Math_default.equalsEpsilon(absStartLon, Math_default.PI, Math_default.EPSILON11)) {
|
||
|
const endSign = Math_default.sign(end.longitude);
|
||
|
start.longitude = endSign * (absStartLon - Math_default.EPSILON11);
|
||
|
return 1;
|
||
|
} else if (Math_default.equalsEpsilon(absEndLon, Math_default.PI, Math_default.EPSILON11)) {
|
||
|
const startSign = Math_default.sign(start.longitude);
|
||
|
end.longitude = startSign * (absEndLon - Math_default.EPSILON11);
|
||
|
return 2;
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
var startCartographicScratch = new Cartographic_default();
|
||
|
var endCartographicScratch = new Cartographic_default();
|
||
|
var segmentStartTopScratch = new Cartesian3_default();
|
||
|
var segmentEndTopScratch = new Cartesian3_default();
|
||
|
var segmentStartBottomScratch = new Cartesian3_default();
|
||
|
var segmentEndBottomScratch = new Cartesian3_default();
|
||
|
var segmentStartNormalScratch = new Cartesian3_default();
|
||
|
var segmentEndNormalScratch = new Cartesian3_default();
|
||
|
var getHeightCartographics = [
|
||
|
startCartographicScratch,
|
||
|
endCartographicScratch
|
||
|
];
|
||
|
var getHeightRectangleScratch = new Rectangle_default();
|
||
|
var adjustHeightStartTopScratch = new Cartesian3_default();
|
||
|
var adjustHeightEndTopScratch = new Cartesian3_default();
|
||
|
var adjustHeightStartBottomScratch = new Cartesian3_default();
|
||
|
var adjustHeightEndBottomScratch = new Cartesian3_default();
|
||
|
var segmentStart2DScratch = new Cartesian3_default();
|
||
|
var segmentEnd2DScratch = new Cartesian3_default();
|
||
|
var segmentStartNormal2DScratch = new Cartesian3_default();
|
||
|
var segmentEndNormal2DScratch = new Cartesian3_default();
|
||
|
var offsetScratch = new Cartesian3_default();
|
||
|
var startUpScratch = new Cartesian3_default();
|
||
|
var endUpScratch = new Cartesian3_default();
|
||
|
var rightScratch = new Cartesian3_default();
|
||
|
var startPlaneNormalScratch = new Cartesian3_default();
|
||
|
var endPlaneNormalScratch = new Cartesian3_default();
|
||
|
var encodeScratch = new EncodedCartesian3_default();
|
||
|
var encodeScratch2D = new EncodedCartesian3_default();
|
||
|
var forwardOffset2DScratch = new Cartesian3_default();
|
||
|
var right2DScratch = new Cartesian3_default();
|
||
|
var normalNudgeScratch = new Cartesian3_default();
|
||
|
var scratchBoundingSpheres = [new BoundingSphere_default(), new BoundingSphere_default()];
|
||
|
var REFERENCE_INDICES = [
|
||
|
0,
|
||
|
2,
|
||
|
1,
|
||
|
0,
|
||
|
3,
|
||
|
2,
|
||
|
// right
|
||
|
0,
|
||
|
7,
|
||
|
3,
|
||
|
0,
|
||
|
4,
|
||
|
7,
|
||
|
// start
|
||
|
0,
|
||
|
5,
|
||
|
4,
|
||
|
0,
|
||
|
1,
|
||
|
5,
|
||
|
// bottom
|
||
|
5,
|
||
|
7,
|
||
|
4,
|
||
|
5,
|
||
|
6,
|
||
|
7,
|
||
|
// left
|
||
|
5,
|
||
|
2,
|
||
|
6,
|
||
|
5,
|
||
|
1,
|
||
|
2,
|
||
|
// end
|
||
|
3,
|
||
|
6,
|
||
|
2,
|
||
|
3,
|
||
|
7,
|
||
|
6
|
||
|
// top
|
||
|
];
|
||
|
var REFERENCE_INDICES_LENGTH = REFERENCE_INDICES.length;
|
||
|
function generateGeometryAttributes(loop, projection, bottomPositionsArray, topPositionsArray, normalsArray, cartographicsArray, compute2dAttributes) {
|
||
|
let i;
|
||
|
let index;
|
||
|
const ellipsoid = projection._ellipsoid;
|
||
|
const segmentCount = bottomPositionsArray.length / 3 - 1;
|
||
|
const vertexCount = segmentCount * 8;
|
||
|
const arraySizeVec4 = vertexCount * 4;
|
||
|
const indexCount = segmentCount * 36;
|
||
|
const indices = vertexCount > 65535 ? new Uint32Array(indexCount) : new Uint16Array(indexCount);
|
||
|
const positionsArray = new Float64Array(vertexCount * 3);
|
||
|
const startHiAndForwardOffsetX = new Float32Array(arraySizeVec4);
|
||
|
const startLoAndForwardOffsetY = new Float32Array(arraySizeVec4);
|
||
|
const startNormalAndForwardOffsetZ = new Float32Array(arraySizeVec4);
|
||
|
const endNormalAndTextureCoordinateNormalizationX = new Float32Array(
|
||
|
arraySizeVec4
|
||
|
);
|
||
|
const rightNormalAndTextureCoordinateNormalizationY = new Float32Array(
|
||
|
arraySizeVec4
|
||
|
);
|
||
|
let startHiLo2D;
|
||
|
let offsetAndRight2D;
|
||
|
let startEndNormals2D;
|
||
|
let texcoordNormalization2D;
|
||
|
if (compute2dAttributes) {
|
||
|
startHiLo2D = new Float32Array(arraySizeVec4);
|
||
|
offsetAndRight2D = new Float32Array(arraySizeVec4);
|
||
|
startEndNormals2D = new Float32Array(arraySizeVec4);
|
||
|
texcoordNormalization2D = new Float32Array(vertexCount * 2);
|
||
|
}
|
||
|
const cartographicsLength = cartographicsArray.length / 2;
|
||
|
let length2D = 0;
|
||
|
const startCartographic = startCartographicScratch;
|
||
|
startCartographic.height = 0;
|
||
|
const endCartographic = endCartographicScratch;
|
||
|
endCartographic.height = 0;
|
||
|
let segmentStartCartesian = segmentStartTopScratch;
|
||
|
let segmentEndCartesian = segmentEndTopScratch;
|
||
|
if (compute2dAttributes) {
|
||
|
index = 0;
|
||
|
for (i = 1; i < cartographicsLength; i++) {
|
||
|
startCartographic.latitude = cartographicsArray[index];
|
||
|
startCartographic.longitude = cartographicsArray[index + 1];
|
||
|
endCartographic.latitude = cartographicsArray[index + 2];
|
||
|
endCartographic.longitude = cartographicsArray[index + 3];
|
||
|
segmentStartCartesian = projection.project(
|
||
|
startCartographic,
|
||
|
segmentStartCartesian
|
||
|
);
|
||
|
segmentEndCartesian = projection.project(
|
||
|
endCartographic,
|
||
|
segmentEndCartesian
|
||
|
);
|
||
|
length2D += Cartesian3_default.distance(
|
||
|
segmentStartCartesian,
|
||
|
segmentEndCartesian
|
||
|
);
|
||
|
index += 2;
|
||
|
}
|
||
|
}
|
||
|
const positionsLength = topPositionsArray.length / 3;
|
||
|
segmentEndCartesian = Cartesian3_default.unpack(
|
||
|
topPositionsArray,
|
||
|
0,
|
||
|
segmentEndCartesian
|
||
|
);
|
||
|
let length3D = 0;
|
||
|
index = 3;
|
||
|
for (i = 1; i < positionsLength; i++) {
|
||
|
segmentStartCartesian = Cartesian3_default.clone(
|
||
|
segmentEndCartesian,
|
||
|
segmentStartCartesian
|
||
|
);
|
||
|
segmentEndCartesian = Cartesian3_default.unpack(
|
||
|
topPositionsArray,
|
||
|
index,
|
||
|
segmentEndCartesian
|
||
|
);
|
||
|
length3D += Cartesian3_default.distance(segmentStartCartesian, segmentEndCartesian);
|
||
|
index += 3;
|
||
|
}
|
||
|
let j;
|
||
|
index = 3;
|
||
|
let cartographicsIndex = 0;
|
||
|
let vec2sWriteIndex = 0;
|
||
|
let vec3sWriteIndex = 0;
|
||
|
let vec4sWriteIndex = 0;
|
||
|
let miterBroken = false;
|
||
|
let endBottom = Cartesian3_default.unpack(
|
||
|
bottomPositionsArray,
|
||
|
0,
|
||
|
segmentEndBottomScratch
|
||
|
);
|
||
|
let endTop = Cartesian3_default.unpack(topPositionsArray, 0, segmentEndTopScratch);
|
||
|
let endGeometryNormal = Cartesian3_default.unpack(
|
||
|
normalsArray,
|
||
|
0,
|
||
|
segmentEndNormalScratch
|
||
|
);
|
||
|
if (loop) {
|
||
|
const preEndBottom = Cartesian3_default.unpack(
|
||
|
bottomPositionsArray,
|
||
|
bottomPositionsArray.length - 6,
|
||
|
segmentStartBottomScratch
|
||
|
);
|
||
|
if (breakMiter(endGeometryNormal, preEndBottom, endBottom, endTop)) {
|
||
|
endGeometryNormal = Cartesian3_default.negate(
|
||
|
endGeometryNormal,
|
||
|
endGeometryNormal
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
let lengthSoFar3D = 0;
|
||
|
let lengthSoFar2D = 0;
|
||
|
let sumHeights = 0;
|
||
|
for (i = 0; i < segmentCount; i++) {
|
||
|
const startBottom = Cartesian3_default.clone(endBottom, segmentStartBottomScratch);
|
||
|
const startTop = Cartesian3_default.clone(endTop, segmentStartTopScratch);
|
||
|
let startGeometryNormal = Cartesian3_default.clone(
|
||
|
endGeometryNormal,
|
||
|
segmentStartNormalScratch
|
||
|
);
|
||
|
if (miterBroken) {
|
||
|
startGeometryNormal = Cartesian3_default.negate(
|
||
|
startGeometryNormal,
|
||
|
startGeometryNormal
|
||
|
);
|
||
|
}
|
||
|
endBottom = Cartesian3_default.unpack(
|
||
|
bottomPositionsArray,
|
||
|
index,
|
||
|
segmentEndBottomScratch
|
||
|
);
|
||
|
endTop = Cartesian3_default.unpack(topPositionsArray, index, segmentEndTopScratch);
|
||
|
endGeometryNormal = Cartesian3_default.unpack(
|
||
|
normalsArray,
|
||
|
index,
|
||
|
segmentEndNormalScratch
|
||
|
);
|
||
|
miterBroken = breakMiter(endGeometryNormal, startBottom, endBottom, endTop);
|
||
|
startCartographic.latitude = cartographicsArray[cartographicsIndex];
|
||
|
startCartographic.longitude = cartographicsArray[cartographicsIndex + 1];
|
||
|
endCartographic.latitude = cartographicsArray[cartographicsIndex + 2];
|
||
|
endCartographic.longitude = cartographicsArray[cartographicsIndex + 3];
|
||
|
let start2D;
|
||
|
let end2D;
|
||
|
let startGeometryNormal2D;
|
||
|
let endGeometryNormal2D;
|
||
|
if (compute2dAttributes) {
|
||
|
const nudgeResult = nudgeCartographic(startCartographic, endCartographic);
|
||
|
start2D = projection.project(startCartographic, segmentStart2DScratch);
|
||
|
end2D = projection.project(endCartographic, segmentEnd2DScratch);
|
||
|
const direction2D = direction(end2D, start2D, forwardOffset2DScratch);
|
||
|
direction2D.y = Math.abs(direction2D.y);
|
||
|
startGeometryNormal2D = segmentStartNormal2DScratch;
|
||
|
endGeometryNormal2D = segmentEndNormal2DScratch;
|
||
|
if (nudgeResult === 0 || Cartesian3_default.dot(direction2D, Cartesian3_default.UNIT_Y) > MITER_BREAK_SMALL) {
|
||
|
startGeometryNormal2D = projectNormal(
|
||
|
projection,
|
||
|
startCartographic,
|
||
|
startGeometryNormal,
|
||
|
start2D,
|
||
|
segmentStartNormal2DScratch
|
||
|
);
|
||
|
endGeometryNormal2D = projectNormal(
|
||
|
projection,
|
||
|
endCartographic,
|
||
|
endGeometryNormal,
|
||
|
end2D,
|
||
|
segmentEndNormal2DScratch
|
||
|
);
|
||
|
} else if (nudgeResult === 1) {
|
||
|
endGeometryNormal2D = projectNormal(
|
||
|
projection,
|
||
|
endCartographic,
|
||
|
endGeometryNormal,
|
||
|
end2D,
|
||
|
segmentEndNormal2DScratch
|
||
|
);
|
||
|
startGeometryNormal2D.x = 0;
|
||
|
startGeometryNormal2D.y = Math_default.sign(
|
||
|
startCartographic.longitude - Math.abs(endCartographic.longitude)
|
||
|
);
|
||
|
startGeometryNormal2D.z = 0;
|
||
|
} else {
|
||
|
startGeometryNormal2D = projectNormal(
|
||
|
projection,
|
||
|
startCartographic,
|
||
|
startGeometryNormal,
|
||
|
start2D,
|
||
|
segmentStartNormal2DScratch
|
||
|
);
|
||
|
endGeometryNormal2D.x = 0;
|
||
|
endGeometryNormal2D.y = Math_default.sign(
|
||
|
startCartographic.longitude - endCartographic.longitude
|
||
|
);
|
||
|
endGeometryNormal2D.z = 0;
|
||
|
}
|
||
|
}
|
||
|
const segmentLength3D = Cartesian3_default.distance(startTop, endTop);
|
||
|
const encodedStart = EncodedCartesian3_default.fromCartesian(
|
||
|
startBottom,
|
||
|
encodeScratch
|
||
|
);
|
||
|
const forwardOffset = Cartesian3_default.subtract(
|
||
|
endBottom,
|
||
|
startBottom,
|
||
|
offsetScratch
|
||
|
);
|
||
|
const forward = Cartesian3_default.normalize(forwardOffset, rightScratch);
|
||
|
let startUp = Cartesian3_default.subtract(startTop, startBottom, startUpScratch);
|
||
|
startUp = Cartesian3_default.normalize(startUp, startUp);
|
||
|
let rightNormal = Cartesian3_default.cross(forward, startUp, rightScratch);
|
||
|
rightNormal = Cartesian3_default.normalize(rightNormal, rightNormal);
|
||
|
let startPlaneNormal = Cartesian3_default.cross(
|
||
|
startUp,
|
||
|
startGeometryNormal,
|
||
|
startPlaneNormalScratch
|
||
|
);
|
||
|
startPlaneNormal = Cartesian3_default.normalize(startPlaneNormal, startPlaneNormal);
|
||
|
let endUp = Cartesian3_default.subtract(endTop, endBottom, endUpScratch);
|
||
|
endUp = Cartesian3_default.normalize(endUp, endUp);
|
||
|
let endPlaneNormal = Cartesian3_default.cross(
|
||
|
endGeometryNormal,
|
||
|
endUp,
|
||
|
endPlaneNormalScratch
|
||
|
);
|
||
|
endPlaneNormal = Cartesian3_default.normalize(endPlaneNormal, endPlaneNormal);
|
||
|
const texcoordNormalization3DX = segmentLength3D / length3D;
|
||
|
const texcoordNormalization3DY = lengthSoFar3D / length3D;
|
||
|
let segmentLength2D = 0;
|
||
|
let encodedStart2D;
|
||
|
let forwardOffset2D;
|
||
|
let right2D;
|
||
|
let texcoordNormalization2DX = 0;
|
||
|
let texcoordNormalization2DY = 0;
|
||
|
if (compute2dAttributes) {
|
||
|
segmentLength2D = Cartesian3_default.distance(start2D, end2D);
|
||
|
encodedStart2D = EncodedCartesian3_default.fromCartesian(
|
||
|
start2D,
|
||
|
encodeScratch2D
|
||
|
);
|
||
|
forwardOffset2D = Cartesian3_default.subtract(
|
||
|
end2D,
|
||
|
start2D,
|
||
|
forwardOffset2DScratch
|
||
|
);
|
||
|
right2D = Cartesian3_default.normalize(forwardOffset2D, right2DScratch);
|
||
|
const swap = right2D.x;
|
||
|
right2D.x = right2D.y;
|
||
|
right2D.y = -swap;
|
||
|
texcoordNormalization2DX = segmentLength2D / length2D;
|
||
|
texcoordNormalization2DY = lengthSoFar2D / length2D;
|
||
|
}
|
||
|
for (j = 0; j < 8; j++) {
|
||
|
const vec4Index = vec4sWriteIndex + j * 4;
|
||
|
const vec2Index = vec2sWriteIndex + j * 2;
|
||
|
const wIndex = vec4Index + 3;
|
||
|
const rightPlaneSide = j < 4 ? 1 : -1;
|
||
|
const topBottomSide = j === 2 || j === 3 || j === 6 || j === 7 ? 1 : -1;
|
||
|
Cartesian3_default.pack(encodedStart.high, startHiAndForwardOffsetX, vec4Index);
|
||
|
startHiAndForwardOffsetX[wIndex] = forwardOffset.x;
|
||
|
Cartesian3_default.pack(encodedStart.low, startLoAndForwardOffsetY, vec4Index);
|
||
|
startLoAndForwardOffsetY[wIndex] = forwardOffset.y;
|
||
|
Cartesian3_default.pack(
|
||
|
startPlaneNormal,
|
||
|
startNormalAndForwardOffsetZ,
|
||
|
vec4Index
|
||
|
);
|
||
|
startNormalAndForwardOffsetZ[wIndex] = forwardOffset.z;
|
||
|
Cartesian3_default.pack(
|
||
|
endPlaneNormal,
|
||
|
endNormalAndTextureCoordinateNormalizationX,
|
||
|
vec4Index
|
||
|
);
|
||
|
endNormalAndTextureCoordinateNormalizationX[wIndex] = texcoordNormalization3DX * rightPlaneSide;
|
||
|
Cartesian3_default.pack(
|
||
|
rightNormal,
|
||
|
rightNormalAndTextureCoordinateNormalizationY,
|
||
|
vec4Index
|
||
|
);
|
||
|
let texcoordNormalization = texcoordNormalization3DY * topBottomSide;
|
||
|
if (texcoordNormalization === 0 && topBottomSide < 0) {
|
||
|
texcoordNormalization = 9;
|
||
|
}
|
||
|
rightNormalAndTextureCoordinateNormalizationY[wIndex] = texcoordNormalization;
|
||
|
if (compute2dAttributes) {
|
||
|
startHiLo2D[vec4Index] = encodedStart2D.high.x;
|
||
|
startHiLo2D[vec4Index + 1] = encodedStart2D.high.y;
|
||
|
startHiLo2D[vec4Index + 2] = encodedStart2D.low.x;
|
||
|
startHiLo2D[vec4Index + 3] = encodedStart2D.low.y;
|
||
|
startEndNormals2D[vec4Index] = -startGeometryNormal2D.y;
|
||
|
startEndNormals2D[vec4Index + 1] = startGeometryNormal2D.x;
|
||
|
startEndNormals2D[vec4Index + 2] = endGeometryNormal2D.y;
|
||
|
startEndNormals2D[vec4Index + 3] = -endGeometryNormal2D.x;
|
||
|
offsetAndRight2D[vec4Index] = forwardOffset2D.x;
|
||
|
offsetAndRight2D[vec4Index + 1] = forwardOffset2D.y;
|
||
|
offsetAndRight2D[vec4Index + 2] = right2D.x;
|
||
|
offsetAndRight2D[vec4Index + 3] = right2D.y;
|
||
|
texcoordNormalization2D[vec2Index] = texcoordNormalization2DX * rightPlaneSide;
|
||
|
texcoordNormalization = texcoordNormalization2DY * topBottomSide;
|
||
|
if (texcoordNormalization === 0 && topBottomSide < 0) {
|
||
|
texcoordNormalization = 9;
|
||
|
}
|
||
|
texcoordNormalization2D[vec2Index + 1] = texcoordNormalization;
|
||
|
}
|
||
|
}
|
||
|
const adjustHeightStartBottom = adjustHeightStartBottomScratch;
|
||
|
const adjustHeightEndBottom = adjustHeightEndBottomScratch;
|
||
|
const adjustHeightStartTop = adjustHeightStartTopScratch;
|
||
|
const adjustHeightEndTop = adjustHeightEndTopScratch;
|
||
|
const getHeightsRectangle = Rectangle_default.fromCartographicArray(
|
||
|
getHeightCartographics,
|
||
|
getHeightRectangleScratch
|
||
|
);
|
||
|
const minMaxHeights = ApproximateTerrainHeights_default.getMinimumMaximumHeights(
|
||
|
getHeightsRectangle,
|
||
|
ellipsoid
|
||
|
);
|
||
|
const minHeight = minMaxHeights.minimumTerrainHeight;
|
||
|
const maxHeight = minMaxHeights.maximumTerrainHeight;
|
||
|
sumHeights += Math.abs(minHeight);
|
||
|
sumHeights += Math.abs(maxHeight);
|
||
|
adjustHeights(
|
||
|
startBottom,
|
||
|
startTop,
|
||
|
minHeight,
|
||
|
maxHeight,
|
||
|
adjustHeightStartBottom,
|
||
|
adjustHeightStartTop
|
||
|
);
|
||
|
adjustHeights(
|
||
|
endBottom,
|
||
|
endTop,
|
||
|
minHeight,
|
||
|
maxHeight,
|
||
|
adjustHeightEndBottom,
|
||
|
adjustHeightEndTop
|
||
|
);
|
||
|
let normalNudge = Cartesian3_default.multiplyByScalar(
|
||
|
rightNormal,
|
||
|
Math_default.EPSILON5,
|
||
|
normalNudgeScratch
|
||
|
);
|
||
|
Cartesian3_default.add(
|
||
|
adjustHeightStartBottom,
|
||
|
normalNudge,
|
||
|
adjustHeightStartBottom
|
||
|
);
|
||
|
Cartesian3_default.add(adjustHeightEndBottom, normalNudge, adjustHeightEndBottom);
|
||
|
Cartesian3_default.add(adjustHeightStartTop, normalNudge, adjustHeightStartTop);
|
||
|
Cartesian3_default.add(adjustHeightEndTop, normalNudge, adjustHeightEndTop);
|
||
|
nudgeXZ(adjustHeightStartBottom, adjustHeightEndBottom);
|
||
|
nudgeXZ(adjustHeightStartTop, adjustHeightEndTop);
|
||
|
Cartesian3_default.pack(adjustHeightStartBottom, positionsArray, vec3sWriteIndex);
|
||
|
Cartesian3_default.pack(adjustHeightEndBottom, positionsArray, vec3sWriteIndex + 3);
|
||
|
Cartesian3_default.pack(adjustHeightEndTop, positionsArray, vec3sWriteIndex + 6);
|
||
|
Cartesian3_default.pack(adjustHeightStartTop, positionsArray, vec3sWriteIndex + 9);
|
||
|
normalNudge = Cartesian3_default.multiplyByScalar(
|
||
|
rightNormal,
|
||
|
-2 * Math_default.EPSILON5,
|
||
|
normalNudgeScratch
|
||
|
);
|
||
|
Cartesian3_default.add(
|
||
|
adjustHeightStartBottom,
|
||
|
normalNudge,
|
||
|
adjustHeightStartBottom
|
||
|
);
|
||
|
Cartesian3_default.add(adjustHeightEndBottom, normalNudge, adjustHeightEndBottom);
|
||
|
Cartesian3_default.add(adjustHeightStartTop, normalNudge, adjustHeightStartTop);
|
||
|
Cartesian3_default.add(adjustHeightEndTop, normalNudge, adjustHeightEndTop);
|
||
|
nudgeXZ(adjustHeightStartBottom, adjustHeightEndBottom);
|
||
|
nudgeXZ(adjustHeightStartTop, adjustHeightEndTop);
|
||
|
Cartesian3_default.pack(
|
||
|
adjustHeightStartBottom,
|
||
|
positionsArray,
|
||
|
vec3sWriteIndex + 12
|
||
|
);
|
||
|
Cartesian3_default.pack(
|
||
|
adjustHeightEndBottom,
|
||
|
positionsArray,
|
||
|
vec3sWriteIndex + 15
|
||
|
);
|
||
|
Cartesian3_default.pack(adjustHeightEndTop, positionsArray, vec3sWriteIndex + 18);
|
||
|
Cartesian3_default.pack(adjustHeightStartTop, positionsArray, vec3sWriteIndex + 21);
|
||
|
cartographicsIndex += 2;
|
||
|
index += 3;
|
||
|
vec2sWriteIndex += 16;
|
||
|
vec3sWriteIndex += 24;
|
||
|
vec4sWriteIndex += 32;
|
||
|
lengthSoFar3D += segmentLength3D;
|
||
|
lengthSoFar2D += segmentLength2D;
|
||
|
}
|
||
|
index = 0;
|
||
|
let indexOffset = 0;
|
||
|
for (i = 0; i < segmentCount; i++) {
|
||
|
for (j = 0; j < REFERENCE_INDICES_LENGTH; j++) {
|
||
|
indices[index + j] = REFERENCE_INDICES[j] + indexOffset;
|
||
|
}
|
||
|
indexOffset += 8;
|
||
|
index += REFERENCE_INDICES_LENGTH;
|
||
|
}
|
||
|
const boundingSpheres = scratchBoundingSpheres;
|
||
|
BoundingSphere_default.fromVertices(
|
||
|
bottomPositionsArray,
|
||
|
Cartesian3_default.ZERO,
|
||
|
3,
|
||
|
boundingSpheres[0]
|
||
|
);
|
||
|
BoundingSphere_default.fromVertices(
|
||
|
topPositionsArray,
|
||
|
Cartesian3_default.ZERO,
|
||
|
3,
|
||
|
boundingSpheres[1]
|
||
|
);
|
||
|
const boundingSphere = BoundingSphere_default.fromBoundingSpheres(boundingSpheres);
|
||
|
boundingSphere.radius += sumHeights / (segmentCount * 2);
|
||
|
const attributes = {
|
||
|
position: new GeometryAttribute_default({
|
||
|
componentDatatype: ComponentDatatype_default.DOUBLE,
|
||
|
componentsPerAttribute: 3,
|
||
|
normalize: false,
|
||
|
values: positionsArray
|
||
|
}),
|
||
|
startHiAndForwardOffsetX: getVec4GeometryAttribute(
|
||
|
startHiAndForwardOffsetX
|
||
|
),
|
||
|
startLoAndForwardOffsetY: getVec4GeometryAttribute(
|
||
|
startLoAndForwardOffsetY
|
||
|
),
|
||
|
startNormalAndForwardOffsetZ: getVec4GeometryAttribute(
|
||
|
startNormalAndForwardOffsetZ
|
||
|
),
|
||
|
endNormalAndTextureCoordinateNormalizationX: getVec4GeometryAttribute(
|
||
|
endNormalAndTextureCoordinateNormalizationX
|
||
|
),
|
||
|
rightNormalAndTextureCoordinateNormalizationY: getVec4GeometryAttribute(
|
||
|
rightNormalAndTextureCoordinateNormalizationY
|
||
|
)
|
||
|
};
|
||
|
if (compute2dAttributes) {
|
||
|
attributes.startHiLo2D = getVec4GeometryAttribute(startHiLo2D);
|
||
|
attributes.offsetAndRight2D = getVec4GeometryAttribute(offsetAndRight2D);
|
||
|
attributes.startEndNormals2D = getVec4GeometryAttribute(startEndNormals2D);
|
||
|
attributes.texcoordNormalization2D = new GeometryAttribute_default({
|
||
|
componentDatatype: ComponentDatatype_default.FLOAT,
|
||
|
componentsPerAttribute: 2,
|
||
|
normalize: false,
|
||
|
values: texcoordNormalization2D
|
||
|
});
|
||
|
}
|
||
|
return new Geometry_default({
|
||
|
attributes,
|
||
|
indices,
|
||
|
boundingSphere
|
||
|
});
|
||
|
}
|
||
|
function getVec4GeometryAttribute(typedArray) {
|
||
|
return new GeometryAttribute_default({
|
||
|
componentDatatype: ComponentDatatype_default.FLOAT,
|
||
|
componentsPerAttribute: 4,
|
||
|
normalize: false,
|
||
|
values: typedArray
|
||
|
});
|
||
|
}
|
||
|
GroundPolylineGeometry._projectNormal = projectNormal;
|
||
|
var GroundPolylineGeometry_default = GroundPolylineGeometry;
|
||
|
|
||
|
// packages/engine/Source/Workers/createGroundPolylineGeometry.js
|
||
|
function createGroundPolylineGeometry(groundPolylineGeometry, offset) {
|
||
|
return ApproximateTerrainHeights_default.initialize().then(function() {
|
||
|
if (defined_default(offset)) {
|
||
|
groundPolylineGeometry = GroundPolylineGeometry_default.unpack(
|
||
|
groundPolylineGeometry,
|
||
|
offset
|
||
|
);
|
||
|
}
|
||
|
return GroundPolylineGeometry_default.createGeometry(groundPolylineGeometry);
|
||
|
});
|
||
|
}
|
||
|
var createGroundPolylineGeometry_default = createGroundPolylineGeometry;
|
||
|
export {
|
||
|
createGroundPolylineGeometry_default as default
|
||
|
};
|