@loaders.gl/draco 4.3.4 → 4.4.0-alpha.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/dist/dist.dev.js +13059 -1021
  2. package/dist/dist.min.js +12 -3
  3. package/dist/draco-arrow-loader.d.ts +30 -0
  4. package/dist/draco-arrow-loader.d.ts.map +1 -0
  5. package/dist/draco-arrow-loader.js +20 -0
  6. package/dist/draco-arrow-loader.js.map +1 -0
  7. package/dist/draco-format.d.ts +13 -0
  8. package/dist/draco-format.d.ts.map +1 -0
  9. package/dist/draco-format.js +16 -0
  10. package/dist/draco-format.js.map +1 -0
  11. package/dist/draco-loader.d.ts +29 -2
  12. package/dist/draco-loader.d.ts.map +1 -1
  13. package/dist/draco-loader.js +21 -1
  14. package/dist/draco-loader.js.map +1 -0
  15. package/dist/draco-worker-node.js +429 -185
  16. package/dist/draco-worker-node.js.map +4 -4
  17. package/dist/draco-worker.js +188 -116
  18. package/dist/draco-worker.js.map +4 -4
  19. package/dist/draco-writer-worker-node.js +301 -76
  20. package/dist/draco-writer-worker-node.js.map +4 -4
  21. package/dist/draco-writer-worker.js +61 -7
  22. package/dist/draco-writer-worker.js.map +2 -2
  23. package/dist/draco-writer.d.ts +16 -0
  24. package/dist/draco-writer.d.ts.map +1 -1
  25. package/dist/draco-writer.js +21 -1
  26. package/dist/draco-writer.js.map +1 -0
  27. package/dist/draco3d/draco3d-types.js +1 -0
  28. package/dist/draco3d/draco3d-types.js.map +1 -0
  29. package/dist/index.cjs +865 -811
  30. package/dist/index.cjs.map +4 -4
  31. package/dist/index.d.ts +5 -48
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +7 -38
  34. package/dist/index.js.map +1 -0
  35. package/dist/lib/draco-builder.d.ts.map +1 -1
  36. package/dist/lib/draco-builder.js +1 -0
  37. package/dist/lib/draco-builder.js.map +1 -0
  38. package/dist/lib/draco-module-loader.d.ts +3 -2
  39. package/dist/lib/draco-module-loader.d.ts.map +1 -1
  40. package/dist/lib/draco-module-loader.js +53 -10
  41. package/dist/lib/draco-module-loader.js.map +1 -0
  42. package/dist/lib/draco-parser.d.ts.map +1 -1
  43. package/dist/lib/draco-parser.js +4 -1
  44. package/dist/lib/draco-parser.js.map +1 -0
  45. package/dist/lib/draco-types.js +1 -0
  46. package/dist/lib/draco-types.js.map +1 -0
  47. package/dist/lib/utils/get-draco-schema.d.ts.map +1 -1
  48. package/dist/lib/utils/get-draco-schema.js +2 -1
  49. package/dist/lib/utils/get-draco-schema.js.map +1 -0
  50. package/dist/lib/utils/version.js +2 -1
  51. package/dist/lib/utils/version.js.map +1 -0
  52. package/dist/libs/libs/draco_decoder.wasm +0 -0
  53. package/dist/libs/libs/draco_encoder.js +52 -0
  54. package/dist/libs/libs/draco_wasm_wrapper.js +117 -0
  55. package/dist/workers/draco-worker-node.js +1 -0
  56. package/dist/workers/draco-worker-node.js.map +1 -0
  57. package/dist/workers/draco-worker.js +1 -0
  58. package/dist/workers/draco-worker.js.map +1 -0
  59. package/dist/workers/draco-writer-worker-node.cjs +18 -0
  60. package/dist/workers/draco-writer-worker-node.cjs.map +1 -0
  61. package/dist/workers/draco-writer-worker-node.d.cts +2 -0
  62. package/dist/workers/draco-writer-worker-node.d.cts.map +1 -0
  63. package/dist/workers/draco-writer-worker-node.js +1 -0
  64. package/dist/workers/draco-writer-worker-node.js.map +1 -0
  65. package/dist/workers/draco-writer-worker.js +1 -0
  66. package/dist/workers/draco-writer-worker.js.map +1 -0
  67. package/package.json +19 -6
  68. package/src/draco-arrow-loader.ts +25 -0
  69. package/src/draco-format.ts +18 -0
  70. package/src/draco-loader.ts +26 -3
  71. package/src/draco-writer.ts +22 -1
  72. package/src/index.ts +5 -45
  73. package/src/lib/draco-module-loader.ts +87 -23
  74. package/src/lib/draco-parser.ts +3 -1
  75. package/src/lib/utils/get-draco-schema.ts +2 -1
  76. package/src/workers/draco-writer-worker-node.cjs +18 -0
