PolylineVolumeGeometryLibrary-759a8d46.js 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781
  1. /* This file is automatically rebuilt by the Cesium build process. */
  2. define(['exports', './Matrix2-fc7e9822', './EllipsoidTangentPlane-d2c0c530', './ComponentDatatype-4a60b8d6', './PolylinePipeline-7608e667', './Transforms-a076dbe6', './defaultValue-94c3e563', './RuntimeError-c581ca93'], (function (exports, Matrix2, EllipsoidTangentPlane, ComponentDatatype, PolylinePipeline, Transforms, defaultValue, RuntimeError) { 'use strict';
  3. /**
  4. * Style options for corners.
  5. *
  6. * @demo The {@link https://sandcastle.cesium.com/index.html?src=Corridor.html&label=Geometries|Corridor Demo}
  7. * demonstrates the three corner types, as used by {@link CorridorGraphics}.
  8. *
  9. * @enum {Number}
  10. */
  11. const CornerType = {
  12. /**
  13. * <img src="Images/CornerTypeRounded.png" style="vertical-align: middle;" width="186" height="189" />
  14. *
  15. * Corner has a smooth edge.
  16. * @type {Number}
  17. * @constant
  18. */
  19. ROUNDED: 0,
  20. /**
  21. * <img src="Images/CornerTypeMitered.png" style="vertical-align: middle;" width="186" height="189" />
  22. *
  23. * Corner point is the intersection of adjacent edges.
  24. * @type {Number}
  25. * @constant
  26. */
  27. MITERED: 1,
  28. /**
  29. * <img src="Images/CornerTypeBeveled.png" style="vertical-align: middle;" width="186" height="189" />
  30. *
  31. * Corner is clipped.
  32. * @type {Number}
  33. * @constant
  34. */
  35. BEVELED: 2,
  36. };
  37. var CornerType$1 = Object.freeze(CornerType);
  38. const warnings = {};
  39. /**
  40. * Logs a one time message to the console. Use this function instead of
  41. * <code>console.log</code> directly since this does not log duplicate messages
  42. * unless it is called from multiple workers.
  43. *
  44. * @function oneTimeWarning
  45. *
  46. * @param {String} identifier The unique identifier for this warning.
  47. * @param {String} [message=identifier] The message to log to the console.
  48. *
  49. * @example
  50. * for(let i=0;i<foo.length;++i) {
  51. * if (!defined(foo[i].bar)) {
  52. * // Something that can be recovered from but may happen a lot
  53. * oneTimeWarning('foo.bar undefined', 'foo.bar is undefined. Setting to 0.');
  54. * foo[i].bar = 0;
  55. * // ...
  56. * }
  57. * }
  58. *
  59. * @private
  60. */
  61. function oneTimeWarning(identifier, message) {
  62. //>>includeStart('debug', pragmas.debug);
  63. if (!defaultValue.defined(identifier)) {
  64. throw new RuntimeError.DeveloperError("identifier is required.");
  65. }
  66. //>>includeEnd('debug');
  67. if (!defaultValue.defined(warnings[identifier])) {
  68. warnings[identifier] = true;
  69. console.warn(defaultValue.defaultValue(message, identifier));
  70. }
  71. }
  72. oneTimeWarning.geometryOutlines =
  73. "Entity geometry outlines are unsupported on terrain. Outlines will be disabled. To enable outlines, disable geometry terrain clamping by explicitly setting height to 0.";
  74. oneTimeWarning.geometryZIndex =
  75. "Entity geometry with zIndex are unsupported when height or extrudedHeight are defined. zIndex will be ignored";
  76. oneTimeWarning.geometryHeightReference =
  77. "Entity corridor, ellipse, polygon or rectangle with heightReference must also have a defined height. heightReference will be ignored";
  78. oneTimeWarning.geometryExtrudedHeightReference =
  79. "Entity corridor, ellipse, polygon or rectangle with extrudedHeightReference must also have a defined extrudedHeight. extrudedHeightReference will be ignored";
  80. const scratch2Array = [new Matrix2.Cartesian3(), new Matrix2.Cartesian3()];
  81. const scratchCartesian1 = new Matrix2.Cartesian3();
  82. const scratchCartesian2 = new Matrix2.Cartesian3();
  83. const scratchCartesian3 = new Matrix2.Cartesian3();
  84. const scratchCartesian4 = new Matrix2.Cartesian3();
  85. const scratchCartesian5 = new Matrix2.Cartesian3();
  86. const scratchCartesian6 = new Matrix2.Cartesian3();
  87. const scratchCartesian7 = new Matrix2.Cartesian3();
  88. const scratchCartesian8 = new Matrix2.Cartesian3();
  89. const scratchCartesian9 = new Matrix2.Cartesian3();
  90. const scratch1 = new Matrix2.Cartesian3();
  91. const scratch2 = new Matrix2.Cartesian3();
  92. /**
  93. * @private
  94. */
  95. const PolylineVolumeGeometryLibrary = {};
  96. let cartographic = new Matrix2.Cartographic();
  97. function scaleToSurface(positions, ellipsoid) {
  98. const heights = new Array(positions.length);
  99. for (let i = 0; i < positions.length; i++) {
  100. const pos = positions[i];
  101. cartographic = ellipsoid.cartesianToCartographic(pos, cartographic);
  102. heights[i] = cartographic.height;
  103. positions[i] = ellipsoid.scaleToGeodeticSurface(pos, pos);
  104. }
  105. return heights;
  106. }
  107. function subdivideHeights(points, h0, h1, granularity) {
  108. const p0 = points[0];
  109. const p1 = points[1];
  110. const angleBetween = Matrix2.Cartesian3.angleBetween(p0, p1);
  111. const numPoints = Math.ceil(angleBetween / granularity);
  112. const heights = new Array(numPoints);
  113. let i;
  114. if (h0 === h1) {
  115. for (i = 0; i < numPoints; i++) {
  116. heights[i] = h0;
  117. }
  118. heights.push(h1);
  119. return heights;
  120. }
  121. const dHeight = h1 - h0;
  122. const heightPerVertex = dHeight / numPoints;
  123. for (i = 1; i < numPoints; i++) {
  124. const h = h0 + i * heightPerVertex;
  125. heights[i] = h;
  126. }
  127. heights[0] = h0;
  128. heights.push(h1);
  129. return heights;
  130. }
  131. const nextScratch = new Matrix2.Cartesian3();
  132. const prevScratch = new Matrix2.Cartesian3();
  133. function computeRotationAngle(start, end, position, ellipsoid) {
  134. const tangentPlane = new EllipsoidTangentPlane.EllipsoidTangentPlane(position, ellipsoid);
  135. const next = tangentPlane.projectPointOntoPlane(
  136. Matrix2.Cartesian3.add(position, start, nextScratch),
  137. nextScratch
  138. );
  139. const prev = tangentPlane.projectPointOntoPlane(
  140. Matrix2.Cartesian3.add(position, end, prevScratch),
  141. prevScratch
  142. );
  143. const angle = Matrix2.Cartesian2.angleBetween(next, prev);
  144. return prev.x * next.y - prev.y * next.x >= 0.0 ? -angle : angle;
  145. }
  146. const negativeX = new Matrix2.Cartesian3(-1, 0, 0);
  147. let transform = new Matrix2.Matrix4();
  148. const translation = new Matrix2.Matrix4();
  149. let rotationZ = new Matrix2.Matrix3();
  150. const scaleMatrix = Matrix2.Matrix3.IDENTITY.clone();
  151. const westScratch = new Matrix2.Cartesian3();
  152. const finalPosScratch = new Matrix2.Cartesian4();
  153. const heightCartesian = new Matrix2.Cartesian3();
  154. function addPosition(
  155. center,
  156. left,
  157. shape,
  158. finalPositions,
  159. ellipsoid,
  160. height,
  161. xScalar,
  162. repeat
  163. ) {
  164. let west = westScratch;
  165. let finalPosition = finalPosScratch;
  166. transform = Transforms.Transforms.eastNorthUpToFixedFrame(center, ellipsoid, transform);
  167. west = Matrix2.Matrix4.multiplyByPointAsVector(transform, negativeX, west);
  168. west = Matrix2.Cartesian3.normalize(west, west);
  169. const angle = computeRotationAngle(west, left, center, ellipsoid);
  170. rotationZ = Matrix2.Matrix3.fromRotationZ(angle, rotationZ);
  171. heightCartesian.z = height;
  172. transform = Matrix2.Matrix4.multiplyTransformation(
  173. transform,
  174. Matrix2.Matrix4.fromRotationTranslation(rotationZ, heightCartesian, translation),
  175. transform
  176. );
  177. const scale = scaleMatrix;
  178. scale[0] = xScalar;
  179. for (let j = 0; j < repeat; j++) {
  180. for (let i = 0; i < shape.length; i += 3) {
  181. finalPosition = Matrix2.Cartesian3.fromArray(shape, i, finalPosition);
  182. finalPosition = Matrix2.Matrix3.multiplyByVector(
  183. scale,
  184. finalPosition,
  185. finalPosition
  186. );
  187. finalPosition = Matrix2.Matrix4.multiplyByPoint(
  188. transform,
  189. finalPosition,
  190. finalPosition
  191. );
  192. finalPositions.push(finalPosition.x, finalPosition.y, finalPosition.z);
  193. }
  194. }
  195. return finalPositions;
  196. }
  197. const centerScratch = new Matrix2.Cartesian3();
  198. function addPositions(
  199. centers,
  200. left,
  201. shape,
  202. finalPositions,
  203. ellipsoid,
  204. heights,
  205. xScalar
  206. ) {
  207. for (let i = 0; i < centers.length; i += 3) {
  208. const center = Matrix2.Cartesian3.fromArray(centers, i, centerScratch);
  209. finalPositions = addPosition(
  210. center,
  211. left,
  212. shape,
  213. finalPositions,
  214. ellipsoid,
  215. heights[i / 3],
  216. xScalar,
  217. 1
  218. );
  219. }
  220. return finalPositions;
  221. }
  222. function convertShapeTo3DDuplicate(shape2D, boundingRectangle) {
  223. //orientate 2D shape to XZ plane center at (0, 0, 0), duplicate points
  224. const length = shape2D.length;
  225. const shape = new Array(length * 6);
  226. let index = 0;
  227. const xOffset = boundingRectangle.x + boundingRectangle.width / 2;
  228. const yOffset = boundingRectangle.y + boundingRectangle.height / 2;
  229. let point = shape2D[0];
  230. shape[index++] = point.x - xOffset;
  231. shape[index++] = 0.0;
  232. shape[index++] = point.y - yOffset;
  233. for (let i = 1; i < length; i++) {
  234. point = shape2D[i];
  235. const x = point.x - xOffset;
  236. const z = point.y - yOffset;
  237. shape[index++] = x;
  238. shape[index++] = 0.0;
  239. shape[index++] = z;
  240. shape[index++] = x;
  241. shape[index++] = 0.0;
  242. shape[index++] = z;
  243. }
  244. point = shape2D[0];
  245. shape[index++] = point.x - xOffset;
  246. shape[index++] = 0.0;
  247. shape[index++] = point.y - yOffset;
  248. return shape;
  249. }
  250. function convertShapeTo3D(shape2D, boundingRectangle) {
  251. //orientate 2D shape to XZ plane center at (0, 0, 0)
  252. const length = shape2D.length;
  253. const shape = new Array(length * 3);
  254. let index = 0;
  255. const xOffset = boundingRectangle.x + boundingRectangle.width / 2;
  256. const yOffset = boundingRectangle.y + boundingRectangle.height / 2;
  257. for (let i = 0; i < length; i++) {
  258. shape[index++] = shape2D[i].x - xOffset;
  259. shape[index++] = 0;
  260. shape[index++] = shape2D[i].y - yOffset;
  261. }
  262. return shape;
  263. }
  264. const quaterion = new Transforms.Quaternion();
  265. const startPointScratch = new Matrix2.Cartesian3();
  266. const rotMatrix = new Matrix2.Matrix3();
  267. function computeRoundCorner(
  268. pivot,
  269. startPoint,
  270. endPoint,
  271. cornerType,
  272. leftIsOutside,
  273. ellipsoid,
  274. finalPositions,
  275. shape,
  276. height,
  277. duplicatePoints
  278. ) {
  279. const angle = Matrix2.Cartesian3.angleBetween(
  280. Matrix2.Cartesian3.subtract(startPoint, pivot, scratch1),
  281. Matrix2.Cartesian3.subtract(endPoint, pivot, scratch2)
  282. );
  283. const granularity =
  284. cornerType === CornerType$1.BEVELED
  285. ? 0
  286. : Math.ceil(angle / ComponentDatatype.CesiumMath.toRadians(5));
  287. let m;
  288. if (leftIsOutside) {
  289. m = Matrix2.Matrix3.fromQuaternion(
  290. Transforms.Quaternion.fromAxisAngle(
  291. Matrix2.Cartesian3.negate(pivot, scratch1),
  292. angle / (granularity + 1),
  293. quaterion
  294. ),
  295. rotMatrix
  296. );
  297. } else {
  298. m = Matrix2.Matrix3.fromQuaternion(
  299. Transforms.Quaternion.fromAxisAngle(pivot, angle / (granularity + 1), quaterion),
  300. rotMatrix
  301. );
  302. }
  303. let left;
  304. let surfacePoint;
  305. startPoint = Matrix2.Cartesian3.clone(startPoint, startPointScratch);
  306. if (granularity > 0) {
  307. const repeat = duplicatePoints ? 2 : 1;
  308. for (let i = 0; i < granularity; i++) {
  309. startPoint = Matrix2.Matrix3.multiplyByVector(m, startPoint, startPoint);
  310. left = Matrix2.Cartesian3.subtract(startPoint, pivot, scratch1);
  311. left = Matrix2.Cartesian3.normalize(left, left);
  312. if (!leftIsOutside) {
  313. left = Matrix2.Cartesian3.negate(left, left);
  314. }
  315. surfacePoint = ellipsoid.scaleToGeodeticSurface(startPoint, scratch2);
  316. finalPositions = addPosition(
  317. surfacePoint,
  318. left,
  319. shape,
  320. finalPositions,
  321. ellipsoid,
  322. height,
  323. 1,
  324. repeat
  325. );
  326. }
  327. } else {
  328. left = Matrix2.Cartesian3.subtract(startPoint, pivot, scratch1);
  329. left = Matrix2.Cartesian3.normalize(left, left);
  330. if (!leftIsOutside) {
  331. left = Matrix2.Cartesian3.negate(left, left);
  332. }
  333. surfacePoint = ellipsoid.scaleToGeodeticSurface(startPoint, scratch2);
  334. finalPositions = addPosition(
  335. surfacePoint,
  336. left,
  337. shape,
  338. finalPositions,
  339. ellipsoid,
  340. height,
  341. 1,
  342. 1
  343. );
  344. endPoint = Matrix2.Cartesian3.clone(endPoint, startPointScratch);
  345. left = Matrix2.Cartesian3.subtract(endPoint, pivot, scratch1);
  346. left = Matrix2.Cartesian3.normalize(left, left);
  347. if (!leftIsOutside) {
  348. left = Matrix2.Cartesian3.negate(left, left);
  349. }
  350. surfacePoint = ellipsoid.scaleToGeodeticSurface(endPoint, scratch2);
  351. finalPositions = addPosition(
  352. surfacePoint,
  353. left,
  354. shape,
  355. finalPositions,
  356. ellipsoid,
  357. height,
  358. 1,
  359. 1
  360. );
  361. }
  362. return finalPositions;
  363. }
  364. PolylineVolumeGeometryLibrary.removeDuplicatesFromShape = function (
  365. shapePositions
  366. ) {
  367. const length = shapePositions.length;
  368. const cleanedPositions = [];
  369. for (let i0 = length - 1, i1 = 0; i1 < length; i0 = i1++) {
  370. const v0 = shapePositions[i0];
  371. const v1 = shapePositions[i1];
  372. if (!Matrix2.Cartesian2.equals(v0, v1)) {
  373. cleanedPositions.push(v1); // Shallow copy!
  374. }
  375. }
  376. return cleanedPositions;
  377. };
  378. PolylineVolumeGeometryLibrary.angleIsGreaterThanPi = function (
  379. forward,
  380. backward,
  381. position,
  382. ellipsoid
  383. ) {
  384. const tangentPlane = new EllipsoidTangentPlane.EllipsoidTangentPlane(position, ellipsoid);
  385. const next = tangentPlane.projectPointOntoPlane(
  386. Matrix2.Cartesian3.add(position, forward, nextScratch),
  387. nextScratch
  388. );
  389. const prev = tangentPlane.projectPointOntoPlane(
  390. Matrix2.Cartesian3.add(position, backward, prevScratch),
  391. prevScratch
  392. );
  393. return prev.x * next.y - prev.y * next.x >= 0.0;
  394. };
  395. const scratchForwardProjection = new Matrix2.Cartesian3();
  396. const scratchBackwardProjection = new Matrix2.Cartesian3();
  397. PolylineVolumeGeometryLibrary.computePositions = function (
  398. positions,
  399. shape2D,
  400. boundingRectangle,
  401. geometry,
  402. duplicatePoints
  403. ) {
  404. const ellipsoid = geometry._ellipsoid;
  405. const heights = scaleToSurface(positions, ellipsoid);
  406. const granularity = geometry._granularity;
  407. const cornerType = geometry._cornerType;
  408. const shapeForSides = duplicatePoints
  409. ? convertShapeTo3DDuplicate(shape2D, boundingRectangle)
  410. : convertShapeTo3D(shape2D, boundingRectangle);
  411. const shapeForEnds = duplicatePoints
  412. ? convertShapeTo3D(shape2D, boundingRectangle)
  413. : undefined;
  414. const heightOffset = boundingRectangle.height / 2;
  415. const width = boundingRectangle.width / 2;
  416. let length = positions.length;
  417. let finalPositions = [];
  418. let ends = duplicatePoints ? [] : undefined;
  419. let forward = scratchCartesian1;
  420. let backward = scratchCartesian2;
  421. let cornerDirection = scratchCartesian3;
  422. let surfaceNormal = scratchCartesian4;
  423. let pivot = scratchCartesian5;
  424. let start = scratchCartesian6;
  425. let end = scratchCartesian7;
  426. let left = scratchCartesian8;
  427. let previousPosition = scratchCartesian9;
  428. let position = positions[0];
  429. let nextPosition = positions[1];
  430. surfaceNormal = ellipsoid.geodeticSurfaceNormal(position, surfaceNormal);
  431. forward = Matrix2.Cartesian3.subtract(nextPosition, position, forward);
  432. forward = Matrix2.Cartesian3.normalize(forward, forward);
  433. left = Matrix2.Cartesian3.cross(surfaceNormal, forward, left);
  434. left = Matrix2.Cartesian3.normalize(left, left);
  435. let h0 = heights[0];
  436. let h1 = heights[1];
  437. if (duplicatePoints) {
  438. ends = addPosition(
  439. position,
  440. left,
  441. shapeForEnds,
  442. ends,
  443. ellipsoid,
  444. h0 + heightOffset,
  445. 1,
  446. 1
  447. );
  448. }
  449. previousPosition = Matrix2.Cartesian3.clone(position, previousPosition);
  450. position = nextPosition;
  451. backward = Matrix2.Cartesian3.negate(forward, backward);
  452. let subdividedHeights;
  453. let subdividedPositions;
  454. for (let i = 1; i < length - 1; i++) {
  455. const repeat = duplicatePoints ? 2 : 1;
  456. nextPosition = positions[i + 1];
  457. if (position.equals(nextPosition)) {
  458. oneTimeWarning(
  459. "Positions are too close and are considered equivalent with rounding error."
  460. );
  461. continue;
  462. }
  463. forward = Matrix2.Cartesian3.subtract(nextPosition, position, forward);
  464. forward = Matrix2.Cartesian3.normalize(forward, forward);
  465. cornerDirection = Matrix2.Cartesian3.add(forward, backward, cornerDirection);
  466. cornerDirection = Matrix2.Cartesian3.normalize(cornerDirection, cornerDirection);
  467. surfaceNormal = ellipsoid.geodeticSurfaceNormal(position, surfaceNormal);
  468. const forwardProjection = Matrix2.Cartesian3.multiplyByScalar(
  469. surfaceNormal,
  470. Matrix2.Cartesian3.dot(forward, surfaceNormal),
  471. scratchForwardProjection
  472. );
  473. Matrix2.Cartesian3.subtract(forward, forwardProjection, forwardProjection);
  474. Matrix2.Cartesian3.normalize(forwardProjection, forwardProjection);
  475. const backwardProjection = Matrix2.Cartesian3.multiplyByScalar(
  476. surfaceNormal,
  477. Matrix2.Cartesian3.dot(backward, surfaceNormal),
  478. scratchBackwardProjection
  479. );
  480. Matrix2.Cartesian3.subtract(backward, backwardProjection, backwardProjection);
  481. Matrix2.Cartesian3.normalize(backwardProjection, backwardProjection);
  482. const doCorner = !ComponentDatatype.CesiumMath.equalsEpsilon(
  483. Math.abs(Matrix2.Cartesian3.dot(forwardProjection, backwardProjection)),
  484. 1.0,
  485. ComponentDatatype.CesiumMath.EPSILON7
  486. );
  487. if (doCorner) {
  488. cornerDirection = Matrix2.Cartesian3.cross(
  489. cornerDirection,
  490. surfaceNormal,
  491. cornerDirection
  492. );
  493. cornerDirection = Matrix2.Cartesian3.cross(
  494. surfaceNormal,
  495. cornerDirection,
  496. cornerDirection
  497. );
  498. cornerDirection = Matrix2.Cartesian3.normalize(cornerDirection, cornerDirection);
  499. const scalar =
  500. 1 /
  501. Math.max(
  502. 0.25,
  503. Matrix2.Cartesian3.magnitude(
  504. Matrix2.Cartesian3.cross(cornerDirection, backward, scratch1)
  505. )
  506. );
  507. const leftIsOutside = PolylineVolumeGeometryLibrary.angleIsGreaterThanPi(
  508. forward,
  509. backward,
  510. position,
  511. ellipsoid
  512. );
  513. if (leftIsOutside) {
  514. pivot = Matrix2.Cartesian3.add(
  515. position,
  516. Matrix2.Cartesian3.multiplyByScalar(
  517. cornerDirection,
  518. scalar * width,
  519. cornerDirection
  520. ),
  521. pivot
  522. );
  523. start = Matrix2.Cartesian3.add(
  524. pivot,
  525. Matrix2.Cartesian3.multiplyByScalar(left, width, start),
  526. start
  527. );
  528. scratch2Array[0] = Matrix2.Cartesian3.clone(previousPosition, scratch2Array[0]);
  529. scratch2Array[1] = Matrix2.Cartesian3.clone(start, scratch2Array[1]);
  530. subdividedHeights = subdivideHeights(
  531. scratch2Array,
  532. h0 + heightOffset,
  533. h1 + heightOffset,
  534. granularity
  535. );
  536. subdividedPositions = PolylinePipeline.PolylinePipeline.generateArc({
  537. positions: scratch2Array,
  538. granularity: granularity,
  539. ellipsoid: ellipsoid,
  540. });
  541. finalPositions = addPositions(
  542. subdividedPositions,
  543. left,
  544. shapeForSides,
  545. finalPositions,
  546. ellipsoid,
  547. subdividedHeights,
  548. 1
  549. );
  550. left = Matrix2.Cartesian3.cross(surfaceNormal, forward, left);
  551. left = Matrix2.Cartesian3.normalize(left, left);
  552. end = Matrix2.Cartesian3.add(
  553. pivot,
  554. Matrix2.Cartesian3.multiplyByScalar(left, width, end),
  555. end
  556. );
  557. if (
  558. cornerType === CornerType$1.ROUNDED ||
  559. cornerType === CornerType$1.BEVELED
  560. ) {
  561. computeRoundCorner(
  562. pivot,
  563. start,
  564. end,
  565. cornerType,
  566. leftIsOutside,
  567. ellipsoid,
  568. finalPositions,
  569. shapeForSides,
  570. h1 + heightOffset,
  571. duplicatePoints
  572. );
  573. } else {
  574. cornerDirection = Matrix2.Cartesian3.negate(cornerDirection, cornerDirection);
  575. finalPositions = addPosition(
  576. position,
  577. cornerDirection,
  578. shapeForSides,
  579. finalPositions,
  580. ellipsoid,
  581. h1 + heightOffset,
  582. scalar,
  583. repeat
  584. );
  585. }
  586. previousPosition = Matrix2.Cartesian3.clone(end, previousPosition);
  587. } else {
  588. pivot = Matrix2.Cartesian3.add(
  589. position,
  590. Matrix2.Cartesian3.multiplyByScalar(
  591. cornerDirection,
  592. scalar * width,
  593. cornerDirection
  594. ),
  595. pivot
  596. );
  597. start = Matrix2.Cartesian3.add(
  598. pivot,
  599. Matrix2.Cartesian3.multiplyByScalar(left, -width, start),
  600. start
  601. );
  602. scratch2Array[0] = Matrix2.Cartesian3.clone(previousPosition, scratch2Array[0]);
  603. scratch2Array[1] = Matrix2.Cartesian3.clone(start, scratch2Array[1]);
  604. subdividedHeights = subdivideHeights(
  605. scratch2Array,
  606. h0 + heightOffset,
  607. h1 + heightOffset,
  608. granularity
  609. );
  610. subdividedPositions = PolylinePipeline.PolylinePipeline.generateArc({
  611. positions: scratch2Array,
  612. granularity: granularity,
  613. ellipsoid: ellipsoid,
  614. });
  615. finalPositions = addPositions(
  616. subdividedPositions,
  617. left,
  618. shapeForSides,
  619. finalPositions,
  620. ellipsoid,
  621. subdividedHeights,
  622. 1
  623. );
  624. left = Matrix2.Cartesian3.cross(surfaceNormal, forward, left);
  625. left = Matrix2.Cartesian3.normalize(left, left);
  626. end = Matrix2.Cartesian3.add(
  627. pivot,
  628. Matrix2.Cartesian3.multiplyByScalar(left, -width, end),
  629. end
  630. );
  631. if (
  632. cornerType === CornerType$1.ROUNDED ||
  633. cornerType === CornerType$1.BEVELED
  634. ) {
  635. computeRoundCorner(
  636. pivot,
  637. start,
  638. end,
  639. cornerType,
  640. leftIsOutside,
  641. ellipsoid,
  642. finalPositions,
  643. shapeForSides,
  644. h1 + heightOffset,
  645. duplicatePoints
  646. );
  647. } else {
  648. finalPositions = addPosition(
  649. position,
  650. cornerDirection,
  651. shapeForSides,
  652. finalPositions,
  653. ellipsoid,
  654. h1 + heightOffset,
  655. scalar,
  656. repeat
  657. );
  658. }
  659. previousPosition = Matrix2.Cartesian3.clone(end, previousPosition);
  660. }
  661. backward = Matrix2.Cartesian3.negate(forward, backward);
  662. } else {
  663. finalPositions = addPosition(
  664. previousPosition,
  665. left,
  666. shapeForSides,
  667. finalPositions,
  668. ellipsoid,
  669. h0 + heightOffset,
  670. 1,
  671. 1
  672. );
  673. previousPosition = position;
  674. }
  675. h0 = h1;
  676. h1 = heights[i + 1];
  677. position = nextPosition;
  678. }
  679. scratch2Array[0] = Matrix2.Cartesian3.clone(previousPosition, scratch2Array[0]);
  680. scratch2Array[1] = Matrix2.Cartesian3.clone(position, scratch2Array[1]);
  681. subdividedHeights = subdivideHeights(
  682. scratch2Array,
  683. h0 + heightOffset,
  684. h1 + heightOffset,
  685. granularity
  686. );
  687. subdividedPositions = PolylinePipeline.PolylinePipeline.generateArc({
  688. positions: scratch2Array,
  689. granularity: granularity,
  690. ellipsoid: ellipsoid,
  691. });
  692. finalPositions = addPositions(
  693. subdividedPositions,
  694. left,
  695. shapeForSides,
  696. finalPositions,
  697. ellipsoid,
  698. subdividedHeights,
  699. 1
  700. );
  701. if (duplicatePoints) {
  702. ends = addPosition(
  703. position,
  704. left,
  705. shapeForEnds,
  706. ends,
  707. ellipsoid,
  708. h1 + heightOffset,
  709. 1,
  710. 1
  711. );
  712. }
  713. length = finalPositions.length;
  714. const posLength = duplicatePoints ? length + ends.length : length;
  715. const combinedPositions = new Float64Array(posLength);
  716. combinedPositions.set(finalPositions);
  717. if (duplicatePoints) {
  718. combinedPositions.set(ends, length);
  719. }
  720. return combinedPositions;
  721. };
  722. exports.CornerType = CornerType$1;
  723. exports.PolylineVolumeGeometryLibrary = PolylineVolumeGeometryLibrary;
  724. exports.oneTimeWarning = oneTimeWarning;
  725. }));