@loaders.gl/draco 3.3.0-alpha.5 → 3.3.0-alpha.6

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 (67) hide show
  1. package/dist/draco-nodejs-worker.js +70 -69
  2. package/dist/draco-nodejs-worker.js.map +3 -3
  3. package/dist/draco-worker.js +1 -1
  4. package/dist/draco-writer-nodejs-worker.js +61 -60
  5. package/dist/draco-writer-nodejs-worker.js.map +3 -3
  6. package/dist/draco-writer-worker.js +2 -2
  7. package/dist/es5/bundle.js +0 -1
  8. package/dist/es5/bundle.js.map +1 -1
  9. package/dist/es5/draco-loader.js +1 -4
  10. package/dist/es5/draco-loader.js.map +1 -1
  11. package/dist/es5/draco-writer-nodejs.js +0 -2
  12. package/dist/es5/draco-writer-nodejs.js.map +1 -1
  13. package/dist/es5/draco-writer.js +5 -17
  14. package/dist/es5/draco-writer.js.map +1 -1
  15. package/dist/es5/draco3d/draco3d-types.js +1 -8
  16. package/dist/es5/draco3d/draco3d-types.js.map +1 -1
  17. package/dist/es5/index.js +5 -25
  18. package/dist/es5/index.js.map +1 -1
  19. package/dist/es5/lib/draco-builder.js +40 -96
  20. package/dist/es5/lib/draco-builder.js.map +1 -1
  21. package/dist/es5/lib/draco-module-loader.js +2 -41
  22. package/dist/es5/lib/draco-module-loader.js.map +1 -1
  23. package/dist/es5/lib/draco-parser.js +63 -111
  24. package/dist/es5/lib/draco-parser.js.map +1 -1
  25. package/dist/es5/lib/draco-types.js.map +1 -1
  26. package/dist/es5/lib/utils/get-draco-schema.js +0 -12
  27. package/dist/es5/lib/utils/get-draco-schema.js.map +1 -1
  28. package/dist/es5/lib/utils/version.js +1 -1
  29. package/dist/es5/lib/utils/version.js.map +1 -1
  30. package/dist/es5/workers/draco-nodejs-worker.js +0 -3
  31. package/dist/es5/workers/draco-nodejs-worker.js.map +1 -1
  32. package/dist/es5/workers/draco-worker.js +0 -2
  33. package/dist/es5/workers/draco-worker.js.map +1 -1
  34. package/dist/es5/workers/draco-writer-nodejs-worker.js +0 -15
  35. package/dist/es5/workers/draco-writer-nodejs-worker.js.map +1 -1
  36. package/dist/es5/workers/draco-writer-worker.js +0 -15
  37. package/dist/es5/workers/draco-writer-worker.js.map +1 -1
  38. package/dist/esm/bundle.js +1 -1
  39. package/dist/esm/bundle.js.map +1 -1
  40. package/dist/esm/draco-loader.js +1 -0
  41. package/dist/esm/draco-loader.js.map +1 -1
  42. package/dist/esm/draco-writer-nodejs.js +1 -0
  43. package/dist/esm/draco-writer-nodejs.js.map +1 -1
  44. package/dist/esm/draco-writer.js +3 -3
  45. package/dist/esm/draco-writer.js.map +1 -1
  46. package/dist/esm/draco3d/draco3d-types.js +2 -3
  47. package/dist/esm/draco3d/draco3d-types.js.map +1 -1
  48. package/dist/esm/index.js +6 -3
  49. package/dist/esm/index.js.map +1 -1
  50. package/dist/esm/lib/draco-builder.js +6 -75
  51. package/dist/esm/lib/draco-builder.js.map +1 -1
  52. package/dist/esm/lib/draco-module-loader.js +4 -9
  53. package/dist/esm/lib/draco-module-loader.js.map +1 -1
  54. package/dist/esm/lib/draco-parser.js +5 -66
  55. package/dist/esm/lib/draco-parser.js.map +1 -1
  56. package/dist/esm/lib/draco-types.js.map +1 -1
  57. package/dist/esm/lib/utils/get-draco-schema.js +0 -10
  58. package/dist/esm/lib/utils/get-draco-schema.js.map +1 -1
  59. package/dist/esm/lib/utils/version.js +2 -1
  60. package/dist/esm/lib/utils/version.js.map +1 -1
  61. package/dist/esm/workers/draco-nodejs-worker.js.map +1 -1
  62. package/dist/esm/workers/draco-worker.js.map +1 -1
  63. package/dist/esm/workers/draco-writer-nodejs-worker.js +0 -4
  64. package/dist/esm/workers/draco-writer-nodejs-worker.js.map +1 -1
  65. package/dist/esm/workers/draco-writer-worker.js +0 -4
  66. package/dist/esm/workers/draco-writer-worker.js.map +1 -1
  67. package/package.json +6 -6
@@ -1,33 +1,21 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports.default = void 0;
9
-
10
8
  var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
11
-
12
9
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
-
14
10
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
15
-
16
11
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
17
-
18
12
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
19
-
20
13
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
21
-
22
14
  function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
23
-
24
15
  function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
25
-
26
16
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
27
-
28
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
29
-
30
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
17
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
18
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
31
19
 
