@loaders.gl/draco 4.0.0-alpha.4 → 4.0.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/bundle.d.ts +2 -0
- package/dist/bundle.d.ts.map +1 -0
- package/dist/bundle.js +2 -2
- package/dist/dist.min.js +4 -0
- package/dist/dist.min.js.map +7 -0
- package/dist/draco-loader.d.ts +18 -0
- package/dist/draco-loader.d.ts.map +1 -0
- package/dist/draco-loader.js +28 -21
- package/dist/draco-nodejs-worker.js +191 -0
- package/dist/draco-nodejs-worker.js.map +7 -0
- package/dist/draco-worker.js +2 -1236
- package/dist/draco-worker.js.map +7 -0
- package/dist/draco-writer-nodejs-worker.js +193 -0
- package/dist/draco-writer-nodejs-worker.js.map +7 -0
- package/dist/draco-writer-nodejs.d.ts +3 -0
- package/dist/draco-writer-nodejs.d.ts.map +1 -0
- package/dist/draco-writer-nodejs.js +7 -0
- package/dist/draco-writer-worker.js +4 -0
- package/dist/draco-writer-worker.js.map +7 -0
- package/dist/draco-writer.d.ts +17 -0
- package/dist/draco-writer.d.ts.map +1 -0
- package/dist/draco-writer.js +40 -28
- package/dist/draco3d/draco3d-types.d.ts +295 -0
- package/dist/draco3d/draco3d-types.d.ts.map +1 -0
- package/dist/draco3d/draco3d-types.js +47 -44
- package/dist/es5/bundle.js +6 -0
- package/dist/es5/bundle.js.map +1 -0
- package/dist/es5/draco-loader.js +34 -0
- package/dist/es5/draco-loader.js.map +1 -0
- package/dist/es5/draco-writer-nodejs.js +14 -0
- package/dist/es5/draco-writer-nodejs.js.map +1 -0
- package/dist/es5/draco-writer.js +63 -0
- package/dist/es5/draco-writer.js.map +1 -0
- package/dist/es5/draco3d/draco3d-types.js +51 -0
- package/dist/es5/draco3d/draco3d-types.js.map +1 -0
- package/dist/es5/index.js +79 -0
- package/dist/es5/index.js.map +1 -0
- package/dist/es5/lib/draco-builder.js +324 -0
- package/dist/es5/lib/draco-builder.js.map +1 -0
- package/dist/es5/lib/draco-module-loader.js +183 -0
- package/dist/es5/lib/draco-module-loader.js.map +1 -0
- package/dist/es5/lib/draco-parser.js +435 -0
- package/dist/es5/lib/draco-parser.js.map +1 -0
- package/dist/es5/lib/draco-types.js +2 -0
- package/dist/es5/lib/draco-types.js.map +1 -0
- package/dist/es5/lib/utils/get-draco-schema.js +47 -0
- package/dist/es5/lib/utils/get-draco-schema.js.map +1 -0
- package/dist/es5/lib/utils/version.js +9 -0
- package/dist/es5/lib/utils/version.js.map +1 -0
- package/dist/es5/workers/draco-nodejs-worker.js +7 -0
- package/dist/es5/workers/draco-nodejs-worker.js.map +1 -0
- package/dist/es5/workers/draco-worker.js +6 -0
- package/dist/es5/workers/draco-worker.js.map +1 -0
- package/dist/es5/workers/draco-writer-nodejs-worker.js +53 -0
- package/dist/es5/workers/draco-writer-nodejs-worker.js.map +1 -0
- package/dist/es5/workers/draco-writer-worker.js +53 -0
- package/dist/es5/workers/draco-writer-worker.js.map +1 -0
- package/dist/esm/bundle.js +4 -0
- package/dist/esm/bundle.js.map +1 -0
- package/dist/esm/draco-loader.js +24 -0
- package/dist/esm/draco-loader.js.map +1 -0
- package/dist/esm/draco-writer-nodejs.js +3 -0
- package/dist/esm/draco-writer-nodejs.js.map +1 -0
- package/dist/esm/draco-writer.js +31 -0
- package/dist/esm/draco-writer.js.map +1 -0
- package/dist/esm/draco3d/draco3d-types.js +41 -0
- package/dist/esm/draco3d/draco3d-types.js.map +1 -0
- package/dist/esm/index.js +35 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/lib/draco-builder.js +268 -0
- package/dist/esm/lib/draco-builder.js.map +1 -0
- package/dist/esm/lib/draco-module-loader.js +76 -0
- package/dist/esm/lib/draco-module-loader.js.map +1 -0
- package/dist/esm/lib/draco-parser.js +363 -0
- package/dist/esm/lib/draco-parser.js.map +1 -0
- package/dist/esm/lib/draco-types.js +2 -0
- package/dist/esm/lib/draco-types.js.map +1 -0
- package/dist/esm/lib/utils/get-draco-schema.js +41 -0
- package/dist/esm/lib/utils/get-draco-schema.js.map +1 -0
- package/dist/esm/lib/utils/version.js +2 -0
- package/dist/esm/lib/utils/version.js.map +1 -0
- package/dist/esm/workers/draco-nodejs-worker.js +5 -0
- package/dist/esm/workers/draco-nodejs-worker.js.map +1 -0
- package/dist/esm/workers/draco-worker.js +4 -0
- package/dist/esm/workers/draco-worker.js.map +1 -0
- package/dist/esm/workers/draco-writer-nodejs-worker.js +30 -0
- package/dist/esm/workers/draco-writer-nodejs-worker.js.map +1 -0
- package/dist/esm/workers/draco-writer-worker.js +30 -0
- package/dist/esm/workers/draco-writer-worker.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +46 -21
- package/dist/lib/draco-builder.d.ts +107 -0
- package/dist/lib/draco-builder.d.ts.map +1 -0
- package/dist/lib/draco-builder.js +313 -329
- package/dist/lib/draco-module-loader.d.ts +3 -0
- package/dist/lib/draco-module-loader.d.ts.map +1 -0
- package/dist/lib/draco-module-loader.js +81 -73
- package/dist/lib/draco-parser.d.ts +137 -0
- package/dist/lib/draco-parser.d.ts.map +1 -0
- package/dist/lib/draco-parser.js +440 -416
- package/dist/lib/draco-types.d.ts +59 -0
- package/dist/lib/draco-types.d.ts.map +1 -0
- package/dist/lib/draco-types.js +3 -2
- package/dist/lib/utils/get-draco-schema.d.ts +8 -0
- package/dist/lib/utils/get-draco-schema.d.ts.map +1 -0
- package/dist/lib/utils/get-draco-schema.js +35 -41
- package/dist/lib/utils/version.d.ts +2 -0
- package/dist/lib/utils/version.d.ts.map +1 -0
- package/dist/lib/utils/version.js +7 -2
- package/dist/workers/draco-nodejs-worker.d.ts +2 -0
- package/dist/workers/draco-nodejs-worker.d.ts.map +1 -0
- package/dist/workers/draco-nodejs-worker.js +6 -0
- package/dist/workers/draco-worker.d.ts +2 -0
- package/dist/workers/draco-worker.d.ts.map +1 -0
- package/dist/workers/draco-worker.js +5 -4
- package/dist/workers/draco-writer-nodejs-worker.d.ts +2 -0
- package/dist/workers/draco-writer-nodejs-worker.d.ts.map +1 -0
- package/dist/workers/draco-writer-nodejs-worker.js +26 -0
- package/dist/workers/draco-writer-worker.d.ts +2 -0
- package/dist/workers/draco-writer-worker.d.ts.map +1 -0
- package/dist/workers/draco-writer-worker.js +26 -0
- package/package.json +18 -11
- package/src/draco-loader.ts +8 -4
- package/src/draco-writer-nodejs.ts +4 -0
- package/src/draco-writer.ts +17 -12
- package/src/index.ts +21 -1
- package/src/lib/draco-module-loader.ts +9 -5
- package/src/lib/utils/get-draco-schema.ts +7 -6
- package/src/workers/draco-nodejs-worker.ts +5 -0
- package/src/workers/draco-writer-nodejs-worker.ts +25 -0
- package/src/workers/draco-writer-worker.ts +25 -0
- package/dist/bundle.js.map +0 -1
- package/dist/draco-loader.js.map +0 -1
- package/dist/draco-writer.js.map +0 -1
- package/dist/draco3d/draco3d-types.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/lib/draco-builder.js.map +0 -1
- package/dist/lib/draco-module-loader.js.map +0 -1
- package/dist/lib/draco-parser.js.map +0 -1
- package/dist/lib/draco-types.js.map +0 -1
- package/dist/lib/utils/get-draco-schema.js.map +0 -1
- package/dist/lib/utils/version.js.map +0 -1
- package/dist/workers/draco-worker.js.map +0 -1
package/dist/lib/draco-parser.js
CHANGED
|
@@ -1,452 +1,476 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
/* eslint-disable camelcase */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const schema_1 = require("@loaders.gl/schema");
|
|
5
|
+
const get_draco_schema_1 = require("./utils/get-draco-schema");
|
|
6
|
+
// @ts-ignore
|
|
7
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
4
8
|
const GEOMETRY_TYPE = {
|
|
5
|
-
|
|
6
|
-
|
|
9
|
+
TRIANGULAR_MESH: 0,
|
|
10
|
+
POINT_CLOUD: 1
|
|
7
11
|
};
|
|
12
|
+
// Native Draco attribute names to GLTF attribute names.
|
|
8
13
|
const DRACO_TO_GLTF_ATTRIBUTE_NAME_MAP = {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
14
|
+
POSITION: 'POSITION',
|
|
15
|
+
NORMAL: 'NORMAL',
|
|
16
|
+
COLOR: 'COLOR_0',
|
|
17
|
+
TEX_COORD: 'TEXCOORD_0'
|
|
13
18
|
};
|
|
14
19
|
const DRACO_DATA_TYPE_TO_TYPED_ARRAY_MAP = {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
1: Int8Array,
|
|
21
|
+
2: Uint8Array,
|
|
22
|
+
3: Int16Array,
|
|
23
|
+
4: Uint16Array,
|
|
24
|
+
5: Int32Array,
|
|
25
|
+
6: Uint32Array,
|
|
26
|
+
9: Float32Array
|
|
22
27
|
};
|
|
23
28
|
const INDEX_ITEM_SIZE = 4;
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
_defineProperty(this, "metadataQuerier", void 0);
|
|
31
|
-
|
|
32
|
-
this.draco = draco;
|
|
33
|
-
this.decoder = new this.draco.Decoder();
|
|
34
|
-
this.metadataQuerier = new this.draco.MetadataQuerier();
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
destroy() {
|
|
38
|
-
this.draco.destroy(this.decoder);
|
|
39
|
-
this.draco.destroy(this.metadataQuerier);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
parseSync(arrayBuffer, options = {}) {
|
|
43
|
-
const buffer = new this.draco.DecoderBuffer();
|
|
44
|
-
buffer.Init(new Int8Array(arrayBuffer), arrayBuffer.byteLength);
|
|
45
|
-
|
|
46
|
-
this._disableAttributeTransforms(options);
|
|
47
|
-
|
|
48
|
-
const geometry_type = this.decoder.GetEncodedGeometryType(buffer);
|
|
49
|
-
const dracoGeometry = geometry_type === this.draco.TRIANGULAR_MESH ? new this.draco.Mesh() : new this.draco.PointCloud();
|
|
50
|
-
|
|
51
|
-
try {
|
|
52
|
-
let dracoStatus;
|
|
53
|
-
|
|
54
|
-
switch (geometry_type) {
|
|
55
|
-
case this.draco.TRIANGULAR_MESH:
|
|
56
|
-
dracoStatus = this.decoder.DecodeBufferToMesh(buffer, dracoGeometry);
|
|
57
|
-
break;
|
|
58
|
-
|
|
59
|
-
case this.draco.POINT_CLOUD:
|
|
60
|
-
dracoStatus = this.decoder.DecodeBufferToPointCloud(buffer, dracoGeometry);
|
|
61
|
-
break;
|
|
62
|
-
|
|
63
|
-
default:
|
|
64
|
-
throw new Error('DRACO: Unknown geometry type.');
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
if (!dracoStatus.ok() || !dracoGeometry.ptr) {
|
|
68
|
-
const message = "DRACO decompression failed: ".concat(dracoStatus.error_msg());
|
|
69
|
-
throw new Error(message);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
const loaderData = this._getDracoLoaderData(dracoGeometry, geometry_type, options);
|
|
73
|
-
|
|
74
|
-
const geometry = this._getMeshData(dracoGeometry, loaderData, options);
|
|
75
|
-
|
|
76
|
-
const boundingBox = getMeshBoundingBox(geometry.attributes);
|
|
77
|
-
const schema = getDracoSchema(geometry.attributes, loaderData, geometry.indices);
|
|
78
|
-
const data = {
|
|
79
|
-
loader: 'draco',
|
|
80
|
-
loaderData,
|
|
81
|
-
header: {
|
|
82
|
-
vertexCount: dracoGeometry.num_points(),
|
|
83
|
-
boundingBox
|
|
84
|
-
},
|
|
85
|
-
...geometry,
|
|
86
|
-
schema
|
|
87
|
-
};
|
|
88
|
-
return data;
|
|
89
|
-
} finally {
|
|
90
|
-
this.draco.destroy(buffer);
|
|
91
|
-
|
|
92
|
-
if (dracoGeometry) {
|
|
93
|
-
this.draco.destroy(dracoGeometry);
|
|
94
|
-
}
|
|
29
|
+
class DracoParser {
|
|
30
|
+
// draco - the draco decoder, either import `draco3d` or load dynamically
|
|
31
|
+
constructor(draco) {
|
|
32
|
+
this.draco = draco;
|
|
33
|
+
this.decoder = new this.draco.Decoder();
|
|
34
|
+
this.metadataQuerier = new this.draco.MetadataQuerier();
|
|
95
35
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
36
|
+
/**
|
|
37
|
+
* Destroy draco resources
|
|
38
|
+
*/
|
|
39
|
+
destroy() {
|
|
40
|
+
this.draco.destroy(this.decoder);
|
|
41
|
+
this.draco.destroy(this.metadataQuerier);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* NOTE: caller must call `destroyGeometry` on the return value after using it
|
|
45
|
+
* @param arrayBuffer
|
|
46
|
+
* @param options
|
|
47
|
+
*/
|
|
48
|
+
parseSync(arrayBuffer, options = {}) {
|
|
49
|
+
const buffer = new this.draco.DecoderBuffer();
|
|
50
|
+
buffer.Init(new Int8Array(arrayBuffer), arrayBuffer.byteLength);
|
|
51
|
+
this._disableAttributeTransforms(options);
|
|
52
|
+
const geometry_type = this.decoder.GetEncodedGeometryType(buffer);
|
|
53
|
+
const dracoGeometry = geometry_type === this.draco.TRIANGULAR_MESH
|
|
54
|
+
? new this.draco.Mesh()
|
|
55
|
+
: new this.draco.PointCloud();
|
|
56
|
+
try {
|
|
57
|
+
let dracoStatus;
|
|
58
|
+
switch (geometry_type) {
|
|
59
|
+
case this.draco.TRIANGULAR_MESH:
|
|
60
|
+
dracoStatus = this.decoder.DecodeBufferToMesh(buffer, dracoGeometry);
|
|
61
|
+
break;
|
|
62
|
+
case this.draco.POINT_CLOUD:
|
|
63
|
+
dracoStatus = this.decoder.DecodeBufferToPointCloud(buffer, dracoGeometry);
|
|
64
|
+
break;
|
|
65
|
+
default:
|
|
66
|
+
throw new Error('DRACO: Unknown geometry type.');
|
|
67
|
+
}
|
|
68
|
+
if (!dracoStatus.ok() || !dracoGeometry.ptr) {
|
|
69
|
+
const message = `DRACO decompression failed: ${dracoStatus.error_msg()}`;
|
|
70
|
+
// console.error(message);
|
|
71
|
+
throw new Error(message);
|
|
72
|
+
}
|
|
73
|
+
const loaderData = this._getDracoLoaderData(dracoGeometry, geometry_type, options);
|
|
74
|
+
const geometry = this._getMeshData(dracoGeometry, loaderData, options);
|
|
75
|
+
const boundingBox = (0, schema_1.getMeshBoundingBox)(geometry.attributes);
|
|
76
|
+
const schema = (0, get_draco_schema_1.getDracoSchema)(geometry.attributes, loaderData, geometry.indices);
|
|
77
|
+
const data = {
|
|
78
|
+
loader: 'draco',
|
|
79
|
+
loaderData,
|
|
80
|
+
header: {
|
|
81
|
+
vertexCount: dracoGeometry.num_points(),
|
|
82
|
+
boundingBox
|
|
83
|
+
},
|
|
84
|
+
...geometry,
|
|
85
|
+
schema
|
|
86
|
+
};
|
|
87
|
+
return data;
|
|
88
|
+
}
|
|
89
|
+
finally {
|
|
90
|
+
this.draco.destroy(buffer);
|
|
91
|
+
if (dracoGeometry) {
|
|
92
|
+
this.draco.destroy(dracoGeometry);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
144
95
|
}
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
96
|
+
// Draco specific "loader data"
|
|
97
|
+
/**
|
|
98
|
+
* Extract
|
|
99
|
+
* @param dracoGeometry
|
|
100
|
+
* @param geometry_type
|
|
101
|
+
* @param options
|
|
102
|
+
* @returns
|
|
103
|
+
*/
|
|
104
|
+
_getDracoLoaderData(dracoGeometry, geometry_type, options) {
|
|
105
|
+
const metadata = this._getTopLevelMetadata(dracoGeometry);
|
|
106
|
+
const attributes = this._getDracoAttributes(dracoGeometry, options);
|
|
107
|
+
return {
|
|
108
|
+
geometry_type,
|
|
109
|
+
num_attributes: dracoGeometry.num_attributes(),
|
|
110
|
+
num_points: dracoGeometry.num_points(),
|
|
111
|
+
num_faces: dracoGeometry instanceof this.draco.Mesh ? dracoGeometry.num_faces() : 0,
|
|
112
|
+
metadata,
|
|
113
|
+
attributes
|
|
114
|
+
};
|
|
156
115
|
}
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
116
|
+
/**
|
|
117
|
+
* Extract all draco provided information and metadata for each attribute
|
|
118
|
+
* @param dracoGeometry
|
|
119
|
+
* @param options
|
|
120
|
+
* @returns
|
|
121
|
+
*/
|
|
122
|
+
_getDracoAttributes(dracoGeometry, options) {
|
|
123
|
+
const dracoAttributes = {};
|
|
124
|
+
for (let attributeId = 0; attributeId < dracoGeometry.num_attributes(); attributeId++) {
|
|
125
|
+
// Note: Draco docs do not seem clear on `GetAttribute` ids just being a zero-based index,
|
|
126
|
+
// but it does seems to work this way
|
|
127
|
+
const dracoAttribute = this.decoder.GetAttribute(dracoGeometry, attributeId);
|
|
128
|
+
const metadata = this._getAttributeMetadata(dracoGeometry, attributeId);
|
|
129
|
+
dracoAttributes[dracoAttribute.unique_id()] = {
|
|
130
|
+
unique_id: dracoAttribute.unique_id(),
|
|
131
|
+
attribute_type: dracoAttribute.attribute_type(),
|
|
132
|
+
data_type: dracoAttribute.data_type(),
|
|
133
|
+
num_components: dracoAttribute.num_components(),
|
|
134
|
+
byte_offset: dracoAttribute.byte_offset(),
|
|
135
|
+
byte_stride: dracoAttribute.byte_stride(),
|
|
136
|
+
normalized: dracoAttribute.normalized(),
|
|
137
|
+
attribute_index: attributeId,
|
|
138
|
+
metadata
|
|
139
|
+
};
|
|
140
|
+
// Add transformation parameters for any attributes app wants untransformed
|
|
141
|
+
const quantization = this._getQuantizationTransform(dracoAttribute, options);
|
|
142
|
+
if (quantization) {
|
|
143
|
+
dracoAttributes[dracoAttribute.unique_id()].quantization_transform = quantization;
|
|
168
144
|
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
default:
|
|
173
|
-
return {
|
|
174
|
-
topology: 'triangle-list',
|
|
175
|
-
mode: 5,
|
|
176
|
-
attributes,
|
|
177
|
-
indices: {
|
|
178
|
-
value: this._getTriangleListIndices(dracoGeometry),
|
|
179
|
-
size: 1
|
|
145
|
+
const octahedron = this._getOctahedronTransform(dracoAttribute, options);
|
|
146
|
+
if (octahedron) {
|
|
147
|
+
dracoAttributes[dracoAttribute.unique_id()].octahedron_transform = octahedron;
|
|
180
148
|
}
|
|
181
|
-
|
|
182
|
-
|
|
149
|
+
}
|
|
150
|
+
return dracoAttributes;
|
|
183
151
|
}
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
152
|
+
/**
|
|
153
|
+
* Get standard loaders.gl mesh category data
|
|
154
|
+
* Extracts the geometry from draco
|
|
155
|
+
* @param dracoGeometry
|
|
156
|
+
* @param options
|
|
157
|
+
*/
|
|
158
|
+
_getMeshData(dracoGeometry, loaderData, options) {
|
|
159
|
+
const attributes = this._getMeshAttributes(loaderData, dracoGeometry, options);
|
|
160
|
+
const positionAttribute = attributes.POSITION;
|
|
161
|
+
if (!positionAttribute) {
|
|
162
|
+
throw new Error('DRACO: No position attribute found.');
|
|
163
|
+
}
|
|
164
|
+
// For meshes, we need indices to define the faces.
|
|
165
|
+
if (dracoGeometry instanceof this.draco.Mesh) {
|
|
166
|
+
switch (options.topology) {
|
|
167
|
+
case 'triangle-strip':
|
|
168
|
+
return {
|
|
169
|
+
topology: 'triangle-strip',
|
|
170
|
+
mode: 4,
|
|
171
|
+
attributes,
|
|
172
|
+
indices: {
|
|
173
|
+
value: this._getTriangleStripIndices(dracoGeometry),
|
|
174
|
+
size: 1
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
case 'triangle-list':
|
|
178
|
+
default:
|
|
179
|
+
return {
|
|
180
|
+
topology: 'triangle-list',
|
|
181
|
+
mode: 5,
|
|
182
|
+
attributes,
|
|
183
|
+
indices: {
|
|
184
|
+
value: this._getTriangleListIndices(dracoGeometry),
|
|
185
|
+
size: 1
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
// PointCloud - must come last as Mesh inherits from PointCloud
|
|
191
|
+
return {
|
|
192
|
+
topology: 'point-list',
|
|
193
|
+
mode: 0,
|
|
194
|
+
attributes
|
|
195
|
+
};
|
|
212
196
|
}
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
this.draco._free(ptr);
|
|
197
|
+
_getMeshAttributes(loaderData, dracoGeometry, options) {
|
|
198
|
+
const attributes = {};
|
|
199
|
+
for (const loaderAttribute of Object.values(loaderData.attributes)) {
|
|
200
|
+
const attributeName = this._deduceAttributeName(loaderAttribute, options);
|
|
201
|
+
loaderAttribute.name = attributeName;
|
|
202
|
+
const { value, size } = this._getAttributeValues(dracoGeometry, loaderAttribute);
|
|
203
|
+
attributes[attributeName] = {
|
|
204
|
+
value,
|
|
205
|
+
size,
|
|
206
|
+
byteOffset: loaderAttribute.byte_offset,
|
|
207
|
+
byteStride: loaderAttribute.byte_stride,
|
|
208
|
+
normalized: loaderAttribute.normalized
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
return attributes;
|
|
229
212
|
}
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
213
|
+
// MESH INDICES EXTRACTION
|
|
214
|
+
/**
|
|
215
|
+
* For meshes, we need indices to define the faces.
|
|
216
|
+
* @param dracoGeometry
|
|
217
|
+
*/
|
|
218
|
+
_getTriangleListIndices(dracoGeometry) {
|
|
219
|
+
// Example on how to retrieve mesh and attributes.
|
|
220
|
+
const numFaces = dracoGeometry.num_faces();
|
|
221
|
+
const numIndices = numFaces * 3;
|
|
222
|
+
const byteLength = numIndices * INDEX_ITEM_SIZE;
|
|
223
|
+
const ptr = this.draco._malloc(byteLength);
|
|
224
|
+
try {
|
|
225
|
+
this.decoder.GetTrianglesUInt32Array(dracoGeometry, byteLength, ptr);
|
|
226
|
+
return new Uint32Array(this.draco.HEAPF32.buffer, ptr, numIndices).slice();
|
|
227
|
+
}
|
|
228
|
+
finally {
|
|
229
|
+
this.draco._free(ptr);
|
|
230
|
+
}
|
|
240
231
|
}
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
try {
|
|
255
|
-
const dracoAttribute = this.decoder.GetAttribute(dracoGeometry, attribute.attribute_index);
|
|
256
|
-
this.decoder.GetAttributeDataArrayForAllPoints(dracoGeometry, dracoAttribute, dataType, byteLength, ptr);
|
|
257
|
-
value = new TypedArrayCtor(this.draco.HEAPF32.buffer, ptr, numValues).slice();
|
|
258
|
-
} finally {
|
|
259
|
-
this.draco._free(ptr);
|
|
232
|
+
/**
|
|
233
|
+
* For meshes, we need indices to define the faces.
|
|
234
|
+
* @param dracoGeometry
|
|
235
|
+
*/
|
|
236
|
+
_getTriangleStripIndices(dracoGeometry) {
|
|
237
|
+
const dracoArray = new this.draco.DracoInt32Array();
|
|
238
|
+
try {
|
|
239
|
+
/* const numStrips = */ this.decoder.GetTriangleStripsFromMesh(dracoGeometry, dracoArray);
|
|
240
|
+
return getUint32Array(dracoArray);
|
|
241
|
+
}
|
|
242
|
+
finally {
|
|
243
|
+
this.draco.destroy(dracoArray);
|
|
244
|
+
}
|
|
260
245
|
}
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
246
|
+
/**
|
|
247
|
+
*
|
|
248
|
+
* @param dracoGeometry
|
|
249
|
+
* @param dracoAttribute
|
|
250
|
+
* @param attributeName
|
|
251
|
+
*/
|
|
252
|
+
_getAttributeValues(dracoGeometry, attribute) {
|
|
253
|
+
const TypedArrayCtor = DRACO_DATA_TYPE_TO_TYPED_ARRAY_MAP[attribute.data_type];
|
|
254
|
+
const numComponents = attribute.num_components;
|
|
255
|
+
const numPoints = dracoGeometry.num_points();
|
|
256
|
+
const numValues = numPoints * numComponents;
|
|
257
|
+
const byteLength = numValues * TypedArrayCtor.BYTES_PER_ELEMENT;
|
|
258
|
+
const dataType = getDracoDataType(this.draco, TypedArrayCtor);
|
|
259
|
+
let value;
|
|
260
|
+
const ptr = this.draco._malloc(byteLength);
|
|
261
|
+
try {
|
|
262
|
+
const dracoAttribute = this.decoder.GetAttribute(dracoGeometry, attribute.attribute_index);
|
|
263
|
+
this.decoder.GetAttributeDataArrayForAllPoints(dracoGeometry, dracoAttribute, dataType, byteLength, ptr);
|
|
264
|
+
value = new TypedArrayCtor(this.draco.HEAPF32.buffer, ptr, numValues).slice();
|
|
265
|
+
}
|
|
266
|
+
finally {
|
|
267
|
+
this.draco._free(ptr);
|
|
268
|
+
}
|
|
269
|
+
return { value, size: numComponents };
|
|
275
270
|
}
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
271
|
+
// Attribute names
|
|
272
|
+
/**
|
|
273
|
+
* DRACO does not store attribute names - We need to deduce an attribute name
|
|
274
|
+
* for each attribute
|
|
275
|
+
_getAttributeNames(
|
|
276
|
+
dracoGeometry: Mesh | PointCloud,
|
|
277
|
+
options: DracoParseOptions
|
|
278
|
+
): {[unique_id: number]: string} {
|
|
279
|
+
const attributeNames: {[unique_id: number]: string} = {};
|
|
280
|
+
for (let attributeId = 0; attributeId < dracoGeometry.num_attributes(); attributeId++) {
|
|
281
|
+
const dracoAttribute = this.decoder.GetAttribute(dracoGeometry, attributeId);
|
|
282
|
+
const attributeName = this._deduceAttributeName(dracoAttribute, options);
|
|
283
|
+
attributeNames[attributeName] = attributeName;
|
|
284
284
|
}
|
|
285
|
+
return attributeNames;
|
|
285
286
|
}
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
287
|
+
*/
|
|
288
|
+
/**
|
|
289
|
+
* Deduce an attribute name.
|
|
290
|
+
* @note DRACO does not save attribute names, just general type (POSITION, COLOR)
|
|
291
|
+
* to help optimize compression. We generate GLTF compatible names for the Draco-recognized
|
|
292
|
+
* types
|
|
293
|
+
* @param attributeData
|
|
294
|
+
*/
|
|
295
|
+
_deduceAttributeName(attribute, options) {
|
|
296
|
+
// Deduce name based on application provided map
|
|
297
|
+
const uniqueId = attribute.unique_id;
|
|
298
|
+
for (const [attributeName, attributeUniqueId] of Object.entries(options.extraAttributes || {})) {
|
|
299
|
+
if (attributeUniqueId === uniqueId) {
|
|
300
|
+
return attributeName;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
// Deduce name based on attribute type
|
|
304
|
+
const thisAttributeType = attribute.attribute_type;
|
|
305
|
+
for (const dracoAttributeConstant in DRACO_TO_GLTF_ATTRIBUTE_NAME_MAP) {
|
|
306
|
+
const attributeType = this.draco[dracoAttributeConstant];
|
|
307
|
+
if (attributeType === thisAttributeType) {
|
|
308
|
+
// TODO - Return unique names if there multiple attributes per type
|
|
309
|
+
// (e.g. multiple TEX_COORDS or COLORS)
|
|
310
|
+
return DRACO_TO_GLTF_ATTRIBUTE_NAME_MAP[dracoAttributeConstant];
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
// Look up in metadata
|
|
314
|
+
// TODO - shouldn't this have priority?
|
|
315
|
+
const entryName = options.attributeNameEntry || 'name';
|
|
316
|
+
if (attribute.metadata[entryName]) {
|
|
317
|
+
return attribute.metadata[entryName].string;
|
|
318
|
+
}
|
|
319
|
+
// Attribute of "GENERIC" type, we need to assign some name
|
|
320
|
+
return `CUSTOM_ATTRIBUTE_${uniqueId}`;
|
|
291
321
|
}
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
const dracoMetadata = this.decoder.GetMetadata(dracoGeometry);
|
|
298
|
-
return this._getDracoMetadata(dracoMetadata);
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
_getAttributeMetadata(dracoGeometry, attributeId) {
|
|
302
|
-
const dracoMetadata = this.decoder.GetAttributeMetadata(dracoGeometry, attributeId);
|
|
303
|
-
return this._getDracoMetadata(dracoMetadata);
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
_getDracoMetadata(dracoMetadata) {
|
|
307
|
-
if (!dracoMetadata || !dracoMetadata.ptr) {
|
|
308
|
-
return {};
|
|
322
|
+
// METADATA EXTRACTION
|
|
323
|
+
/** Get top level metadata */
|
|
324
|
+
_getTopLevelMetadata(dracoGeometry) {
|
|
325
|
+
const dracoMetadata = this.decoder.GetMetadata(dracoGeometry);
|
|
326
|
+
return this._getDracoMetadata(dracoMetadata);
|
|
309
327
|
}
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
for (let entryIndex = 0; entryIndex < numEntries; entryIndex++) {
|
|
315
|
-
const entryName = this.metadataQuerier.GetEntryName(dracoMetadata, entryIndex);
|
|
316
|
-
result[entryName] = this._getDracoMetadataField(dracoMetadata, entryName);
|
|
328
|
+
/** Get per attribute metadata */
|
|
329
|
+
_getAttributeMetadata(dracoGeometry, attributeId) {
|
|
330
|
+
const dracoMetadata = this.decoder.GetAttributeMetadata(dracoGeometry, attributeId);
|
|
331
|
+
return this._getDracoMetadata(dracoMetadata);
|
|
317
332
|
}
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
this.draco.destroy(dracoArray);
|
|
333
|
+
/**
|
|
334
|
+
* Extract metadata field values
|
|
335
|
+
* @param dracoMetadata
|
|
336
|
+
* @returns
|
|
337
|
+
*/
|
|
338
|
+
_getDracoMetadata(dracoMetadata) {
|
|
339
|
+
// The not so wonderful world of undocumented Draco APIs :(
|
|
340
|
+
if (!dracoMetadata || !dracoMetadata.ptr) {
|
|
341
|
+
return {};
|
|
342
|
+
}
|
|
343
|
+
const result = {};
|
|
344
|
+
const numEntries = this.metadataQuerier.NumEntries(dracoMetadata);
|
|
345
|
+
for (let entryIndex = 0; entryIndex < numEntries; entryIndex++) {
|
|
346
|
+
const entryName = this.metadataQuerier.GetEntryName(dracoMetadata, entryIndex);
|
|
347
|
+
result[entryName] = this._getDracoMetadataField(dracoMetadata, entryName);
|
|
348
|
+
}
|
|
349
|
+
return result;
|
|
336
350
|
}
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
351
|
+
/**
|
|
352
|
+
* Extracts possible values for one metadata entry by name
|
|
353
|
+
* @param dracoMetadata
|
|
354
|
+
* @param entryName
|
|
355
|
+
*/
|
|
356
|
+
_getDracoMetadataField(dracoMetadata, entryName) {
|
|
357
|
+
const dracoArray = new this.draco.DracoInt32Array();
|
|
358
|
+
try {
|
|
359
|
+
// Draco metadata fields can hold int32 arrays
|
|
360
|
+
this.metadataQuerier.GetIntEntryArray(dracoMetadata, entryName, dracoArray);
|
|
361
|
+
const intArray = getInt32Array(dracoArray);
|
|
362
|
+
return {
|
|
363
|
+
int: this.metadataQuerier.GetIntEntry(dracoMetadata, entryName),
|
|
364
|
+
string: this.metadataQuerier.GetStringEntry(dracoMetadata, entryName),
|
|
365
|
+
double: this.metadataQuerier.GetDoubleEntry(dracoMetadata, entryName),
|
|
366
|
+
intArray
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
finally {
|
|
370
|
+
this.draco.destroy(dracoArray);
|
|
371
|
+
}
|
|
348
372
|
}
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
const skip = quantizedAttributes.map(type => this.decoder[type]).includes(attribute_type);
|
|
357
|
-
|
|
358
|
-
if (skip) {
|
|
359
|
-
const transform = new this.draco.AttributeQuantizationTransform();
|
|
360
|
-
|
|
361
|
-
try {
|
|
362
|
-
if (transform.InitFromAttribute(dracoAttribute)) {
|
|
363
|
-
return {
|
|
364
|
-
quantization_bits: transform.quantization_bits(),
|
|
365
|
-
range: transform.range(),
|
|
366
|
-
min_values: new Float32Array([1, 2, 3]).map(i => transform.min_value(i))
|
|
367
|
-
};
|
|
373
|
+
// QUANTIZED ATTRIBUTE SUPPORT (NO DECOMPRESSION)
|
|
374
|
+
/** Skip transforms for specific attribute types */
|
|
375
|
+
_disableAttributeTransforms(options) {
|
|
376
|
+
const { quantizedAttributes = [], octahedronAttributes = [] } = options;
|
|
377
|
+
const skipAttributes = [...quantizedAttributes, ...octahedronAttributes];
|
|
378
|
+
for (const dracoAttributeName of skipAttributes) {
|
|
379
|
+
this.decoder.SkipAttributeTransform(this.draco[dracoAttributeName]);
|
|
368
380
|
}
|
|
369
|
-
} finally {
|
|
370
|
-
this.draco.destroy(transform);
|
|
371
|
-
}
|
|
372
381
|
}
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
382
|
+
/**
|
|
383
|
+
* Extract (and apply?) Position Transform
|
|
384
|
+
* @todo not used
|
|
385
|
+
*/
|
|
386
|
+
_getQuantizationTransform(dracoAttribute, options) {
|
|
387
|
+
const { quantizedAttributes = [] } = options;
|
|
388
|
+
const attribute_type = dracoAttribute.attribute_type();
|
|
389
|
+
const skip = quantizedAttributes.map((type) => this.decoder[type]).includes(attribute_type);
|
|
390
|
+
if (skip) {
|
|
391
|
+
const transform = new this.draco.AttributeQuantizationTransform();
|
|
392
|
+
try {
|
|
393
|
+
if (transform.InitFromAttribute(dracoAttribute)) {
|
|
394
|
+
return {
|
|
395
|
+
quantization_bits: transform.quantization_bits(),
|
|
396
|
+
range: transform.range(),
|
|
397
|
+
min_values: new Float32Array([1, 2, 3]).map((i) => transform.min_value(i))
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
finally {
|
|
402
|
+
this.draco.destroy(transform);
|
|
403
|
+
}
|
|
392
404
|
}
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
405
|
+
return null;
|
|
406
|
+
}
|
|
407
|
+
_getOctahedronTransform(dracoAttribute, options) {
|
|
408
|
+
const { octahedronAttributes = [] } = options;
|
|
409
|
+
const attribute_type = dracoAttribute.attribute_type();
|
|
410
|
+
const octahedron = octahedronAttributes
|
|
411
|
+
.map((type) => this.decoder[type])
|
|
412
|
+
.includes(attribute_type);
|
|
413
|
+
if (octahedron) {
|
|
414
|
+
const transform = new this.draco.AttributeQuantizationTransform();
|
|
415
|
+
try {
|
|
416
|
+
if (transform.InitFromAttribute(dracoAttribute)) {
|
|
417
|
+
return {
|
|
418
|
+
quantization_bits: transform.quantization_bits()
|
|
419
|
+
};
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
finally {
|
|
423
|
+
this.draco.destroy(transform);
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
return null;
|
|
396
427
|
}
|
|
397
|
-
|
|
398
|
-
return null;
|
|
399
|
-
}
|
|
400
|
-
|
|
401
428
|
}
|
|
402
|
-
|
|
429
|
+
exports.default = DracoParser;
|
|
430
|
+
/**
|
|
431
|
+
* Get draco specific data type by TypedArray constructor type
|
|
432
|
+
* @param attributeType
|
|
433
|
+
* @returns draco specific data type
|
|
434
|
+
*/
|
|
403
435
|
function getDracoDataType(draco, attributeType) {
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
case Uint32Array:
|
|
424
|
-
return draco.DT_UINT32;
|
|
425
|
-
|
|
426
|
-
default:
|
|
427
|
-
return draco.DT_INVALID;
|
|
428
|
-
}
|
|
436
|
+
switch (attributeType) {
|
|
437
|
+
case Float32Array:
|
|
438
|
+
return draco.DT_FLOAT32;
|
|
439
|
+
case Int8Array:
|
|
440
|
+
return draco.DT_INT8;
|
|
441
|
+
case Int16Array:
|
|
442
|
+
return draco.DT_INT16;
|
|
443
|
+
case Int32Array:
|
|
444
|
+
return draco.DT_INT32;
|
|
445
|
+
case Uint8Array:
|
|
446
|
+
return draco.DT_UINT8;
|
|
447
|
+
case Uint16Array:
|
|
448
|
+
return draco.DT_UINT16;
|
|
449
|
+
case Uint32Array:
|
|
450
|
+
return draco.DT_UINT32;
|
|
451
|
+
default:
|
|
452
|
+
return draco.DT_INVALID;
|
|
453
|
+
}
|
|
429
454
|
}
|
|
430
|
-
|
|
455
|
+
/**
|
|
456
|
+
* Copy a Draco int32 array into a JS typed array
|
|
457
|
+
*/
|
|
431
458
|
function getInt32Array(dracoArray) {
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
return intArray;
|
|
459
|
+
const numValues = dracoArray.size();
|
|
460
|
+
const intArray = new Int32Array(numValues);
|
|
461
|
+
for (let i = 0; i < numValues; i++) {
|
|
462
|
+
intArray[i] = dracoArray.GetValue(i);
|
|
463
|
+
}
|
|
464
|
+
return intArray;
|
|
440
465
|
}
|
|
441
|
-
|
|
466
|
+
/**
|
|
467
|
+
* Copy a Draco int32 array into a JS typed array
|
|
468
|
+
*/
|
|
442
469
|
function getUint32Array(dracoArray) {
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
return intArray;
|
|
470
|
+
const numValues = dracoArray.size();
|
|
471
|
+
const intArray = new Int32Array(numValues);
|
|
472
|
+
for (let i = 0; i < numValues; i++) {
|
|
473
|
+
intArray[i] = dracoArray.GetValue(i);
|
|
474
|
+
}
|
|
475
|
+
return intArray;
|
|
451
476
|
}
|
|
452
|
-
//# sourceMappingURL=draco-parser.js.map
|