BinaryDecoderWorker.js 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905
  1. class Version {
  2. constructor(version) {
  3. this.version = version;
  4. var vmLength = version.indexOf('.') === -1 ? version.length : version.indexOf('.');
  5. this.versionMajor = parseInt(version.substr(0, vmLength));
  6. this.versionMinor = parseInt(version.substr(vmLength + 1));
  7. if (this.versionMinor.length === 0) {
  8. this.versionMinor = 0;
  9. }
  10. }
  11. newerThan(version) {
  12. var v = new Version(version);
  13. if (this.versionMajor > v.versionMajor) {
  14. return true;
  15. } else if (this.versionMajor === v.versionMajor && this.versionMinor > v.versionMinor) {
  16. return true;
  17. } else {
  18. return false;
  19. }
  20. }
  21. equalOrHigher(version) {
  22. var v = new Version(version);
  23. if (this.versionMajor > v.versionMajor) {
  24. return true;
  25. } else if (this.versionMajor === v.versionMajor && this.versionMinor >= v.versionMinor) {
  26. return true;
  27. } else {
  28. return false;
  29. }
  30. }
  31. upTo(version) {
  32. return !this.newerThan(version);
  33. }
  34. }
  35. /**
  36. * Some types of possible point attribute data formats
  37. *
  38. * @class
  39. */
  40. var PointAttributeTypes = {
  41. DATA_TYPE_DOUBLE: {
  42. ordinal: 0,
  43. name: "double",
  44. size: 8
  45. },
  46. DATA_TYPE_FLOAT: {
  47. ordinal: 1,
  48. name: "float",
  49. size: 4
  50. },
  51. DATA_TYPE_INT8: {
  52. ordinal: 2,
  53. name: "int8",
  54. size: 1
  55. },
  56. DATA_TYPE_UINT8: {
  57. ordinal: 3,
  58. name: "uint8",
  59. size: 1
  60. },
  61. DATA_TYPE_INT16: {
  62. ordinal: 4,
  63. name: "int16",
  64. size: 2
  65. },
  66. DATA_TYPE_UINT16: {
  67. ordinal: 5,
  68. name: "uint16",
  69. size: 2
  70. },
  71. DATA_TYPE_INT32: {
  72. ordinal: 6,
  73. name: "int32",
  74. size: 4
  75. },
  76. DATA_TYPE_UINT32: {
  77. ordinal: 7,
  78. name: "uint32",
  79. size: 4
  80. },
  81. DATA_TYPE_INT64: {
  82. ordinal: 8,
  83. name: "int64",
  84. size: 8
  85. },
  86. DATA_TYPE_UINT64: {
  87. ordinal: 9,
  88. name: "uint64",
  89. size: 8
  90. }
  91. };
  92. var i = 0;
  93. for (var obj in PointAttributeTypes) {
  94. PointAttributeTypes[i] = PointAttributeTypes[obj];
  95. i++;
  96. }
  97. class PointAttribute {
  98. constructor(name, type, numElements) {
  99. this.name = name;
  100. this.type = type;
  101. this.numElements = numElements;
  102. this.byteSize = this.numElements * this.type.size;
  103. this.description = "";
  104. this.range = [Infinity, -Infinity];
  105. }
  106. }
  107. PointAttribute.POSITION_CARTESIAN = new PointAttribute("POSITION_CARTESIAN", PointAttributeTypes.DATA_TYPE_FLOAT, 3);
  108. PointAttribute.RGBA_PACKED = new PointAttribute("COLOR_PACKED", PointAttributeTypes.DATA_TYPE_INT8, 4);
  109. PointAttribute.COLOR_PACKED = PointAttribute.RGBA_PACKED;
  110. PointAttribute.RGB_PACKED = new PointAttribute("COLOR_PACKED", PointAttributeTypes.DATA_TYPE_INT8, 3);
  111. PointAttribute.NORMAL_FLOATS = new PointAttribute("NORMAL_FLOATS", PointAttributeTypes.DATA_TYPE_FLOAT, 3);
  112. PointAttribute.INTENSITY = new PointAttribute("INTENSITY", PointAttributeTypes.DATA_TYPE_UINT16, 1);
  113. PointAttribute.CLASSIFICATION = new PointAttribute("CLASSIFICATION", PointAttributeTypes.DATA_TYPE_UINT8, 1);
  114. PointAttribute.NORMAL_SPHEREMAPPED = new PointAttribute("NORMAL_SPHEREMAPPED", PointAttributeTypes.DATA_TYPE_UINT8, 2);
  115. PointAttribute.NORMAL_OCT16 = new PointAttribute("NORMAL_OCT16", PointAttributeTypes.DATA_TYPE_UINT8, 2);
  116. PointAttribute.NORMAL = new PointAttribute("NORMAL", PointAttributeTypes.DATA_TYPE_FLOAT, 3);
  117. PointAttribute.RETURN_NUMBER = new PointAttribute("RETURN_NUMBER", PointAttributeTypes.DATA_TYPE_UINT8, 1);
  118. PointAttribute.NUMBER_OF_RETURNS = new PointAttribute("NUMBER_OF_RETURNS", PointAttributeTypes.DATA_TYPE_UINT8, 1);
  119. PointAttribute.SOURCE_ID = new PointAttribute("SOURCE_ID", PointAttributeTypes.DATA_TYPE_UINT16, 1);
  120. PointAttribute.INDICES = new PointAttribute("INDICES", PointAttributeTypes.DATA_TYPE_UINT32, 1);
  121. PointAttribute.SPACING = new PointAttribute("SPACING", PointAttributeTypes.DATA_TYPE_FLOAT, 1);
  122. PointAttribute.GPS_TIME = new PointAttribute("GPS_TIME", PointAttributeTypes.DATA_TYPE_DOUBLE, 1);
  123. //import * as THREE from "../../libs/three.js/build/three.module.js";
  124. var typedArrayMapping = {
  125. "int8": Int8Array,
  126. "int16": Int16Array,
  127. "int32": Int32Array,
  128. "int64": Float64Array,
  129. "uint8": Uint8Array,
  130. "uint16": Uint16Array,
  131. "uint32": Uint32Array,
  132. "uint64": Float64Array,
  133. "float": Float32Array,
  134. "double": Float64Array
  135. };
  136. var gs3dProplist = [
  137. //'x', 'y', 'z',
  138. //'nx', 'ny', 'nz',
  139. 'f_dc_0', 'f_dc_1', 'f_dc_2', 'f_rest_0', 'f_rest_1', 'f_rest_2', 'f_rest_3', 'f_rest_4', 'f_rest_5', 'f_rest_6', 'f_rest_7', 'f_rest_8', 'opacity', 'scale_0', 'scale_1', 'scale_2', 'rot_0', 'rot_1', 'rot_2', 'rot_3'];
  140. var clamp = function clamp(value, min, max) {
  141. return Math.max(min, Math.min(max, value));
  142. };
  143. class Vector3 {
  144. constructor() {
  145. var x = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
  146. var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
  147. var z = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
  148. Object.defineProperty(this, 'isVector3', {
  149. value: true
  150. });
  151. this.x = x;
  152. this.y = y;
  153. this.z = z;
  154. }
  155. set(x, y, z) {
  156. if (z === undefined) z = this.z; // sprite.scale.set(x,y)
  157. this.x = x;
  158. this.y = y;
  159. this.z = z;
  160. return this;
  161. }
  162. }
  163. class Quaternion {
  164. constructor() {
  165. var x = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
  166. var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
  167. var z = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
  168. var w = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 1;
  169. Object.defineProperty(this, 'isQuaternion', {
  170. value: true
  171. });
  172. this._x = x;
  173. this._y = y;
  174. this._z = z;
  175. this._w = w;
  176. }
  177. set(x, y, z, w) {
  178. this._x = x;
  179. this._y = y;
  180. this._z = z;
  181. this._w = w;
  182. //this._onChangeCallback();
  183. return this;
  184. }
  185. length() {
  186. return Math.sqrt(this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w);
  187. }
  188. normalize() {
  189. var l = this.length();
  190. if (l === 0) {
  191. this._x = 0;
  192. this._y = 0;
  193. this._z = 0;
  194. this._w = 1;
  195. } else {
  196. l = 1 / l;
  197. this._x = this._x * l;
  198. this._y = this._y * l;
  199. this._z = this._z * l;
  200. this._w = this._w * l;
  201. }
  202. //this._onChangeCallback();
  203. return this;
  204. }
  205. }
  206. var _zero = new Vector3(0, 0, 0);
  207. var _one = new Vector3(1, 1, 1);
  208. class Matrix4 {
  209. constructor() {
  210. Object.defineProperty(this, 'isMatrix4', {
  211. value: true
  212. });
  213. this.elements = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];
  214. if (arguments.length > 0) {
  215. console.error('THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.');
  216. }
  217. }
  218. makeRotationFromQuaternion(q) {
  219. return this.compose(_zero, q, _one);
  220. }
  221. compose(position, quaternion, scale) {
  222. var te = this.elements;
  223. var x = quaternion._x,
  224. y = quaternion._y,
  225. z = quaternion._z,
  226. w = quaternion._w;
  227. var x2 = x + x,
  228. y2 = y + y,
  229. z2 = z + z;
  230. var xx = x * x2,
  231. xy = x * y2,
  232. xz = x * z2;
  233. var yy = y * y2,
  234. yz = y * z2,
  235. zz = z * z2;
  236. var wx = w * x2,
  237. wy = w * y2,
  238. wz = w * z2;
  239. var sx = scale.x,
  240. sy = scale.y,
  241. sz = scale.z;
  242. te[0] = (1 - (yy + zz)) * sx;
  243. te[1] = (xy + wz) * sx;
  244. te[2] = (xz - wy) * sx;
  245. te[3] = 0;
  246. te[4] = (xy - wz) * sy;
  247. te[5] = (1 - (xx + zz)) * sy;
  248. te[6] = (yz + wx) * sy;
  249. te[7] = 0;
  250. te[8] = (xz + wy) * sz;
  251. te[9] = (yz - wx) * sz;
  252. te[10] = (1 - (xx + yy)) * sz;
  253. te[11] = 0;
  254. te[12] = position.x;
  255. te[13] = position.y;
  256. te[14] = position.z;
  257. te[15] = 1;
  258. return this;
  259. }
  260. makeScale(x, y, z) {
  261. this.set(x, 0, 0, 0, 0, y, 0, 0, 0, 0, z, 0, 0, 0, 0, 1);
  262. return this;
  263. }
  264. set(n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44) {
  265. var te = this.elements;
  266. te[0] = n11;
  267. te[4] = n12;
  268. te[8] = n13;
  269. te[12] = n14;
  270. te[1] = n21;
  271. te[5] = n22;
  272. te[9] = n23;
  273. te[13] = n24;
  274. te[2] = n31;
  275. te[6] = n32;
  276. te[10] = n33;
  277. te[14] = n34;
  278. te[3] = n41;
  279. te[7] = n42;
  280. te[11] = n43;
  281. te[15] = n44;
  282. return this;
  283. }
  284. }
  285. class Matrix3 {
  286. constructor() {
  287. Object.defineProperty(this, 'isMatrix3', {
  288. value: true
  289. });
  290. this.elements = [1, 0, 0, 0, 1, 0, 0, 0, 1];
  291. if (arguments.length > 0) {
  292. console.error('THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.');
  293. }
  294. }
  295. copy(m) {
  296. var te = this.elements;
  297. var me = m.elements;
  298. te[0] = me[0];
  299. te[1] = me[1];
  300. te[2] = me[2];
  301. te[3] = me[3];
  302. te[4] = me[4];
  303. te[5] = me[5];
  304. te[6] = me[6];
  305. te[7] = me[7];
  306. te[8] = me[8];
  307. return this;
  308. }
  309. multiply(m) {
  310. return this.multiplyMatrices(this, m);
  311. }
  312. premultiply(m) {
  313. return this.multiplyMatrices(m, this);
  314. }
  315. multiplyMatrices(a, b) {
  316. var ae = a.elements;
  317. var be = b.elements;
  318. var te = this.elements;
  319. var a11 = ae[0],
  320. a12 = ae[3],
  321. a13 = ae[6];
  322. var a21 = ae[1],
  323. a22 = ae[4],
  324. a23 = ae[7];
  325. var a31 = ae[2],
  326. a32 = ae[5],
  327. a33 = ae[8];
  328. var b11 = be[0],
  329. b12 = be[3],
  330. b13 = be[6];
  331. var b21 = be[1],
  332. b22 = be[4],
  333. b23 = be[7];
  334. var b31 = be[2],
  335. b32 = be[5],
  336. b33 = be[8];
  337. te[0] = a11 * b11 + a12 * b21 + a13 * b31;
  338. te[3] = a11 * b12 + a12 * b22 + a13 * b32;
  339. te[6] = a11 * b13 + a12 * b23 + a13 * b33;
  340. te[1] = a21 * b11 + a22 * b21 + a23 * b31;
  341. te[4] = a21 * b12 + a22 * b22 + a23 * b32;
  342. te[7] = a21 * b13 + a22 * b23 + a23 * b33;
  343. te[2] = a31 * b11 + a32 * b21 + a33 * b31;
  344. te[5] = a31 * b12 + a32 * b22 + a33 * b32;
  345. te[8] = a31 * b13 + a32 * b23 + a33 * b33;
  346. return this;
  347. }
  348. setFromMatrix4(m) {
  349. var me = m.elements;
  350. this.set(me[0], me[4], me[8], me[1], me[5], me[9], me[2], me[6], me[10]);
  351. return this;
  352. }
  353. set(n11, n12, n13, n21, n22, n23, n31, n32, n33) {
  354. var te = this.elements;
  355. te[0] = n11;
  356. te[1] = n21;
  357. te[2] = n31;
  358. te[3] = n12;
  359. te[4] = n22;
  360. te[5] = n32;
  361. te[6] = n13;
  362. te[7] = n23;
  363. te[8] = n33;
  364. return this;
  365. }
  366. transpose() {
  367. var tmp;
  368. var m = this.elements;
  369. tmp = m[1];
  370. m[1] = m[3];
  371. m[3] = tmp;
  372. tmp = m[2];
  373. m[2] = m[6];
  374. m[6] = tmp;
  375. tmp = m[5];
  376. m[5] = m[7];
  377. m[7] = tmp;
  378. return this;
  379. }
  380. }
  381. var toHalfFloat = function toHalfFloat(val) {
  382. // Source: http://gamedev.stackexchange.com/questions/17326/conversion-of-a-number-from-single-precision-floating-point-representation-to-a/17410#17410
  383. /* This method is faster than the OpenEXR implementation (very often
  384. * used, eg. in Ogre), with the additional benefit of rounding, inspired
  385. * by James Tursa?s half-precision code. */
  386. _floatView[0] = val;
  387. var x = _int32View[0];
  388. var bits = x >> 16 & 0x8000; /* Get the sign */
  389. var m = x >> 12 & 0x07ff; /* Keep one extra bit for rounding */
  390. var e = x >> 23 & 0xff; /* Using int is faster here */
  391. /* If zero, or denormal, or exponent underflows too much for a denormal
  392. * half, return signed zero. */
  393. if (e < 103) return bits;
  394. /* If NaN, return NaN. If Inf or exponent overflow, return Inf. */
  395. if (e > 142) {
  396. bits |= 0x7c00;
  397. /* If exponent was 0xff and one mantissa bit was set, it means NaN,
  398. * not Inf, so make sure we set one mantissa bit too. */
  399. bits |= (e == 255 ? 0 : 1) && x & 0x007fffff;
  400. return bits;
  401. }
  402. /* If exponent underflows but not too much, return a denorma l */
  403. if (e < 113) {
  404. m |= 0x0800;
  405. /* Extra rounding may overflow and set mantissa to 0 and exponent
  406. * to 1, which is OK. */
  407. bits |= (m >> 114 - e) + (m >> 113 - e & 1);
  408. return bits;
  409. }
  410. bits |= e - 112 << 10 | m >> 1;
  411. /* Extra rounding. An overflow will set mantissa to 0 and increment
  412. * the exponent, which is OK. */
  413. bits += m & 1;
  414. return bits;
  415. };
  416. var computeCovariance = function () {
  417. //通过旋转和缩放计算协方差(决定姿态)得到6个数
  418. var tempMatrix4 = new Matrix4();
  419. var scaleMatrix = new Matrix3();
  420. var rotationMatrix = new Matrix3();
  421. var covarianceMatrix = new Matrix3();
  422. var transformedCovariance = new Matrix3();
  423. var transform3x3 = new Matrix3();
  424. var transform3x3Transpose = new Matrix3();
  425. var thf = toHalfFloat; //THREE.DataUtils.toHalfFloat.bind(THREE.DataUtils);
  426. return function (scale, rotation, transform, outCovariance) {
  427. var outOffset = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0;
  428. var desiredOutputCompressionLevel = arguments.length > 5 ? arguments[5] : undefined;
  429. tempMatrix4.makeScale(scale.x, scale.y, scale.z);
  430. scaleMatrix.setFromMatrix4(tempMatrix4);
  431. tempMatrix4.makeRotationFromQuaternion(rotation);
  432. rotationMatrix.setFromMatrix4(tempMatrix4);
  433. covarianceMatrix.copy(rotationMatrix).multiply(scaleMatrix);
  434. transformedCovariance.copy(covarianceMatrix).transpose().premultiply(covarianceMatrix); //为什么要乘以自己的转置呀?
  435. if (transform) {
  436. //场景的整体transform 如果可能移动就不传,在sort时直接乘
  437. transform3x3.setFromMatrix4(transform);
  438. transform3x3Transpose.copy(transform3x3).transpose();
  439. transformedCovariance.multiply(transform3x3Transpose);
  440. transformedCovariance.premultiply(transform3x3);
  441. }
  442. if (desiredOutputCompressionLevel === 1) {
  443. //压缩
  444. outCovariance[outOffset] = thf(transformedCovariance.elements[0]);
  445. outCovariance[outOffset + 1] = thf(transformedCovariance.elements[3]);
  446. outCovariance[outOffset + 2] = thf(transformedCovariance.elements[6]);
  447. outCovariance[outOffset + 3] = thf(transformedCovariance.elements[4]);
  448. outCovariance[outOffset + 4] = thf(transformedCovariance.elements[7]);
  449. outCovariance[outOffset + 5] = thf(transformedCovariance.elements[8]);
  450. } else {
  451. outCovariance[outOffset] = transformedCovariance.elements[0];
  452. outCovariance[outOffset + 1] = transformedCovariance.elements[3];
  453. outCovariance[outOffset + 2] = transformedCovariance.elements[6];
  454. outCovariance[outOffset + 3] = transformedCovariance.elements[4];
  455. outCovariance[outOffset + 4] = transformedCovariance.elements[7];
  456. outCovariance[outOffset + 5] = transformedCovariance.elements[8];
  457. }
  458. /*
  459. Vrk 中的元素分别是transformedCovariance的 [
  460. 0,3,6,
  461. 3,4,7,
  462. 6,7,8
  463. ]
  464. */
  465. };
  466. }();
  467. Potree = {};
  468. onmessage = function onmessage(event) {
  469. performance.mark("binary-decoder-start");
  470. var buffer = event.data.buffer;
  471. var pointAttributes = event.data.pointAttributes;
  472. var numPoints = buffer.byteLength / pointAttributes.byteSize;
  473. var view = new DataView(buffer);
  474. var version = new Version(event.data.version);
  475. var nodeOffset = event.data.offset;
  476. var scale = event.data.scale;
  477. var spacing = event.data.spacing;
  478. var hasChildren = event.data.hasChildren;
  479. var name = event.data.name;
  480. var tightBoxMin = [Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY];
  481. var tightBoxMax = [Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY];
  482. var mean = [0, 0, 0];
  483. var pos = event.data.min; // add geometryNode.sceneNode.position node的偏移
  484. var attributeBuffers = {};
  485. var inOffset = 0;
  486. var hasGS3D = pointAttributes.attributes.some(e => e.name == 'GS3D');
  487. var _loop = function _loop(pointAttribute) {
  488. if (pointAttribute.name === "POSITION_CARTESIAN") {
  489. var _buff = new ArrayBuffer(numPoints * 4 * 3);
  490. var positions = new Float32Array(_buff);
  491. for (var _j = 0; _j < numPoints; _j++) {
  492. var x = void 0,
  493. y = void 0,
  494. z = void 0;
  495. if (version.newerThan('1.3')) {
  496. x = view.getUint32(inOffset + _j * pointAttributes.byteSize + 0, true) * scale;
  497. y = view.getUint32(inOffset + _j * pointAttributes.byteSize + 4, true) * scale;
  498. z = view.getUint32(inOffset + _j * pointAttributes.byteSize + 8, true) * scale;
  499. } else {
  500. x = view.getFloat32(_j * pointAttributes.byteSize + 0, true) + nodeOffset[0];
  501. y = view.getFloat32(_j * pointAttributes.byteSize + 4, true) + nodeOffset[1];
  502. z = view.getFloat32(_j * pointAttributes.byteSize + 8, true) + nodeOffset[2];
  503. }
  504. positions[3 * _j + 0] = x;
  505. positions[3 * _j + 1] = y;
  506. positions[3 * _j + 2] = z;
  507. mean[0] += x / numPoints;
  508. mean[1] += y / numPoints;
  509. mean[2] += z / numPoints;
  510. tightBoxMin[0] = Math.min(tightBoxMin[0], x);
  511. tightBoxMin[1] = Math.min(tightBoxMin[1], y);
  512. tightBoxMin[2] = Math.min(tightBoxMin[2], z);
  513. tightBoxMax[0] = Math.max(tightBoxMax[0], x);
  514. tightBoxMax[1] = Math.max(tightBoxMax[1], y);
  515. tightBoxMax[2] = Math.max(tightBoxMax[2], z);
  516. }
  517. attributeBuffers[pointAttribute.name] = {
  518. buffer: _buff,
  519. attribute: pointAttribute
  520. };
  521. if (hasGS3D) {
  522. //add
  523. var buff2 = new ArrayBuffer(numPoints * 4 * 4);
  524. var buff3 = new ArrayBuffer(numPoints * 4 * 3);
  525. var centersInt = new Int32Array(buff2);
  526. var centersFloat = new Float32Array(buff3);
  527. for (var _i = 0; _i < numPoints; _i++) {
  528. centersFloat[3 * _i + 0] = positions[3 * _i + 0] + pos[0];
  529. centersFloat[3 * _i + 1] = positions[3 * _i + 1] + pos[1];
  530. centersFloat[3 * _i + 2] = positions[3 * _i + 2] + pos[2];
  531. //centersFloat[4 * i + 3] = 1;
  532. centersInt[4 * _i + 0] = centersFloat[3 * _i + 0] * 1000;
  533. centersInt[4 * _i + 1] = centersFloat[3 * _i + 1] * 1000;
  534. centersInt[4 * _i + 2] = centersFloat[3 * _i + 2] * 1000;
  535. centersInt[4 * _i + 3] = 1000;
  536. }
  537. attributeBuffers['centersInt'] = {
  538. buffer: buff2,
  539. attribute: pointAttribute
  540. };
  541. attributeBuffers['centersFloat'] = {
  542. buffer: buff3,
  543. attribute: pointAttribute
  544. };
  545. }
  546. } else if (pointAttribute.name === "rgba") {
  547. var _buff2 = new ArrayBuffer(numPoints * 4);
  548. var colors = new Uint8Array(_buff2);
  549. for (var _j2 = 0; _j2 < numPoints; _j2++) {
  550. colors[4 * _j2 + 0] = view.getUint8(inOffset + _j2 * pointAttributes.byteSize + 0);
  551. colors[4 * _j2 + 1] = view.getUint8(inOffset + _j2 * pointAttributes.byteSize + 1);
  552. colors[4 * _j2 + 2] = view.getUint8(inOffset + _j2 * pointAttributes.byteSize + 2);
  553. }
  554. attributeBuffers[pointAttribute.name] = {
  555. buffer: _buff2,
  556. attribute: pointAttribute
  557. };
  558. } else if (pointAttribute.name === "NORMAL_SPHEREMAPPED") {
  559. var _buff3 = new ArrayBuffer(numPoints * 4 * 3);
  560. var normals = new Float32Array(_buff3);
  561. for (var _j3 = 0; _j3 < numPoints; _j3++) {
  562. var bx = view.getUint8(inOffset + _j3 * pointAttributes.byteSize + 0);
  563. var by = view.getUint8(inOffset + _j3 * pointAttributes.byteSize + 1);
  564. var ex = bx / 255;
  565. var ey = by / 255;
  566. var nx = ex * 2 - 1;
  567. var ny = ey * 2 - 1;
  568. var nz = 1;
  569. var nw = -1;
  570. var l = nx * -nx + ny * -ny + nz * -nw;
  571. nz = l;
  572. nx = nx * Math.sqrt(l);
  573. ny = ny * Math.sqrt(l);
  574. nx = nx * 2;
  575. ny = ny * 2;
  576. nz = nz * 2 - 1;
  577. normals[3 * _j3 + 0] = nx;
  578. normals[3 * _j3 + 1] = ny;
  579. normals[3 * _j3 + 2] = nz;
  580. }
  581. attributeBuffers[pointAttribute.name] = {
  582. buffer: _buff3,
  583. attribute: pointAttribute
  584. };
  585. } else if (pointAttribute.name === "NORMAL_OCT16") {
  586. //只需要2 byte! 原本需要12个byte
  587. var _buff4 = new ArrayBuffer(numPoints * 4 * 3);
  588. var _normals = new Float32Array(_buff4);
  589. for (var _j4 = 0; _j4 < numPoints; _j4++) {
  590. var _bx = view.getUint8(inOffset + _j4 * pointAttributes.byteSize + 0);
  591. var _by = view.getUint8(inOffset + _j4 * pointAttributes.byteSize + 1);
  592. var u = _bx / 255 * 2 - 1;
  593. var v = _by / 255 * 2 - 1;
  594. var _z = 1 - Math.abs(u) - Math.abs(v);
  595. var _x = 0;
  596. var _y = 0;
  597. if (_z >= 0) {
  598. _x = u;
  599. _y = v;
  600. } else {
  601. _x = -(v / Math.sign(v) - 1) / Math.sign(u);
  602. _y = -(u / Math.sign(u) - 1) / Math.sign(v);
  603. }
  604. var length = Math.sqrt(_x * _x + _y * _y + _z * _z); //因法线长度固定为1,所以只需要xy就能算出z(不过这里似乎是约定相加为1?)
  605. _x = _x / length; //x和y都只有一个byte,所以精度很低,只有256个分段
  606. _y = _y / length;
  607. _z = _z / length;
  608. _normals[3 * _j4 + 0] = _x;
  609. _normals[3 * _j4 + 1] = _y;
  610. _normals[3 * _j4 + 2] = _z;
  611. }
  612. attributeBuffers[pointAttribute.name] = {
  613. buffer: _buff4,
  614. attribute: pointAttribute
  615. };
  616. } else if (pointAttribute.name === "NORMAL") {
  617. var _buff5 = new ArrayBuffer(numPoints * 4 * 3);
  618. var _normals2 = new Float32Array(_buff5);
  619. for (var _j5 = 0; _j5 < numPoints; _j5++) {
  620. var _x2 = view.getFloat32(inOffset + _j5 * pointAttributes.byteSize + 0, true);
  621. var _y2 = view.getFloat32(inOffset + _j5 * pointAttributes.byteSize + 4, true);
  622. var _z2 = view.getFloat32(inOffset + _j5 * pointAttributes.byteSize + 8, true);
  623. _normals2[3 * _j5 + 0] = _x2;
  624. _normals2[3 * _j5 + 1] = _y2;
  625. _normals2[3 * _j5 + 2] = _z2;
  626. }
  627. attributeBuffers[pointAttribute.name] = {
  628. buffer: _buff5,
  629. attribute: pointAttribute
  630. };
  631. } else if (pointAttribute.name === "IR" || pointAttribute.name === "TEMP") {
  632. //温度 ir是热成像的温度 temp是AI识别的温度
  633. var _buff6 = new ArrayBuffer(numPoints * 4); //原本数据是uint16但是shader没办法接收,只能转了
  634. var _f = new Float32Array(_buff6); //according to pointAttribute.type.name, 取值范围为 0 到 65535。
  635. var min = Infinity,
  636. max = -Infinity,
  637. _v;
  638. for (var _j6 = 0; _j6 < numPoints; _j6++) {
  639. //仿照position的写法 填入数据
  640. _f[_j6] = _v = view.getUint16(inOffset + _j6 * pointAttributes.byteSize, true) / 10; //开尔文
  641. _v != 0 && (min = Math.min(min, _v)); //==0可能是没探测到所以跳过
  642. _v != 0 && (max = Math.max(max, _v));
  643. } //ir or temp 里面的值除以10就是开尔文温度
  644. attributeBuffers[pointAttribute.name] = {
  645. buffer: _buff6,
  646. attribute: pointAttribute
  647. };
  648. pointAttribute.range = [min, max]; //但每个geo范围不一样
  649. } else if (pointAttribute.name === "SEG") {
  650. //类型
  651. /*
  652. 1: concrete
  653. 2: wood
  654. 3: metal
  655. 4: glass
  656. 5: plastic
  657. 6: electric_wire
  658. */
  659. var _buff7 = new ArrayBuffer(numPoints * 4);
  660. var _f2 = new Float32Array(_buff7); //according to pointAttribute.type.name, 取值范围为 0 到 65535。
  661. for (var _j7 = 0; _j7 < numPoints; _j7++) {
  662. //仿照position的写法 填入数据
  663. _f2[_j7] = view.getUint16(inOffset + _j7 * pointAttributes.byteSize, true);
  664. } //ir or temp 里面的值除以10就是开尔文温度哈
  665. attributeBuffers[pointAttribute.name] = {
  666. buffer: _buff7,
  667. attribute: pointAttribute
  668. };
  669. } else if (pointAttribute.name === "GS3D") {
  670. //add 见inriav1plyparser.js
  671. //////////////////////////////////////////////////////////
  672. var _buff8 = new ArrayBuffer(numPoints * pointAttribute.byteSize);
  673. var _f3 = new Float32Array(_buff8);
  674. for (var _j8 = 0; _j8 < numPoints; _j8++) {
  675. //仿照position的写法 填入数据
  676. for (var _i2 = 0; _i2 < pointAttribute.numElements; _i2++) {
  677. //f32[pointAttribute.numElements * j + i] = view.getUint32( inOffset + j * pointAttributes.byteSize + 4*i, true) * scale ;
  678. _f3[pointAttribute.numElements * _j8 + _i2] = view.getFloat32(inOffset + _j8 * pointAttributes.byteSize + 4 * _i2, true); //+ nodeOffset[0];
  679. //是Uint32还是Float32? PlyParserUtils.js中写的是getFloat32 ( rawVertex[fieldId] = vertexData.getFloat32(offset + fieldOffsets[fieldId], true);)
  680. }
  681. }
  682. attributeBuffers[pointAttribute.name] = {
  683. buffer: _buff8,
  684. attribute: pointAttribute
  685. };
  686. //得到颜色
  687. var _buff9 = new ArrayBuffer(numPoints * 4);
  688. var _colors = new Uint8Array(_buff9);
  689. var SH_C0 = 0.28209479177387814;
  690. var offset_opa = gs3dProplist.indexOf('opacity');
  691. var offset_col = gs3dProplist.indexOf('f_dc_0');
  692. var getColor = index => {
  693. var value = (0.5 + SH_C0 * _f3[index + offset_col]) * 255;
  694. return clamp(Math.floor(value), 0, 255);
  695. };
  696. var getOpacity = index => {
  697. var value = 1 / (1 + Math.exp(-_f3[index + offset_opa])) * 255;
  698. return clamp(Math.floor(value), 0, 255);
  699. };
  700. for (var _j9 = 0; _j9 < numPoints; _j9++) {
  701. _colors[4 * _j9 + 0] = getColor(_j9 * pointAttribute.numElements + 0);
  702. _colors[4 * _j9 + 1] = getColor(_j9 * pointAttribute.numElements + 1);
  703. _colors[4 * _j9 + 2] = getColor(_j9 * pointAttribute.numElements + 2);
  704. _colors[4 * _j9 + 3] = getOpacity(_j9 * pointAttribute.numElements);
  705. }
  706. attributeBuffers['rgba'] = {
  707. buffer: _buff9,
  708. attribute: pointAttribute
  709. };
  710. //compute cov:
  711. var _buff10 = new ArrayBuffer(numPoints * 24);
  712. //let buff3_ = new ArrayBuffer(numPoints * 12);
  713. var covs = new Float32Array(_buff10);
  714. //let scales = new Float32Array(buff3_);
  715. var offset_scale = gs3dProplist.indexOf('scale_0'); //第49个数开始是
  716. var offset_rot = gs3dProplist.indexOf('rot_0');
  717. var _scale2 = new Vector3();
  718. var quaternion = new Quaternion();
  719. var getScale = index => {
  720. var get = offset => {
  721. var s1 = _f3[index * pointAttribute.numElements + offset + offset_scale];
  722. var s = Math.exp(s1);
  723. //scales[index*3+offset] = s
  724. return s; //0.2*Math.pow(1.1, f32[index * pointAttribute.numElements + offset + offset_scale])
  725. };
  726. _scale2.set(get(0), get(1), get(2));
  727. };
  728. var getQuatenion = index => {
  729. var get = offset => {
  730. return _f3[index * pointAttribute.numElements + offset + offset_rot];
  731. };
  732. //quaternion.set( get(0), get(1), get(2), get(3))
  733. quaternion.set(get(1), get(2), get(3), get(0)); //w放到最后 另外如果compressionLevel不是0的话还要再加一步,见this.fbf(sectionFloatArray[rotationBase + 1]
  734. quaternion.normalize(); //有时候数据没归一化,结果splat看起来很大
  735. };
  736. for (var _j10 = 0; _j10 < numPoints; _j10++) {
  737. getScale(_j10);
  738. getQuatenion(_j10);
  739. computeCovariance(_scale2, quaternion, null, covs, 6 * _j10);
  740. }
  741. attributeBuffers['covs'] = {
  742. buffer: _buff10,
  743. attribute: pointAttribute
  744. };
  745. ////////////////////////////////////////////////////////////////////////////////
  746. } else {
  747. var _buff12 = new ArrayBuffer(numPoints * 4);
  748. var _f4 = new Float32Array(_buff12);
  749. var TypedArray = typedArrayMapping[pointAttribute.type.name];
  750. preciseBuffer = new TypedArray(numPoints);
  751. var [_min, _max] = [Infinity, -Infinity];
  752. var [_offset2, _scale3] = [0, 1];
  753. var getterMap = {
  754. "int8": view.getInt8,
  755. "int16": view.getInt16,
  756. "int32": view.getInt32,
  757. "int64": view.getInt64,
  758. "uint8": view.getUint8,
  759. "uint16": view.getUint16,
  760. "uint32": view.getUint32,
  761. "uint64": view.getUint64,
  762. "float": view.getFloat32,
  763. "double": view.getFloat64
  764. };
  765. var _getter = getterMap[pointAttribute.type.name].bind(view);
  766. // compute offset and scale to pack larger types into 32 bit floats
  767. if (pointAttribute.type.size > 4) {
  768. for (var _j12 = 0; _j12 < numPoints; _j12++) {
  769. var _value = _getter(inOffset + _j12 * pointAttributes.byteSize, true);
  770. if (!Number.isNaN(_value)) {
  771. _min = Math.min(_min, _value);
  772. _max = Math.max(_max, _value);
  773. }
  774. }
  775. if (pointAttribute.initialRange != null) {
  776. _offset2 = pointAttribute.initialRange[0];
  777. _scale3 = 1 / (pointAttribute.initialRange[1] - pointAttribute.initialRange[0]);
  778. } else {
  779. _offset2 = _min;
  780. _scale3 = 1 / (_max - _min);
  781. }
  782. }
  783. for (var _j13 = 0; _j13 < numPoints; _j13++) {
  784. var _value2 = _getter(inOffset + _j13 * pointAttributes.byteSize, true);
  785. if (!Number.isNaN(_value2)) {
  786. _min = Math.min(_min, _value2);
  787. _max = Math.max(_max, _value2);
  788. }
  789. _f4[_j13] = (_value2 - _offset2) * _scale3;
  790. preciseBuffer[_j13] = _value2;
  791. }
  792. pointAttribute.range = [_min, _max];
  793. attributeBuffers[pointAttribute.name] = {
  794. buffer: _buff12,
  795. preciseBuffer: preciseBuffer,
  796. attribute: pointAttribute,
  797. offset: _offset2,
  798. scale: _scale3
  799. };
  800. }
  801. inOffset += pointAttribute.byteSize;
  802. };
  803. for (var pointAttribute of pointAttributes.attributes) {
  804. _loop(pointAttribute);
  805. }
  806. {
  807. // add indices
  808. var buff = new ArrayBuffer(numPoints * 4);
  809. var indices = new Uint32Array(buff);
  810. for (var i = 0; i < numPoints; i++) {
  811. indices[i] = i;
  812. }
  813. attributeBuffers["INDICES"] = {
  814. buffer: buff,
  815. attribute: PointAttribute.INDICES
  816. };
  817. }
  818. {
  819. // handle attribute vectors
  820. var vectors = pointAttributes.vectors;
  821. for (var vector of vectors) {
  822. var {
  823. name: _name,
  824. attributes
  825. } = vector;
  826. var numVectorElements = attributes.length;
  827. var _buffer = new ArrayBuffer(numVectorElements * numPoints * 4);
  828. var f32 = new Float32Array(_buffer);
  829. var iElement = 0;
  830. for (var sourceName of attributes) {
  831. var sourceBuffer = attributeBuffers[sourceName];
  832. var {
  833. offset,
  834. scale: _scale
  835. } = sourceBuffer;
  836. var _view = new DataView(sourceBuffer.buffer);
  837. var getter = _view.getFloat32.bind(_view);
  838. for (var j = 0; j < numPoints; j++) {
  839. var value = getter(j * 4, true);
  840. f32[j * numVectorElements + iElement] = value / _scale + offset;
  841. }
  842. iElement++;
  843. }
  844. var vecAttribute = new PointAttribute(_name, PointAttributeTypes.DATA_TYPE_FLOAT, 3);
  845. attributeBuffers[_name] = {
  846. buffer: _buffer,
  847. attribute: vecAttribute
  848. };
  849. }
  850. }
  851. performance.mark("binary-decoder-end");
  852. // { // print timings
  853. // //performance.measure("spacing", "spacing-start", "spacing-end");
  854. // performance.measure("binary-decoder", "binary-decoder-start", "binary-decoder-end");
  855. // let measure = performance.getEntriesByType("measure")[0];
  856. // let dpp = 1000 * measure.duration / numPoints;
  857. // let pps = parseInt(numPoints / (measure.duration / 1000));
  858. // let debugMessage = `${measure.duration.toFixed(3)} ms, ${numPoints} points, ${pps.toLocaleString()} points/sec`;
  859. // console.log(debugMessage);
  860. // }
  861. performance.clearMarks();
  862. performance.clearMeasures();
  863. var message = {
  864. buffer: buffer,
  865. mean: mean,
  866. attributeBuffers: attributeBuffers,
  867. tightBoundingBox: {
  868. min: tightBoxMin,
  869. max: tightBoxMax
  870. }
  871. };
  872. var transferables = [];
  873. for (var property in message.attributeBuffers) {
  874. transferables.push(message.attributeBuffers[property].buffer);
  875. }
  876. transferables.push(buffer);
  877. postMessage(message, transferables);
  878. };