@loaders.gl/draco 3.3.0-alpha.4 → 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.
- package/dist/draco-nodejs-worker.js +70 -69
- package/dist/draco-nodejs-worker.js.map +3 -3
- package/dist/draco-worker.js +1 -1
- package/dist/draco-worker.js.map +1 -1
- package/dist/draco-writer-nodejs-worker.js +61 -60
- package/dist/draco-writer-nodejs-worker.js.map +3 -3
- package/dist/draco-writer-worker.js +2 -2
- package/dist/draco-writer-worker.js.map +1 -1
- package/dist/es5/bundle.js +0 -1
- package/dist/es5/bundle.js.map +1 -1
- package/dist/es5/draco-loader.js +1 -4
- package/dist/es5/draco-loader.js.map +1 -1
- package/dist/es5/draco-writer-nodejs.js +0 -2
- package/dist/es5/draco-writer-nodejs.js.map +1 -1
- package/dist/es5/draco-writer.js +5 -17
- package/dist/es5/draco-writer.js.map +1 -1
- package/dist/es5/draco3d/draco3d-types.js +1 -8
- package/dist/es5/draco3d/draco3d-types.js.map +1 -1
- package/dist/es5/index.js +5 -25
- package/dist/es5/index.js.map +1 -1
- package/dist/es5/lib/draco-builder.js +40 -96
- package/dist/es5/lib/draco-builder.js.map +1 -1
- package/dist/es5/lib/draco-module-loader.js +2 -41
- package/dist/es5/lib/draco-module-loader.js.map +1 -1
- package/dist/es5/lib/draco-parser.js +63 -111
- package/dist/es5/lib/draco-parser.js.map +1 -1
- package/dist/es5/lib/draco-types.js.map +1 -1
- package/dist/es5/lib/utils/get-draco-schema.js +0 -12
- package/dist/es5/lib/utils/get-draco-schema.js.map +1 -1
- package/dist/es5/lib/utils/version.js +1 -1
- package/dist/es5/lib/utils/version.js.map +1 -1
- package/dist/es5/workers/draco-nodejs-worker.js +0 -3
- package/dist/es5/workers/draco-nodejs-worker.js.map +1 -1
- package/dist/es5/workers/draco-worker.js +0 -2
- package/dist/es5/workers/draco-worker.js.map +1 -1
- package/dist/es5/workers/draco-writer-nodejs-worker.js +0 -15
- package/dist/es5/workers/draco-writer-nodejs-worker.js.map +1 -1
- package/dist/es5/workers/draco-writer-worker.js +0 -15
- package/dist/es5/workers/draco-writer-worker.js.map +1 -1
- package/dist/esm/bundle.js +1 -1
- package/dist/esm/bundle.js.map +1 -1
- package/dist/esm/draco-loader.js +1 -0
- package/dist/esm/draco-loader.js.map +1 -1
- package/dist/esm/draco-writer-nodejs.js +1 -0
- package/dist/esm/draco-writer-nodejs.js.map +1 -1
- package/dist/esm/draco-writer.js +3 -3
- package/dist/esm/draco-writer.js.map +1 -1
- package/dist/esm/draco3d/draco3d-types.js +2 -3
- package/dist/esm/draco3d/draco3d-types.js.map +1 -1
- package/dist/esm/index.js +6 -3
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/draco-builder.js +6 -75
- package/dist/esm/lib/draco-builder.js.map +1 -1
- package/dist/esm/lib/draco-module-loader.js +4 -9
- package/dist/esm/lib/draco-module-loader.js.map +1 -1
- package/dist/esm/lib/draco-parser.js +5 -66
- package/dist/esm/lib/draco-parser.js.map +1 -1
- package/dist/esm/lib/draco-types.js.map +1 -1
- package/dist/esm/lib/utils/get-draco-schema.js +0 -10
- package/dist/esm/lib/utils/get-draco-schema.js.map +1 -1
- package/dist/esm/lib/utils/version.js +2 -1
- package/dist/esm/lib/utils/version.js.map +1 -1
- package/dist/esm/workers/draco-nodejs-worker.js.map +1 -1
- package/dist/esm/workers/draco-worker.js.map +1 -1
- package/dist/esm/workers/draco-writer-nodejs-worker.js +0 -4
- package/dist/esm/workers/draco-writer-nodejs-worker.js.map +1 -1
- package/dist/esm/workers/draco-writer-worker.js +0 -4
- package/dist/esm/workers/draco-writer-worker.js.map +1 -1
- package/package.json +6 -6
package/dist/es5/index.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
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
|
});
|
|
7
|
+
exports.DracoLoader = void 0;
|
|
8
8
|
Object.defineProperty(exports, "DracoWorkerLoader", {
|
|
9
9
|
enumerable: true,
|
|
10
10
|
get: function get() {
|
|
@@ -17,30 +17,18 @@ Object.defineProperty(exports, "DracoWriter", {
|
|
|
17
17
|
return _dracoWriter.DracoWriter;
|
|
18
18
|
}
|
|
19
19
|
});
|
|
20
|
-
exports._TypecheckDracoLoader = exports.
|
|
21
|
-
|
|
20
|
+
exports._TypecheckDracoLoader = exports.DracoWriterWorker = void 0;
|
|
22
21
|
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
23
|
-
|
|
24
22
|
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
25
|
-
|
|
26
23
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
27
|
-
|
|
28
24
|
var _dracoLoader = require("./draco-loader");
|
|
29
|
-
|
|
30
25
|
var _dracoParser = _interopRequireDefault(require("./lib/draco-parser"));
|
|
31
|
-
|
|
32
26
|
var _dracoModuleLoader = require("./lib/draco-module-loader");
|
|
33
|
-
|
|
34
27
|
var _version = require("./lib/utils/version");
|
|
35
|
-
|
|
36
28
|
var _workerUtils = require("@loaders.gl/worker-utils");
|
|
37
|
-
|
|
38
29
|
var _dracoWriter = require("./draco-writer");
|
|
39
|
-
|
|
40
|
-
function
|
|
41
|
-
|
|
42
|
-
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; }
|
|
43
|
-
|
|
30
|
+
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; }
|
|
31
|
+
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; }
|
|
44
32
|
var DracoWriterWorker = {
|
|
45
33
|
id: _workerUtils.isBrowser ? 'draco-writer' : 'draco-writer-nodejs',
|
|
46
34
|
name: 'Draco compressed geometry writer',
|
|
@@ -52,41 +40,34 @@ var DracoWriterWorker = {
|
|
|
52
40
|
source: null
|
|
53
41
|
}
|
|
54
42
|
};
|
|
55
|
-
exports.DracoWriterWorker = DracoWriterWorker;
|
|
56
43
|
|
|
44
|
+
exports.DracoWriterWorker = DracoWriterWorker;
|
|
57
45
|
var DracoLoader = _objectSpread(_objectSpread({}, _dracoLoader.DracoLoader), {}, {
|
|
58
46
|
parse: parse
|
|
59
47
|
});
|
|
60
|
-
|
|
61
48
|
exports.DracoLoader = DracoLoader;
|
|
62
|
-
|
|
63
49
|
function parse(_x, _x2) {
|
|
64
50
|
return _parse.apply(this, arguments);
|
|
65
51
|
}
|
|
66
|
-
|
|
67
52
|
function _parse() {
|
|
68
53
|
_parse = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee(arrayBuffer, options) {
|
|
69
54
|
var _yield$loadDracoDecod, draco, dracoParser;
|
|
70
|
-
|
|
71
55
|
return _regenerator.default.wrap(function _callee$(_context) {
|
|
72
56
|
while (1) {
|
|
73
57
|
switch (_context.prev = _context.next) {
|
|
74
58
|
case 0:
|
|
75
59
|
_context.next = 2;
|
|
76
60
|
return (0, _dracoModuleLoader.loadDracoDecoderModule)(options);
|
|
77
|
-
|
|
78
61
|
case 2:
|
|
79
62
|
_yield$loadDracoDecod = _context.sent;
|
|
80
63
|
draco = _yield$loadDracoDecod.draco;
|
|
81
64
|
dracoParser = new _dracoParser.default(draco);
|
|
82
65
|
_context.prev = 5;
|
|
83
66
|
return _context.abrupt("return", dracoParser.parseSync(arrayBuffer, options === null || options === void 0 ? void 0 : options.draco));
|
|
84
|
-
|
|
85
67
|
case 7:
|
|
86
68
|
_context.prev = 7;
|
|
87
69
|
dracoParser.destroy();
|
|
88
70
|
return _context.finish(7);
|
|
89
|
-
|
|
90
71
|
case 10:
|
|
91
72
|
case "end":
|
|
92
73
|
return _context.stop();
|
|
@@ -96,7 +77,6 @@ function _parse() {
|
|
|
96
77
|
}));
|
|
97
78
|
return _parse.apply(this, arguments);
|
|
98
79
|
}
|
|
99
|
-
|
|
100
80
|
var _TypecheckDracoLoader = DracoLoader;
|
|
101
81
|
exports._TypecheckDracoLoader = _TypecheckDracoLoader;
|
|
102
82
|
//# sourceMappingURL=index.js.map
|
package/dist/es5/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"index.js","names":["DracoWriterWorker","id","isBrowser","name","module","version","VERSION","worker","options","draco","source","DracoLoader","DracoWorkerLoader","parse","arrayBuffer","loadDracoDecoderModule","dracoParser","DracoParser","parseSync","destroy","_TypecheckDracoLoader"],"sources":["../../src/index.ts"],"sourcesContent":["import type {LoaderWithParser} from '@loaders.gl/loader-utils';\nimport type {DracoMesh, DracoLoaderData} from './lib/draco-types';\nimport type {DracoLoaderOptions} from './draco-loader';\nimport {DracoLoader as DracoWorkerLoader} from './draco-loader';\nimport DracoParser from './lib/draco-parser';\nimport {loadDracoDecoderModule} from './lib/draco-module-loader';\nimport {VERSION} from './lib/utils/version';\nimport {isBrowser} from '@loaders.gl/worker-utils';\n\n// Draco data types\n\nexport type {DracoMesh, DracoLoaderData};\n\n// Draco Writer\n\nexport type {DracoWriterOptions} from './draco-writer';\nexport {DracoWriter} from './draco-writer';\n\n/**\n * Browser worker doesn't work because of issue during \"draco_encoder.js\" loading.\n * Refused to execute script from 'https://raw.githubusercontent.com/google/draco/1.4.1/javascript/draco_encoder.js' because its MIME type ('') is not executable.\n */\nexport const DracoWriterWorker = {\n id: isBrowser ? 'draco-writer' : 'draco-writer-nodejs',\n name: 'Draco compressed geometry writer',\n module: 'draco',\n version: VERSION,\n worker: true,\n options: {\n draco: {},\n source: null\n }\n};\n\n// Draco Loader\n\nexport type {DracoLoaderOptions};\nexport {DracoWorkerLoader};\n\n/**\n * Loader for Draco3D compressed geometries\n */\nexport const DracoLoader = {\n ...DracoWorkerLoader,\n parse\n};\n\nasync function parse(arrayBuffer: ArrayBuffer, options?: DracoLoaderOptions): Promise<DracoMesh> {\n const {draco} = await loadDracoDecoderModule(options);\n const dracoParser = new DracoParser(draco);\n try {\n return dracoParser.parseSync(arrayBuffer, options?.draco);\n } finally {\n dracoParser.destroy();\n }\n}\n\n// TYPE TESTS - TODO find a better way than exporting junk\nexport const _TypecheckDracoLoader: LoaderWithParser = DracoLoader;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAGA;AACA;AACA;AACA;AACA;AASA;AAA2C;AAAA;AAMpC,IAAMA,iBAAiB,GAAG;EAC/BC,EAAE,EAAEC,sBAAS,GAAG,cAAc,GAAG,qBAAqB;EACtDC,IAAI,EAAE,kCAAkC;EACxCC,MAAM,EAAE,OAAO;EACfC,OAAO,EAAEC,gBAAO;EAChBC,MAAM,EAAE,IAAI;EACZC,OAAO,EAAE;IACPC,KAAK,EAAE,CAAC,CAAC;IACTC,MAAM,EAAE;EACV;AACF,CAAC;;AAAC;AAUK,IAAMC,WAAW,mCACnBC,wBAAiB;EACpBC,KAAK,EAALA;AAAK,EACN;AAAC;AAAA,SAEaA,KAAK;EAAA;AAAA;AAAA;EAAA,mEAApB,iBAAqBC,WAAwB,EAAEN,OAA4B;IAAA;IAAA;MAAA;QAAA;UAAA;YAAA;YAAA,OACnD,IAAAO,yCAAsB,EAACP,OAAO,CAAC;UAAA;YAAA;YAA9CC,KAAK,yBAALA,KAAK;YACNO,WAAW,GAAG,IAAIC,oBAAW,CAACR,KAAK,CAAC;YAAA;YAAA,iCAEjCO,WAAW,CAACE,SAAS,CAACJ,WAAW,EAAEN,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEC,KAAK,CAAC;UAAA;YAAA;YAEzDO,WAAW,CAACG,OAAO,EAAE;YAAC;UAAA;UAAA;YAAA;QAAA;MAAA;IAAA;EAAA,CAEzB;EAAA;AAAA;AAGM,IAAMC,qBAAuC,GAAGT,WAAW;AAAC"}
|
|
@@ -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
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
301
|
+
value:
|
|
302
|
+
function _populateDracoMetadata(dracoMetadata, metadata) {
|
|
350
303
|
var _iterator = _createForOfIteratorHelper(getEntries(metadata)),
|
|
351
|
-
|
|
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
|
-
|
|
357
|
-
|
|
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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"}
|