laz-loader-worker.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. // laz-loader-worker.js
  2. //
  3. //import {Module} from "./laz-perf.js";
  4. let instance = null; // laz-perf instance
  5. function readAs(buf, Type, offset, count) {
  6. count = (count === undefined || count === 0 ? 1 : count);
  7. var sub = buf.slice(offset, offset + Type.BYTES_PER_ELEMENT * count);
  8. var r = new Type(sub);
  9. if (count === undefined || count === 1)
  10. return r[0];
  11. var ret = [];
  12. for (var i = 0 ; i < count ; i ++) {
  13. ret.push(r[i]);
  14. }
  15. return ret;
  16. }
  17. function parseLASHeader(arraybuffer) {
  18. var o = { };
  19. o.pointsOffset = readAs(arraybuffer, Uint32Array, 32*3);
  20. o.pointsFormatId = readAs(arraybuffer, Uint8Array, 32*3+8) & 0b111111;
  21. o.pointsStructSize = readAs(arraybuffer, Uint16Array, 32*3+8+1);
  22. o.extraBytes = 0;
  23. switch (o.pointsFormatId) {
  24. case 0: o.extraBytes = o.pointsStructSize - 20; break;
  25. case 1: o.extraBytes = o.pointsStructSize - 28; break;
  26. case 2: o.extraBytes = o.pointsStructSize - 26; break;
  27. case 3: o.extraBytes = o.pointsStructSize - 34; break;
  28. }
  29. o.pointsCount = readAs(arraybuffer, Uint32Array, 32 * 3 + 11);
  30. var start = 32 * 3 + 35;
  31. o.scale = readAs(arraybuffer, Float64Array, start, 3); start += 24;
  32. o.offset = readAs(arraybuffer, Float64Array, start, 3); start += 24;
  33. var bounds = readAs(arraybuffer, Float64Array, start, 6); start += 48;
  34. o.maxs = [bounds[0], bounds[2], bounds[4]];
  35. o.mins = [bounds[1], bounds[3], bounds[5]];
  36. return o;
  37. }
  38. function handleEvent(msg) {
  39. switch(msg.type) {
  40. case "open":
  41. try {
  42. instance = new Module.LASZip();
  43. var abInt = new Uint8Array(msg.arraybuffer);
  44. var buf = Module._malloc(msg.arraybuffer.byteLength);
  45. instance.arraybuffer = msg.arraybuffer;
  46. instance.buf = buf;
  47. Module.HEAPU8.set(abInt, buf);
  48. instance.open(buf, msg.arraybuffer.byteLength);
  49. instance.readOffset = 0;
  50. postMessage({ type: "open", status: 1});
  51. }catch(e) {
  52. debugger;
  53. postMessage({ type: "open", status: 0, details: e });
  54. }
  55. break;
  56. case "header":
  57. if (!instance)
  58. throw new Error(
  59. "You need to open the file before reading the header");
  60. var header = parseLASHeader(instance.arraybuffer);
  61. header.pointsFormatId &= 0x3f;
  62. instance.header = header;
  63. postMessage({type: "header", status: 1, header: header});
  64. break;
  65. case "read":
  66. if (!instance)
  67. throw new Error(
  68. "You need to open the file before trying to read");
  69. var start = msg.start, count = msg.count, skip = msg.skip;
  70. var o = instance;
  71. if (!o.header)
  72. throw new Error(
  73. "You need to query header before reading");
  74. let h = o.header;
  75. var pointsToRead = Math.min(
  76. count * skip, h.pointsCount - o.readOffset);
  77. var bufferSize = Math.ceil(pointsToRead / skip);
  78. var pointsRead = 0;
  79. let buffer = new ArrayBuffer(bufferSize * h.pointsStructSize);
  80. let this_buf = new Uint8Array(buffer);
  81. var buf_read = Module._malloc(h.pointsStructSize);
  82. for (var i = 0 ; i < pointsToRead ; i ++) {
  83. o.getPoint(buf_read);
  84. if (i % skip === 0) {
  85. var a = new Uint8Array(
  86. Module.HEAPU8.buffer,
  87. buf_read,
  88. h.pointsStructSize);
  89. this_buf.set(
  90. a,
  91. pointsRead * h.pointsStructSize,
  92. h.pointsStructSize);
  93. ++pointsRead;
  94. }
  95. ++o.readOffset;
  96. }
  97. Module._free(buf_read);
  98. let transferables = [buffer];
  99. postMessage({
  100. type: 'header',
  101. status: 1,
  102. buffer: buffer,
  103. count: pointsRead,
  104. hasMoreData: o.readOffset < o.header.pointsCount
  105. }, transferables);
  106. break;
  107. case "close":
  108. if (instance !== null) {
  109. Module._free(instance.buf);
  110. instance.delete();
  111. instance = null;
  112. }else{
  113. debugger;
  114. }
  115. postMessage({ type: "close", status: 1});
  116. break;
  117. }
  118. }
  119. onmessage = function(event) {
  120. try {
  121. handleEvent(event.data);
  122. } catch(e) {
  123. debugger;
  124. postMessage({type: event.data.type, status: 0, details: e});
  125. }
  126. };