CorridorGeometryLibrary-b584c522.js 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. /* This file is automatically rebuilt by the Cesium build process. */
  2. define(['exports', './defined-26bd4a03', './Math-fa6e45cb', './Cartesian2-2a723276', './Transforms-65aba0a4', './PolylineVolumeGeometryLibrary-57289189', './PolylinePipeline-b4161aaf'], function (exports, defined, _Math, Cartesian2, Transforms, PolylineVolumeGeometryLibrary, PolylinePipeline) { 'use strict';
  3. /**
  4. * @private
  5. */
  6. var CorridorGeometryLibrary = {};
  7. var scratch1 = new Cartesian2.Cartesian3();
  8. var scratch2 = new Cartesian2.Cartesian3();
  9. var scratch3 = new Cartesian2.Cartesian3();
  10. var scratch4 = new Cartesian2.Cartesian3();
  11. var scaleArray2 = [new Cartesian2.Cartesian3(), new Cartesian2.Cartesian3()];
  12. var cartesian1 = new Cartesian2.Cartesian3();
  13. var cartesian2 = new Cartesian2.Cartesian3();
  14. var cartesian3 = new Cartesian2.Cartesian3();
  15. var cartesian4 = new Cartesian2.Cartesian3();
  16. var cartesian5 = new Cartesian2.Cartesian3();
  17. var cartesian6 = new Cartesian2.Cartesian3();
  18. var cartesian7 = new Cartesian2.Cartesian3();
  19. var cartesian8 = new Cartesian2.Cartesian3();
  20. var cartesian9 = new Cartesian2.Cartesian3();
  21. var cartesian10 = new Cartesian2.Cartesian3();
  22. var quaterion = new Transforms.Quaternion();
  23. var rotMatrix = new Transforms.Matrix3();
  24. function computeRoundCorner(cornerPoint, startPoint, endPoint, cornerType, leftIsOutside) {
  25. var angle = Cartesian2.Cartesian3.angleBetween(Cartesian2.Cartesian3.subtract(startPoint, cornerPoint, scratch1), Cartesian2.Cartesian3.subtract(endPoint, cornerPoint, scratch2));
  26. var granularity = (cornerType === PolylineVolumeGeometryLibrary.CornerType.BEVELED) ? 1 : Math.ceil(angle / _Math.CesiumMath.toRadians(5)) + 1;
  27. var size = granularity * 3;
  28. var array = new Array(size);
  29. array[size - 3] = endPoint.x;
  30. array[size - 2] = endPoint.y;
  31. array[size - 1] = endPoint.z;
  32. var m;
  33. if (leftIsOutside) {
  34. m = Transforms.Matrix3.fromQuaternion(Transforms.Quaternion.fromAxisAngle(Cartesian2.Cartesian3.negate(cornerPoint, scratch1), angle / granularity, quaterion), rotMatrix);
  35. } else {
  36. m = Transforms.Matrix3.fromQuaternion(Transforms.Quaternion.fromAxisAngle(cornerPoint, angle / granularity, quaterion), rotMatrix);
  37. }
  38. var index = 0;
  39. startPoint = Cartesian2.Cartesian3.clone(startPoint, scratch1);
  40. for (var i = 0; i < granularity; i++) {
  41. startPoint = Transforms.Matrix3.multiplyByVector(m, startPoint, startPoint);
  42. array[index++] = startPoint.x;
  43. array[index++] = startPoint.y;
  44. array[index++] = startPoint.z;
  45. }
  46. return array;
  47. }
  48. function addEndCaps(calculatedPositions) {
  49. var cornerPoint = cartesian1;
  50. var startPoint = cartesian2;
  51. var endPoint = cartesian3;
  52. var leftEdge = calculatedPositions[1];
  53. startPoint = Cartesian2.Cartesian3.fromArray(calculatedPositions[1], leftEdge.length - 3, startPoint);
  54. endPoint = Cartesian2.Cartesian3.fromArray(calculatedPositions[0], 0, endPoint);
  55. cornerPoint = Cartesian2.Cartesian3.midpoint(startPoint, endPoint, cornerPoint);
  56. var firstEndCap = computeRoundCorner(cornerPoint, startPoint, endPoint, PolylineVolumeGeometryLibrary.CornerType.ROUNDED, false);
  57. var length = calculatedPositions.length - 1;
  58. var rightEdge = calculatedPositions[length - 1];
  59. leftEdge = calculatedPositions[length];
  60. startPoint = Cartesian2.Cartesian3.fromArray(rightEdge, rightEdge.length - 3, startPoint);
  61. endPoint = Cartesian2.Cartesian3.fromArray(leftEdge, 0, endPoint);
  62. cornerPoint = Cartesian2.Cartesian3.midpoint(startPoint, endPoint, cornerPoint);
  63. var lastEndCap = computeRoundCorner(cornerPoint, startPoint, endPoint, PolylineVolumeGeometryLibrary.CornerType.ROUNDED, false);
  64. return [firstEndCap, lastEndCap];
  65. }
  66. function computeMiteredCorner(position, leftCornerDirection, lastPoint, leftIsOutside) {
  67. var cornerPoint = scratch1;
  68. if (leftIsOutside) {
  69. cornerPoint = Cartesian2.Cartesian3.add(position, leftCornerDirection, cornerPoint);
  70. } else {
  71. leftCornerDirection = Cartesian2.Cartesian3.negate(leftCornerDirection, leftCornerDirection);
  72. cornerPoint = Cartesian2.Cartesian3.add(position, leftCornerDirection, cornerPoint);
  73. }
  74. return [cornerPoint.x, cornerPoint.y, cornerPoint.z, lastPoint.x, lastPoint.y, lastPoint.z];
  75. }
  76. function addShiftedPositions(positions, left, scalar, calculatedPositions) {
  77. var rightPositions = new Array(positions.length);
  78. var leftPositions = new Array(positions.length);
  79. var scaledLeft = Cartesian2.Cartesian3.multiplyByScalar(left, scalar, scratch1);
  80. var scaledRight = Cartesian2.Cartesian3.negate(scaledLeft, scratch2);
  81. var rightIndex = 0;
  82. var leftIndex = positions.length - 1;
  83. for (var i = 0; i < positions.length; i += 3) {
  84. var pos = Cartesian2.Cartesian3.fromArray(positions, i, scratch3);
  85. var rightPos = Cartesian2.Cartesian3.add(pos, scaledRight, scratch4);
  86. rightPositions[rightIndex++] = rightPos.x;
  87. rightPositions[rightIndex++] = rightPos.y;
  88. rightPositions[rightIndex++] = rightPos.z;
  89. var leftPos = Cartesian2.Cartesian3.add(pos, scaledLeft, scratch4);
  90. leftPositions[leftIndex--] = leftPos.z;
  91. leftPositions[leftIndex--] = leftPos.y;
  92. leftPositions[leftIndex--] = leftPos.x;
  93. }
  94. calculatedPositions.push(rightPositions, leftPositions);
  95. return calculatedPositions;
  96. }
  97. /**
  98. * @private
  99. */
  100. CorridorGeometryLibrary.addAttribute = function(attribute, value, front, back) {
  101. var x = value.x;
  102. var y = value.y;
  103. var z = value.z;
  104. if (defined.defined(front)) {
  105. attribute[front] = x;
  106. attribute[front + 1] = y;
  107. attribute[front + 2] = z;
  108. }
  109. if (defined.defined(back)) {
  110. attribute[back] = z;
  111. attribute[back - 1] = y;
  112. attribute[back - 2] = x;
  113. }
  114. };
  115. var scratchForwardProjection = new Cartesian2.Cartesian3();
  116. var scratchBackwardProjection = new Cartesian2.Cartesian3();
  117. /**
  118. * @private
  119. */
  120. CorridorGeometryLibrary.computePositions = function(params) {
  121. var granularity = params.granularity;
  122. var positions = params.positions;
  123. var ellipsoid = params.ellipsoid;
  124. var width = params.width / 2;
  125. var cornerType = params.cornerType;
  126. var saveAttributes = params.saveAttributes;
  127. var normal = cartesian1;
  128. var forward = cartesian2;
  129. var backward = cartesian3;
  130. var left = cartesian4;
  131. var cornerDirection = cartesian5;
  132. var startPoint = cartesian6;
  133. var previousPos = cartesian7;
  134. var rightPos = cartesian8;
  135. var leftPos = cartesian9;
  136. var center = cartesian10;
  137. var calculatedPositions = [];
  138. var calculatedLefts = (saveAttributes) ? [] : undefined;
  139. var calculatedNormals = (saveAttributes) ? [] : undefined;
  140. var position = positions[0]; //add first point
  141. var nextPosition = positions[1];
  142. forward = Cartesian2.Cartesian3.normalize(Cartesian2.Cartesian3.subtract(nextPosition, position, forward), forward);
  143. normal = ellipsoid.geodeticSurfaceNormal(position, normal);
  144. left = Cartesian2.Cartesian3.normalize(Cartesian2.Cartesian3.cross(normal, forward, left), left);
  145. if (saveAttributes) {
  146. calculatedLefts.push(left.x, left.y, left.z);
  147. calculatedNormals.push(normal.x, normal.y, normal.z);
  148. }
  149. previousPos = Cartesian2.Cartesian3.clone(position, previousPos);
  150. position = nextPosition;
  151. backward = Cartesian2.Cartesian3.negate(forward, backward);
  152. var subdividedPositions;
  153. var corners = [];
  154. var i;
  155. var length = positions.length;
  156. for (i = 1; i < length - 1; i++) { // add middle points and corners
  157. normal = ellipsoid.geodeticSurfaceNormal(position, normal);
  158. nextPosition = positions[i + 1];
  159. forward = Cartesian2.Cartesian3.normalize(Cartesian2.Cartesian3.subtract(nextPosition, position, forward), forward);
  160. cornerDirection = Cartesian2.Cartesian3.normalize(Cartesian2.Cartesian3.add(forward, backward, cornerDirection), cornerDirection);
  161. var forwardProjection = Cartesian2.Cartesian3.multiplyByScalar(normal, Cartesian2.Cartesian3.dot(forward, normal), scratchForwardProjection);
  162. Cartesian2.Cartesian3.subtract(forward, forwardProjection, forwardProjection);
  163. Cartesian2.Cartesian3.normalize(forwardProjection, forwardProjection);
  164. var backwardProjection = Cartesian2.Cartesian3.multiplyByScalar(normal, Cartesian2.Cartesian3.dot(backward, normal), scratchBackwardProjection);
  165. Cartesian2.Cartesian3.subtract(backward, backwardProjection, backwardProjection);
  166. Cartesian2.Cartesian3.normalize(backwardProjection, backwardProjection);
  167. var doCorner = !_Math.CesiumMath.equalsEpsilon(Math.abs(Cartesian2.Cartesian3.dot(forwardProjection, backwardProjection)), 1.0, _Math.CesiumMath.EPSILON7);
  168. if (doCorner) {
  169. cornerDirection = Cartesian2.Cartesian3.cross(cornerDirection, normal, cornerDirection);
  170. cornerDirection = Cartesian2.Cartesian3.cross(normal, cornerDirection, cornerDirection);
  171. cornerDirection = Cartesian2.Cartesian3.normalize(cornerDirection, cornerDirection);
  172. var scalar = width / Math.max(0.25, Cartesian2.Cartesian3.magnitude(Cartesian2.Cartesian3.cross(cornerDirection, backward, scratch1)));
  173. var leftIsOutside = PolylineVolumeGeometryLibrary.PolylineVolumeGeometryLibrary.angleIsGreaterThanPi(forward, backward, position, ellipsoid);
  174. cornerDirection = Cartesian2.Cartesian3.multiplyByScalar(cornerDirection, scalar, cornerDirection);
  175. if (leftIsOutside) {
  176. rightPos = Cartesian2.Cartesian3.add(position, cornerDirection, rightPos);
  177. center = Cartesian2.Cartesian3.add(rightPos, Cartesian2.Cartesian3.multiplyByScalar(left, width, center), center);
  178. leftPos = Cartesian2.Cartesian3.add(rightPos, Cartesian2.Cartesian3.multiplyByScalar(left, width * 2, leftPos), leftPos);
  179. scaleArray2[0] = Cartesian2.Cartesian3.clone(previousPos, scaleArray2[0]);
  180. scaleArray2[1] = Cartesian2.Cartesian3.clone(center, scaleArray2[1]);
  181. subdividedPositions = PolylinePipeline.PolylinePipeline.generateArc({
  182. positions: scaleArray2,
  183. granularity: granularity,
  184. ellipsoid: ellipsoid
  185. });
  186. calculatedPositions = addShiftedPositions(subdividedPositions, left, width, calculatedPositions);
  187. if (saveAttributes) {
  188. calculatedLefts.push(left.x, left.y, left.z);
  189. calculatedNormals.push(normal.x, normal.y, normal.z);
  190. }
  191. startPoint = Cartesian2.Cartesian3.clone(leftPos, startPoint);
  192. left = Cartesian2.Cartesian3.normalize(Cartesian2.Cartesian3.cross(normal, forward, left), left);
  193. leftPos = Cartesian2.Cartesian3.add(rightPos, Cartesian2.Cartesian3.multiplyByScalar(left, width * 2, leftPos), leftPos);
  194. previousPos = Cartesian2.Cartesian3.add(rightPos, Cartesian2.Cartesian3.multiplyByScalar(left, width, previousPos), previousPos);
  195. if (cornerType === PolylineVolumeGeometryLibrary.CornerType.ROUNDED || cornerType === PolylineVolumeGeometryLibrary.CornerType.BEVELED) {
  196. corners.push({
  197. leftPositions : computeRoundCorner(rightPos, startPoint, leftPos, cornerType, leftIsOutside)
  198. });
  199. } else {
  200. corners.push({
  201. leftPositions : computeMiteredCorner(position, Cartesian2.Cartesian3.negate(cornerDirection, cornerDirection), leftPos, leftIsOutside)
  202. });
  203. }
  204. } else {
  205. leftPos = Cartesian2.Cartesian3.add(position, cornerDirection, leftPos);
  206. center = Cartesian2.Cartesian3.add(leftPos, Cartesian2.Cartesian3.negate(Cartesian2.Cartesian3.multiplyByScalar(left, width, center), center), center);
  207. rightPos = Cartesian2.Cartesian3.add(leftPos, Cartesian2.Cartesian3.negate(Cartesian2.Cartesian3.multiplyByScalar(left, width * 2, rightPos), rightPos), rightPos);
  208. scaleArray2[0] = Cartesian2.Cartesian3.clone(previousPos, scaleArray2[0]);
  209. scaleArray2[1] = Cartesian2.Cartesian3.clone(center, scaleArray2[1]);
  210. subdividedPositions = PolylinePipeline.PolylinePipeline.generateArc({
  211. positions: scaleArray2,
  212. granularity: granularity,
  213. ellipsoid: ellipsoid
  214. });
  215. calculatedPositions = addShiftedPositions(subdividedPositions, left, width, calculatedPositions);
  216. if (saveAttributes) {
  217. calculatedLefts.push(left.x, left.y, left.z);
  218. calculatedNormals.push(normal.x, normal.y, normal.z);
  219. }
  220. startPoint = Cartesian2.Cartesian3.clone(rightPos, startPoint);
  221. left = Cartesian2.Cartesian3.normalize(Cartesian2.Cartesian3.cross(normal, forward, left), left);
  222. rightPos = Cartesian2.Cartesian3.add(leftPos, Cartesian2.Cartesian3.negate(Cartesian2.Cartesian3.multiplyByScalar(left, width * 2, rightPos), rightPos), rightPos);
  223. previousPos = Cartesian2.Cartesian3.add(leftPos, Cartesian2.Cartesian3.negate(Cartesian2.Cartesian3.multiplyByScalar(left, width, previousPos), previousPos), previousPos);
  224. if (cornerType === PolylineVolumeGeometryLibrary.CornerType.ROUNDED || cornerType === PolylineVolumeGeometryLibrary.CornerType.BEVELED) {
  225. corners.push({
  226. rightPositions : computeRoundCorner(leftPos, startPoint, rightPos, cornerType, leftIsOutside)
  227. });
  228. } else {
  229. corners.push({
  230. rightPositions : computeMiteredCorner(position, cornerDirection, rightPos, leftIsOutside)
  231. });
  232. }
  233. }
  234. backward = Cartesian2.Cartesian3.negate(forward, backward);
  235. }
  236. position = nextPosition;
  237. }
  238. normal = ellipsoid.geodeticSurfaceNormal(position, normal);
  239. scaleArray2[0] = Cartesian2.Cartesian3.clone(previousPos, scaleArray2[0]);
  240. scaleArray2[1] = Cartesian2.Cartesian3.clone(position, scaleArray2[1]);
  241. subdividedPositions = PolylinePipeline.PolylinePipeline.generateArc({
  242. positions: scaleArray2,
  243. granularity: granularity,
  244. ellipsoid: ellipsoid
  245. });
  246. calculatedPositions = addShiftedPositions(subdividedPositions, left, width, calculatedPositions);
  247. if (saveAttributes) {
  248. calculatedLefts.push(left.x, left.y, left.z);
  249. calculatedNormals.push(normal.x, normal.y, normal.z);
  250. }
  251. var endPositions;
  252. if (cornerType === PolylineVolumeGeometryLibrary.CornerType.ROUNDED) {
  253. endPositions = addEndCaps(calculatedPositions);
  254. }
  255. return {
  256. positions : calculatedPositions,
  257. corners : corners,
  258. lefts : calculatedLefts,
  259. normals : calculatedNormals,
  260. endPositions : endPositions
  261. };
  262. };
  263. exports.CorridorGeometryLibrary = CorridorGeometryLibrary;
  264. });