@loaders.gl/pcd 4.0.0-alpha.4 → 4.0.0-alpha.5
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/dist.min.js +870 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/lib/decompress-lzf.d.ts +8 -0
- package/dist/lib/decompress-lzf.d.ts.map +1 -0
- package/dist/lib/decompress-lzf.js +44 -0
- package/dist/lib/decompress-lzf.js.map +1 -0
- package/dist/lib/get-pcd-schema.d.ts +12 -0
- package/dist/lib/get-pcd-schema.d.ts.map +1 -0
- package/dist/lib/parse-pcd.d.ts +17 -0
- package/dist/lib/parse-pcd.d.ts.map +1 -0
- package/dist/lib/parse-pcd.js +50 -0
- package/dist/lib/parse-pcd.js.map +1 -1
- package/dist/lib/pcd-types.d.ts +31 -0
- package/dist/lib/pcd-types.d.ts.map +1 -0
- package/dist/pcd-loader.d.ts +18 -0
- package/dist/pcd-loader.d.ts.map +1 -0
- package/dist/pcd-loader.js +1 -1
- package/dist/pcd-worker.js +88 -1
- package/dist/workers/pcd-worker.d.ts +2 -0
- package/dist/workers/pcd-worker.d.ts.map +1 -0
- package/package.json +7 -7
- package/src/lib/decompress-lzf.ts +50 -0
- package/src/lib/parse-pcd.ts +98 -2
package/dist/dist.min.js
ADDED
|
@@ -0,0 +1,870 @@
|
|
|
1
|
+
(() => {
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
|
|
4
|
+
var __esm = (fn, res) => function __init() {
|
|
5
|
+
return fn && (res = (0, fn[Object.keys(fn)[0]])(fn = 0)), res;
|
|
6
|
+
};
|
|
7
|
+
var __commonJS = (cb, mod) => function __require() {
|
|
8
|
+
return mod || (0, cb[Object.keys(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
9
|
+
};
|
|
10
|
+
var __export = (target, all) => {
|
|
11
|
+
__markAsModule(target);
|
|
12
|
+
for (var name in all)
|
|
13
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
// ../schema/src/category/mesh/mesh-utils.ts
|
|
17
|
+
function getMeshBoundingBox(attributes) {
|
|
18
|
+
let minX = Infinity;
|
|
19
|
+
let minY = Infinity;
|
|
20
|
+
let minZ = Infinity;
|
|
21
|
+
let maxX = -Infinity;
|
|
22
|
+
let maxY = -Infinity;
|
|
23
|
+
let maxZ = -Infinity;
|
|
24
|
+
const positions = attributes.POSITION ? attributes.POSITION.value : [];
|
|
25
|
+
const len = positions && positions.length;
|
|
26
|
+
for (let i = 0; i < len; i += 3) {
|
|
27
|
+
const x = positions[i];
|
|
28
|
+
const y = positions[i + 1];
|
|
29
|
+
const z = positions[i + 2];
|
|
30
|
+
minX = x < minX ? x : minX;
|
|
31
|
+
minY = y < minY ? y : minY;
|
|
32
|
+
minZ = z < minZ ? z : minZ;
|
|
33
|
+
maxX = x > maxX ? x : maxX;
|
|
34
|
+
maxY = y > maxY ? y : maxY;
|
|
35
|
+
maxZ = z > maxZ ? z : maxZ;
|
|
36
|
+
}
|
|
37
|
+
return [
|
|
38
|
+
[minX, minY, minZ],
|
|
39
|
+
[maxX, maxY, maxZ]
|
|
40
|
+
];
|
|
41
|
+
}
|
|
42
|
+
var init_mesh_utils = __esm({
|
|
43
|
+
"../schema/src/category/mesh/mesh-utils.ts"() {
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
// ../schema/src/lib/utils/assert.ts
|
|
48
|
+
function assert(condition, message) {
|
|
49
|
+
if (!condition) {
|
|
50
|
+
throw new Error(message || "loader assertion failed.");
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
var init_assert = __esm({
|
|
54
|
+
"../schema/src/lib/utils/assert.ts"() {
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
// ../schema/src/lib/schema/impl/schema.ts
|
|
59
|
+
function checkNames(fields) {
|
|
60
|
+
const usedNames = {};
|
|
61
|
+
for (const field of fields) {
|
|
62
|
+
if (usedNames[field.name]) {
|
|
63
|
+
console.warn("Schema: duplicated field name", field.name, field);
|
|
64
|
+
}
|
|
65
|
+
usedNames[field.name] = true;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function mergeMaps(m1, m2) {
|
|
69
|
+
return new Map([...m1 || new Map(), ...m2 || new Map()]);
|
|
70
|
+
}
|
|
71
|
+
var Schema;
|
|
72
|
+
var init_schema = __esm({
|
|
73
|
+
"../schema/src/lib/schema/impl/schema.ts"() {
|
|
74
|
+
init_assert();
|
|
75
|
+
Schema = class {
|
|
76
|
+
constructor(fields, metadata) {
|
|
77
|
+
assert(Array.isArray(fields));
|
|
78
|
+
checkNames(fields);
|
|
79
|
+
this.fields = fields;
|
|
80
|
+
this.metadata = metadata || new Map();
|
|
81
|
+
}
|
|
82
|
+
compareTo(other) {
|
|
83
|
+
if (this.metadata !== other.metadata) {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
if (this.fields.length !== other.fields.length) {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
for (let i = 0; i < this.fields.length; ++i) {
|
|
90
|
+
if (!this.fields[i].compareTo(other.fields[i])) {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
select(...columnNames) {
|
|
97
|
+
const nameMap = Object.create(null);
|
|
98
|
+
for (const name of columnNames) {
|
|
99
|
+
nameMap[name] = true;
|
|
100
|
+
}
|
|
101
|
+
const selectedFields = this.fields.filter((field) => nameMap[field.name]);
|
|
102
|
+
return new Schema(selectedFields, this.metadata);
|
|
103
|
+
}
|
|
104
|
+
selectAt(...columnIndices) {
|
|
105
|
+
const selectedFields = columnIndices.map((index) => this.fields[index]).filter(Boolean);
|
|
106
|
+
return new Schema(selectedFields, this.metadata);
|
|
107
|
+
}
|
|
108
|
+
assign(schemaOrFields) {
|
|
109
|
+
let fields;
|
|
110
|
+
let metadata = this.metadata;
|
|
111
|
+
if (schemaOrFields instanceof Schema) {
|
|
112
|
+
const otherSchema = schemaOrFields;
|
|
113
|
+
fields = otherSchema.fields;
|
|
114
|
+
metadata = mergeMaps(mergeMaps(new Map(), this.metadata), otherSchema.metadata);
|
|
115
|
+
} else {
|
|
116
|
+
fields = schemaOrFields;
|
|
117
|
+
}
|
|
118
|
+
const fieldMap = Object.create(null);
|
|
119
|
+
for (const field of this.fields) {
|
|
120
|
+
fieldMap[field.name] = field;
|
|
121
|
+
}
|
|
122
|
+
for (const field of fields) {
|
|
123
|
+
fieldMap[field.name] = field;
|
|
124
|
+
}
|
|
125
|
+
const mergedFields = Object.values(fieldMap);
|
|
126
|
+
return new Schema(mergedFields, metadata);
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
// ../schema/src/lib/schema/impl/field.ts
|
|
133
|
+
var Field;
|
|
134
|
+
var init_field = __esm({
|
|
135
|
+
"../schema/src/lib/schema/impl/field.ts"() {
|
|
136
|
+
Field = class {
|
|
137
|
+
constructor(name, type, nullable = false, metadata = new Map()) {
|
|
138
|
+
this.name = name;
|
|
139
|
+
this.type = type;
|
|
140
|
+
this.nullable = nullable;
|
|
141
|
+
this.metadata = metadata;
|
|
142
|
+
}
|
|
143
|
+
get typeId() {
|
|
144
|
+
return this.type && this.type.typeId;
|
|
145
|
+
}
|
|
146
|
+
clone() {
|
|
147
|
+
return new Field(this.name, this.type, this.nullable, this.metadata);
|
|
148
|
+
}
|
|
149
|
+
compareTo(other) {
|
|
150
|
+
return this.name === other.name && this.type === other.type && this.nullable === other.nullable && this.metadata === other.metadata;
|
|
151
|
+
}
|
|
152
|
+
toString() {
|
|
153
|
+
return `${this.type}${this.nullable ? ", nullable" : ""}${this.metadata ? `, metadata: ${this.metadata}` : ""}`;
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
// ../schema/src/lib/schema/impl/enum.ts
|
|
160
|
+
var Type;
|
|
161
|
+
var init_enum = __esm({
|
|
162
|
+
"../schema/src/lib/schema/impl/enum.ts"() {
|
|
163
|
+
(function(Type2) {
|
|
164
|
+
Type2[Type2["NONE"] = 0] = "NONE";
|
|
165
|
+
Type2[Type2["Null"] = 1] = "Null";
|
|
166
|
+
Type2[Type2["Int"] = 2] = "Int";
|
|
167
|
+
Type2[Type2["Float"] = 3] = "Float";
|
|
168
|
+
Type2[Type2["Binary"] = 4] = "Binary";
|
|
169
|
+
Type2[Type2["Utf8"] = 5] = "Utf8";
|
|
170
|
+
Type2[Type2["Bool"] = 6] = "Bool";
|
|
171
|
+
Type2[Type2["Decimal"] = 7] = "Decimal";
|
|
172
|
+
Type2[Type2["Date"] = 8] = "Date";
|
|
173
|
+
Type2[Type2["Time"] = 9] = "Time";
|
|
174
|
+
Type2[Type2["Timestamp"] = 10] = "Timestamp";
|
|
175
|
+
Type2[Type2["Interval"] = 11] = "Interval";
|
|
176
|
+
Type2[Type2["List"] = 12] = "List";
|
|
177
|
+
Type2[Type2["Struct"] = 13] = "Struct";
|
|
178
|
+
Type2[Type2["Union"] = 14] = "Union";
|
|
179
|
+
Type2[Type2["FixedSizeBinary"] = 15] = "FixedSizeBinary";
|
|
180
|
+
Type2[Type2["FixedSizeList"] = 16] = "FixedSizeList";
|
|
181
|
+
Type2[Type2["Map"] = 17] = "Map";
|
|
182
|
+
Type2[Type2["Dictionary"] = -1] = "Dictionary";
|
|
183
|
+
Type2[Type2["Int8"] = -2] = "Int8";
|
|
184
|
+
Type2[Type2["Int16"] = -3] = "Int16";
|
|
185
|
+
Type2[Type2["Int32"] = -4] = "Int32";
|
|
186
|
+
Type2[Type2["Int64"] = -5] = "Int64";
|
|
187
|
+
Type2[Type2["Uint8"] = -6] = "Uint8";
|
|
188
|
+
Type2[Type2["Uint16"] = -7] = "Uint16";
|
|
189
|
+
Type2[Type2["Uint32"] = -8] = "Uint32";
|
|
190
|
+
Type2[Type2["Uint64"] = -9] = "Uint64";
|
|
191
|
+
Type2[Type2["Float16"] = -10] = "Float16";
|
|
192
|
+
Type2[Type2["Float32"] = -11] = "Float32";
|
|
193
|
+
Type2[Type2["Float64"] = -12] = "Float64";
|
|
194
|
+
Type2[Type2["DateDay"] = -13] = "DateDay";
|
|
195
|
+
Type2[Type2["DateMillisecond"] = -14] = "DateMillisecond";
|
|
196
|
+
Type2[Type2["TimestampSecond"] = -15] = "TimestampSecond";
|
|
197
|
+
Type2[Type2["TimestampMillisecond"] = -16] = "TimestampMillisecond";
|
|
198
|
+
Type2[Type2["TimestampMicrosecond"] = -17] = "TimestampMicrosecond";
|
|
199
|
+
Type2[Type2["TimestampNanosecond"] = -18] = "TimestampNanosecond";
|
|
200
|
+
Type2[Type2["TimeSecond"] = -19] = "TimeSecond";
|
|
201
|
+
Type2[Type2["TimeMillisecond"] = -20] = "TimeMillisecond";
|
|
202
|
+
Type2[Type2["TimeMicrosecond"] = -21] = "TimeMicrosecond";
|
|
203
|
+
Type2[Type2["TimeNanosecond"] = -22] = "TimeNanosecond";
|
|
204
|
+
Type2[Type2["DenseUnion"] = -23] = "DenseUnion";
|
|
205
|
+
Type2[Type2["SparseUnion"] = -24] = "SparseUnion";
|
|
206
|
+
Type2[Type2["IntervalDayTime"] = -25] = "IntervalDayTime";
|
|
207
|
+
Type2[Type2["IntervalYearMonth"] = -26] = "IntervalYearMonth";
|
|
208
|
+
})(Type || (Type = {}));
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
// ../schema/src/lib/schema/impl/type.ts
|
|
213
|
+
var DataType, Null, Bool, Int, Uint8, Precision, Float, Float32, Binary, Utf8, DateUnit, Date, TimeUnit, Time, Timestamp, IntervalUnit, Interval, FixedSizeList, Struct;
|
|
214
|
+
var init_type = __esm({
|
|
215
|
+
"../schema/src/lib/schema/impl/type.ts"() {
|
|
216
|
+
init_enum();
|
|
217
|
+
DataType = class {
|
|
218
|
+
static isNull(x) {
|
|
219
|
+
return x && x.typeId === Type.Null;
|
|
220
|
+
}
|
|
221
|
+
static isInt(x) {
|
|
222
|
+
return x && x.typeId === Type.Int;
|
|
223
|
+
}
|
|
224
|
+
static isFloat(x) {
|
|
225
|
+
return x && x.typeId === Type.Float;
|
|
226
|
+
}
|
|
227
|
+
static isBinary(x) {
|
|
228
|
+
return x && x.typeId === Type.Binary;
|
|
229
|
+
}
|
|
230
|
+
static isUtf8(x) {
|
|
231
|
+
return x && x.typeId === Type.Utf8;
|
|
232
|
+
}
|
|
233
|
+
static isBool(x) {
|
|
234
|
+
return x && x.typeId === Type.Bool;
|
|
235
|
+
}
|
|
236
|
+
static isDecimal(x) {
|
|
237
|
+
return x && x.typeId === Type.Decimal;
|
|
238
|
+
}
|
|
239
|
+
static isDate(x) {
|
|
240
|
+
return x && x.typeId === Type.Date;
|
|
241
|
+
}
|
|
242
|
+
static isTime(x) {
|
|
243
|
+
return x && x.typeId === Type.Time;
|
|
244
|
+
}
|
|
245
|
+
static isTimestamp(x) {
|
|
246
|
+
return x && x.typeId === Type.Timestamp;
|
|
247
|
+
}
|
|
248
|
+
static isInterval(x) {
|
|
249
|
+
return x && x.typeId === Type.Interval;
|
|
250
|
+
}
|
|
251
|
+
static isList(x) {
|
|
252
|
+
return x && x.typeId === Type.List;
|
|
253
|
+
}
|
|
254
|
+
static isStruct(x) {
|
|
255
|
+
return x && x.typeId === Type.Struct;
|
|
256
|
+
}
|
|
257
|
+
static isUnion(x) {
|
|
258
|
+
return x && x.typeId === Type.Union;
|
|
259
|
+
}
|
|
260
|
+
static isFixedSizeBinary(x) {
|
|
261
|
+
return x && x.typeId === Type.FixedSizeBinary;
|
|
262
|
+
}
|
|
263
|
+
static isFixedSizeList(x) {
|
|
264
|
+
return x && x.typeId === Type.FixedSizeList;
|
|
265
|
+
}
|
|
266
|
+
static isMap(x) {
|
|
267
|
+
return x && x.typeId === Type.Map;
|
|
268
|
+
}
|
|
269
|
+
static isDictionary(x) {
|
|
270
|
+
return x && x.typeId === Type.Dictionary;
|
|
271
|
+
}
|
|
272
|
+
get typeId() {
|
|
273
|
+
return Type.NONE;
|
|
274
|
+
}
|
|
275
|
+
compareTo(other) {
|
|
276
|
+
return this === other;
|
|
277
|
+
}
|
|
278
|
+
};
|
|
279
|
+
Null = class extends DataType {
|
|
280
|
+
get typeId() {
|
|
281
|
+
return Type.Null;
|
|
282
|
+
}
|
|
283
|
+
get [Symbol.toStringTag]() {
|
|
284
|
+
return "Null";
|
|
285
|
+
}
|
|
286
|
+
toString() {
|
|
287
|
+
return "Null";
|
|
288
|
+
}
|
|
289
|
+
};
|
|
290
|
+
Bool = class extends DataType {
|
|
291
|
+
get typeId() {
|
|
292
|
+
return Type.Bool;
|
|
293
|
+
}
|
|
294
|
+
get [Symbol.toStringTag]() {
|
|
295
|
+
return "Bool";
|
|
296
|
+
}
|
|
297
|
+
toString() {
|
|
298
|
+
return "Bool";
|
|
299
|
+
}
|
|
300
|
+
};
|
|
301
|
+
Int = class extends DataType {
|
|
302
|
+
constructor(isSigned, bitWidth) {
|
|
303
|
+
super();
|
|
304
|
+
this.isSigned = isSigned;
|
|
305
|
+
this.bitWidth = bitWidth;
|
|
306
|
+
}
|
|
307
|
+
get typeId() {
|
|
308
|
+
return Type.Int;
|
|
309
|
+
}
|
|
310
|
+
get [Symbol.toStringTag]() {
|
|
311
|
+
return "Int";
|
|
312
|
+
}
|
|
313
|
+
toString() {
|
|
314
|
+
return `${this.isSigned ? "I" : "Ui"}nt${this.bitWidth}`;
|
|
315
|
+
}
|
|
316
|
+
};
|
|
317
|
+
Uint8 = class extends Int {
|
|
318
|
+
constructor() {
|
|
319
|
+
super(false, 8);
|
|
320
|
+
}
|
|
321
|
+
};
|
|
322
|
+
Precision = {
|
|
323
|
+
HALF: 16,
|
|
324
|
+
SINGLE: 32,
|
|
325
|
+
DOUBLE: 64
|
|
326
|
+
};
|
|
327
|
+
Float = class extends DataType {
|
|
328
|
+
constructor(precision) {
|
|
329
|
+
super();
|
|
330
|
+
this.precision = precision;
|
|
331
|
+
}
|
|
332
|
+
get typeId() {
|
|
333
|
+
return Type.Float;
|
|
334
|
+
}
|
|
335
|
+
get [Symbol.toStringTag]() {
|
|
336
|
+
return "Float";
|
|
337
|
+
}
|
|
338
|
+
toString() {
|
|
339
|
+
return `Float${this.precision}`;
|
|
340
|
+
}
|
|
341
|
+
};
|
|
342
|
+
Float32 = class extends Float {
|
|
343
|
+
constructor() {
|
|
344
|
+
super(Precision.SINGLE);
|
|
345
|
+
}
|
|
346
|
+
};
|
|
347
|
+
Binary = class extends DataType {
|
|
348
|
+
constructor() {
|
|
349
|
+
super();
|
|
350
|
+
}
|
|
351
|
+
get typeId() {
|
|
352
|
+
return Type.Binary;
|
|
353
|
+
}
|
|
354
|
+
toString() {
|
|
355
|
+
return "Binary";
|
|
356
|
+
}
|
|
357
|
+
get [Symbol.toStringTag]() {
|
|
358
|
+
return "Binary";
|
|
359
|
+
}
|
|
360
|
+
};
|
|
361
|
+
Utf8 = class extends DataType {
|
|
362
|
+
get typeId() {
|
|
363
|
+
return Type.Utf8;
|
|
364
|
+
}
|
|
365
|
+
get [Symbol.toStringTag]() {
|
|
366
|
+
return "Utf8";
|
|
367
|
+
}
|
|
368
|
+
toString() {
|
|
369
|
+
return "Utf8";
|
|
370
|
+
}
|
|
371
|
+
};
|
|
372
|
+
DateUnit = {
|
|
373
|
+
DAY: 0,
|
|
374
|
+
MILLISECOND: 1
|
|
375
|
+
};
|
|
376
|
+
Date = class extends DataType {
|
|
377
|
+
constructor(unit) {
|
|
378
|
+
super();
|
|
379
|
+
this.unit = unit;
|
|
380
|
+
}
|
|
381
|
+
get typeId() {
|
|
382
|
+
return Type.Date;
|
|
383
|
+
}
|
|
384
|
+
get [Symbol.toStringTag]() {
|
|
385
|
+
return "Date";
|
|
386
|
+
}
|
|
387
|
+
toString() {
|
|
388
|
+
return `Date${(this.unit + 1) * 32}<${DateUnit[this.unit]}>`;
|
|
389
|
+
}
|
|
390
|
+
};
|
|
391
|
+
TimeUnit = {
|
|
392
|
+
SECOND: 1,
|
|
393
|
+
MILLISECOND: 1e3,
|
|
394
|
+
MICROSECOND: 1e6,
|
|
395
|
+
NANOSECOND: 1e9
|
|
396
|
+
};
|
|
397
|
+
Time = class extends DataType {
|
|
398
|
+
constructor(unit, bitWidth) {
|
|
399
|
+
super();
|
|
400
|
+
this.unit = unit;
|
|
401
|
+
this.bitWidth = bitWidth;
|
|
402
|
+
}
|
|
403
|
+
get typeId() {
|
|
404
|
+
return Type.Time;
|
|
405
|
+
}
|
|
406
|
+
toString() {
|
|
407
|
+
return `Time${this.bitWidth}<${TimeUnit[this.unit]}>`;
|
|
408
|
+
}
|
|
409
|
+
get [Symbol.toStringTag]() {
|
|
410
|
+
return "Time";
|
|
411
|
+
}
|
|
412
|
+
};
|
|
413
|
+
Timestamp = class extends DataType {
|
|
414
|
+
constructor(unit, timezone = null) {
|
|
415
|
+
super();
|
|
416
|
+
this.unit = unit;
|
|
417
|
+
this.timezone = timezone;
|
|
418
|
+
}
|
|
419
|
+
get typeId() {
|
|
420
|
+
return Type.Timestamp;
|
|
421
|
+
}
|
|
422
|
+
get [Symbol.toStringTag]() {
|
|
423
|
+
return "Timestamp";
|
|
424
|
+
}
|
|
425
|
+
toString() {
|
|
426
|
+
return `Timestamp<${TimeUnit[this.unit]}${this.timezone ? `, ${this.timezone}` : ""}>`;
|
|
427
|
+
}
|
|
428
|
+
};
|
|
429
|
+
IntervalUnit = {
|
|
430
|
+
DAY_TIME: 0,
|
|
431
|
+
YEAR_MONTH: 1
|
|
432
|
+
};
|
|
433
|
+
Interval = class extends DataType {
|
|
434
|
+
constructor(unit) {
|
|
435
|
+
super();
|
|
436
|
+
this.unit = unit;
|
|
437
|
+
}
|
|
438
|
+
get typeId() {
|
|
439
|
+
return Type.Interval;
|
|
440
|
+
}
|
|
441
|
+
get [Symbol.toStringTag]() {
|
|
442
|
+
return "Interval";
|
|
443
|
+
}
|
|
444
|
+
toString() {
|
|
445
|
+
return `Interval<${IntervalUnit[this.unit]}>`;
|
|
446
|
+
}
|
|
447
|
+
};
|
|
448
|
+
FixedSizeList = class extends DataType {
|
|
449
|
+
constructor(listSize, child) {
|
|
450
|
+
super();
|
|
451
|
+
this.listSize = listSize;
|
|
452
|
+
this.children = [child];
|
|
453
|
+
}
|
|
454
|
+
get typeId() {
|
|
455
|
+
return Type.FixedSizeList;
|
|
456
|
+
}
|
|
457
|
+
get valueType() {
|
|
458
|
+
return this.children[0].type;
|
|
459
|
+
}
|
|
460
|
+
get valueField() {
|
|
461
|
+
return this.children[0];
|
|
462
|
+
}
|
|
463
|
+
get [Symbol.toStringTag]() {
|
|
464
|
+
return "FixedSizeList";
|
|
465
|
+
}
|
|
466
|
+
toString() {
|
|
467
|
+
return `FixedSizeList[${this.listSize}]<${this.valueType}>`;
|
|
468
|
+
}
|
|
469
|
+
};
|
|
470
|
+
Struct = class extends DataType {
|
|
471
|
+
constructor(children) {
|
|
472
|
+
super();
|
|
473
|
+
this.children = children;
|
|
474
|
+
}
|
|
475
|
+
get typeId() {
|
|
476
|
+
return Type.Struct;
|
|
477
|
+
}
|
|
478
|
+
toString() {
|
|
479
|
+
return `Struct<{${this.children.map((f) => `${f.name}:${f.type}`).join(", ")}}>`;
|
|
480
|
+
}
|
|
481
|
+
get [Symbol.toStringTag]() {
|
|
482
|
+
return "Struct";
|
|
483
|
+
}
|
|
484
|
+
};
|
|
485
|
+
}
|
|
486
|
+
});
|
|
487
|
+
|
|
488
|
+
// ../schema/src/lib/schema/schema.ts
|
|
489
|
+
var init_schema2 = __esm({
|
|
490
|
+
"../schema/src/lib/schema/schema.ts"() {
|
|
491
|
+
init_schema();
|
|
492
|
+
init_field();
|
|
493
|
+
init_type();
|
|
494
|
+
}
|
|
495
|
+
});
|
|
496
|
+
|
|
497
|
+
// ../schema/src/index.ts
|
|
498
|
+
var init_src = __esm({
|
|
499
|
+
"../schema/src/index.ts"() {
|
|
500
|
+
init_mesh_utils();
|
|
501
|
+
init_schema2();
|
|
502
|
+
}
|
|
503
|
+
});
|
|
504
|
+
|
|
505
|
+
// src/lib/decompress-lzf.ts
|
|
506
|
+
function decompressLZF(inData, outLength) {
|
|
507
|
+
const inLength = inData.length;
|
|
508
|
+
const outData = new Uint8Array(outLength);
|
|
509
|
+
let inPtr = 0;
|
|
510
|
+
let outPtr = 0;
|
|
511
|
+
let ctrl;
|
|
512
|
+
let len;
|
|
513
|
+
let ref;
|
|
514
|
+
do {
|
|
515
|
+
ctrl = inData[inPtr++];
|
|
516
|
+
if (ctrl < 1 << 5) {
|
|
517
|
+
ctrl++;
|
|
518
|
+
if (outPtr + ctrl > outLength)
|
|
519
|
+
throw new Error("Output buffer is not large enough");
|
|
520
|
+
if (inPtr + ctrl > inLength)
|
|
521
|
+
throw new Error("Invalid compressed data");
|
|
522
|
+
do {
|
|
523
|
+
outData[outPtr++] = inData[inPtr++];
|
|
524
|
+
} while (--ctrl);
|
|
525
|
+
} else {
|
|
526
|
+
len = ctrl >> 5;
|
|
527
|
+
ref = outPtr - ((ctrl & 31) << 8) - 1;
|
|
528
|
+
if (inPtr >= inLength)
|
|
529
|
+
throw new Error("Invalid compressed data");
|
|
530
|
+
if (len === 7) {
|
|
531
|
+
len += inData[inPtr++];
|
|
532
|
+
if (inPtr >= inLength)
|
|
533
|
+
throw new Error("Invalid compressed data");
|
|
534
|
+
}
|
|
535
|
+
ref -= inData[inPtr++];
|
|
536
|
+
if (outPtr + len + 2 > outLength)
|
|
537
|
+
throw new Error("Output buffer is not large enough");
|
|
538
|
+
if (ref < 0)
|
|
539
|
+
throw new Error("Invalid compressed data");
|
|
540
|
+
if (ref >= outPtr)
|
|
541
|
+
throw new Error("Invalid compressed data");
|
|
542
|
+
do {
|
|
543
|
+
outData[outPtr++] = outData[ref++];
|
|
544
|
+
} while (--len + 2);
|
|
545
|
+
}
|
|
546
|
+
} while (inPtr < inLength);
|
|
547
|
+
return outData;
|
|
548
|
+
}
|
|
549
|
+
var init_decompress_lzf = __esm({
|
|
550
|
+
"src/lib/decompress-lzf.ts"() {
|
|
551
|
+
}
|
|
552
|
+
});
|
|
553
|
+
|
|
554
|
+
// src/lib/get-pcd-schema.ts
|
|
555
|
+
function getPCDSchema(PCDheader, metadata) {
|
|
556
|
+
const offset = PCDheader.offset;
|
|
557
|
+
const fields = [];
|
|
558
|
+
if (offset.x !== void 0) {
|
|
559
|
+
fields.push(new Field("POSITION", new FixedSizeList(3, new Field("xyz", new Float32())), false));
|
|
560
|
+
}
|
|
561
|
+
if (offset.normal_x !== void 0) {
|
|
562
|
+
fields.push(new Field("NORMAL", new FixedSizeList(3, new Field("xyz", new Float32())), false));
|
|
563
|
+
}
|
|
564
|
+
if (offset.rgb !== void 0) {
|
|
565
|
+
fields.push(new Field("COLOR_0", new FixedSizeList(3, new Field("rgb", new Uint8())), false));
|
|
566
|
+
}
|
|
567
|
+
return new Schema(fields, metadata);
|
|
568
|
+
}
|
|
569
|
+
var init_get_pcd_schema = __esm({
|
|
570
|
+
"src/lib/get-pcd-schema.ts"() {
|
|
571
|
+
init_src();
|
|
572
|
+
}
|
|
573
|
+
});
|
|
574
|
+
|
|
575
|
+
// src/lib/parse-pcd.ts
|
|
576
|
+
function parsePCD(data) {
|
|
577
|
+
const textData = new TextDecoder().decode(data);
|
|
578
|
+
const pcdHeader = parsePCDHeader(textData);
|
|
579
|
+
let attributes = {};
|
|
580
|
+
switch (pcdHeader.data) {
|
|
581
|
+
case "ascii":
|
|
582
|
+
attributes = parsePCDASCII(pcdHeader, textData);
|
|
583
|
+
break;
|
|
584
|
+
case "binary":
|
|
585
|
+
attributes = parsePCDBinary(pcdHeader, data);
|
|
586
|
+
break;
|
|
587
|
+
case "binary_compressed":
|
|
588
|
+
attributes = parsePCDBinaryCompressed(pcdHeader, data);
|
|
589
|
+
break;
|
|
590
|
+
default:
|
|
591
|
+
throw new Error(`PCD: ${pcdHeader.data} files are not supported`);
|
|
592
|
+
}
|
|
593
|
+
attributes = getMeshAttributes(attributes);
|
|
594
|
+
const header = getMeshHeader(pcdHeader, attributes);
|
|
595
|
+
const metadata = new Map([
|
|
596
|
+
["mode", "0"],
|
|
597
|
+
["boundingBox", JSON.stringify(header.boundingBox)]
|
|
598
|
+
]);
|
|
599
|
+
const schema = getPCDSchema(pcdHeader, metadata);
|
|
600
|
+
return {
|
|
601
|
+
loaderData: {
|
|
602
|
+
header: pcdHeader
|
|
603
|
+
},
|
|
604
|
+
header,
|
|
605
|
+
schema,
|
|
606
|
+
mode: 0,
|
|
607
|
+
indices: null,
|
|
608
|
+
attributes
|
|
609
|
+
};
|
|
610
|
+
}
|
|
611
|
+
function getMeshHeader(pcdHeader, attributes) {
|
|
612
|
+
if (typeof pcdHeader.width === "number" && typeof pcdHeader.height === "number") {
|
|
613
|
+
const pointCount = pcdHeader.width * pcdHeader.height;
|
|
614
|
+
return {
|
|
615
|
+
vertexCount: pointCount,
|
|
616
|
+
boundingBox: getMeshBoundingBox(attributes)
|
|
617
|
+
};
|
|
618
|
+
}
|
|
619
|
+
return pcdHeader;
|
|
620
|
+
}
|
|
621
|
+
function getMeshAttributes(attributes) {
|
|
622
|
+
const normalizedAttributes = {
|
|
623
|
+
POSITION: {
|
|
624
|
+
value: new Float32Array(attributes.position),
|
|
625
|
+
size: 3
|
|
626
|
+
}
|
|
627
|
+
};
|
|
628
|
+
if (attributes.normal && attributes.normal.length > 0) {
|
|
629
|
+
normalizedAttributes.NORMAL = {
|
|
630
|
+
value: new Float32Array(attributes.normal),
|
|
631
|
+
size: 3
|
|
632
|
+
};
|
|
633
|
+
}
|
|
634
|
+
if (attributes.color && attributes.color.length > 0) {
|
|
635
|
+
normalizedAttributes.COLOR_0 = {
|
|
636
|
+
value: new Uint8Array(attributes.color),
|
|
637
|
+
size: 3
|
|
638
|
+
};
|
|
639
|
+
}
|
|
640
|
+
return normalizedAttributes;
|
|
641
|
+
}
|
|
642
|
+
function parsePCDHeader(data) {
|
|
643
|
+
const result1 = data.search(/[\r\n]DATA\s(\S*)\s/i);
|
|
644
|
+
const result2 = /[\r\n]DATA\s(\S*)\s/i.exec(data.substr(result1 - 1));
|
|
645
|
+
const pcdHeader = {};
|
|
646
|
+
pcdHeader.data = result2 && result2[1];
|
|
647
|
+
if (result2 !== null) {
|
|
648
|
+
pcdHeader.headerLen = (result2 && result2[0].length) + result1;
|
|
649
|
+
}
|
|
650
|
+
pcdHeader.str = data.substr(0, pcdHeader.headerLen);
|
|
651
|
+
pcdHeader.str = pcdHeader.str.replace(/\#.*/gi, "");
|
|
652
|
+
pcdHeader.version = /VERSION (.*)/i.exec(pcdHeader.str);
|
|
653
|
+
pcdHeader.fields = /FIELDS (.*)/i.exec(pcdHeader.str);
|
|
654
|
+
pcdHeader.size = /SIZE (.*)/i.exec(pcdHeader.str);
|
|
655
|
+
pcdHeader.type = /TYPE (.*)/i.exec(pcdHeader.str);
|
|
656
|
+
pcdHeader.count = /COUNT (.*)/i.exec(pcdHeader.str);
|
|
657
|
+
pcdHeader.width = /WIDTH (.*)/i.exec(pcdHeader.str);
|
|
658
|
+
pcdHeader.height = /HEIGHT (.*)/i.exec(pcdHeader.str);
|
|
659
|
+
pcdHeader.viewpoint = /VIEWPOINT (.*)/i.exec(pcdHeader.str);
|
|
660
|
+
pcdHeader.points = /POINTS (.*)/i.exec(pcdHeader.str);
|
|
661
|
+
if (pcdHeader.version !== null) {
|
|
662
|
+
pcdHeader.version = parseFloat(pcdHeader.version[1]);
|
|
663
|
+
}
|
|
664
|
+
if (pcdHeader.fields !== null) {
|
|
665
|
+
pcdHeader.fields = pcdHeader.fields[1].split(" ");
|
|
666
|
+
}
|
|
667
|
+
if (pcdHeader.type !== null) {
|
|
668
|
+
pcdHeader.type = pcdHeader.type[1].split(" ");
|
|
669
|
+
}
|
|
670
|
+
if (pcdHeader.width !== null) {
|
|
671
|
+
pcdHeader.width = parseInt(pcdHeader.width[1], 10);
|
|
672
|
+
}
|
|
673
|
+
if (pcdHeader.height !== null) {
|
|
674
|
+
pcdHeader.height = parseInt(pcdHeader.height[1], 10);
|
|
675
|
+
}
|
|
676
|
+
if (pcdHeader.viewpoint !== null) {
|
|
677
|
+
pcdHeader.viewpoint = pcdHeader.viewpoint[1];
|
|
678
|
+
}
|
|
679
|
+
if (pcdHeader.points !== null) {
|
|
680
|
+
pcdHeader.points = parseInt(pcdHeader.points[1], 10);
|
|
681
|
+
}
|
|
682
|
+
if (pcdHeader.points === null && typeof pcdHeader.width === "number" && typeof pcdHeader.height === "number") {
|
|
683
|
+
pcdHeader.points = pcdHeader.width * pcdHeader.height;
|
|
684
|
+
}
|
|
685
|
+
if (pcdHeader.size !== null) {
|
|
686
|
+
pcdHeader.size = pcdHeader.size[1].split(" ").map((x) => parseInt(x, 10));
|
|
687
|
+
}
|
|
688
|
+
if (pcdHeader.count !== null) {
|
|
689
|
+
pcdHeader.count = pcdHeader.count[1].split(" ").map((x) => parseInt(x, 10));
|
|
690
|
+
} else {
|
|
691
|
+
pcdHeader.count = [];
|
|
692
|
+
if (pcdHeader.fields !== null) {
|
|
693
|
+
for (let i = 0; i < pcdHeader.fields.length; i++) {
|
|
694
|
+
pcdHeader.count.push(1);
|
|
695
|
+
}
|
|
696
|
+
}
|
|
697
|
+
}
|
|
698
|
+
pcdHeader.offset = {};
|
|
699
|
+
let sizeSum = 0;
|
|
700
|
+
if (pcdHeader.fields !== null && pcdHeader.size !== null) {
|
|
701
|
+
for (let i = 0; i < pcdHeader.fields.length; i++) {
|
|
702
|
+
if (pcdHeader.data === "ascii") {
|
|
703
|
+
pcdHeader.offset[pcdHeader.fields[i]] = i;
|
|
704
|
+
} else {
|
|
705
|
+
pcdHeader.offset[pcdHeader.fields[i]] = sizeSum;
|
|
706
|
+
sizeSum += pcdHeader.size[i];
|
|
707
|
+
}
|
|
708
|
+
}
|
|
709
|
+
}
|
|
710
|
+
pcdHeader.rowSize = sizeSum;
|
|
711
|
+
return pcdHeader;
|
|
712
|
+
}
|
|
713
|
+
function parsePCDASCII(pcdHeader, textData) {
|
|
714
|
+
const position = [];
|
|
715
|
+
const normal = [];
|
|
716
|
+
const color = [];
|
|
717
|
+
const offset = pcdHeader.offset;
|
|
718
|
+
const pcdData = textData.substr(pcdHeader.headerLen);
|
|
719
|
+
const lines = pcdData.split("\n");
|
|
720
|
+
for (let i = 0; i < lines.length; i++) {
|
|
721
|
+
if (lines[i] !== "") {
|
|
722
|
+
const line = lines[i].split(" ");
|
|
723
|
+
if (offset.x !== void 0) {
|
|
724
|
+
position.push(parseFloat(line[offset.x]));
|
|
725
|
+
position.push(parseFloat(line[offset.y]));
|
|
726
|
+
position.push(parseFloat(line[offset.z]));
|
|
727
|
+
}
|
|
728
|
+
if (offset.rgb !== void 0) {
|
|
729
|
+
const floatValue = parseFloat(line[offset.rgb]);
|
|
730
|
+
const binaryColor = new Float32Array([floatValue]);
|
|
731
|
+
const dataview = new DataView(binaryColor.buffer, 0);
|
|
732
|
+
color.push(dataview.getUint8(0));
|
|
733
|
+
color.push(dataview.getUint8(1));
|
|
734
|
+
color.push(dataview.getUint8(2));
|
|
735
|
+
}
|
|
736
|
+
if (offset.normal_x !== void 0) {
|
|
737
|
+
normal.push(parseFloat(line[offset.normal_x]));
|
|
738
|
+
normal.push(parseFloat(line[offset.normal_y]));
|
|
739
|
+
normal.push(parseFloat(line[offset.normal_z]));
|
|
740
|
+
}
|
|
741
|
+
}
|
|
742
|
+
}
|
|
743
|
+
return { position, normal, color };
|
|
744
|
+
}
|
|
745
|
+
function parsePCDBinary(pcdHeader, data) {
|
|
746
|
+
const position = [];
|
|
747
|
+
const normal = [];
|
|
748
|
+
const color = [];
|
|
749
|
+
const dataview = new DataView(data, pcdHeader.headerLen);
|
|
750
|
+
const offset = pcdHeader.offset;
|
|
751
|
+
for (let i = 0, row = 0; i < pcdHeader.points; i++, row += pcdHeader.rowSize) {
|
|
752
|
+
if (offset.x !== void 0) {
|
|
753
|
+
position.push(dataview.getFloat32(row + offset.x, LITTLE_ENDIAN));
|
|
754
|
+
position.push(dataview.getFloat32(row + offset.y, LITTLE_ENDIAN));
|
|
755
|
+
position.push(dataview.getFloat32(row + offset.z, LITTLE_ENDIAN));
|
|
756
|
+
}
|
|
757
|
+
if (offset.rgb !== void 0) {
|
|
758
|
+
color.push(dataview.getUint8(row + offset.rgb + 0));
|
|
759
|
+
color.push(dataview.getUint8(row + offset.rgb + 1));
|
|
760
|
+
color.push(dataview.getUint8(row + offset.rgb + 2));
|
|
761
|
+
}
|
|
762
|
+
if (offset.normal_x !== void 0) {
|
|
763
|
+
normal.push(dataview.getFloat32(row + offset.normal_x, LITTLE_ENDIAN));
|
|
764
|
+
normal.push(dataview.getFloat32(row + offset.normal_y, LITTLE_ENDIAN));
|
|
765
|
+
normal.push(dataview.getFloat32(row + offset.normal_z, LITTLE_ENDIAN));
|
|
766
|
+
}
|
|
767
|
+
}
|
|
768
|
+
return { position, normal, color };
|
|
769
|
+
}
|
|
770
|
+
function parsePCDBinaryCompressed(PCDheader, data) {
|
|
771
|
+
const position = [];
|
|
772
|
+
const normal = [];
|
|
773
|
+
const color = [];
|
|
774
|
+
const sizes = new Uint32Array(data.slice(PCDheader.headerLen, PCDheader.headerLen + 8));
|
|
775
|
+
const compressedSize = sizes[0];
|
|
776
|
+
const decompressedSize = sizes[1];
|
|
777
|
+
const decompressed = decompressLZF(new Uint8Array(data, PCDheader.headerLen + 8, compressedSize), decompressedSize);
|
|
778
|
+
const dataview = new DataView(decompressed.buffer);
|
|
779
|
+
const offset = PCDheader.offset;
|
|
780
|
+
for (let i = 0; i < PCDheader.points; i++) {
|
|
781
|
+
if (offset.x !== void 0) {
|
|
782
|
+
position.push(dataview.getFloat32(PCDheader.points * offset.x + PCDheader.size[0] * i, LITTLE_ENDIAN));
|
|
783
|
+
position.push(dataview.getFloat32(PCDheader.points * offset.y + PCDheader.size[1] * i, LITTLE_ENDIAN));
|
|
784
|
+
position.push(dataview.getFloat32(PCDheader.points * offset.z + PCDheader.size[2] * i, LITTLE_ENDIAN));
|
|
785
|
+
}
|
|
786
|
+
if (offset.rgb !== void 0) {
|
|
787
|
+
color.push(dataview.getUint8(PCDheader.points * offset.rgb + PCDheader.size[3] * i + 0) / 255);
|
|
788
|
+
color.push(dataview.getUint8(PCDheader.points * offset.rgb + PCDheader.size[3] * i + 1) / 255);
|
|
789
|
+
color.push(dataview.getUint8(PCDheader.points * offset.rgb + PCDheader.size[3] * i + 2) / 255);
|
|
790
|
+
}
|
|
791
|
+
if (offset.normal_x !== void 0) {
|
|
792
|
+
normal.push(dataview.getFloat32(PCDheader.points * offset.normal_x + PCDheader.size[4] * i, LITTLE_ENDIAN));
|
|
793
|
+
normal.push(dataview.getFloat32(PCDheader.points * offset.normal_y + PCDheader.size[5] * i, LITTLE_ENDIAN));
|
|
794
|
+
normal.push(dataview.getFloat32(PCDheader.points * offset.normal_z + PCDheader.size[6] * i, LITTLE_ENDIAN));
|
|
795
|
+
}
|
|
796
|
+
}
|
|
797
|
+
return {
|
|
798
|
+
position,
|
|
799
|
+
normal,
|
|
800
|
+
color
|
|
801
|
+
};
|
|
802
|
+
}
|
|
803
|
+
var LITTLE_ENDIAN;
|
|
804
|
+
var init_parse_pcd = __esm({
|
|
805
|
+
"src/lib/parse-pcd.ts"() {
|
|
806
|
+
init_src();
|
|
807
|
+
init_decompress_lzf();
|
|
808
|
+
init_get_pcd_schema();
|
|
809
|
+
LITTLE_ENDIAN = true;
|
|
810
|
+
}
|
|
811
|
+
});
|
|
812
|
+
|
|
813
|
+
// src/pcd-loader.ts
|
|
814
|
+
var VERSION, PCDLoader;
|
|
815
|
+
var init_pcd_loader = __esm({
|
|
816
|
+
"src/pcd-loader.ts"() {
|
|
817
|
+
VERSION = typeof __VERSION__ !== "undefined" ? __VERSION__ : "latest";
|
|
818
|
+
PCDLoader = {
|
|
819
|
+
name: "PCD (Point Cloud Data)",
|
|
820
|
+
id: "pcd",
|
|
821
|
+
module: "pcd",
|
|
822
|
+
version: VERSION,
|
|
823
|
+
worker: true,
|
|
824
|
+
extensions: ["pcd"],
|
|
825
|
+
mimeTypes: ["text/plain"],
|
|
826
|
+
options: {
|
|
827
|
+
pcd: {}
|
|
828
|
+
}
|
|
829
|
+
};
|
|
830
|
+
}
|
|
831
|
+
});
|
|
832
|
+
|
|
833
|
+
// src/index.ts
|
|
834
|
+
var src_exports = {};
|
|
835
|
+
__export(src_exports, {
|
|
836
|
+
PCDLoader: () => PCDLoader2,
|
|
837
|
+
PCDWorkerLoader: () => PCDLoader,
|
|
838
|
+
_typecheckPCDLoader: () => _typecheckPCDLoader
|
|
839
|
+
});
|
|
840
|
+
var PCDLoader2, _typecheckPCDLoader;
|
|
841
|
+
var init_src2 = __esm({
|
|
842
|
+
"src/index.ts"() {
|
|
843
|
+
init_parse_pcd();
|
|
844
|
+
init_pcd_loader();
|
|
845
|
+
PCDLoader2 = {
|
|
846
|
+
...PCDLoader,
|
|
847
|
+
parse: async (arrayBuffer) => parsePCD(arrayBuffer),
|
|
848
|
+
parseSync: parsePCD
|
|
849
|
+
};
|
|
850
|
+
_typecheckPCDLoader = PCDLoader2;
|
|
851
|
+
}
|
|
852
|
+
});
|
|
853
|
+
|
|
854
|
+
// src/bundle.ts
|
|
855
|
+
var require_bundle = __commonJS({
|
|
856
|
+
"src/bundle.ts"(exports, module) {
|
|
857
|
+
var moduleExports = (init_src2(), src_exports);
|
|
858
|
+
globalThis.loaders = globalThis.loaders || {};
|
|
859
|
+
module.exports = Object.assign(globalThis.loaders, moduleExports);
|
|
860
|
+
}
|
|
861
|
+
});
|
|
862
|
+
require_bundle();
|
|
863
|
+
})();
|
|
864
|
+
/** Parse compressed PCD data in in binary_compressed form ( https://pointclouds.org/documentation/tutorials/pcd_file_format.html)
|
|
865
|
+
* from https://github.com/mrdoob/three.js/blob/master/examples/jsm/loaders/PCDLoader.js
|
|
866
|
+
* @license MIT (http://opensource.org/licenses/MIT)
|
|
867
|
+
* @param pcdHeader
|
|
868
|
+
* @param data
|
|
869
|
+
* @returns [attributes]
|
|
870
|
+
*/
|