2
0

import_stl.js 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. let pos = 0;
  2. function read_i16(view) {
  3. let i = view.getInt16(pos, true);
  4. pos += 2;
  5. return i;
  6. }
  7. function read_i32(view) {
  8. let i = view.getInt32(pos, true);
  9. pos += 4;
  10. return i;
  11. }
  12. function read_f32(view) {
  13. let f = view.getFloat32(pos, true);
  14. pos += 4;
  15. return f;
  16. }
  17. function import_stl(path) {
  18. let b = data_get_blob(path);
  19. let view = new DataView(b);
  20. pos = 0;
  21. pos += 80; // header
  22. let faces = read_i32(view);
  23. let pos_temp = new Float32Array(faces * 9);
  24. let nor_temp = new Float32Array(faces * 3);
  25. for (let i = 0; i < faces; ++i) {
  26. let i3 = i * 3;
  27. nor_temp[i3 ] = read_f32(view);
  28. nor_temp[i3 + 1] = read_f32(view);
  29. nor_temp[i3 + 2] = read_f32(view);
  30. let i9 = i * 9;
  31. pos_temp[i9 ] = read_f32(view);
  32. pos_temp[i9 + 1] = read_f32(view);
  33. pos_temp[i9 + 2] = read_f32(view);
  34. pos_temp[i9 + 3] = read_f32(view);
  35. pos_temp[i9 + 4] = read_f32(view);
  36. pos_temp[i9 + 5] = read_f32(view);
  37. pos_temp[i9 + 6] = read_f32(view);
  38. pos_temp[i9 + 7] = read_f32(view);
  39. pos_temp[i9 + 8] = read_f32(view);
  40. read_i16(view); // attribute
  41. }
  42. let scale_pos = 0.0;
  43. for (let i = 0; i < pos_temp.length; ++i) {
  44. let f = Math.abs(pos_temp[i]);
  45. if (scale_pos < f) {
  46. scale_pos = f;
  47. }
  48. }
  49. let inv = 32767 * (1 / scale_pos);
  50. let verts = pos_temp.length / 3;
  51. let posa = new Int16Array(verts * 4);
  52. let nora = new Int16Array(verts * 2);
  53. let inda = new Uint32Array(verts);
  54. for (let i = 0; i < verts; ++i) {
  55. posa[i * 4 ] = pos_temp[i * 3 ] * inv;
  56. posa[i * 4 + 1] = -pos_temp[i * 3 + 2] * inv;
  57. posa[i * 4 + 2] = pos_temp[i * 3 + 1] * inv;
  58. nora[i * 2 ] = nor_temp[i ] * 32767;
  59. nora[i * 2 + 1] = -nor_temp[i + 2] * 32767;
  60. posa[i * 4 + 3] = nor_temp[i + 1] * 32767;
  61. inda[i] = i;
  62. }
  63. data_delete_blob(path);
  64. let name = path.split("\\\\").pop().split("/").pop().split(".").shift();
  65. return plugin_api_make_raw_mesh(name, posa.buffer, nora.buffer, inda.buffer, scale_pos);
  66. }
  67. let plugin = plugin_create();
  68. path_mesh_importers_set("stl", import_stl);
  69. plugin_notify_on_delete(plugin, function() {
  70. path_mesh_importers_delete("stl");
  71. });