@loaders.gl/draco 3.1.0-alpha.3 → 3.1.0-beta.2
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 -2
- package/dist/dist.min.js.map +7 -1
- package/dist/draco-loader.d.ts +28 -0
- package/dist/draco-loader.d.ts.map +1 -0
- package/dist/draco-loader.js +27 -21
- package/dist/draco-worker.js +2 -2
- package/dist/draco-worker.js.map +7 -1
- package/dist/draco-writer.d.ts +8 -0
- package/dist/draco-writer.d.ts.map +1 -0
- package/dist/draco-writer.js +39 -27
- 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 +7 -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.js +45 -0
- package/dist/es5/draco-writer.js.map +1 -0
- package/dist/es5/draco3d/draco3d-types.js +58 -0
- package/dist/es5/draco3d/draco3d-types.js.map +1 -0
- package/dist/es5/index.js +50 -0
- package/dist/es5/index.js.map +1 -0
- package/dist/es5/lib/draco-builder.js +361 -0
- package/dist/es5/lib/draco-builder.js.map +1 -0
- package/dist/es5/lib/draco-module-loader.js +96 -0
- package/dist/es5/lib/draco-module-loader.js.map +1 -0
- package/dist/es5/lib/draco-parser.js +464 -0
- package/dist/es5/lib/draco-parser.js.map +1 -0
- package/dist/es5/lib/draco-types.js +2 -0
- package/dist/{lib → es5/lib}/draco-types.js.map +0 -0
- package/dist/es5/lib/utils/get-draco-schema.js +55 -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-worker.js +8 -0
- package/dist/es5/workers/draco-worker.js.map +1 -0
- package/dist/esm/bundle.js +5 -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.js +32 -0
- package/dist/esm/draco-writer.js.map +1 -0
- package/dist/esm/draco3d/draco3d-types.js +48 -0
- package/dist/esm/draco3d/draco3d-types.js.map +1 -0
- package/dist/esm/index.js +24 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/lib/draco-builder.js +354 -0
- package/dist/esm/lib/draco-builder.js.map +1 -0
- package/dist/esm/lib/draco-module-loader.js +85 -0
- package/dist/esm/lib/draco-module-loader.js.map +1 -0
- package/dist/esm/lib/draco-parser.js +452 -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 +48 -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-worker.js +4 -0
- package/dist/esm/workers/draco-worker.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -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 -331
- 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 +74 -68
- 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-worker.d.ts +2 -0
- package/dist/workers/draco-worker.d.ts.map +1 -0
- package/dist/workers/draco-worker.js +5 -4
- package/package.json +10 -10
- 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/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
|
@@ -1,356 +1,338 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
// Native Draco attribute names to GLTF attribute names.
|
|
2
4
|
const GLTF_TO_DRACO_ATTRIBUTE_NAME_MAP = {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
POSITION: 'POSITION',
|
|
6
|
+
NORMAL: 'NORMAL',
|
|
7
|
+
COLOR_0: 'COLOR',
|
|
8
|
+
TEXCOORD_0: 'TEX_COORD'
|
|
7
9
|
};
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
_defineProperty(this, "dracoMeshBuilder", void 0);
|
|
18
|
-
|
|
19
|
-
_defineProperty(this, "dracoMetadataBuilder", void 0);
|
|
20
|
-
|
|
21
|
-
_defineProperty(this, "log", void 0);
|
|
22
|
-
|
|
23
|
-
this.draco = draco;
|
|
24
|
-
this.dracoEncoder = new this.draco.Encoder();
|
|
25
|
-
this.dracoMeshBuilder = new this.draco.MeshBuilder();
|
|
26
|
-
this.dracoMetadataBuilder = new this.draco.MetadataBuilder();
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
destroy() {
|
|
30
|
-
this.destroyEncodedObject(this.dracoMeshBuilder);
|
|
31
|
-
this.destroyEncodedObject(this.dracoEncoder);
|
|
32
|
-
this.destroyEncodedObject(this.dracoMetadataBuilder);
|
|
33
|
-
this.dracoMeshBuilder = null;
|
|
34
|
-
this.dracoEncoder = null;
|
|
35
|
-
this.draco = null;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
destroyEncodedObject(object) {
|
|
39
|
-
if (object) {
|
|
40
|
-
this.draco.destroy(object);
|
|
10
|
+
const noop = () => { };
|
|
11
|
+
class DracoBuilder {
|
|
12
|
+
// draco - the draco decoder, either import `draco3d` or load dynamically
|
|
13
|
+
constructor(draco) {
|
|
14
|
+
this.draco = draco;
|
|
15
|
+
this.dracoEncoder = new this.draco.Encoder();
|
|
16
|
+
this.dracoMeshBuilder = new this.draco.MeshBuilder();
|
|
17
|
+
this.dracoMetadataBuilder = new this.draco.MetadataBuilder();
|
|
41
18
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
_getAttributesFromMesh(mesh) {
|
|
53
|
-
const attributes = { ...mesh,
|
|
54
|
-
...mesh.attributes
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
if (mesh.indices) {
|
|
58
|
-
attributes.indices = mesh.indices;
|
|
19
|
+
destroy() {
|
|
20
|
+
this.destroyEncodedObject(this.dracoMeshBuilder);
|
|
21
|
+
this.destroyEncodedObject(this.dracoEncoder);
|
|
22
|
+
this.destroyEncodedObject(this.dracoMetadataBuilder);
|
|
23
|
+
// @ts-ignore
|
|
24
|
+
this.dracoMeshBuilder = null;
|
|
25
|
+
// @ts-ignore
|
|
26
|
+
this.dracoEncoder = null;
|
|
27
|
+
// @ts-ignore
|
|
28
|
+
this.draco = null;
|
|
59
29
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
const dracoPointCloud = new this.draco.PointCloud();
|
|
66
|
-
|
|
67
|
-
if (options.metadata) {
|
|
68
|
-
this._addGeometryMetadata(dracoPointCloud, options.metadata);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
const attributes = this._getAttributesFromMesh(pointcloud);
|
|
72
|
-
|
|
73
|
-
this._createDracoPointCloud(dracoPointCloud, attributes, options);
|
|
74
|
-
|
|
75
|
-
const dracoData = new this.draco.DracoInt8Array();
|
|
76
|
-
|
|
77
|
-
try {
|
|
78
|
-
const encodedLen = this.dracoEncoder.EncodePointCloudToDracoBuffer(dracoPointCloud, false, dracoData);
|
|
79
|
-
|
|
80
|
-
if (!(encodedLen > 0)) {
|
|
81
|
-
throw new Error('Draco encoding failed.');
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
this.log(`DRACO encoded ${dracoPointCloud.num_points()} points
|
|
85
|
-
with ${dracoPointCloud.num_attributes()} attributes into ${encodedLen} bytes`);
|
|
86
|
-
return dracoInt8ArrayToArrayBuffer(dracoData);
|
|
87
|
-
} finally {
|
|
88
|
-
this.destroyEncodedObject(dracoData);
|
|
89
|
-
this.destroyEncodedObject(dracoPointCloud);
|
|
30
|
+
// TBD - when does this need to be called?
|
|
31
|
+
destroyEncodedObject(object) {
|
|
32
|
+
if (object) {
|
|
33
|
+
this.draco.destroy(object);
|
|
34
|
+
}
|
|
90
35
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
36
|
+
/**
|
|
37
|
+
* Encode mesh or point cloud
|
|
38
|
+
* @param mesh =({})
|
|
39
|
+
* @param options
|
|
40
|
+
*/
|
|
41
|
+
encodeSync(mesh, options = {}) {
|
|
42
|
+
this.log = noop; // TODO
|
|
43
|
+
this._setOptions(options);
|
|
44
|
+
return options.pointcloud
|
|
45
|
+
? this._encodePointCloud(mesh, options)
|
|
46
|
+
: this._encodeMesh(mesh, options);
|
|
98
47
|
}
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
if (encodedLen <= 0) {
|
|
110
|
-
throw new Error('Draco encoding failed.');
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
this.log(`DRACO encoded ${dracoMesh.num_points()} points
|
|
114
|
-
with ${dracoMesh.num_attributes()} attributes into ${encodedLen} bytes`);
|
|
115
|
-
return dracoInt8ArrayToArrayBuffer(dracoData);
|
|
116
|
-
} finally {
|
|
117
|
-
this.destroyEncodedObject(dracoData);
|
|
118
|
-
this.destroyEncodedObject(dracoMesh);
|
|
48
|
+
// PRIVATE
|
|
49
|
+
_getAttributesFromMesh(mesh) {
|
|
50
|
+
// TODO - Change the encodePointCloud interface instead?
|
|
51
|
+
const attributes = { ...mesh, ...mesh.attributes };
|
|
52
|
+
// Fold indices into the attributes
|
|
53
|
+
if (mesh.indices) {
|
|
54
|
+
attributes.indices = mesh.indices;
|
|
55
|
+
}
|
|
56
|
+
return attributes;
|
|
119
57
|
}
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
58
|
+
_encodePointCloud(pointcloud, options) {
|
|
59
|
+
const dracoPointCloud = new this.draco.PointCloud();
|
|
60
|
+
if (options.metadata) {
|
|
61
|
+
this._addGeometryMetadata(dracoPointCloud, options.metadata);
|
|
62
|
+
}
|
|
63
|
+
const attributes = this._getAttributesFromMesh(pointcloud);
|
|
64
|
+
// Build a `DracoPointCloud` from the input data
|
|
65
|
+
this._createDracoPointCloud(dracoPointCloud, attributes, options);
|
|
66
|
+
const dracoData = new this.draco.DracoInt8Array();
|
|
67
|
+
try {
|
|
68
|
+
const encodedLen = this.dracoEncoder.EncodePointCloudToDracoBuffer(dracoPointCloud, false, dracoData);
|
|
69
|
+
if (!(encodedLen > 0)) {
|
|
70
|
+
throw new Error('Draco encoding failed.');
|
|
71
|
+
}
|
|
72
|
+
this.log(`DRACO encoded ${dracoPointCloud.num_points()} points
|
|
73
|
+
with ${dracoPointCloud.num_attributes()} attributes into ${encodedLen} bytes`);
|
|
74
|
+
return dracoInt8ArrayToArrayBuffer(dracoData);
|
|
75
|
+
}
|
|
76
|
+
finally {
|
|
77
|
+
this.destroyEncodedObject(dracoData);
|
|
78
|
+
this.destroyEncodedObject(dracoPointCloud);
|
|
79
|
+
}
|
|
125
80
|
}
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
81
|
+
_encodeMesh(mesh, options) {
|
|
82
|
+
const dracoMesh = new this.draco.Mesh();
|
|
83
|
+
if (options.metadata) {
|
|
84
|
+
this._addGeometryMetadata(dracoMesh, options.metadata);
|
|
85
|
+
}
|
|
86
|
+
const attributes = this._getAttributesFromMesh(mesh);
|
|
87
|
+
// Build a `DracoMesh` from the input data
|
|
88
|
+
this._createDracoMesh(dracoMesh, attributes, options);
|
|
89
|
+
const dracoData = new this.draco.DracoInt8Array();
|
|
90
|
+
try {
|
|
91
|
+
const encodedLen = this.dracoEncoder.EncodeMeshToDracoBuffer(dracoMesh, dracoData);
|
|
92
|
+
if (encodedLen <= 0) {
|
|
93
|
+
throw new Error('Draco encoding failed.');
|
|
94
|
+
}
|
|
95
|
+
this.log(`DRACO encoded ${dracoMesh.num_points()} points
|
|
96
|
+
with ${dracoMesh.num_attributes()} attributes into ${encodedLen} bytes`);
|
|
97
|
+
return dracoInt8ArrayToArrayBuffer(dracoData);
|
|
98
|
+
}
|
|
99
|
+
finally {
|
|
100
|
+
this.destroyEncodedObject(dracoData);
|
|
101
|
+
this.destroyEncodedObject(dracoMesh);
|
|
102
|
+
}
|
|
130
103
|
}
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
104
|
+
/**
|
|
105
|
+
* Set encoding options.
|
|
106
|
+
* @param {{speed?: any; method?: any; quantization?: any;}} options
|
|
107
|
+
*/
|
|
108
|
+
_setOptions(options) {
|
|
109
|
+
if ('speed' in options) {
|
|
110
|
+
// @ts-ignore
|
|
111
|
+
this.dracoEncoder.SetSpeedOptions(...options.speed);
|
|
112
|
+
}
|
|
113
|
+
if ('method' in options) {
|
|
114
|
+
const dracoMethod = this.draco[options.method || 'MESH_SEQUENTIAL_ENCODING'];
|
|
115
|
+
// assert(dracoMethod)
|
|
116
|
+
this.dracoEncoder.SetEncodingMethod(dracoMethod);
|
|
117
|
+
}
|
|
118
|
+
if ('quantization' in options) {
|
|
119
|
+
for (const attribute in options.quantization) {
|
|
120
|
+
const bits = options.quantization[attribute];
|
|
121
|
+
const dracoPosition = this.draco[attribute];
|
|
122
|
+
this.dracoEncoder.SetAttributeQuantization(dracoPosition, bits);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
138
125
|
}
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
});
|
|
126
|
+
/**
|
|
127
|
+
* @param {Mesh} dracoMesh
|
|
128
|
+
* @param {object} attributes
|
|
129
|
+
* @returns {Mesh}
|
|
130
|
+
*/
|
|
131
|
+
_createDracoMesh(dracoMesh, attributes, options) {
|
|
132
|
+
const optionalMetadata = options.attributesMetadata || {};
|
|
133
|
+
try {
|
|
134
|
+
const positions = this._getPositionAttribute(attributes);
|
|
135
|
+
if (!positions) {
|
|
136
|
+
throw new Error('positions');
|
|
137
|
+
}
|
|
138
|
+
const vertexCount = positions.length / 3;
|
|
139
|
+
for (let attributeName in attributes) {
|
|
140
|
+
const attribute = attributes[attributeName];
|
|
141
|
+
attributeName = GLTF_TO_DRACO_ATTRIBUTE_NAME_MAP[attributeName] || attributeName;
|
|
142
|
+
const uniqueId = this._addAttributeToMesh(dracoMesh, attributeName, attribute, vertexCount);
|
|
143
|
+
if (uniqueId !== -1) {
|
|
144
|
+
this._addAttributeMetadata(dracoMesh, uniqueId, {
|
|
145
|
+
name: attributeName,
|
|
146
|
+
...(optionalMetadata[attributeName] || {})
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
}
|
|
164
150
|
}
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
151
|
+
catch (error) {
|
|
152
|
+
this.destroyEncodedObject(dracoMesh);
|
|
153
|
+
throw error;
|
|
154
|
+
}
|
|
155
|
+
return dracoMesh;
|
|
169
156
|
}
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
157
|
+
/**
|
|
158
|
+
* @param {} dracoPointCloud
|
|
159
|
+
* @param {object} attributes
|
|
160
|
+
*/
|
|
161
|
+
_createDracoPointCloud(dracoPointCloud, attributes, options) {
|
|
162
|
+
const optionalMetadata = options.attributesMetadata || {};
|
|
163
|
+
try {
|
|
164
|
+
const positions = this._getPositionAttribute(attributes);
|
|
165
|
+
if (!positions) {
|
|
166
|
+
throw new Error('positions');
|
|
167
|
+
}
|
|
168
|
+
const vertexCount = positions.length / 3;
|
|
169
|
+
for (let attributeName in attributes) {
|
|
170
|
+
const attribute = attributes[attributeName];
|
|
171
|
+
attributeName = GLTF_TO_DRACO_ATTRIBUTE_NAME_MAP[attributeName] || attributeName;
|
|
172
|
+
const uniqueId = this._addAttributeToMesh(dracoPointCloud, attributeName, attribute, vertexCount);
|
|
173
|
+
if (uniqueId !== -1) {
|
|
174
|
+
this._addAttributeMetadata(dracoPointCloud, uniqueId, {
|
|
175
|
+
name: attributeName,
|
|
176
|
+
...(optionalMetadata[attributeName] || {})
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
this.destroyEncodedObject(dracoPointCloud);
|
|
183
|
+
throw error;
|
|
197
184
|
}
|
|
198
|
-
|
|
199
|
-
} catch (error) {
|
|
200
|
-
this.destroyEncodedObject(dracoPointCloud);
|
|
201
|
-
throw error;
|
|
185
|
+
return dracoPointCloud;
|
|
202
186
|
}
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
187
|
+
/**
|
|
188
|
+
* @param mesh
|
|
189
|
+
* @param attributeName
|
|
190
|
+
* @param attribute
|
|
191
|
+
* @param vertexCount
|
|
192
|
+
*/
|
|
193
|
+
_addAttributeToMesh(mesh, attributeName, attribute, vertexCount) {
|
|
194
|
+
if (!ArrayBuffer.isView(attribute)) {
|
|
195
|
+
return -1;
|
|
196
|
+
}
|
|
197
|
+
const type = this._getDracoAttributeType(attributeName);
|
|
198
|
+
// @ts-ignore TODO/fix types
|
|
199
|
+
const size = attribute.length / vertexCount;
|
|
200
|
+
if (type === 'indices') {
|
|
201
|
+
// @ts-ignore TODO/fix types
|
|
202
|
+
const numFaces = attribute.length / 3;
|
|
203
|
+
this.log(`Adding attribute ${attributeName}, size ${numFaces}`);
|
|
204
|
+
// @ts-ignore assumes mesh is a Mesh, not a point cloud
|
|
205
|
+
this.dracoMeshBuilder.AddFacesToMesh(mesh, numFaces, attribute);
|
|
206
|
+
return -1;
|
|
207
|
+
}
|
|
208
|
+
this.log(`Adding attribute ${attributeName}, size ${size}`);
|
|
209
|
+
const builder = this.dracoMeshBuilder;
|
|
210
|
+
const { buffer } = attribute;
|
|
211
|
+
switch (attribute.constructor) {
|
|
212
|
+
case Int8Array:
|
|
213
|
+
return builder.AddInt8Attribute(mesh, type, vertexCount, size, new Int8Array(buffer));
|
|
214
|
+
case Int16Array:
|
|
215
|
+
return builder.AddInt16Attribute(mesh, type, vertexCount, size, new Int16Array(buffer));
|
|
216
|
+
case Int32Array:
|
|
217
|
+
return builder.AddInt32Attribute(mesh, type, vertexCount, size, new Int32Array(buffer));
|
|
218
|
+
case Uint8Array:
|
|
219
|
+
case Uint8ClampedArray:
|
|
220
|
+
return builder.AddUInt8Attribute(mesh, type, vertexCount, size, new Uint8Array(buffer));
|
|
221
|
+
case Uint16Array:
|
|
222
|
+
return builder.AddUInt16Attribute(mesh, type, vertexCount, size, new Uint16Array(buffer));
|
|
223
|
+
case Uint32Array:
|
|
224
|
+
return builder.AddUInt32Attribute(mesh, type, vertexCount, size, new Uint32Array(buffer));
|
|
225
|
+
case Float32Array:
|
|
226
|
+
default:
|
|
227
|
+
return builder.AddFloatAttribute(mesh, type, vertexCount, size, new Float32Array(buffer));
|
|
228
|
+
}
|
|
210
229
|
}
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
230
|
+
/**
|
|
231
|
+
* DRACO can compress attributes of know type better
|
|
232
|
+
* TODO - expose an attribute type map?
|
|
233
|
+
* @param attributeName
|
|
234
|
+
*/
|
|
235
|
+
_getDracoAttributeType(attributeName) {
|
|
236
|
+
switch (attributeName.toLowerCase()) {
|
|
237
|
+
case 'indices':
|
|
238
|
+
return 'indices';
|
|
239
|
+
case 'position':
|
|
240
|
+
case 'positions':
|
|
241
|
+
case 'vertices':
|
|
242
|
+
return this.draco.POSITION;
|
|
243
|
+
case 'normal':
|
|
244
|
+
case 'normals':
|
|
245
|
+
return this.draco.NORMAL;
|
|
246
|
+
case 'color':
|
|
247
|
+
case 'colors':
|
|
248
|
+
return this.draco.COLOR;
|
|
249
|
+
case 'texcoord':
|
|
250
|
+
case 'texcoords':
|
|
251
|
+
return this.draco.TEX_COORD;
|
|
252
|
+
default:
|
|
253
|
+
return this.draco.GENERIC;
|
|
254
|
+
}
|
|
221
255
|
}
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
return builder.AddInt8Attribute(mesh, type, vertexCount, size, new Int8Array(buffer));
|
|
232
|
-
|
|
233
|
-
case Int16Array:
|
|
234
|
-
return builder.AddInt16Attribute(mesh, type, vertexCount, size, new Int16Array(buffer));
|
|
235
|
-
|
|
236
|
-
case Int32Array:
|
|
237
|
-
return builder.AddInt32Attribute(mesh, type, vertexCount, size, new Int32Array(buffer));
|
|
238
|
-
|
|
239
|
-
case Uint8Array:
|
|
240
|
-
case Uint8ClampedArray:
|
|
241
|
-
return builder.AddUInt8Attribute(mesh, type, vertexCount, size, new Uint8Array(buffer));
|
|
242
|
-
|
|
243
|
-
case Uint16Array:
|
|
244
|
-
return builder.AddUInt16Attribute(mesh, type, vertexCount, size, new Uint16Array(buffer));
|
|
245
|
-
|
|
246
|
-
case Uint32Array:
|
|
247
|
-
return builder.AddUInt32Attribute(mesh, type, vertexCount, size, new Uint32Array(buffer));
|
|
248
|
-
|
|
249
|
-
case Float32Array:
|
|
250
|
-
default:
|
|
251
|
-
return builder.AddFloatAttribute(mesh, type, vertexCount, size, new Float32Array(buffer));
|
|
256
|
+
_getPositionAttribute(attributes) {
|
|
257
|
+
for (const attributeName in attributes) {
|
|
258
|
+
const attribute = attributes[attributeName];
|
|
259
|
+
const dracoType = this._getDracoAttributeType(attributeName);
|
|
260
|
+
if (dracoType === this.draco.POSITION) {
|
|
261
|
+
return attribute;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
return null;
|
|
252
265
|
}
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
case 'vertices':
|
|
263
|
-
return this.draco.POSITION;
|
|
264
|
-
|
|
265
|
-
case 'normal':
|
|
266
|
-
case 'normals':
|
|
267
|
-
return this.draco.NORMAL;
|
|
268
|
-
|
|
269
|
-
case 'color':
|
|
270
|
-
case 'colors':
|
|
271
|
-
return this.draco.COLOR;
|
|
272
|
-
|
|
273
|
-
case 'texcoord':
|
|
274
|
-
case 'texcoords':
|
|
275
|
-
return this.draco.TEX_COORD;
|
|
276
|
-
|
|
277
|
-
default:
|
|
278
|
-
return this.draco.GENERIC;
|
|
266
|
+
/**
|
|
267
|
+
* Add metadata for the geometry.
|
|
268
|
+
* @param dracoGeometry - WASM Draco Object
|
|
269
|
+
* @param metadata
|
|
270
|
+
*/
|
|
271
|
+
_addGeometryMetadata(dracoGeometry, metadata) {
|
|
272
|
+
const dracoMetadata = new this.draco.Metadata();
|
|
273
|
+
this._populateDracoMetadata(dracoMetadata, metadata);
|
|
274
|
+
this.dracoMeshBuilder.AddMetadata(dracoGeometry, dracoMetadata);
|
|
279
275
|
}
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
276
|
+
/**
|
|
277
|
+
* Add metadata for an attribute to geometry.
|
|
278
|
+
* @param dracoGeometry - WASM Draco Object
|
|
279
|
+
* @param uniqueAttributeId
|
|
280
|
+
* @param metadata
|
|
281
|
+
*/
|
|
282
|
+
_addAttributeMetadata(dracoGeometry, uniqueAttributeId, metadata) {
|
|
283
|
+
// Note: Draco JS IDL doesn't seem to expose draco.AttributeMetadata, however it seems to
|
|
284
|
+
// create such objects automatically from draco.Metadata object.
|
|
285
|
+
const dracoAttributeMetadata = new this.draco.Metadata();
|
|
286
|
+
this._populateDracoMetadata(dracoAttributeMetadata, metadata);
|
|
287
|
+
// Draco3d doc note: Directly add attribute metadata to geometry.
|
|
288
|
+
// You can do this without explicitly adding |GeometryMetadata| to mesh.
|
|
289
|
+
this.dracoMeshBuilder.SetMetadataForAttribute(dracoGeometry, uniqueAttributeId, dracoAttributeMetadata);
|
|
291
290
|
}
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
} else {
|
|
319
|
-
this.dracoMetadataBuilder.AddDoubleEntry(dracoMetadata, key, value);
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
break;
|
|
323
|
-
|
|
324
|
-
case 'object':
|
|
325
|
-
if (value instanceof Int32Array) {
|
|
326
|
-
this.dracoMetadataBuilder.AddIntEntryArray(dracoMetadata, key, value, value.length);
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
break;
|
|
330
|
-
|
|
331
|
-
case 'string':
|
|
332
|
-
default:
|
|
333
|
-
this.dracoMetadataBuilder.AddStringEntry(dracoMetadata, key, value);
|
|
334
|
-
}
|
|
291
|
+
/**
|
|
292
|
+
* Add contents of object or map to a WASM Draco Metadata Object
|
|
293
|
+
* @param dracoMetadata - WASM Draco Object
|
|
294
|
+
* @param metadata
|
|
295
|
+
*/
|
|
296
|
+
_populateDracoMetadata(dracoMetadata, metadata) {
|
|
297
|
+
for (const [key, value] of getEntries(metadata)) {
|
|
298
|
+
switch (typeof value) {
|
|
299
|
+
case 'number':
|
|
300
|
+
if (Math.trunc(value) === value) {
|
|
301
|
+
this.dracoMetadataBuilder.AddIntEntry(dracoMetadata, key, value);
|
|
302
|
+
}
|
|
303
|
+
else {
|
|
304
|
+
this.dracoMetadataBuilder.AddDoubleEntry(dracoMetadata, key, value);
|
|
305
|
+
}
|
|
306
|
+
break;
|
|
307
|
+
case 'object':
|
|
308
|
+
if (value instanceof Int32Array) {
|
|
309
|
+
this.dracoMetadataBuilder.AddIntEntryArray(dracoMetadata, key, value, value.length);
|
|
310
|
+
}
|
|
311
|
+
break;
|
|
312
|
+
case 'string':
|
|
313
|
+
default:
|
|
314
|
+
this.dracoMetadataBuilder.AddStringEntry(dracoMetadata, key, value);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
335
317
|
}
|
|
336
|
-
}
|
|
337
|
-
|
|
338
318
|
}
|
|
339
|
-
|
|
319
|
+
exports.default = DracoBuilder;
|
|
320
|
+
// HELPER FUNCTIONS
|
|
321
|
+
/**
|
|
322
|
+
* Copy encoded data to buffer
|
|
323
|
+
* @param dracoData
|
|
324
|
+
*/
|
|
340
325
|
function dracoInt8ArrayToArrayBuffer(dracoData) {
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
return outputBuffer;
|
|
326
|
+
const byteLength = dracoData.size();
|
|
327
|
+
const outputBuffer = new ArrayBuffer(byteLength);
|
|
328
|
+
const outputData = new Int8Array(outputBuffer);
|
|
329
|
+
for (let i = 0; i < byteLength; ++i) {
|
|
330
|
+
outputData[i] = dracoData.GetValue(i);
|
|
331
|
+
}
|
|
332
|
+
return outputBuffer;
|
|
350
333
|
}
|
|
351
|
-
|
|
334
|
+
/** Enable iteration over either an object or a map */
|
|
352
335
|
function getEntries(container) {
|
|
353
|
-
|
|
354
|
-
|
|
336
|
+
const hasEntriesFunc = container.entries && !container.hasOwnProperty('entries');
|
|
337
|
+
return hasEntriesFunc ? container.entries() : Object.entries(container);
|
|
355
338
|
}
|
|
356
|
-
//# sourceMappingURL=draco-builder.js.map
|