BinaryDecoderWorker.js 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562
  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 {Splat} from '../custom/objects/3dgs/Splat.js' //暂时用不到
  124. import {MathUtils,Vector3,Quaternion} from "../../libs/three.js/build/three.module.js";
  125. 引用THREE的任何东西过来都会在打包时把THREE.js压缩进去,导致文件过大。所以是否要在此重写用到的类*/
  126. var typedArrayMapping = {
  127. "int8": Int8Array,
  128. "int16": Int16Array,
  129. "int32": Int32Array,
  130. "int64": Float64Array,
  131. "uint8": Uint8Array,
  132. "uint16": Uint16Array,
  133. "uint32": Uint32Array,
  134. "uint64": Float64Array,
  135. "float": Float32Array,
  136. "double": Float64Array
  137. };
  138. var gs3dProplist = ['f_dc_0',
  139. //color
  140. 'f_dc_1', 'f_dc_2', 'f_rest_0',
  141. // has sh if not null at origin inriav1parser.js
  142. 'f_rest_1', 'f_rest_2', 'f_rest_3', 'f_rest_4', 'f_rest_5', 'f_rest_6', 'f_rest_7', 'f_rest_8', 'f_rest_9', 'f_rest_10', 'f_rest_11', 'f_rest_12', 'f_rest_13', 'f_rest_14', 'f_rest_15', 'f_rest_16', 'f_rest_17', 'f_rest_18', 'f_rest_19', 'f_rest_20', 'f_rest_21', 'f_rest_22', 'f_rest_23', 'f_rest_24', 'f_rest_25', 'f_rest_26', 'f_rest_27', 'f_rest_28', 'f_rest_29', 'f_rest_30', 'f_rest_31', 'f_rest_32', 'f_rest_33', 'f_rest_34', 'f_rest_35', 'f_rest_36', 'f_rest_37', 'f_rest_38', 'f_rest_39', 'f_rest_40', 'f_rest_41', 'f_rest_42', 'f_rest_43', 'f_rest_44', 'opacity', 'scale_0', 'scale_1', 'scale_2', 'rot_0', 'rot_1', 'rot_2', 'rot_3'];
  143. Potree = {};
  144. onmessage = function onmessage(event) {
  145. performance.mark("binary-decoder-start");
  146. var buffer = event.data.buffer;
  147. var pointAttributes = event.data.pointAttributes;
  148. var numPoints = buffer.byteLength / pointAttributes.byteSize;
  149. var view = new DataView(buffer);
  150. var version = new Version(event.data.version);
  151. var nodeOffset = event.data.offset;
  152. var scale = event.data.scale;
  153. var spacing = event.data.spacing;
  154. var hasChildren = event.data.hasChildren;
  155. var name = event.data.name;
  156. var tightBoxMin = [Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY];
  157. var tightBoxMax = [Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY];
  158. var mean = [0, 0, 0];
  159. var pos = event.data.min; // add geometryNode.sceneNode.position node的偏移
  160. var attributeBuffers = {};
  161. var inOffset = 0;
  162. var hasGS3D = pointAttributes.attributes.some(e => e.name == 'GS3D');
  163. var _loop = function _loop(pointAttribute) {
  164. if (pointAttribute.name === "POSITION_CARTESIAN") {
  165. var _buff = new ArrayBuffer(numPoints * 4 * 3);
  166. var positions = new Float32Array(_buff);
  167. for (var _j = 0; _j < numPoints; _j++) {
  168. var x = void 0,
  169. y = void 0,
  170. z = void 0;
  171. if (version.newerThan('1.3')) {
  172. x = view.getUint32(inOffset + _j * pointAttributes.byteSize + 0, true) * scale;
  173. y = view.getUint32(inOffset + _j * pointAttributes.byteSize + 4, true) * scale;
  174. z = view.getUint32(inOffset + _j * pointAttributes.byteSize + 8, true) * scale;
  175. } else {
  176. x = view.getFloat32(_j * pointAttributes.byteSize + 0, true) + nodeOffset[0];
  177. y = view.getFloat32(_j * pointAttributes.byteSize + 4, true) + nodeOffset[1];
  178. z = view.getFloat32(_j * pointAttributes.byteSize + 8, true) + nodeOffset[2];
  179. }
  180. positions[3 * _j + 0] = x;
  181. positions[3 * _j + 1] = y;
  182. positions[3 * _j + 2] = z;
  183. mean[0] += x / numPoints;
  184. mean[1] += y / numPoints;
  185. mean[2] += z / numPoints;
  186. tightBoxMin[0] = Math.min(tightBoxMin[0], x);
  187. tightBoxMin[1] = Math.min(tightBoxMin[1], y);
  188. tightBoxMin[2] = Math.min(tightBoxMin[2], z);
  189. tightBoxMax[0] = Math.max(tightBoxMax[0], x);
  190. tightBoxMax[1] = Math.max(tightBoxMax[1], y);
  191. tightBoxMax[2] = Math.max(tightBoxMax[2], z);
  192. }
  193. attributeBuffers[pointAttribute.name] = {
  194. buffer: _buff,
  195. attribute: pointAttribute
  196. };
  197. if (hasGS3D) {
  198. //add
  199. var buff2 = new ArrayBuffer(numPoints * 4 * 4);
  200. var buff3 = new ArrayBuffer(numPoints * 4 * 4);
  201. var centersInt = new Int32Array(buff2);
  202. var centersFloat = new Float32Array(buff3);
  203. for (var _i = 0; _i < numPoints; _i++) {
  204. centersFloat[4 * _i + 0] = positions[3 * _i + 0] + pos[0];
  205. centersFloat[4 * _i + 1] = positions[3 * _i + 1] + pos[1];
  206. centersFloat[4 * _i + 2] = positions[3 * _i + 2] + pos[2];
  207. centersFloat[4 * _i + 3] = 1;
  208. centersInt[4 * _i + 0] = centersFloat[4 * _i + 0] * 1000;
  209. centersInt[4 * _i + 1] = centersFloat[4 * _i + 1] * 1000;
  210. centersInt[4 * _i + 2] = centersFloat[4 * _i + 2] * 1000;
  211. centersInt[4 * _i + 3] = 1000;
  212. }
  213. attributeBuffers['centersInt'] = {
  214. buffer: buff2,
  215. attribute: pointAttribute
  216. };
  217. attributeBuffers['centersFloat'] = {
  218. buffer: buff3,
  219. attribute: pointAttribute
  220. }; //暂时必须4位,以后再改cpp改为3位
  221. }
  222. } else if (pointAttribute.name === "rgba") {
  223. var _buff2 = new ArrayBuffer(numPoints * 4);
  224. var colors = new Uint8Array(_buff2);
  225. for (var _j2 = 0; _j2 < numPoints; _j2++) {
  226. colors[4 * _j2 + 0] = view.getUint8(inOffset + _j2 * pointAttributes.byteSize + 0);
  227. colors[4 * _j2 + 1] = view.getUint8(inOffset + _j2 * pointAttributes.byteSize + 1);
  228. colors[4 * _j2 + 2] = view.getUint8(inOffset + _j2 * pointAttributes.byteSize + 2);
  229. }
  230. attributeBuffers[pointAttribute.name] = {
  231. buffer: _buff2,
  232. attribute: pointAttribute
  233. };
  234. } else if (pointAttribute.name === "NORMAL_SPHEREMAPPED") {
  235. var _buff3 = new ArrayBuffer(numPoints * 4 * 3);
  236. var normals = new Float32Array(_buff3);
  237. for (var _j3 = 0; _j3 < numPoints; _j3++) {
  238. var bx = view.getUint8(inOffset + _j3 * pointAttributes.byteSize + 0);
  239. var by = view.getUint8(inOffset + _j3 * pointAttributes.byteSize + 1);
  240. var ex = bx / 255;
  241. var ey = by / 255;
  242. var nx = ex * 2 - 1;
  243. var ny = ey * 2 - 1;
  244. var nz = 1;
  245. var nw = -1;
  246. var l = nx * -nx + ny * -ny + nz * -nw;
  247. nz = l;
  248. nx = nx * Math.sqrt(l);
  249. ny = ny * Math.sqrt(l);
  250. nx = nx * 2;
  251. ny = ny * 2;
  252. nz = nz * 2 - 1;
  253. normals[3 * _j3 + 0] = nx;
  254. normals[3 * _j3 + 1] = ny;
  255. normals[3 * _j3 + 2] = nz;
  256. }
  257. attributeBuffers[pointAttribute.name] = {
  258. buffer: _buff3,
  259. attribute: pointAttribute
  260. };
  261. } else if (pointAttribute.name === "NORMAL_OCT16") {
  262. //只需要2 byte! 原本需要12个byte
  263. var _buff4 = new ArrayBuffer(numPoints * 4 * 3);
  264. var _normals = new Float32Array(_buff4);
  265. for (var _j4 = 0; _j4 < numPoints; _j4++) {
  266. var _bx = view.getUint8(inOffset + _j4 * pointAttributes.byteSize + 0);
  267. var _by = view.getUint8(inOffset + _j4 * pointAttributes.byteSize + 1);
  268. var u = _bx / 255 * 2 - 1;
  269. var v = _by / 255 * 2 - 1;
  270. var _z = 1 - Math.abs(u) - Math.abs(v);
  271. var _x = 0;
  272. var _y = 0;
  273. if (_z >= 0) {
  274. _x = u;
  275. _y = v;
  276. } else {
  277. _x = -(v / Math.sign(v) - 1) / Math.sign(u);
  278. _y = -(u / Math.sign(u) - 1) / Math.sign(v);
  279. }
  280. var length = Math.sqrt(_x * _x + _y * _y + _z * _z); //因法线长度固定为1,所以只需要xy就能算出z(不过这里似乎是约定相加为1?)
  281. _x = _x / length; //x和y都只有一个byte,所以精度很低,只有256个分段
  282. _y = _y / length;
  283. _z = _z / length;
  284. _normals[3 * _j4 + 0] = _x;
  285. _normals[3 * _j4 + 1] = _y;
  286. _normals[3 * _j4 + 2] = _z;
  287. }
  288. attributeBuffers[pointAttribute.name] = {
  289. buffer: _buff4,
  290. attribute: pointAttribute
  291. };
  292. } else if (pointAttribute.name === "NORMAL") {
  293. var _buff5 = new ArrayBuffer(numPoints * 4 * 3);
  294. var _normals2 = new Float32Array(_buff5);
  295. for (var _j5 = 0; _j5 < numPoints; _j5++) {
  296. var _x2 = view.getFloat32(inOffset + _j5 * pointAttributes.byteSize + 0, true);
  297. var _y2 = view.getFloat32(inOffset + _j5 * pointAttributes.byteSize + 4, true);
  298. var _z2 = view.getFloat32(inOffset + _j5 * pointAttributes.byteSize + 8, true);
  299. _normals2[3 * _j5 + 0] = _x2;
  300. _normals2[3 * _j5 + 1] = _y2;
  301. _normals2[3 * _j5 + 2] = _z2;
  302. }
  303. attributeBuffers[pointAttribute.name] = {
  304. buffer: _buff5,
  305. attribute: pointAttribute
  306. };
  307. } else if (pointAttribute.name === "IR" || pointAttribute.name === "TEMP") {
  308. //温度 ir是热成像的温度 temp是AI识别的温度
  309. var _buff6 = new ArrayBuffer(numPoints * 4); //原本数据是uint16但是shader没办法接收,只能转了
  310. var _f = new Float32Array(_buff6); //according to pointAttribute.type.name, 取值范围为 0 到 65535。
  311. var min = Infinity,
  312. max = -Infinity,
  313. _v;
  314. for (var _j6 = 0; _j6 < numPoints; _j6++) {
  315. //仿照position的写法 填入数据
  316. _f[_j6] = _v = view.getUint16(inOffset + _j6 * pointAttributes.byteSize, true) / 10; //开尔文
  317. _v != 0 && (min = Math.min(min, _v)); //==0可能是没探测到所以跳过
  318. _v != 0 && (max = Math.max(max, _v));
  319. } //ir or temp 里面的值除以10就是开尔文温度
  320. attributeBuffers[pointAttribute.name] = {
  321. buffer: _buff6,
  322. attribute: pointAttribute
  323. };
  324. pointAttribute.range = [min, max]; //但每个geo范围不一样
  325. } else if (pointAttribute.name === "SEG") {
  326. //类型
  327. /*
  328. 1: concrete
  329. 2: wood
  330. 3: metal
  331. 4: glass
  332. 5: plastic
  333. 6: electric_wire
  334. */
  335. var _buff7 = new ArrayBuffer(numPoints * 4);
  336. var _f2 = new Float32Array(_buff7); //according to pointAttribute.type.name, 取值范围为 0 到 65535。
  337. for (var _j7 = 0; _j7 < numPoints; _j7++) {
  338. //仿照position的写法 填入数据
  339. _f2[_j7] = view.getUint16(inOffset + _j7 * pointAttributes.byteSize, true);
  340. } //ir or temp 里面的值除以10就是开尔文温度哈
  341. attributeBuffers[pointAttribute.name] = {
  342. buffer: _buff7,
  343. attribute: pointAttribute
  344. };
  345. } else if (pointAttribute.name === "GS3D") {
  346. //add 见inriav1plyparser.js
  347. //////////////////////////////////////////////////////////
  348. var _buff8 = new ArrayBuffer(numPoints * pointAttribute.byteSize);
  349. var _f3 = new Float32Array(_buff8);
  350. for (var _j8 = 0; _j8 < numPoints; _j8++) {
  351. //仿照position的写法 填入数据
  352. for (var _i2 = 0; _i2 < pointAttribute.numElements; _i2++) {
  353. //f32[pointAttribute.numElements * j + i] = view.getUint32( inOffset + j * pointAttributes.byteSize + 4*i, true) * scale ;
  354. _f3[pointAttribute.numElements * _j8 + _i2] = view.getFloat32(inOffset + _j8 * pointAttributes.byteSize + 4 * _i2, true); //+ nodeOffset[0];
  355. //是Uint32还是Float32? PlyParserUtils.js中写的是getFloat32 ( rawVertex[fieldId] = vertexData.getFloat32(offset + fieldOffsets[fieldId], true);)
  356. }
  357. }
  358. attributeBuffers[pointAttribute.name] = {
  359. buffer: _buff8,
  360. attribute: pointAttribute
  361. };
  362. //得到颜色
  363. var _buff9 = new ArrayBuffer(numPoints * 4);
  364. var _colors = new Uint8Array(_buff9);
  365. var SH_C0 = 0.28209479177387814;
  366. var offset_opa = gs3dProplist.indexOf('opacity');
  367. var offset_col = gs3dProplist.indexOf('f_dc_0');
  368. var getColor = index => {
  369. var value = (0.5 + SH_C0 * _f3[index + offset_col]) * 255;
  370. return MathUtils.clamp(Math.floor(value), 0, 255);
  371. };
  372. var getOpacity = index => {
  373. var value = 1 / (1 + Math.exp(-_f3[index + offset_opa])) * 255;
  374. return THREE.MathUtils.clamp(Math.floor(value), 0, 255);
  375. };
  376. for (var _j9 = 0; _j9 < numPoints; _j9++) {
  377. _colors[4 * _j9 + 0] = getColor(_j9 * pointAttribute.numElements + 0);
  378. _colors[4 * _j9 + 1] = getColor(_j9 * pointAttribute.numElements + 1);
  379. _colors[4 * _j9 + 2] = getColor(_j9 * pointAttribute.numElements + 2);
  380. _colors[4 * _j9 + 3] = getOpacity(_j9 * pointAttribute.numElements);
  381. }
  382. attributeBuffers['rgba'] = {
  383. buffer: _buff9,
  384. attribute: pointAttribute
  385. };
  386. //compute cov:
  387. var _buff10 = new ArrayBuffer(numPoints * 24);
  388. var covs = new Float32Array(_buff10);
  389. var offset_scale = gs3dProplist.indexOf('scale_0'); //第49个数开始是
  390. var offset_rot = gs3dProplist.indexOf('rot_0');
  391. var _scale2 = new Vector3();
  392. var quaternion = new Quaternion();
  393. var getScale = index => {
  394. var get = offset => {
  395. return Math.exp(_f3[index * pointAttribute.numElements + offset + offset_scale]);
  396. };
  397. _scale2.set(get(0), get(1), get(2));
  398. };
  399. var getQuatenion = index => {
  400. var get = offset => {
  401. return _f3[index * pointAttribute.numElements + offset + offset_rot];
  402. };
  403. //quaternion.set( get(0), get(1), get(2), get(3))
  404. quaternion.set(get(1), get(2), get(3), get(0)); //w放到最后 另外如果compressionLevel不是0的话还要再加一步,见this.fbf(sectionFloatArray[rotationBase + 1]
  405. //quaternion.normalize();
  406. };
  407. for (var _j10 = 0; _j10 < numPoints; _j10++) {
  408. getScale(_j10);
  409. getQuatenion(_j10);
  410. Splat.computeCovariance(_scale2, quaternion, null, covs, 6 * _j10);
  411. }
  412. attributeBuffers['covs'] = {
  413. buffer: _buff10,
  414. attribute: pointAttribute
  415. };
  416. ////////////////////////////////////////////////////////////////////////////////
  417. } else {
  418. var _buff11 = new ArrayBuffer(numPoints * 4);
  419. var _f4 = new Float32Array(_buff11);
  420. var TypedArray = typedArrayMapping[pointAttribute.type.name];
  421. preciseBuffer = new TypedArray(numPoints);
  422. var [_min, _max] = [Infinity, -Infinity];
  423. var [_offset, _scale3] = [0, 1];
  424. var getterMap = {
  425. "int8": view.getInt8,
  426. "int16": view.getInt16,
  427. "int32": view.getInt32,
  428. "int64": view.getInt64,
  429. "uint8": view.getUint8,
  430. "uint16": view.getUint16,
  431. "uint32": view.getUint32,
  432. "uint64": view.getUint64,
  433. "float": view.getFloat32,
  434. "double": view.getFloat64
  435. };
  436. var _getter = getterMap[pointAttribute.type.name].bind(view);
  437. // compute offset and scale to pack larger types into 32 bit floats
  438. if (pointAttribute.type.size > 4) {
  439. for (var _j11 = 0; _j11 < numPoints; _j11++) {
  440. var _value = _getter(inOffset + _j11 * pointAttributes.byteSize, true);
  441. if (!Number.isNaN(_value)) {
  442. _min = Math.min(_min, _value);
  443. _max = Math.max(_max, _value);
  444. }
  445. }
  446. if (pointAttribute.initialRange != null) {
  447. _offset = pointAttribute.initialRange[0];
  448. _scale3 = 1 / (pointAttribute.initialRange[1] - pointAttribute.initialRange[0]);
  449. } else {
  450. _offset = _min;
  451. _scale3 = 1 / (_max - _min);
  452. }
  453. }
  454. for (var _j12 = 0; _j12 < numPoints; _j12++) {
  455. var _value2 = _getter(inOffset + _j12 * pointAttributes.byteSize, true);
  456. if (!Number.isNaN(_value2)) {
  457. _min = Math.min(_min, _value2);
  458. _max = Math.max(_max, _value2);
  459. }
  460. _f4[_j12] = (_value2 - _offset) * _scale3;
  461. preciseBuffer[_j12] = _value2;
  462. }
  463. pointAttribute.range = [_min, _max];
  464. attributeBuffers[pointAttribute.name] = {
  465. buffer: _buff11,
  466. preciseBuffer: preciseBuffer,
  467. attribute: pointAttribute,
  468. offset: _offset,
  469. scale: _scale3
  470. };
  471. }
  472. inOffset += pointAttribute.byteSize;
  473. };
  474. for (var pointAttribute of pointAttributes.attributes) {
  475. _loop(pointAttribute);
  476. }
  477. {
  478. // add indices
  479. var buff = new ArrayBuffer(numPoints * 4);
  480. var indices = new Uint32Array(buff);
  481. for (var i = 0; i < numPoints; i++) {
  482. indices[i] = i;
  483. }
  484. attributeBuffers["INDICES"] = {
  485. buffer: buff,
  486. attribute: PointAttribute.INDICES
  487. };
  488. }
  489. {
  490. // handle attribute vectors
  491. var vectors = pointAttributes.vectors;
  492. for (var vector of vectors) {
  493. var {
  494. name: _name,
  495. attributes
  496. } = vector;
  497. var numVectorElements = attributes.length;
  498. var _buffer = new ArrayBuffer(numVectorElements * numPoints * 4);
  499. var f32 = new Float32Array(_buffer);
  500. var iElement = 0;
  501. for (var sourceName of attributes) {
  502. var sourceBuffer = attributeBuffers[sourceName];
  503. var {
  504. offset,
  505. scale: _scale
  506. } = sourceBuffer;
  507. var _view = new DataView(sourceBuffer.buffer);
  508. var getter = _view.getFloat32.bind(_view);
  509. for (var j = 0; j < numPoints; j++) {
  510. var value = getter(j * 4, true);
  511. f32[j * numVectorElements + iElement] = value / _scale + offset;
  512. }
  513. iElement++;
  514. }
  515. var vecAttribute = new PointAttribute(_name, PointAttributeTypes.DATA_TYPE_FLOAT, 3);
  516. attributeBuffers[_name] = {
  517. buffer: _buffer,
  518. attribute: vecAttribute
  519. };
  520. }
  521. }
  522. performance.mark("binary-decoder-end");
  523. // { // print timings
  524. // //performance.measure("spacing", "spacing-start", "spacing-end");
  525. // performance.measure("binary-decoder", "binary-decoder-start", "binary-decoder-end");
  526. // let measure = performance.getEntriesByType("measure")[0];
  527. // let dpp = 1000 * measure.duration / numPoints;
  528. // let pps = parseInt(numPoints / (measure.duration / 1000));
  529. // let debugMessage = `${measure.duration.toFixed(3)} ms, ${numPoints} points, ${pps.toLocaleString()} points/sec`;
  530. // console.log(debugMessage);
  531. // }
  532. performance.clearMarks();
  533. performance.clearMeasures();
  534. var message = {
  535. buffer: buffer,
  536. mean: mean,
  537. attributeBuffers: attributeBuffers,
  538. tightBoundingBox: {
  539. min: tightBoxMin,
  540. max: tightBoxMax
  541. }
  542. };
  543. var transferables = [];
  544. for (var property in message.attributeBuffers) {
  545. transferables.push(message.attributeBuffers[property].buffer);
  546. }
  547. transferables.push(buffer);
  548. postMessage(message, transferables);
  549. };