智慧水务管理系统 - 精河县供水工程综合管理平台

I3SDecoder.js 4.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. import Cartographic from "../Core/Cartographic.js";
  2. import Check from "../Core/Check.js";
  3. import defined from "../Core/defined.js";
  4. import Ellipsoid from "../Core/Ellipsoid.js";
  5. import FeatureDetection from "../Core/FeatureDetection.js";
  6. import CesiumMath from "../Core/Math.js";
  7. import Matrix3 from "../Core/Matrix3.js";
  8. import RuntimeError from "../Core/RuntimeError.js";
  9. import TaskProcessor from "../Core/TaskProcessor.js";
  10. /**
  11. * Decode I3S using web workers.
  12. *
  13. * @private
  14. */
  15. function I3SDecoder() {}
  16. // Maximum concurrency to use when decoding draco models
  17. I3SDecoder._maxDecodingConcurrency = Math.max(
  18. FeatureDetection.hardwareConcurrency - 1,
  19. 1,
  20. );
  21. I3SDecoder._decodeTaskProcessor = new TaskProcessor(
  22. "decodeI3S",
  23. I3SDecoder._maxDecodingConcurrency,
  24. );
  25. I3SDecoder._promise = undefined;
  26. async function initializeDecoder() {
  27. const result = await I3SDecoder._decodeTaskProcessor.initWebAssemblyModule({
  28. wasmBinaryFile: "ThirdParty/draco_decoder.wasm",
  29. });
  30. if (result) {
  31. return I3SDecoder._decodeTaskProcessor;
  32. }
  33. throw new RuntimeError("I3S decoder could not be initialized.");
  34. }
  35. /**
  36. * Transcodes I3S to glTF in a web worker
  37. * @param {string} url custom attributes source URL
  38. * @param {object} defaultGeometrySchema Schema to use during decoding
  39. * @param {I3SGeometry} geometryData The draco encoded geometry data
  40. * @param {Array} [featureData] The draco encoded feature data
  41. * @param {object} [symbologyData] The rendering symbology to apply
  42. * @returns Promise<undefined|object> Returns a promise which resolves to the glTF result, or undefined if the task cannot be scheduled this frame.
  43. *
  44. * @exception {RuntimeError} I3S decoder could not be initialized.
  45. */
  46. I3SDecoder.decode = async function (
  47. url,
  48. defaultGeometrySchema,
  49. geometryData,
  50. featureData,
  51. symbologyData,
  52. ) {
  53. //>>includeStart('debug', pragmas.debug);
  54. Check.typeOf.string("url", url);
  55. Check.defined("defaultGeometrySchema", defaultGeometrySchema);
  56. Check.defined("geometryData", geometryData);
  57. //>>includeEnd('debug');
  58. if (!defined(I3SDecoder._promise)) {
  59. I3SDecoder._promise = initializeDecoder();
  60. }
  61. return I3SDecoder._promise.then(function (taskProcessor) {
  62. // Prepare the data to send to the worker
  63. const parentData = geometryData._parent._data;
  64. const parentRotationInverseMatrix =
  65. geometryData._parent._inverseRotationMatrix;
  66. let longitude = 0.0;
  67. let latitude = 0.0;
  68. let height = 0.0;
  69. if (defined(parentData.obb)) {
  70. longitude = parentData.obb.center[0];
  71. latitude = parentData.obb.center[1];
  72. height = parentData.obb.center[2];
  73. } else if (defined(parentData.mbs)) {
  74. longitude = parentData.mbs[0];
  75. latitude = parentData.mbs[1];
  76. height = parentData.mbs[2];
  77. }
  78. const axisFlipRotation = Matrix3.fromRotationX(-CesiumMath.PI_OVER_TWO);
  79. const parentRotation = new Matrix3();
  80. Matrix3.multiply(
  81. axisFlipRotation,
  82. parentRotationInverseMatrix,
  83. parentRotation,
  84. );
  85. const cartographicCenter = Cartographic.fromDegrees(
  86. longitude,
  87. latitude,
  88. height,
  89. );
  90. const cartesianCenter =
  91. Ellipsoid.WGS84.cartographicToCartesian(cartographicCenter);
  92. const payload = {
  93. binaryData: geometryData._data,
  94. featureData:
  95. defined(featureData) && defined(featureData[0])
  96. ? featureData[0].data
  97. : undefined,
  98. schema: defaultGeometrySchema,
  99. bufferInfo: geometryData._geometryBufferInfo,
  100. ellipsoidRadiiSquare: Ellipsoid.WGS84.radiiSquared,
  101. url: url,
  102. geoidDataList: geometryData._dataProvider._geoidDataList,
  103. cartographicCenter: cartographicCenter,
  104. cartesianCenter: cartesianCenter,
  105. parentRotation: parentRotation,
  106. enableFeatures: geometryData._dataProvider.showFeatures,
  107. splitGeometryByColorTransparency:
  108. geometryData._dataProvider.adjustMaterialAlphaMode,
  109. symbologyData: symbologyData,
  110. calculateNormals: geometryData._dataProvider.calculateNormals,
  111. };
  112. return taskProcessor.scheduleTask(payload);
  113. });
  114. };
  115. export default I3SDecoder;