@@ -2,7 +2,7 @@
2
2
  // https://github.com/mrdoob/three.js/blob/398c4f39ebdb8b23eefd4a7a5ec49ec0c96c7462/examples/jsm/loaders/DRACOLoader.js
3
3
  // by Don McCurdy / https://www.donmccurdy.com / MIT license
4
4
 
5
- import {loadLibrary} from '@loaders.gl/worker-utils';
5
+ import {isBrowser, loadLibrary, type LoadLibraryOptions} from '@loaders.gl/worker-utils';
6
6
 
7
7
  const DRACO_DECODER_VERSION = '1.5.6';
8
8
  const DRACO_ENCODER_VERSION = '1.4.1';
@@ -30,7 +30,10 @@ export const DRACO_EXTERNAL_LIBRARY_URLS = {
30
30
  let loadDecoderPromise;
31
31
  let loadEncoderPromise;
32
32
 
33
- export async function loadDracoDecoderModule(options) {
33
+ export async function loadDracoDecoderModule(
34
+ options: LoadLibraryOptions = {},
35
+ type: 'wasm' | 'js'
36
+ ) {
34
37
  const modules = options.modules || {};
35
38
 
36
39
  // Check if a bundled draco3d library has been supplied by application
@@ -40,12 +43,12 @@ export async function loadDracoDecoderModule(options) {
40
43
  });
41
44
  } else {
42
45
  // If not, dynamically load the WASM script from our CDN
43
- loadDecoderPromise ||= loadDracoDecoder(options);
46
+ loadDecoderPromise ||= loadDracoDecoder(options, type);
44
47
  }
45
48
  return await loadDecoderPromise;
46
49
  }
47
50
 
