PolylineVolumeGeometryLibrary-9c0639f7.js 24 KB

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