32
20
  var GLTF_TO_DRACO_ATTRIBUTE_NAME_MAP = {
33
21
  POSITION: 'POSITION',
@@ -35,9 +23,7 @@ var GLTF_TO_DRACO_ATTRIBUTE_NAME_MAP = {
35
23
  COLOR_0: 'COLOR',
36
24
  TEXCOORD_0: 'TEX_COORD'
37
25
  };
38
-
39
26
  var noop = function noop() {};
40
-
41
27
  var DracoBuilder = function () {
42
28
  function DracoBuilder(draco) {
43
29
  (0, _classCallCheck2.default)(this, DracoBuilder);
@@ -51,7 +37,6 @@ var DracoBuilder = function () {
51
37
  this.dracoMeshBuilder = new this.draco.MeshBuilder();
52
38
  this.dracoMetadataBuilder = new this.draco.MetadataBuilder();
53
39
  }
54
-
55
40
  (0, _createClass2.default)(DracoBuilder, [{
56
41
  key: "destroy",
57
42
  value: function destroy() {
@@ -62,56 +47,53 @@ var DracoBuilder = function () {
62
47
  this.dracoEncoder = null;
63
48
  this.draco = null;
64
49
  }
50
+
65
51
  }, {
66
52
  key: "destroyEncodedObject",
67
- value: function destroyEncodedObject(object) {
53
+ value:
54
+ function destroyEncodedObject(object) {
68
55
  if (object) {
69
56
  this.draco.destroy(object);
70
57
  }
71
58
  }
59
+
72
60
  }, {
73
61
  key: "encodeSync",
74
- value: function encodeSync(mesh) {
62
+ value:
63
+ function encodeSync(mesh) {
75
64
  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
76
65
  this.log = noop;
77
-
78
66
  this._setOptions(options);
79
-
80
67
  return options.pointcloud ? this._encodePointCloud(mesh, options) : this._encodeMesh(mesh, options);
81
68
  }
69
+
82
70
  }, {
83
71
  key: "_getAttributesFromMesh",
84
- value: function _getAttributesFromMesh(mesh) {
85
- var attributes = _objectSpread(_objectSpread({}, mesh), mesh.attributes);
72
+ value:
86
73
 
74
+ function _getAttributesFromMesh(mesh) {
75
+ var attributes = _objectSpread(_objectSpread({}, mesh), mesh.attributes);
87
76
  if (mesh.indices) {
88
77
  attributes.indices = mesh.indices;
89
78
  }
90
-
91
79
  return attributes;
92
80
  }
93
81
  }, {
94
82
  key: "_encodePointCloud",
95
83
  value: function _encodePointCloud(pointcloud, options) {
96
84
  var dracoPointCloud = new this.draco.PointCloud();
97
-
98
85
  if (options.metadata) {
99
86
  this._addGeometryMetadata(dracoPointCloud, options.metadata);
100
87
  }
101
-
102
88
  var attributes = this._getAttributesFromMesh(pointcloud);
103
89
 
104
90
  this._createDracoPointCloud(dracoPointCloud, attributes, options);
105
-
106
91
  var dracoData = new this.draco.DracoInt8Array();
107
-
108
92
  try {
109
93
  var encodedLen = this.dracoEncoder.EncodePointCloudToDracoBuffer(dracoPointCloud, false, dracoData);
110
-
111
94
  if (!(encodedLen > 0)) {
112
95
  throw new Error('Draco encoding failed.');
113
96
  }
114
-
115
97
  this.log("DRACO encoded ".concat(dracoPointCloud.num_points(), " points\n with ").concat(dracoPointCloud.num_attributes(), " attributes into ").concat(encodedLen, " bytes"));
116
98
  return dracoInt8ArrayToArrayBuffer(dracoData);
117
99
  } finally {
@@ -123,24 +105,18 @@ var DracoBuilder = function () {
123
105
  key: "_encodeMesh",
124
106
  value: function _encodeMesh(mesh, options) {
125
107
  var dracoMesh = new this.draco.Mesh();
126
-
127
108
  if (options.metadata) {
128
109
  this._addGeometryMetadata(dracoMesh, options.metadata);
129
110
  }
130
-
131
111
  var attributes = this._getAttributesFromMesh(mesh);
132
112
 
133
113
  this._createDracoMesh(dracoMesh, attributes, options);
134
-
135
114
  var dracoData = new this.draco.DracoInt8Array();
136
-
137
115
  try {
138
116
  var encodedLen = this.dracoEncoder.EncodeMeshToDracoBuffer(dracoMesh, dracoData);
139
-
140
117
  if (encodedLen <= 0) {
141
118
  throw new Error('Draco encoding failed.');
142
119
  }
143
-
144
120
  this.log("DRACO encoded ".concat(dracoMesh.num_points(), " points\n with ").concat(dracoMesh.num_attributes(), " attributes into ").concat(encodedLen, " bytes"));
145
121
  return dracoInt8ArrayToArrayBuffer(dracoData);
146
122
  } finally {
@@ -148,20 +124,19 @@ var DracoBuilder = function () {
148
124
  this.destroyEncodedObject(dracoMesh);
149
125
  }
150
126
  }
127
+
151
128
  }, {
152
129
  key: "_setOptions",
153
- value: function _setOptions(options) {
130
+ value:
131
+ function _setOptions(options) {
154
132
  if ('speed' in options) {
155
133
  var _this$dracoEncoder;
156
-
157
134
  (_this$dracoEncoder = this.dracoEncoder).SetSpeedOptions.apply(_this$dracoEncoder, (0, _toConsumableArray2.default)(options.speed));
158
135
  }
159
-
160
136
  if ('method' in options) {
161
137
  var dracoMethod = this.draco[options.method || 'MESH_SEQUENTIAL_ENCODING'];
162
138
  this.dracoEncoder.SetEncodingMethod(dracoMethod);
163
139
  }
164
-
165
140
  if ('quantization' in options) {
166
141
  for (var attribute in options.quantization) {
167
142
  var bits = options.quantization[attribute];
@@ -170,26 +145,22 @@ var DracoBuilder = function () {
170
145
  }
171
146
  }
172
147
  }
148
+
173
149
  }, {
174
150
  key: "_createDracoMesh",
175
- value: function _createDracoMesh(dracoMesh, attributes, options) {
151
+ value:
152
+ function _createDracoMesh(dracoMesh, attributes, options) {
176
153
  var optionalMetadata = options.attributesMetadata || {};
177
-
178
154
  try {
179
155
  var positions = this._getPositionAttribute(attributes);
180
-
181
156
  if (!positions) {
182
157
  throw new Error('positions');
183
158
  }
184
-
185
159
  var vertexCount = positions.length / 3;
186
-
187
160
  for (var _attributeName in attributes) {
188
161
  var attribute = attributes[_attributeName];
189
162
  _attributeName = GLTF_TO_DRACO_ATTRIBUTE_NAME_MAP[_attributeName] || _attributeName;
190
-
191
163
  var uniqueId = this._addAttributeToMesh(dracoMesh, _attributeName, attribute, vertexCount);
192
-
193
164
  if (uniqueId !== -1) {
194
165
  this._addAttributeMetadata(dracoMesh, uniqueId, _objectSpread({
195
166
  name: _attributeName
@@ -200,29 +171,24 @@ var DracoBuilder = function () {
200
171
  this.destroyEncodedObject(dracoMesh);
201
172
  throw error;
202
173
  }
203
-
204
174
  return dracoMesh;
205
175
  }
176
+
206
177
  }, {
207
178
  key: "_createDracoPointCloud",
208
- value: function _createDracoPointCloud(dracoPointCloud, attributes, options) {
179
+ value:
180
+ function _createDracoPointCloud(dracoPointCloud, attributes, options) {
209
181
  var optionalMetadata = options.attributesMetadata || {};
210
-
211
182
  try {
212
183
  var positions = this._getPositionAttribute(attributes);
213
-
214
184
  if (!positions) {
215
185
  throw new Error('positions');
216
186
  }
217
-
218
187
  var vertexCount = positions.length / 3;
219
-
220
188
  for (var _attributeName2 in attributes) {
221
189
  var attribute = attributes[_attributeName2];
222
190
  _attributeName2 = GLTF_TO_DRACO_ATTRIBUTE_NAME_MAP[_attributeName2] || _attributeName2;
223
-
224
191
  var uniqueId = this._addAttributeToMesh(dracoPointCloud, _attributeName2, attribute, vertexCount);
225
-
226
192
  if (uniqueId !== -1) {
227
193
  this._addAttributeMetadata(dracoPointCloud, uniqueId, _objectSpread({
228
194
  name: _attributeName2
@@ -233,80 +199,68 @@ var DracoBuilder = function () {
233
199
  this.destroyEncodedObject(dracoPointCloud);
234
200
  throw error;
235
201
  }
236
-
237
202
  return dracoPointCloud;
238
203
  }
204
+
239
205
  }, {
240
206
  key: "_addAttributeToMesh",
241
- value: function _addAttributeToMesh(mesh, attributeName, attribute, vertexCount) {
207
+ value:
208
+ function _addAttributeToMesh(mesh, attributeName, attribute, vertexCount) {
242
209
  if (!ArrayBuffer.isView(attribute)) {
243
210
  return -1;
244
211
  }
245
-
246
212
  var type = this._getDracoAttributeType(attributeName);
247
-
248
213
  var size = attribute.length / vertexCount;
249
-
250
214
  if (type === 'indices') {
251
215
  var numFaces = attribute.length / 3;
252
216
  this.log("Adding attribute ".concat(attributeName, ", size ").concat(numFaces));
217
+
253
218
  this.dracoMeshBuilder.AddFacesToMesh(mesh, numFaces, attribute);
254
219
  return -1;
255
220
  }
256
-
257
221
  this.log("Adding attribute ".concat(attributeName, ", size ").concat(size));
258
222
  var builder = this.dracoMeshBuilder;
259
223
  var buffer = attribute.buffer;
260
-
261
224
  switch (attribute.constructor) {
262
225
  case Int8Array:
263
226
  return builder.AddInt8Attribute(mesh, type, vertexCount, size, new Int8Array(buffer));
264
-
265
227
  case Int16Array:
266
228
  return builder.AddInt16Attribute(mesh, type, vertexCount, size, new Int16Array(buffer));
267
-
268
229
  case Int32Array:
269
230
  return builder.AddInt32Attribute(mesh, type, vertexCount, size, new Int32Array(buffer));
270
-
271
231
  case Uint8Array:
272
232
  case Uint8ClampedArray:
273
233
  return builder.AddUInt8Attribute(mesh, type, vertexCount, size, new Uint8Array(buffer));
274
-
275
234
  case Uint16Array:
276
235
  return builder.AddUInt16Attribute(mesh, type, vertexCount, size, new Uint16Array(buffer));
277
-
278
236
  case Uint32Array:
279
237
  return builder.AddUInt32Attribute(mesh, type, vertexCount, size, new Uint32Array(buffer));
280
-
281
238
  case Float32Array:
282
239
  default:
283
240
  return builder.AddFloatAttribute(mesh, type, vertexCount, size, new Float32Array(buffer));
284
241
  }
285
242
  }
243
+
286
244
  }, {
287
245
  key: "_getDracoAttributeType",
288
- value: function _getDracoAttributeType(attributeName) {
246
+ value:
247
+ function _getDracoAttributeType(attributeName) {
289
248
  switch (attributeName.toLowerCase()) {
290
249
  case 'indices':
291
250
  return 'indices';
292
-
293
251
  case 'position':
294
252
  case 'positions':
295
253
  case 'vertices':
296
254
  return this.draco.POSITION;
297
-
298
255
  case 'normal':
299
256
  case 'normals':
300
257
  return this.draco.NORMAL;
301
-
302
258
  case 'color':
303
259
  case 'colors':
304
260
  return this.draco.COLOR;
305
-
306
261
  case 'texcoord':
307
262
  case 'texcoords':
308
263
  return this.draco.TEX_COORD;
309
-
310
264
  default:
311
265
  return this.draco.GENERIC;
312
266
  }
@@ -316,46 +270,43 @@ var DracoBuilder = function () {
316
270
  value: function _getPositionAttribute(attributes) {
317
271
  for (var _attributeName3 in attributes) {
318
272
  var attribute = attributes[_attributeName3];
319
-
320
273
  var dracoType = this._getDracoAttributeType(_attributeName3);
321
-
322
274
  if (dracoType === this.draco.POSITION) {
323
275
  return attribute;
324
276
  }
325
277
  }
326
-
327
278
  return null;
328
279
  }
280
+
329
281
  }, {
330
282
  key: "_addGeometryMetadata",
331
- value: function _addGeometryMetadata(dracoGeometry, metadata) {
283
+ value:
284
+ function _addGeometryMetadata(dracoGeometry, metadata) {
332
285
  var dracoMetadata = new this.draco.Metadata();
333
-
334
286
  this._populateDracoMetadata(dracoMetadata, metadata);
335
-
336
287
  this.dracoMeshBuilder.AddMetadata(dracoGeometry, dracoMetadata);
337
288
  }
289
+
338
290
  }, {
339
291
  key: "_addAttributeMetadata",
340
- value: function _addAttributeMetadata(dracoGeometry, uniqueAttributeId, metadata) {
292
+ value:
293
+ function _addAttributeMetadata(dracoGeometry, uniqueAttributeId, metadata) {
341
294
  var dracoAttributeMetadata = new this.draco.Metadata();
342
-
343
295
  this._populateDracoMetadata(dracoAttributeMetadata, metadata);
344
-
345
296
  this.dracoMeshBuilder.SetMetadataForAttribute(dracoGeometry, uniqueAttributeId, dracoAttributeMetadata);
346
297
  }
298
+
347
299
  }, {
348
300
  key: "_populateDracoMetadata",
349
- value: function _populateDracoMetadata(dracoMetadata, metadata) {
301
+ value:
302
+ function _populateDracoMetadata(dracoMetadata, metadata) {
350
303
  var _iterator = _createForOfIteratorHelper(getEntries(metadata)),
351
- _step;
352
-
304
+ _step;
353
305
  try {
354
306
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
355
307
  var _step$value = (0, _slicedToArray2.default)(_step.value, 2),
356
- _key = _step$value[0],
357
- value = _step$value[1];
358
-
308
+ _key = _step$value[0],
309
+ value = _step$value[1];
359
310
  switch ((0, _typeof2.default)(value)) {
360
311
  case 'number':
361
312
  if (Math.trunc(value) === value) {
@@ -363,16 +314,12 @@ var DracoBuilder = function () {
363
314
  } else {
364
315
  this.dracoMetadataBuilder.AddDoubleEntry(dracoMetadata, _key, value);
365
316
  }
366
-
367
317
  break;
368
-
369
318
  case 'object':
370
319
  if (value instanceof Int32Array) {
371
320
  this.dracoMetadataBuilder.AddIntEntryArray(dracoMetadata, _key, value, value.length);
372
321
  }
373
-
374
322
  break;
375
-
376
323
  case 'string':
377
324
  default:
378
325
  this.dracoMetadataBuilder.AddStringEntry(dracoMetadata, _key, value);
@@ -387,18 +334,15 @@ var DracoBuilder = function () {
387
334
  }]);
388
335
  return DracoBuilder;
389
336
  }();
390
-
391
337
  exports.default = DracoBuilder;
392
338
 
393
339
  function dracoInt8ArrayToArrayBuffer(dracoData) {
394
340
  var byteLength = dracoData.size();
395
341
  var outputBuffer = new ArrayBuffer(byteLength);
396
342
  var outputData = new Int8Array(outputBuffer);
397
-
398
343
  for (var i = 0; i < byteLength; ++i) {
399
344
  outputData[i] = dracoData.GetValue(i);
400
345
  }
401
-
402
346
  return outputBuffer;
403
347
  }
404
348
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/draco-builder.ts"],"names":["GLTF_TO_DRACO_ATTRIBUTE_NAME_MAP","POSITION","NORMAL","COLOR_0","TEXCOORD_0","noop","DracoBuilder","draco","dracoEncoder","Encoder","dracoMeshBuilder","MeshBuilder","dracoMetadataBuilder","MetadataBuilder","destroyEncodedObject","object","destroy","mesh","options","log","_setOptions","pointcloud","_encodePointCloud","_encodeMesh","attributes","indices","dracoPointCloud","PointCloud","metadata","_addGeometryMetadata","_getAttributesFromMesh","_createDracoPointCloud","dracoData","DracoInt8Array","encodedLen","EncodePointCloudToDracoBuffer","Error","num_points","num_attributes","dracoInt8ArrayToArrayBuffer","dracoMesh","Mesh","_createDracoMesh","EncodeMeshToDracoBuffer","SetSpeedOptions","speed","dracoMethod","method","SetEncodingMethod","attribute","quantization","bits","dracoPosition","SetAttributeQuantization","optionalMetadata","attributesMetadata","positions","_getPositionAttribute","vertexCount","length","attributeName","uniqueId","_addAttributeToMesh","_addAttributeMetadata","name","error","ArrayBuffer","isView","type","_getDracoAttributeType","size","numFaces","AddFacesToMesh","builder","buffer","constructor","Int8Array","AddInt8Attribute","Int16Array","AddInt16Attribute","Int32Array","AddInt32Attribute","Uint8Array","Uint8ClampedArray","AddUInt8Attribute","Uint16Array","AddUInt16Attribute","Uint32Array","AddUInt32Attribute","Float32Array","AddFloatAttribute","toLowerCase","COLOR","TEX_COORD","GENERIC","dracoType","dracoGeometry","dracoMetadata","Metadata","_populateDracoMetadata","AddMetadata","uniqueAttributeId","dracoAttributeMetadata","SetMetadataForAttribute","getEntries","key","value","Math","trunc","AddIntEntry","AddDoubleEntry","AddIntEntryArray","AddStringEntry","byteLength","outputBuffer","outputData","i","GetValue","container","hasEntriesFunc","entries","hasOwnProperty","Object"],"mappings":"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","sourcesContent":["/* eslint-disable camelcase */\n// This code is inspired by example code in the DRACO repository\nimport type {\n Draco3D,\n DracoInt8Array,\n Encoder,\n Mesh,\n MeshBuilder,\n PointCloud,\n Metadata,\n MetadataBuilder,\n draco_GeometryAttribute_Type\n} from '../draco3d/draco3d-types';\n\nimport type {TypedArray} from '@loaders.gl/schema';\nimport type {DracoMesh} from './draco-types';\n\nexport type DracoBuildOptions = {\n pointcloud?: boolean;\n metadata?: {[key: string]: string};\n attributesMetadata?: {};\n log?: any;\n\n // draco encoding options\n speed?: [number, number];\n method?: string;\n quantization?: {[attributeName: string]: number};\n};\n\n// Native Draco attribute names to GLTF attribute names.\nconst GLTF_TO_DRACO_ATTRIBUTE_NAME_MAP = {\n POSITION: 'POSITION',\n NORMAL: 'NORMAL',\n COLOR_0: 'COLOR',\n TEXCOORD_0: 'TEX_COORD'\n};\n\nconst noop = () => {};\n\nexport default class DracoBuilder {\n draco: Draco3D;\n dracoEncoder: Encoder;\n dracoMeshBuilder: MeshBuilder;\n dracoMetadataBuilder: MetadataBuilder;\n log: any;\n\n // draco - the draco decoder, either import `draco3d` or load dynamically\n constructor(draco: Draco3D) {\n this.draco = draco;\n this.dracoEncoder = new this.draco.Encoder();\n this.dracoMeshBuilder = new this.draco.MeshBuilder();\n this.dracoMetadataBuilder = new this.draco.MetadataBuilder();\n }\n\n destroy(): void {\n this.destroyEncodedObject(this.dracoMeshBuilder);\n this.destroyEncodedObject(this.dracoEncoder);\n this.destroyEncodedObject(this.dracoMetadataBuilder);\n // @ts-ignore\n this.dracoMeshBuilder = null;\n // @ts-ignore\n this.dracoEncoder = null;\n // @ts-ignore\n this.draco = null;\n }\n\n // TBD - when does this need to be called?\n destroyEncodedObject(object): void {\n if (object) {\n this.draco.destroy(object);\n }\n }\n\n /**\n * Encode mesh or point cloud\n * @param mesh =({})\n * @param options\n */\n encodeSync(mesh: DracoMesh, options: DracoBuildOptions = {}): ArrayBuffer {\n this.log = noop; // TODO\n this._setOptions(options);\n\n return options.pointcloud\n ? this._encodePointCloud(mesh, options)\n : this._encodeMesh(mesh, options);\n }\n\n // PRIVATE\n\n _getAttributesFromMesh(mesh: DracoMesh) {\n // TODO - Change the encodePointCloud interface instead?\n const attributes = {...mesh, ...mesh.attributes};\n // Fold indices into the attributes\n if (mesh.indices) {\n attributes.indices = mesh.indices;\n }\n return attributes;\n }\n\n _encodePointCloud(pointcloud: DracoMesh, options: DracoBuildOptions): ArrayBuffer {\n const dracoPointCloud = new this.draco.PointCloud();\n\n if (options.metadata) {\n this._addGeometryMetadata(dracoPointCloud, options.metadata);\n }\n\n const attributes = this._getAttributesFromMesh(pointcloud);\n\n // Build a `DracoPointCloud` from the input data\n this._createDracoPointCloud(dracoPointCloud, attributes, options);\n\n const dracoData = new this.draco.DracoInt8Array();\n\n try {\n const encodedLen = this.dracoEncoder.EncodePointCloudToDracoBuffer(\n dracoPointCloud,\n false,\n dracoData\n );\n\n if (!(encodedLen > 0)) {\n throw new Error('Draco encoding failed.');\n }\n\n this.log(`DRACO encoded ${dracoPointCloud.num_points()} points\n with ${dracoPointCloud.num_attributes()} attributes into ${encodedLen} bytes`);\n\n return dracoInt8ArrayToArrayBuffer(dracoData);\n } finally {\n this.destroyEncodedObject(dracoData);\n this.destroyEncodedObject(dracoPointCloud);\n }\n }\n\n _encodeMesh(mesh: DracoMesh, options: DracoBuildOptions): ArrayBuffer {\n const dracoMesh = new this.draco.Mesh();\n\n if (options.metadata) {\n this._addGeometryMetadata(dracoMesh, options.metadata);\n }\n\n const attributes = this._getAttributesFromMesh(mesh);\n\n // Build a `DracoMesh` from the input data\n this._createDracoMesh(dracoMesh, attributes, options);\n\n const dracoData = new this.draco.DracoInt8Array();\n\n try {\n const encodedLen = this.dracoEncoder.EncodeMeshToDracoBuffer(dracoMesh, dracoData);\n if (encodedLen <= 0) {\n throw new Error('Draco encoding failed.');\n }\n\n this.log(`DRACO encoded ${dracoMesh.num_points()} points\n with ${dracoMesh.num_attributes()} attributes into ${encodedLen} bytes`);\n\n return dracoInt8ArrayToArrayBuffer(dracoData);\n } finally {\n this.destroyEncodedObject(dracoData);\n this.destroyEncodedObject(dracoMesh);\n }\n }\n\n /**\n * Set encoding options.\n * @param {{speed?: any; method?: any; quantization?: any;}} options\n */\n _setOptions(options: DracoBuildOptions): void {\n if ('speed' in options) {\n // @ts-ignore\n this.dracoEncoder.SetSpeedOptions(...options.speed);\n }\n if ('method' in options) {\n const dracoMethod = this.draco[options.method || 'MESH_SEQUENTIAL_ENCODING'];\n // assert(dracoMethod)\n this.dracoEncoder.SetEncodingMethod(dracoMethod);\n }\n if ('quantization' in options) {\n for (const attribute in options.quantization) {\n const bits = options.quantization[attribute];\n const dracoPosition = this.draco[attribute];\n this.dracoEncoder.SetAttributeQuantization(dracoPosition, bits);\n }\n }\n }\n\n /**\n * @param {Mesh} dracoMesh\n * @param {object} attributes\n * @returns {Mesh}\n */\n _createDracoMesh(dracoMesh: Mesh, attributes, options: DracoBuildOptions): Mesh {\n const optionalMetadata = options.attributesMetadata || {};\n\n try {\n const positions = this._getPositionAttribute(attributes);\n if (!positions) {\n throw new Error('positions');\n }\n const vertexCount = positions.length / 3;\n\n for (let attributeName in attributes) {\n const attribute = attributes[attributeName];\n attributeName = GLTF_TO_DRACO_ATTRIBUTE_NAME_MAP[attributeName] || attributeName;\n const uniqueId = this._addAttributeToMesh(dracoMesh, attributeName, attribute, vertexCount);\n\n if (uniqueId !== -1) {\n this._addAttributeMetadata(dracoMesh, uniqueId, {\n name: attributeName,\n ...(optionalMetadata[attributeName] || {})\n });\n }\n }\n } catch (error) {\n this.destroyEncodedObject(dracoMesh);\n throw error;\n }\n\n return dracoMesh;\n }\n\n /**\n * @param {} dracoPointCloud\n * @param {object} attributes\n */\n _createDracoPointCloud(\n dracoPointCloud: PointCloud,\n attributes: object,\n options: DracoBuildOptions\n ): PointCloud {\n const optionalMetadata = options.attributesMetadata || {};\n\n try {\n const positions = this._getPositionAttribute(attributes);\n if (!positions) {\n throw new Error('positions');\n }\n const vertexCount = positions.length / 3;\n\n for (let attributeName in attributes) {\n const attribute = attributes[attributeName];\n attributeName = GLTF_TO_DRACO_ATTRIBUTE_NAME_MAP[attributeName] || attributeName;\n const uniqueId = this._addAttributeToMesh(\n dracoPointCloud,\n attributeName,\n attribute,\n vertexCount\n );\n if (uniqueId !== -1) {\n this._addAttributeMetadata(dracoPointCloud, uniqueId, {\n name: attributeName,\n ...(optionalMetadata[attributeName] || {})\n });\n }\n }\n } catch (error) {\n this.destroyEncodedObject(dracoPointCloud);\n throw error;\n }\n\n return dracoPointCloud;\n }\n\n /**\n * @param mesh\n * @param attributeName\n * @param attribute\n * @param vertexCount\n */\n _addAttributeToMesh(\n mesh: PointCloud,\n attributeName: string,\n attribute: TypedArray,\n vertexCount: number\n ) {\n if (!ArrayBuffer.isView(attribute)) {\n return -1;\n }\n\n const type = this._getDracoAttributeType(attributeName);\n // @ts-ignore TODO/fix types\n const size = attribute.length / vertexCount;\n\n if (type === 'indices') {\n // @ts-ignore TODO/fix types\n const numFaces = attribute.length / 3;\n this.log(`Adding attribute ${attributeName}, size ${numFaces}`);\n\n // @ts-ignore assumes mesh is a Mesh, not a point cloud\n this.dracoMeshBuilder.AddFacesToMesh(mesh, numFaces, attribute);\n return -1;\n }\n\n this.log(`Adding attribute ${attributeName}, size ${size}`);\n\n const builder = this.dracoMeshBuilder;\n const {buffer} = attribute;\n\n switch (attribute.constructor) {\n case Int8Array:\n return builder.AddInt8Attribute(mesh, type, vertexCount, size, new Int8Array(buffer));\n\n case Int16Array:\n return builder.AddInt16Attribute(mesh, type, vertexCount, size, new Int16Array(buffer));\n\n case Int32Array:\n return builder.AddInt32Attribute(mesh, type, vertexCount, size, new Int32Array(buffer));\n case Uint8Array:\n case Uint8ClampedArray:\n return builder.AddUInt8Attribute(mesh, type, vertexCount, size, new Uint8Array(buffer));\n\n case Uint16Array:\n return builder.AddUInt16Attribute(mesh, type, vertexCount, size, new Uint16Array(buffer));\n\n case Uint32Array:\n return builder.AddUInt32Attribute(mesh, type, vertexCount, size, new Uint32Array(buffer));\n\n case Float32Array:\n default:\n return builder.AddFloatAttribute(mesh, type, vertexCount, size, new Float32Array(buffer));\n }\n }\n\n /**\n * DRACO can compress attributes of know type better\n * TODO - expose an attribute type map?\n * @param attributeName\n */\n _getDracoAttributeType(attributeName: string): draco_GeometryAttribute_Type | 'indices' {\n switch (attributeName.toLowerCase()) {\n case 'indices':\n return 'indices';\n case 'position':\n case 'positions':\n case 'vertices':\n return this.draco.POSITION;\n case 'normal':\n case 'normals':\n return this.draco.NORMAL;\n case 'color':\n case 'colors':\n return this.draco.COLOR;\n case 'texcoord':\n case 'texcoords':\n return this.draco.TEX_COORD;\n default:\n return this.draco.GENERIC;\n }\n }\n\n _getPositionAttribute(attributes) {\n for (const attributeName in attributes) {\n const attribute = attributes[attributeName];\n const dracoType = this._getDracoAttributeType(attributeName);\n if (dracoType === this.draco.POSITION) {\n return attribute;\n }\n }\n return null;\n }\n\n /**\n * Add metadata for the geometry.\n * @param dracoGeometry - WASM Draco Object\n * @param metadata\n */\n _addGeometryMetadata(dracoGeometry: PointCloud, metadata: {[key: string]: string}) {\n const dracoMetadata = new this.draco.Metadata();\n this._populateDracoMetadata(dracoMetadata, metadata);\n this.dracoMeshBuilder.AddMetadata(dracoGeometry, dracoMetadata);\n }\n\n /**\n * Add metadata for an attribute to geometry.\n * @param dracoGeometry - WASM Draco Object\n * @param uniqueAttributeId\n * @param metadata\n */\n _addAttributeMetadata(\n dracoGeometry: PointCloud,\n uniqueAttributeId: number,\n metadata: Map<string, string> | {[key: string]: string}\n ) {\n // Note: Draco JS IDL doesn't seem to expose draco.AttributeMetadata, however it seems to\n // create such objects automatically from draco.Metadata object.\n const dracoAttributeMetadata = new this.draco.Metadata();\n this._populateDracoMetadata(dracoAttributeMetadata, metadata);\n // Draco3d doc note: Directly add attribute metadata to geometry.\n // You can do this without explicitly adding |GeometryMetadata| to mesh.\n this.dracoMeshBuilder.SetMetadataForAttribute(\n dracoGeometry,\n uniqueAttributeId,\n dracoAttributeMetadata\n );\n }\n\n /**\n * Add contents of object or map to a WASM Draco Metadata Object\n * @param dracoMetadata - WASM Draco Object\n * @param metadata\n */\n _populateDracoMetadata(\n dracoMetadata: Metadata,\n metadata: Map<string, string> | {[key: string]: string}\n ) {\n for (const [key, value] of getEntries(metadata)) {\n switch (typeof value) {\n case 'number':\n if (Math.trunc(value) === value) {\n this.dracoMetadataBuilder.AddIntEntry(dracoMetadata, key, value);\n } else {\n this.dracoMetadataBuilder.AddDoubleEntry(dracoMetadata, key, value);\n }\n break;\n case 'object':\n if (value instanceof Int32Array) {\n this.dracoMetadataBuilder.AddIntEntryArray(dracoMetadata, key, value, value.length);\n }\n break;\n case 'string':\n default:\n this.dracoMetadataBuilder.AddStringEntry(dracoMetadata, key, value);\n }\n }\n }\n}\n\n// HELPER FUNCTIONS\n\n/**\n * Copy encoded data to buffer\n * @param dracoData\n */\nfunction dracoInt8ArrayToArrayBuffer(dracoData: DracoInt8Array) {\n const byteLength = dracoData.size();\n const outputBuffer = new ArrayBuffer(byteLength);\n const outputData = new Int8Array(outputBuffer);\n for (let i = 0; i < byteLength; ++i) {\n outputData[i] = dracoData.GetValue(i);\n }\n return outputBuffer;\n}\n\n/** Enable iteration over either an object or a map */\nfunction getEntries(container) {\n const hasEntriesFunc = container.entries && !container.hasOwnProperty('entries');\n return hasEntriesFunc ? container.entries() : Object.entries(container);\n}\n"],"file":"draco-builder.js"}
1
+ {"version":3,"file":"draco-builder.js","names":["GLTF_TO_DRACO_ATTRIBUTE_NAME_MAP","POSITION","NORMAL","COLOR_0","TEXCOORD_0","noop","DracoBuilder","draco","dracoEncoder","Encoder","dracoMeshBuilder","MeshBuilder","dracoMetadataBuilder","MetadataBuilder","destroyEncodedObject","object","destroy","mesh","options","log","_setOptions","pointcloud","_encodePointCloud","_encodeMesh","attributes","indices","dracoPointCloud","PointCloud","metadata","_addGeometryMetadata","_getAttributesFromMesh","_createDracoPointCloud","dracoData","DracoInt8Array","encodedLen","EncodePointCloudToDracoBuffer","Error","num_points","num_attributes","dracoInt8ArrayToArrayBuffer","dracoMesh","Mesh","_createDracoMesh","EncodeMeshToDracoBuffer","SetSpeedOptions","speed","dracoMethod","method","SetEncodingMethod","attribute","quantization","bits","dracoPosition","SetAttributeQuantization","optionalMetadata","attributesMetadata","positions","_getPositionAttribute","vertexCount","length","attributeName","uniqueId","_addAttributeToMesh","_addAttributeMetadata","name","error","ArrayBuffer","isView","type","_getDracoAttributeType","size","numFaces","AddFacesToMesh","builder","buffer","constructor","Int8Array","AddInt8Attribute","Int16Array","AddInt16Attribute","Int32Array","AddInt32Attribute","Uint8Array","Uint8ClampedArray","AddUInt8Attribute","Uint16Array","AddUInt16Attribute","Uint32Array","AddUInt32Attribute","Float32Array","AddFloatAttribute","toLowerCase","COLOR","TEX_COORD","GENERIC","dracoType","dracoGeometry","dracoMetadata","Metadata","_populateDracoMetadata","AddMetadata","uniqueAttributeId","dracoAttributeMetadata","SetMetadataForAttribute","getEntries","key","value","Math","trunc","AddIntEntry","AddDoubleEntry","AddIntEntryArray","AddStringEntry","byteLength","outputBuffer","outputData","i","GetValue","container","hasEntriesFunc","entries","hasOwnProperty","Object"],"sources":["../../../src/lib/draco-builder.ts"],"sourcesContent":["/* eslint-disable camelcase */\n// This code is inspired by example code in the DRACO repository\nimport type {\n Draco3D,\n DracoInt8Array,\n Encoder,\n Mesh,\n MeshBuilder,\n PointCloud,\n Metadata,\n MetadataBuilder,\n draco_GeometryAttribute_Type\n} from '../draco3d/draco3d-types';\n\nimport type {TypedArray} from '@loaders.gl/schema';\nimport type {DracoMesh} from './draco-types';\n\nexport type DracoBuildOptions = {\n pointcloud?: boolean;\n metadata?: {[key: string]: string};\n attributesMetadata?: {};\n log?: any;\n\n // draco encoding options\n speed?: [number, number];\n method?: string;\n quantization?: {[attributeName: string]: number};\n};\n\n// Native Draco attribute names to GLTF attribute names.\nconst GLTF_TO_DRACO_ATTRIBUTE_NAME_MAP = {\n POSITION: 'POSITION',\n NORMAL: 'NORMAL',\n COLOR_0: 'COLOR',\n TEXCOORD_0: 'TEX_COORD'\n};\n\nconst noop = () => {};\n\nexport default class DracoBuilder {\n draco: Draco3D;\n dracoEncoder: Encoder;\n dracoMeshBuilder: MeshBuilder;\n dracoMetadataBuilder: MetadataBuilder;\n log: any;\n\n // draco - the draco decoder, either import `draco3d` or load dynamically\n constructor(draco: Draco3D) {\n this.draco = draco;\n this.dracoEncoder = new this.draco.Encoder();\n this.dracoMeshBuilder = new this.draco.MeshBuilder();\n this.dracoMetadataBuilder = new this.draco.MetadataBuilder();\n }\n\n destroy(): void {\n this.destroyEncodedObject(this.dracoMeshBuilder);\n this.destroyEncodedObject(this.dracoEncoder);\n this.destroyEncodedObject(this.dracoMetadataBuilder);\n // @ts-ignore\n this.dracoMeshBuilder = null;\n // @ts-ignore\n this.dracoEncoder = null;\n // @ts-ignore\n this.draco = null;\n }\n\n // TBD - when does this need to be called?\n destroyEncodedObject(object): void {\n if (object) {\n this.draco.destroy(object);\n }\n }\n\n /**\n * Encode mesh or point cloud\n * @param mesh =({})\n * @param options\n */\n encodeSync(mesh: DracoMesh, options: DracoBuildOptions = {}): ArrayBuffer {\n this.log = noop; // TODO\n this._setOptions(options);\n\n return options.pointcloud\n ? this._encodePointCloud(mesh, options)\n : this._encodeMesh(mesh, options);\n }\n\n // PRIVATE\n\n _getAttributesFromMesh(mesh: DracoMesh) {\n // TODO - Change the encodePointCloud interface instead?\n const attributes = {...mesh, ...mesh.attributes};\n // Fold indices into the attributes\n if (mesh.indices) {\n attributes.indices = mesh.indices;\n }\n return attributes;\n }\n\n _encodePointCloud(pointcloud: DracoMesh, options: DracoBuildOptions): ArrayBuffer {\n const dracoPointCloud = new this.draco.PointCloud();\n\n if (options.metadata) {\n this._addGeometryMetadata(dracoPointCloud, options.metadata);\n }\n\n const attributes = this._getAttributesFromMesh(pointcloud);\n\n // Build a `DracoPointCloud` from the input data\n this._createDracoPointCloud(dracoPointCloud, attributes, options);\n\n const dracoData = new this.draco.DracoInt8Array();\n\n try {\n const encodedLen = this.dracoEncoder.EncodePointCloudToDracoBuffer(\n dracoPointCloud,\n false,\n dracoData\n );\n\n if (!(encodedLen > 0)) {\n throw new Error('Draco encoding failed.');\n }\n\n this.log(`DRACO encoded ${dracoPointCloud.num_points()} points\n with ${dracoPointCloud.num_attributes()} attributes into ${encodedLen} bytes`);\n\n return dracoInt8ArrayToArrayBuffer(dracoData);\n } finally {\n this.destroyEncodedObject(dracoData);\n this.destroyEncodedObject(dracoPointCloud);\n }\n }\n\n _encodeMesh(mesh: DracoMesh, options: DracoBuildOptions): ArrayBuffer {\n const dracoMesh = new this.draco.Mesh();\n\n if (options.metadata) {\n this._addGeometryMetadata(dracoMesh, options.metadata);\n }\n\n const attributes = this._getAttributesFromMesh(mesh);\n\n // Build a `DracoMesh` from the input data\n this._createDracoMesh(dracoMesh, attributes, options);\n\n const dracoData = new this.draco.DracoInt8Array();\n\n try {\n const encodedLen = this.dracoEncoder.EncodeMeshToDracoBuffer(dracoMesh, dracoData);\n if (encodedLen <= 0) {\n throw new Error('Draco encoding failed.');\n }\n\n this.log(`DRACO encoded ${dracoMesh.num_points()} points\n with ${dracoMesh.num_attributes()} attributes into ${encodedLen} bytes`);\n\n return dracoInt8ArrayToArrayBuffer(dracoData);\n } finally {\n this.destroyEncodedObject(dracoData);\n this.destroyEncodedObject(dracoMesh);\n }\n }\n\n /**\n * Set encoding options.\n * @param {{speed?: any; method?: any; quantization?: any;}} options\n */\n _setOptions(options: DracoBuildOptions): void {\n if ('speed' in options) {\n // @ts-ignore\n this.dracoEncoder.SetSpeedOptions(...options.speed);\n }\n if ('method' in options) {\n const dracoMethod = this.draco[options.method || 'MESH_SEQUENTIAL_ENCODING'];\n // assert(dracoMethod)\n this.dracoEncoder.SetEncodingMethod(dracoMethod);\n }\n if ('quantization' in options) {\n for (const attribute in options.quantization) {\n const bits = options.quantization[attribute];\n const dracoPosition = this.draco[attribute];\n this.dracoEncoder.SetAttributeQuantization(dracoPosition, bits);\n }\n }\n }\n\n /**\n * @param {Mesh} dracoMesh\n * @param {object} attributes\n * @returns {Mesh}\n */\n _createDracoMesh(dracoMesh: Mesh, attributes, options: DracoBuildOptions): Mesh {\n const optionalMetadata = options.attributesMetadata || {};\n\n try {\n const positions = this._getPositionAttribute(attributes);\n if (!positions) {\n throw new Error('positions');\n }\n const vertexCount = positions.length / 3;\n\n for (let attributeName in attributes) {\n const attribute = attributes[attributeName];\n attributeName = GLTF_TO_DRACO_ATTRIBUTE_NAME_MAP[attributeName] || attributeName;\n const uniqueId = this._addAttributeToMesh(dracoMesh, attributeName, attribute, vertexCount);\n\n if (uniqueId !== -1) {\n this._addAttributeMetadata(dracoMesh, uniqueId, {\n name: attributeName,\n ...(optionalMetadata[attributeName] || {})\n });\n }\n }\n } catch (error) {\n this.destroyEncodedObject(dracoMesh);\n throw error;\n }\n\n return dracoMesh;\n }\n\n /**\n * @param {} dracoPointCloud\n * @param {object} attributes\n */\n _createDracoPointCloud(\n dracoPointCloud: PointCloud,\n attributes: object,\n options: DracoBuildOptions\n ): PointCloud {\n const optionalMetadata = options.attributesMetadata || {};\n\n try {\n const positions = this._getPositionAttribute(attributes);\n if (!positions) {\n throw new Error('positions');\n }\n const vertexCount = positions.length / 3;\n\n for (let attributeName in attributes) {\n const attribute = attributes[attributeName];\n attributeName = GLTF_TO_DRACO_ATTRIBUTE_NAME_MAP[attributeName] || attributeName;\n const uniqueId = this._addAttributeToMesh(\n dracoPointCloud,\n attributeName,\n attribute,\n vertexCount\n );\n if (uniqueId !== -1) {\n this._addAttributeMetadata(dracoPointCloud, uniqueId, {\n name: attributeName,\n ...(optionalMetadata[attributeName] || {})\n });\n }\n }\n } catch (error) {\n this.destroyEncodedObject(dracoPointCloud);\n throw error;\n }\n\n return dracoPointCloud;\n }\n\n /**\n * @param mesh\n * @param attributeName\n * @param attribute\n * @param vertexCount\n */\n _addAttributeToMesh(\n mesh: PointCloud,\n attributeName: string,\n attribute: TypedArray,\n vertexCount: number\n ) {\n if (!ArrayBuffer.isView(attribute)) {\n return -1;\n }\n\n const type = this._getDracoAttributeType(attributeName);\n // @ts-ignore TODO/fix types\n const size = attribute.length / vertexCount;\n\n if (type === 'indices') {\n // @ts-ignore TODO/fix types\n const numFaces = attribute.length / 3;\n this.log(`Adding attribute ${attributeName}, size ${numFaces}`);\n\n // @ts-ignore assumes mesh is a Mesh, not a point cloud\n this.dracoMeshBuilder.AddFacesToMesh(mesh, numFaces, attribute);\n return -1;\n }\n\n this.log(`Adding attribute ${attributeName}, size ${size}`);\n\n const builder = this.dracoMeshBuilder;\n const {buffer} = attribute;\n\n switch (attribute.constructor) {\n case Int8Array:\n return builder.AddInt8Attribute(mesh, type, vertexCount, size, new Int8Array(buffer));\n\n case Int16Array:\n return builder.AddInt16Attribute(mesh, type, vertexCount, size, new Int16Array(buffer));\n\n case Int32Array:\n return builder.AddInt32Attribute(mesh, type, vertexCount, size, new Int32Array(buffer));\n case Uint8Array:\n case Uint8ClampedArray:\n return builder.AddUInt8Attribute(mesh, type, vertexCount, size, new Uint8Array(buffer));\n\n case Uint16Array:\n return builder.AddUInt16Attribute(mesh, type, vertexCount, size, new Uint16Array(buffer));\n\n case Uint32Array:\n return builder.AddUInt32Attribute(mesh, type, vertexCount, size, new Uint32Array(buffer));\n\n case Float32Array:\n default:\n return builder.AddFloatAttribute(mesh, type, vertexCount, size, new Float32Array(buffer));\n }\n }\n\n /**\n * DRACO can compress attributes of know type better\n * TODO - expose an attribute type map?\n * @param attributeName\n */\n _getDracoAttributeType(attributeName: string): draco_GeometryAttribute_Type | 'indices' {\n switch (attributeName.toLowerCase()) {\n case 'indices':\n return 'indices';\n case 'position':\n case 'positions':\n case 'vertices':\n return this.draco.POSITION;\n case 'normal':\n case 'normals':\n return this.draco.NORMAL;\n case 'color':\n case 'colors':\n return this.draco.COLOR;\n case 'texcoord':\n case 'texcoords':\n return this.draco.TEX_COORD;\n default:\n return this.draco.GENERIC;\n }\n }\n\n _getPositionAttribute(attributes) {\n for (const attributeName in attributes) {\n const attribute = attributes[attributeName];\n const dracoType = this._getDracoAttributeType(attributeName);\n if (dracoType === this.draco.POSITION) {\n return attribute;\n }\n }\n return null;\n }\n\n /**\n * Add metadata for the geometry.\n * @param dracoGeometry - WASM Draco Object\n * @param metadata\n */\n _addGeometryMetadata(dracoGeometry: PointCloud, metadata: {[key: string]: string}) {\n const dracoMetadata = new this.draco.Metadata();\n this._populateDracoMetadata(dracoMetadata, metadata);\n this.dracoMeshBuilder.AddMetadata(dracoGeometry, dracoMetadata);\n }\n\n /**\n * Add metadata for an attribute to geometry.\n * @param dracoGeometry - WASM Draco Object\n * @param uniqueAttributeId\n * @param metadata\n */\n _addAttributeMetadata(\n dracoGeometry: PointCloud,\n uniqueAttributeId: number,\n metadata: Map<string, string> | {[key: string]: string}\n ) {\n // Note: Draco JS IDL doesn't seem to expose draco.AttributeMetadata, however it seems to\n // create such objects automatically from draco.Metadata object.\n const dracoAttributeMetadata = new this.draco.Metadata();\n this._populateDracoMetadata(dracoAttributeMetadata, metadata);\n // Draco3d doc note: Directly add attribute metadata to geometry.\n // You can do this without explicitly adding |GeometryMetadata| to mesh.\n this.dracoMeshBuilder.SetMetadataForAttribute(\n dracoGeometry,\n uniqueAttributeId,\n dracoAttributeMetadata\n );\n }\n\n /**\n * Add contents of object or map to a WASM Draco Metadata Object\n * @param dracoMetadata - WASM Draco Object\n * @param metadata\n */\n _populateDracoMetadata(\n dracoMetadata: Metadata,\n metadata: Map<string, string> | {[key: string]: string}\n ) {\n for (const [key, value] of getEntries(metadata)) {\n switch (typeof value) {\n case 'number':\n if (Math.trunc(value) === value) {\n this.dracoMetadataBuilder.AddIntEntry(dracoMetadata, key, value);\n } else {\n this.dracoMetadataBuilder.AddDoubleEntry(dracoMetadata, key, value);\n }\n break;\n case 'object':\n if (value instanceof Int32Array) {\n this.dracoMetadataBuilder.AddIntEntryArray(dracoMetadata, key, value, value.length);\n }\n break;\n case 'string':\n default:\n this.dracoMetadataBuilder.AddStringEntry(dracoMetadata, key, value);\n }\n }\n }\n}\n\n// HELPER FUNCTIONS\n\n/**\n * Copy encoded data to buffer\n * @param dracoData\n */\nfunction dracoInt8ArrayToArrayBuffer(dracoData: DracoInt8Array) {\n const byteLength = dracoData.size();\n const outputBuffer = new ArrayBuffer(byteLength);\n const outputData = new Int8Array(outputBuffer);\n for (let i = 0; i < byteLength; ++i) {\n outputData[i] = dracoData.GetValue(i);\n }\n return outputBuffer;\n}\n\n/** Enable iteration over either an object or a map */\nfunction getEntries(container) {\n const hasEntriesFunc = container.entries && !container.hasOwnProperty('entries');\n return hasEntriesFunc ? container.entries() : Object.entries(container);\n}\n"],"mappings":"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"}