48
- export async function loadDracoEncoderModule(options) {
51
+ export async function loadDracoEncoderModule(options: LoadLibraryOptions) {
49
52
  const modules = options.modules || {};
50
53
 
51
54
  // Check if a bundled draco3d library has been supplied by application
@@ -60,12 +63,24 @@ export async function loadDracoEncoderModule(options) {
60
63
  return await loadEncoderPromise;
61
64
  }
62
65
 
63
- // DRACO DECODER LOADING
66
+ function getLibraryExport(library: any, exportName: string): any {
67
+ if (library && typeof library === 'object') {
68
+ if (library.default) {
69
+ return library.default;
70
+ }
71
+ if (library[exportName]) {
72
+ return library[exportName];
73
+ }
74
+ }
75
+ return library;
76
+ }
64
77
 
65
- async function loadDracoDecoder(options) {
78
+ // DRACO DECODER LOADING
79
+ /** @todo - type the options, they are inconsistent */
80
+ async function loadDracoDecoder(options: LoadLibraryOptions, type: 'wasm' | 'js') {
66
81
  let DracoDecoderModule;
67
82
  let wasmBinary;
68
- switch (options.draco && options.draco.decoderType) {
83
+ switch (type) {
69
84
  case 'js':
70
85
  DracoDecoderModule = await loadLibrary(
71
86
  DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.FALLBACK_DECODER],
@@ -77,28 +92,59 @@ async function loadDracoDecoder(options) {
77
92
 
78
93
  case 'wasm':
79
94
  default:
80
- [DracoDecoderModule, wasmBinary] = await Promise.all([
81
- await loadLibrary(
82
- DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.DECODER],
83
- 'draco',
84
- options,
85
- DRACO_EXTERNAL_LIBRARIES.DECODER
86
- ),
87
- await loadLibrary(
88
- DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.DECODER_WASM],
89
- 'draco',
90
- options,
91
- DRACO_EXTERNAL_LIBRARIES.DECODER_WASM
92
- )
93
- ]);
95
+ try {
96
+ [DracoDecoderModule, wasmBinary] = await Promise.all([
97
+ await loadLibrary(
98
+ DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.DECODER],
99
+ 'draco',
100
+ options,
101
+ DRACO_EXTERNAL_LIBRARIES.DECODER
102
+ ),
103
+ await loadLibrary(
104
+ DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.DECODER_WASM],
105
+ 'draco',
106
+ options,
107
+ DRACO_EXTERNAL_LIBRARIES.DECODER_WASM
108
+ )
109
+ ]);
110
+ } catch {
111
+ DracoDecoderModule = null;
112
+ wasmBinary = null;
113
+ }
94
114
  }
95
- // Depends on how import happened...
115
+ DracoDecoderModule = getLibraryExport(DracoDecoderModule, 'DracoDecoderModule');
96
116
  // @ts-ignore
97
117
  DracoDecoderModule = DracoDecoderModule || globalThis.DracoDecoderModule;
118
+
119
+ // In Node environments without network access, fall back to local copies in the repo.
120
+ if (!DracoDecoderModule && !isBrowser) {
121
+ [DracoDecoderModule, wasmBinary] = await Promise.all([
122
+ await loadLibrary(
123
+ DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.DECODER],
124
+ 'draco',
125
+ {...options, useLocalLibraries: true},
126
+ DRACO_EXTERNAL_LIBRARIES.DECODER
127
+ ),
128
+ await loadLibrary(
129
+ DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.DECODER_WASM],
130
+ 'draco',
131
+ {...options, useLocalLibraries: true},
132
+ DRACO_EXTERNAL_LIBRARIES.DECODER_WASM
133
+ )
134
+ ]);
135
+ DracoDecoderModule = getLibraryExport(DracoDecoderModule, 'DracoDecoderModule');
136
+ // @ts-ignore
137
+ DracoDecoderModule = DracoDecoderModule || globalThis.DracoDecoderModule;
138
+ }
139
+
98
140
  return await initializeDracoDecoder(DracoDecoderModule, wasmBinary);
99
141
  }
100
142
 
101
143
  function initializeDracoDecoder(DracoDecoderModule, wasmBinary) {
144
+ if (typeof DracoDecoderModule !== 'function') {
145
+ throw new Error('DracoDecoderModule could not be loaded');
146
+ }
147
+
102
148
  const options: {wasmBinary?: any} = {};
103
149
  if (wasmBinary) {
104
150
  options.wasmBinary = wasmBinary;
@@ -114,16 +160,34 @@ function initializeDracoDecoder(DracoDecoderModule, wasmBinary) {
114
160
 
115
161
  // ENCODER
116
162
 
117
- async function loadDracoEncoder(options) {
163
+ async function loadDracoEncoder(options: LoadLibraryOptions) {
118
164
  let DracoEncoderModule = await loadLibrary(
119
165
  DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.ENCODER],
120
166
  'draco',
121
167
  options,
122
168
  DRACO_EXTERNAL_LIBRARIES.ENCODER
123
169
  );
170
+ DracoEncoderModule = getLibraryExport(DracoEncoderModule, 'DracoEncoderModule');
124
171
  // @ts-ignore
125
172
  DracoEncoderModule = DracoEncoderModule || globalThis.DracoEncoderModule;
126
173
 
174
+ // In Node environments without network access, fall back to local copies in the repo.
175
+ if (!DracoEncoderModule && !isBrowser) {
176
+ DracoEncoderModule = await loadLibrary(
177
+ DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.ENCODER],
178
+ 'draco',
179
+ {...options, useLocalLibraries: true},
180
+ DRACO_EXTERNAL_LIBRARIES.ENCODER
181
+ );
182
+ DracoEncoderModule = getLibraryExport(DracoEncoderModule, 'DracoEncoderModule');
183
+ // @ts-ignore
184
+ DracoEncoderModule = DracoEncoderModule || globalThis.DracoEncoderModule;
185
+ }
186
+
187
+ if (typeof DracoEncoderModule !== 'function') {
188
+ throw new Error('DracoEncoderModule could not be loaded');
189
+ }
190
+
127
191
  return new Promise((resolve) => {
128
192
  DracoEncoderModule({
129
193
  onModuleLoaded: (draco) => resolve({draco}) // Module is Promise-like. Wrap in object to avoid loop.
@@ -25,7 +25,7 @@ import type {
25
25
  DracoOctahedronTransform
26
26
  } from './draco-types';
27
27
 
28
- import {getMeshBoundingBox} from '@loaders.gl/schema';
28
+ import {getMeshBoundingBox} from '@loaders.gl/schema-utils';
29
29
  import {getDracoSchema} from './utils/get-draco-schema';
30
30
 
31
31
  /** Options to control draco parsing */
@@ -257,6 +257,7 @@ export default class DracoParser {
257
257
  case 'triangle-strip':
258
258
  return {
259
259
  topology: 'triangle-strip',
260
+ // TODO - mode is wrong?
260
261
  mode: 4, // GL.TRIANGLES
261
262
  attributes,
262
263
  indices: {
@@ -268,6 +269,7 @@ export default class DracoParser {
268
269
  default:
269
270
  return {
270
271
  topology: 'triangle-list',
272
+ // TODO - mode is wrong?
271
273
  mode: 5, // GL.TRIANGLE_STRIP
272
274
  attributes,
273
275
  indices: {
@@ -1,4 +1,5 @@
1
- import {deduceMeshField, MeshAttribute, Schema, Field} from '@loaders.gl/schema';
1
+ import {MeshAttribute, Schema, Field} from '@loaders.gl/schema';
2
+ import {deduceMeshField} from '@loaders.gl/schema-utils';
2
3
  import type {DracoAttribute, DracoLoaderData, DracoMetadataEntry} from '../draco-types';
3
4
 
4
5
  /** Extract an arrow-like schema from a Draco mesh */
@@ -0,0 +1,18 @@
1
+ // `@loaders.gl/draco` is an ESM package, so Node.js treats `.js` files as ES modules when executed directly.
2
+ // The prebuilt Node worker bundle is emitted as CommonJS, so we load it by compiling it as CommonJS.
3
+ /* @ts-expect-error TS doesn't like require in an ESM context */
4
+ const fs = require('node:fs');
5
+ /* @ts-expect-error TS doesn't like require in an ESM context */
6
+ const path = require('node:path');
7
+ /* @ts-expect-error TS doesn't like require in an ESM context */
8
+ const Module = require('node:module');
9
+
10
+ const filename = path.join(__dirname, '../../dist/draco-writer-worker-node.js');
11
+ const code = fs.readFileSync(filename, 'utf8');
12
+
13
+ const workerModule = new Module(filename);
14
+ workerModule.filename = filename;
15
+ // eslint-disable-next-line no-underscore-dangle
16
+ workerModule.paths = Module._nodeModulePaths(path.dirname(filename));
17
+ // eslint-disable-next-line no-underscore-dangle
18
+ workerModule._compile(code, filename);