@loaders.gl/obj 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 +744 -0
- package/dist/es5/bundle.js +6 -0
- package/dist/es5/bundle.js.map +1 -0
- package/dist/es5/index.js +74 -0
- package/dist/es5/index.js.map +1 -0
- package/dist/es5/lib/get-obj-schema.js +54 -0
- package/dist/es5/lib/get-obj-schema.js.map +1 -0
- package/dist/es5/lib/obj-types.js +2 -0
- package/dist/es5/lib/obj-types.js.map +1 -0
- package/dist/es5/lib/parse-mtl.js +86 -0
- package/dist/es5/lib/parse-mtl.js.map +1 -0
- package/dist/es5/lib/parse-obj-meshes.js +486 -0
- package/dist/es5/lib/parse-obj-meshes.js.map +1 -0
- package/dist/es5/lib/parse-obj.js +100 -0
- package/dist/es5/lib/parse-obj.js.map +1 -0
- package/dist/es5/mtl-loader.js +26 -0
- package/dist/es5/mtl-loader.js.map +1 -0
- package/dist/es5/obj-loader.js +27 -0
- package/dist/es5/obj-loader.js.map +1 -0
- package/dist/es5/workers/obj-worker.js +6 -0
- package/dist/es5/workers/obj-worker.js.map +1 -0
- package/dist/esm/bundle.js +4 -0
- package/dist/esm/bundle.js.map +1 -0
- package/dist/esm/index.js +18 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/lib/get-obj-schema.js +49 -0
- package/dist/esm/lib/get-obj-schema.js.map +1 -0
- package/dist/esm/lib/obj-types.js +2 -0
- package/dist/esm/lib/obj-types.js.map +1 -0
- package/dist/esm/lib/parse-mtl.js +68 -0
- package/dist/esm/lib/parse-mtl.js.map +1 -0
- package/dist/esm/lib/parse-obj-meshes.js +385 -0
- package/dist/esm/lib/parse-obj-meshes.js.map +1 -0
- package/dist/{lib/load-obj.js → esm/lib/parse-obj.js} +5 -15
- package/dist/esm/lib/parse-obj.js.map +1 -0
- package/dist/esm/mtl-loader.js +16 -0
- package/dist/esm/mtl-loader.js.map +1 -0
- package/dist/esm/obj-loader.js +19 -0
- package/dist/esm/obj-loader.js.map +1 -0
- package/dist/esm/workers/obj-worker.js +4 -0
- package/dist/esm/workers/obj-worker.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -8
- package/dist/lib/get-obj-schema.d.ts +4 -0
- package/dist/lib/get-obj-schema.d.ts.map +1 -0
- package/dist/lib/get-obj-schema.js +33 -33
- package/dist/lib/obj-types.d.ts +1 -0
- package/dist/lib/obj-types.d.ts.map +1 -0
- package/dist/lib/obj-types.js +1 -2
- package/dist/lib/parse-mtl.d.ts +34 -0
- package/dist/lib/parse-mtl.d.ts.map +1 -0
- package/dist/lib/parse-mtl.js +201 -0
- package/dist/lib/parse-obj-meshes.d.ts +5 -0
- package/dist/lib/parse-obj-meshes.d.ts.map +1 -0
- package/dist/lib/parse-obj-meshes.js +440 -0
- package/dist/lib/parse-obj.d.ts +3 -0
- package/dist/lib/parse-obj.d.ts.map +1 -0
- package/dist/lib/parse-obj.js +63 -449
- package/dist/mtl-loader.d.ts +12 -0
- package/dist/mtl-loader.d.ts.map +1 -0
- package/dist/mtl-loader.js +24 -0
- package/dist/obj-loader.d.ts +11 -0
- package/dist/obj-loader.d.ts.map +1 -0
- package/dist/obj-loader.js +24 -18
- package/dist/obj-worker.js +213 -507
- package/dist/workers/obj-worker.d.ts +2 -0
- package/dist/workers/obj-worker.d.ts.map +1 -0
- package/dist/workers/obj-worker.js +5 -4
- package/package.json +9 -9
- package/src/index.ts +25 -4
- package/src/lib/get-obj-schema.ts +24 -20
- package/src/lib/parse-mtl.ts +246 -0
- package/src/lib/parse-obj-meshes.ts +525 -0
- package/src/lib/parse-obj.ts +67 -508
- package/src/mtl-loader.ts +31 -0
- package/src/obj-loader.ts +8 -3
- package/dist/bundle.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/lib/get-obj-schema.js.map +0 -1
- package/dist/lib/load-obj.js.map +0 -1
- package/dist/lib/obj-types.js.map +0 -1
- package/dist/lib/parse-obj.js.map +0 -1
- package/dist/obj-loader.js.map +0 -1
- package/src/lib/load-obj.ts +0 -83
- /package/src/workers/{obj-worker.js → obj-worker.ts} +0 -0
package/dist/dist.min.js
ADDED
|
@@ -0,0 +1,744 @@
|
|
|
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/lib/table/simple-table/data-type.ts
|
|
17
|
+
function getDataTypeFromValue(value, defaultNumberType = "float32") {
|
|
18
|
+
if (value instanceof Date) {
|
|
19
|
+
return "date-millisecond";
|
|
20
|
+
}
|
|
21
|
+
if (value instanceof Number) {
|
|
22
|
+
return defaultNumberType;
|
|
23
|
+
}
|
|
24
|
+
if (typeof value === "string") {
|
|
25
|
+
return "utf8";
|
|
26
|
+
}
|
|
27
|
+
if (value === null || value === "undefined") {
|
|
28
|
+
return "null";
|
|
29
|
+
}
|
|
30
|
+
return "null";
|
|
31
|
+
}
|
|
32
|
+
function getDataTypeFromArray(array) {
|
|
33
|
+
let type = getDataTypeFromTypedArray(array);
|
|
34
|
+
if (type !== "null") {
|
|
35
|
+
return { type, nullable: false };
|
|
36
|
+
}
|
|
37
|
+
if (array.length > 0) {
|
|
38
|
+
type = getDataTypeFromValue(array[0]);
|
|
39
|
+
return { type, nullable: true };
|
|
40
|
+
}
|
|
41
|
+
return { type: "null", nullable: true };
|
|
42
|
+
}
|
|
43
|
+
function getDataTypeFromTypedArray(array) {
|
|
44
|
+
switch (array.constructor) {
|
|
45
|
+
case Int8Array:
|
|
46
|
+
return "int8";
|
|
47
|
+
case Uint8Array:
|
|
48
|
+
case Uint8ClampedArray:
|
|
49
|
+
return "uint8";
|
|
50
|
+
case Int16Array:
|
|
51
|
+
return "int16";
|
|
52
|
+
case Uint16Array:
|
|
53
|
+
return "uint16";
|
|
54
|
+
case Int32Array:
|
|
55
|
+
return "int32";
|
|
56
|
+
case Uint32Array:
|
|
57
|
+
return "uint32";
|
|
58
|
+
case Float32Array:
|
|
59
|
+
return "float32";
|
|
60
|
+
case Float64Array:
|
|
61
|
+
return "float64";
|
|
62
|
+
default:
|
|
63
|
+
return "null";
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
var init_data_type = __esm({
|
|
67
|
+
"../schema/src/lib/table/simple-table/data-type.ts"() {
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
// ../schema/src/lib/mesh/mesh-utils.ts
|
|
72
|
+
function getMeshBoundingBox(attributes) {
|
|
73
|
+
let minX = Infinity;
|
|
74
|
+
let minY = Infinity;
|
|
75
|
+
let minZ = Infinity;
|
|
76
|
+
let maxX = -Infinity;
|
|
77
|
+
let maxY = -Infinity;
|
|
78
|
+
let maxZ = -Infinity;
|
|
79
|
+
const positions = attributes.POSITION ? attributes.POSITION.value : [];
|
|
80
|
+
const len = positions && positions.length;
|
|
81
|
+
for (let i = 0; i < len; i += 3) {
|
|
82
|
+
const x = positions[i];
|
|
83
|
+
const y = positions[i + 1];
|
|
84
|
+
const z = positions[i + 2];
|
|
85
|
+
minX = x < minX ? x : minX;
|
|
86
|
+
minY = y < minY ? y : minY;
|
|
87
|
+
minZ = z < minZ ? z : minZ;
|
|
88
|
+
maxX = x > maxX ? x : maxX;
|
|
89
|
+
maxY = y > maxY ? y : maxY;
|
|
90
|
+
maxZ = z > maxZ ? z : maxZ;
|
|
91
|
+
}
|
|
92
|
+
return [
|
|
93
|
+
[minX, minY, minZ],
|
|
94
|
+
[maxX, maxY, maxZ]
|
|
95
|
+
];
|
|
96
|
+
}
|
|
97
|
+
var init_mesh_utils = __esm({
|
|
98
|
+
"../schema/src/lib/mesh/mesh-utils.ts"() {
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
// ../schema/src/index.ts
|
|
103
|
+
var init_src = __esm({
|
|
104
|
+
"../schema/src/index.ts"() {
|
|
105
|
+
init_data_type();
|
|
106
|
+
init_mesh_utils();
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
// src/lib/parse-obj-meshes.ts
|
|
111
|
+
function parseOBJMeshes(text) {
|
|
112
|
+
const state = new ParserState();
|
|
113
|
+
if (text.indexOf("\r\n") !== -1) {
|
|
114
|
+
text = text.replace(/\r\n/g, "\n");
|
|
115
|
+
}
|
|
116
|
+
if (text.indexOf("\\\n") !== -1) {
|
|
117
|
+
text = text.replace(/\\\n/g, "");
|
|
118
|
+
}
|
|
119
|
+
const lines = text.split("\n");
|
|
120
|
+
let line = "";
|
|
121
|
+
let lineFirstChar = "";
|
|
122
|
+
let lineLength = 0;
|
|
123
|
+
let result = [];
|
|
124
|
+
const trimLeft = typeof "".trimLeft === "function";
|
|
125
|
+
for (let i = 0, l = lines.length; i < l; i++) {
|
|
126
|
+
line = lines[i];
|
|
127
|
+
line = trimLeft ? line.trimLeft() : line.trim();
|
|
128
|
+
lineLength = line.length;
|
|
129
|
+
if (lineLength === 0)
|
|
130
|
+
continue;
|
|
131
|
+
lineFirstChar = line.charAt(0);
|
|
132
|
+
if (lineFirstChar === "#")
|
|
133
|
+
continue;
|
|
134
|
+
if (lineFirstChar === "v") {
|
|
135
|
+
const data = line.split(/\s+/);
|
|
136
|
+
switch (data[0]) {
|
|
137
|
+
case "v":
|
|
138
|
+
state.vertices.push(parseFloat(data[1]), parseFloat(data[2]), parseFloat(data[3]));
|
|
139
|
+
if (data.length === 8) {
|
|
140
|
+
state.colors.push(parseFloat(data[4]), parseFloat(data[5]), parseFloat(data[6]));
|
|
141
|
+
}
|
|
142
|
+
break;
|
|
143
|
+
case "vn":
|
|
144
|
+
state.normals.push(parseFloat(data[1]), parseFloat(data[2]), parseFloat(data[3]));
|
|
145
|
+
break;
|
|
146
|
+
case "vt":
|
|
147
|
+
state.uvs.push(parseFloat(data[1]), parseFloat(data[2]));
|
|
148
|
+
break;
|
|
149
|
+
default:
|
|
150
|
+
}
|
|
151
|
+
} else if (lineFirstChar === "f") {
|
|
152
|
+
const lineData = line.substr(1).trim();
|
|
153
|
+
const vertexData = lineData.split(/\s+/);
|
|
154
|
+
const faceVertices = [];
|
|
155
|
+
for (let j = 0, jl = vertexData.length; j < jl; j++) {
|
|
156
|
+
const vertex = vertexData[j];
|
|
157
|
+
if (vertex.length > 0) {
|
|
158
|
+
const vertexParts = vertex.split("/");
|
|
159
|
+
faceVertices.push(vertexParts);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
const v1 = faceVertices[0];
|
|
163
|
+
for (let j = 1, jl = faceVertices.length - 1; j < jl; j++) {
|
|
164
|
+
const v2 = faceVertices[j];
|
|
165
|
+
const v3 = faceVertices[j + 1];
|
|
166
|
+
state.addFace(v1[0], v2[0], v3[0], v1[1], v2[1], v3[1], v1[2], v2[2], v3[2]);
|
|
167
|
+
}
|
|
168
|
+
} else if (lineFirstChar === "l") {
|
|
169
|
+
const lineParts = line.substring(1).trim().split(" ");
|
|
170
|
+
let lineVertices;
|
|
171
|
+
const lineUVs = [];
|
|
172
|
+
if (line.indexOf("/") === -1) {
|
|
173
|
+
lineVertices = lineParts;
|
|
174
|
+
} else {
|
|
175
|
+
lineVertices = [];
|
|
176
|
+
for (let li = 0, llen = lineParts.length; li < llen; li++) {
|
|
177
|
+
const parts = lineParts[li].split("/");
|
|
178
|
+
if (parts[0] !== "")
|
|
179
|
+
lineVertices.push(parts[0]);
|
|
180
|
+
if (parts[1] !== "")
|
|
181
|
+
lineUVs.push(parts[1]);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
state.addLineGeometry(lineVertices, lineUVs);
|
|
185
|
+
} else if (lineFirstChar === "p") {
|
|
186
|
+
const lineData = line.substr(1).trim();
|
|
187
|
+
const pointData = lineData.split(" ");
|
|
188
|
+
state.addPointGeometry(pointData);
|
|
189
|
+
} else if ((result = OBJECT_RE.exec(line)) !== null) {
|
|
190
|
+
const name = (" " + result[0].substr(1).trim()).substr(1);
|
|
191
|
+
state.startObject(name);
|
|
192
|
+
} else if (MATERIAL_USE_RE.test(line)) {
|
|
193
|
+
state.object.startMaterial(line.substring(7).trim(), state.materialLibraries);
|
|
194
|
+
} else if (MATERIAL_RE.test(line)) {
|
|
195
|
+
state.materialLibraries.push(line.substring(7).trim());
|
|
196
|
+
} else if (lineFirstChar === "s") {
|
|
197
|
+
result = line.split(" ");
|
|
198
|
+
if (result.length > 1) {
|
|
199
|
+
const value = result[1].trim().toLowerCase();
|
|
200
|
+
state.object.smooth = value !== "0" && value !== "off";
|
|
201
|
+
} else {
|
|
202
|
+
state.object.smooth = true;
|
|
203
|
+
}
|
|
204
|
+
const material = state.object.currentMaterial();
|
|
205
|
+
if (material)
|
|
206
|
+
material.smooth = state.object.smooth;
|
|
207
|
+
} else {
|
|
208
|
+
if (line === "\0")
|
|
209
|
+
continue;
|
|
210
|
+
throw new Error(`Unexpected line: "${line}"`);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
state.finalize();
|
|
214
|
+
const meshes = [];
|
|
215
|
+
const materials = [];
|
|
216
|
+
for (const object of state.objects) {
|
|
217
|
+
const { geometry } = object;
|
|
218
|
+
if (geometry.vertices.length === 0)
|
|
219
|
+
continue;
|
|
220
|
+
const mesh = {
|
|
221
|
+
header: {
|
|
222
|
+
vertexCount: geometry.vertices.length / 3
|
|
223
|
+
},
|
|
224
|
+
attributes: {}
|
|
225
|
+
};
|
|
226
|
+
switch (geometry.type) {
|
|
227
|
+
case "Points":
|
|
228
|
+
mesh.mode = 0;
|
|
229
|
+
break;
|
|
230
|
+
case "Line":
|
|
231
|
+
mesh.mode = 1;
|
|
232
|
+
break;
|
|
233
|
+
default:
|
|
234
|
+
mesh.mode = 4;
|
|
235
|
+
break;
|
|
236
|
+
}
|
|
237
|
+
mesh.attributes.POSITION = { value: new Float32Array(geometry.vertices), size: 3 };
|
|
238
|
+
if (geometry.normals.length > 0) {
|
|
239
|
+
mesh.attributes.NORMAL = { value: new Float32Array(geometry.normals), size: 3 };
|
|
240
|
+
}
|
|
241
|
+
if (geometry.colors.length > 0) {
|
|
242
|
+
mesh.attributes.COLOR_0 = { value: new Float32Array(geometry.colors), size: 3 };
|
|
243
|
+
}
|
|
244
|
+
if (geometry.uvs.length > 0) {
|
|
245
|
+
mesh.attributes.TEXCOORD_0 = { value: new Float32Array(geometry.uvs), size: 2 };
|
|
246
|
+
}
|
|
247
|
+
mesh.materials = [];
|
|
248
|
+
for (const sourceMaterial of object.materials) {
|
|
249
|
+
const _material = {
|
|
250
|
+
name: sourceMaterial.name,
|
|
251
|
+
flatShading: !sourceMaterial.smooth
|
|
252
|
+
};
|
|
253
|
+
mesh.materials.push(_material);
|
|
254
|
+
materials.push(_material);
|
|
255
|
+
}
|
|
256
|
+
mesh.name = object.name;
|
|
257
|
+
meshes.push(mesh);
|
|
258
|
+
}
|
|
259
|
+
return { meshes, materials };
|
|
260
|
+
}
|
|
261
|
+
var OBJECT_RE, MATERIAL_RE, MATERIAL_USE_RE, MeshMaterial, MeshObject, ParserState;
|
|
262
|
+
var init_parse_obj_meshes = __esm({
|
|
263
|
+
"src/lib/parse-obj-meshes.ts"() {
|
|
264
|
+
OBJECT_RE = /^[og]\s*(.+)?/;
|
|
265
|
+
MATERIAL_RE = /^mtllib /;
|
|
266
|
+
MATERIAL_USE_RE = /^usemtl /;
|
|
267
|
+
MeshMaterial = class {
|
|
268
|
+
constructor({ index, name = "", mtllib, smooth, groupStart }) {
|
|
269
|
+
this.index = index;
|
|
270
|
+
this.name = name;
|
|
271
|
+
this.mtllib = mtllib;
|
|
272
|
+
this.smooth = smooth;
|
|
273
|
+
this.groupStart = groupStart;
|
|
274
|
+
this.groupEnd = -1;
|
|
275
|
+
this.groupCount = -1;
|
|
276
|
+
this.inherited = false;
|
|
277
|
+
}
|
|
278
|
+
clone(index = this.index) {
|
|
279
|
+
return new MeshMaterial({
|
|
280
|
+
index,
|
|
281
|
+
name: this.name,
|
|
282
|
+
mtllib: this.mtllib,
|
|
283
|
+
smooth: this.smooth,
|
|
284
|
+
groupStart: 0
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
};
|
|
288
|
+
MeshObject = class {
|
|
289
|
+
constructor(name = "") {
|
|
290
|
+
this.name = name;
|
|
291
|
+
this.geometry = {
|
|
292
|
+
vertices: [],
|
|
293
|
+
normals: [],
|
|
294
|
+
colors: [],
|
|
295
|
+
uvs: []
|
|
296
|
+
};
|
|
297
|
+
this.materials = [];
|
|
298
|
+
this.smooth = true;
|
|
299
|
+
this.fromDeclaration = null;
|
|
300
|
+
}
|
|
301
|
+
startMaterial(name, libraries) {
|
|
302
|
+
const previous = this._finalize(false);
|
|
303
|
+
if (previous && (previous.inherited || previous.groupCount <= 0)) {
|
|
304
|
+
this.materials.splice(previous.index, 1);
|
|
305
|
+
}
|
|
306
|
+
const material = new MeshMaterial({
|
|
307
|
+
index: this.materials.length,
|
|
308
|
+
name,
|
|
309
|
+
mtllib: Array.isArray(libraries) && libraries.length > 0 ? libraries[libraries.length - 1] : "",
|
|
310
|
+
smooth: previous !== void 0 ? previous.smooth : this.smooth,
|
|
311
|
+
groupStart: previous !== void 0 ? previous.groupEnd : 0
|
|
312
|
+
});
|
|
313
|
+
this.materials.push(material);
|
|
314
|
+
return material;
|
|
315
|
+
}
|
|
316
|
+
currentMaterial() {
|
|
317
|
+
if (this.materials.length > 0) {
|
|
318
|
+
return this.materials[this.materials.length - 1];
|
|
319
|
+
}
|
|
320
|
+
return void 0;
|
|
321
|
+
}
|
|
322
|
+
_finalize(end) {
|
|
323
|
+
const lastMultiMaterial = this.currentMaterial();
|
|
324
|
+
if (lastMultiMaterial && lastMultiMaterial.groupEnd === -1) {
|
|
325
|
+
lastMultiMaterial.groupEnd = this.geometry.vertices.length / 3;
|
|
326
|
+
lastMultiMaterial.groupCount = lastMultiMaterial.groupEnd - lastMultiMaterial.groupStart;
|
|
327
|
+
lastMultiMaterial.inherited = false;
|
|
328
|
+
}
|
|
329
|
+
if (end && this.materials.length > 1) {
|
|
330
|
+
for (let mi = this.materials.length - 1; mi >= 0; mi--) {
|
|
331
|
+
if (this.materials[mi].groupCount <= 0) {
|
|
332
|
+
this.materials.splice(mi, 1);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
if (end && this.materials.length === 0) {
|
|
337
|
+
this.materials.push({
|
|
338
|
+
name: "",
|
|
339
|
+
smooth: this.smooth
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
return lastMultiMaterial;
|
|
343
|
+
}
|
|
344
|
+
};
|
|
345
|
+
ParserState = class {
|
|
346
|
+
constructor() {
|
|
347
|
+
this.objects = [];
|
|
348
|
+
this.object = null;
|
|
349
|
+
this.vertices = [];
|
|
350
|
+
this.normals = [];
|
|
351
|
+
this.colors = [];
|
|
352
|
+
this.uvs = [];
|
|
353
|
+
this.materialLibraries = [];
|
|
354
|
+
this.startObject("", false);
|
|
355
|
+
}
|
|
356
|
+
startObject(name, fromDeclaration = true) {
|
|
357
|
+
if (this.object && !this.object.fromDeclaration) {
|
|
358
|
+
this.object.name = name;
|
|
359
|
+
this.object.fromDeclaration = fromDeclaration;
|
|
360
|
+
return;
|
|
361
|
+
}
|
|
362
|
+
const previousMaterial = this.object && typeof this.object.currentMaterial === "function" ? this.object.currentMaterial() : void 0;
|
|
363
|
+
if (this.object && typeof this.object._finalize === "function") {
|
|
364
|
+
this.object._finalize(true);
|
|
365
|
+
}
|
|
366
|
+
this.object = new MeshObject(name);
|
|
367
|
+
this.object.fromDeclaration = fromDeclaration;
|
|
368
|
+
if (previousMaterial && previousMaterial.name && typeof previousMaterial.clone === "function") {
|
|
369
|
+
const declared = previousMaterial.clone(0);
|
|
370
|
+
declared.inherited = true;
|
|
371
|
+
this.object.materials.push(declared);
|
|
372
|
+
}
|
|
373
|
+
this.objects.push(this.object);
|
|
374
|
+
}
|
|
375
|
+
finalize() {
|
|
376
|
+
if (this.object && typeof this.object._finalize === "function") {
|
|
377
|
+
this.object._finalize(true);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
parseVertexIndex(value, len) {
|
|
381
|
+
const index = parseInt(value);
|
|
382
|
+
return (index >= 0 ? index - 1 : index + len / 3) * 3;
|
|
383
|
+
}
|
|
384
|
+
parseNormalIndex(value, len) {
|
|
385
|
+
const index = parseInt(value);
|
|
386
|
+
return (index >= 0 ? index - 1 : index + len / 3) * 3;
|
|
387
|
+
}
|
|
388
|
+
parseUVIndex(value, len) {
|
|
389
|
+
const index = parseInt(value);
|
|
390
|
+
return (index >= 0 ? index - 1 : index + len / 2) * 2;
|
|
391
|
+
}
|
|
392
|
+
addVertex(a, b, c) {
|
|
393
|
+
const src = this.vertices;
|
|
394
|
+
const dst = this.object.geometry.vertices;
|
|
395
|
+
dst.push(src[a + 0], src[a + 1], src[a + 2]);
|
|
396
|
+
dst.push(src[b + 0], src[b + 1], src[b + 2]);
|
|
397
|
+
dst.push(src[c + 0], src[c + 1], src[c + 2]);
|
|
398
|
+
}
|
|
399
|
+
addVertexPoint(a) {
|
|
400
|
+
const src = this.vertices;
|
|
401
|
+
const dst = this.object.geometry.vertices;
|
|
402
|
+
dst.push(src[a + 0], src[a + 1], src[a + 2]);
|
|
403
|
+
}
|
|
404
|
+
addVertexLine(a) {
|
|
405
|
+
const src = this.vertices;
|
|
406
|
+
const dst = this.object.geometry.vertices;
|
|
407
|
+
dst.push(src[a + 0], src[a + 1], src[a + 2]);
|
|
408
|
+
}
|
|
409
|
+
addNormal(a, b, c) {
|
|
410
|
+
const src = this.normals;
|
|
411
|
+
const dst = this.object.geometry.normals;
|
|
412
|
+
dst.push(src[a + 0], src[a + 1], src[a + 2]);
|
|
413
|
+
dst.push(src[b + 0], src[b + 1], src[b + 2]);
|
|
414
|
+
dst.push(src[c + 0], src[c + 1], src[c + 2]);
|
|
415
|
+
}
|
|
416
|
+
addColor(a, b, c) {
|
|
417
|
+
const src = this.colors;
|
|
418
|
+
const dst = this.object.geometry.colors;
|
|
419
|
+
dst.push(src[a + 0], src[a + 1], src[a + 2]);
|
|
420
|
+
dst.push(src[b + 0], src[b + 1], src[b + 2]);
|
|
421
|
+
dst.push(src[c + 0], src[c + 1], src[c + 2]);
|
|
422
|
+
}
|
|
423
|
+
addUV(a, b, c) {
|
|
424
|
+
const src = this.uvs;
|
|
425
|
+
const dst = this.object.geometry.uvs;
|
|
426
|
+
dst.push(src[a + 0], src[a + 1]);
|
|
427
|
+
dst.push(src[b + 0], src[b + 1]);
|
|
428
|
+
dst.push(src[c + 0], src[c + 1]);
|
|
429
|
+
}
|
|
430
|
+
addUVLine(a) {
|
|
431
|
+
const src = this.uvs;
|
|
432
|
+
const dst = this.object.geometry.uvs;
|
|
433
|
+
dst.push(src[a + 0], src[a + 1]);
|
|
434
|
+
}
|
|
435
|
+
addFace(a, b, c, ua, ub, uc, na, nb, nc) {
|
|
436
|
+
const vLen = this.vertices.length;
|
|
437
|
+
let ia = this.parseVertexIndex(a, vLen);
|
|
438
|
+
let ib = this.parseVertexIndex(b, vLen);
|
|
439
|
+
let ic = this.parseVertexIndex(c, vLen);
|
|
440
|
+
this.addVertex(ia, ib, ic);
|
|
441
|
+
if (ua !== void 0 && ua !== "") {
|
|
442
|
+
const uvLen = this.uvs.length;
|
|
443
|
+
ia = this.parseUVIndex(ua, uvLen);
|
|
444
|
+
ib = this.parseUVIndex(ub, uvLen);
|
|
445
|
+
ic = this.parseUVIndex(uc, uvLen);
|
|
446
|
+
this.addUV(ia, ib, ic);
|
|
447
|
+
}
|
|
448
|
+
if (na !== void 0 && na !== "") {
|
|
449
|
+
const nLen = this.normals.length;
|
|
450
|
+
ia = this.parseNormalIndex(na, nLen);
|
|
451
|
+
ib = na === nb ? ia : this.parseNormalIndex(nb, nLen);
|
|
452
|
+
ic = na === nc ? ia : this.parseNormalIndex(nc, nLen);
|
|
453
|
+
this.addNormal(ia, ib, ic);
|
|
454
|
+
}
|
|
455
|
+
if (this.colors.length > 0) {
|
|
456
|
+
this.addColor(ia, ib, ic);
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
addPointGeometry(vertices) {
|
|
460
|
+
this.object.geometry.type = "Points";
|
|
461
|
+
const vLen = this.vertices.length;
|
|
462
|
+
for (const vertex of vertices) {
|
|
463
|
+
this.addVertexPoint(this.parseVertexIndex(vertex, vLen));
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
addLineGeometry(vertices, uvs) {
|
|
467
|
+
this.object.geometry.type = "Line";
|
|
468
|
+
const vLen = this.vertices.length;
|
|
469
|
+
const uvLen = this.uvs.length;
|
|
470
|
+
for (const vertex of vertices) {
|
|
471
|
+
this.addVertexLine(this.parseVertexIndex(vertex, vLen));
|
|
472
|
+
}
|
|
473
|
+
for (const uv of uvs) {
|
|
474
|
+
this.addUVLine(this.parseUVIndex(uv, uvLen));
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
};
|
|
478
|
+
}
|
|
479
|
+
});
|
|
480
|
+
|
|
481
|
+
// src/lib/get-obj-schema.ts
|
|
482
|
+
function getOBJSchema(attributes, metadata = {}) {
|
|
483
|
+
const stringMetadata = {};
|
|
484
|
+
for (const key in metadata) {
|
|
485
|
+
if (key !== "value") {
|
|
486
|
+
stringMetadata[key] = JSON.stringify(metadata[key]);
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
const fields = [];
|
|
490
|
+
for (const attributeName in attributes) {
|
|
491
|
+
const attribute = attributes[attributeName];
|
|
492
|
+
const field = getFieldFromAttribute(attributeName, attribute);
|
|
493
|
+
fields.push(field);
|
|
494
|
+
}
|
|
495
|
+
return { fields, metadata: stringMetadata };
|
|
496
|
+
}
|
|
497
|
+
function getFieldFromAttribute(name, attribute) {
|
|
498
|
+
const metadata = {};
|
|
499
|
+
for (const key in attribute) {
|
|
500
|
+
if (key !== "value") {
|
|
501
|
+
metadata[key] = JSON.stringify(attribute[key]);
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
let { type } = getDataTypeFromArray(attribute.value);
|
|
505
|
+
const isSingleValue = attribute.size === 1 || attribute.size === void 0;
|
|
506
|
+
if (!isSingleValue) {
|
|
507
|
+
type = { type: "fixed-size-list", listSize: attribute.size, children: [{ name: "values", type }] };
|
|
508
|
+
}
|
|
509
|
+
return { name, type, nullable: false, metadata };
|
|
510
|
+
}
|
|
511
|
+
var init_get_obj_schema = __esm({
|
|
512
|
+
"src/lib/get-obj-schema.ts"() {
|
|
513
|
+
init_src();
|
|
514
|
+
}
|
|
515
|
+
});
|
|
516
|
+
|
|
517
|
+
// src/lib/parse-obj.ts
|
|
518
|
+
function parseOBJ(text, options) {
|
|
519
|
+
const { meshes } = parseOBJMeshes(text);
|
|
520
|
+
const vertexCount = meshes.reduce((s, mesh) => s + mesh.header.vertexCount, 0);
|
|
521
|
+
const attributes = mergeAttributes(meshes, vertexCount);
|
|
522
|
+
const header = {
|
|
523
|
+
vertexCount,
|
|
524
|
+
boundingBox: getMeshBoundingBox(attributes)
|
|
525
|
+
};
|
|
526
|
+
const schema = getOBJSchema(attributes, {
|
|
527
|
+
mode: 4,
|
|
528
|
+
boundingBox: header.boundingBox
|
|
529
|
+
});
|
|
530
|
+
return {
|
|
531
|
+
loaderData: {
|
|
532
|
+
header: {}
|
|
533
|
+
},
|
|
534
|
+
schema,
|
|
535
|
+
header,
|
|
536
|
+
mode: 4,
|
|
537
|
+
topology: "point-list",
|
|
538
|
+
attributes
|
|
539
|
+
};
|
|
540
|
+
}
|
|
541
|
+
function mergeAttributes(meshes, vertexCount) {
|
|
542
|
+
const positions = new Float32Array(vertexCount * 3);
|
|
543
|
+
let normals;
|
|
544
|
+
let colors;
|
|
545
|
+
let uvs;
|
|
546
|
+
let i = 0;
|
|
547
|
+
for (const mesh of meshes) {
|
|
548
|
+
const { POSITION, NORMAL, COLOR_0, TEXCOORD_0 } = mesh.attributes;
|
|
549
|
+
positions.set(POSITION.value, i * 3);
|
|
550
|
+
if (NORMAL) {
|
|
551
|
+
normals = normals || new Float32Array(vertexCount * 3);
|
|
552
|
+
normals.set(NORMAL.value, i * 3);
|
|
553
|
+
}
|
|
554
|
+
if (COLOR_0) {
|
|
555
|
+
colors = colors || new Float32Array(vertexCount * 3);
|
|
556
|
+
colors.set(COLOR_0.value, i * 3);
|
|
557
|
+
}
|
|
558
|
+
if (TEXCOORD_0) {
|
|
559
|
+
uvs = uvs || new Float32Array(vertexCount * 2);
|
|
560
|
+
uvs.set(TEXCOORD_0.value, i * 2);
|
|
561
|
+
}
|
|
562
|
+
i += POSITION.value.length / 3;
|
|
563
|
+
}
|
|
564
|
+
const attributes = {};
|
|
565
|
+
attributes.POSITION = { value: positions, size: 3 };
|
|
566
|
+
if (normals) {
|
|
567
|
+
attributes.NORMAL = { value: normals, size: 3 };
|
|
568
|
+
}
|
|
569
|
+
if (colors) {
|
|
570
|
+
attributes.COLOR_0 = { value: colors, size: 3 };
|
|
571
|
+
}
|
|
572
|
+
if (uvs) {
|
|
573
|
+
attributes.TEXCOORD_0 = { value: uvs, size: 2 };
|
|
574
|
+
}
|
|
575
|
+
return attributes;
|
|
576
|
+
}
|
|
577
|
+
var init_parse_obj = __esm({
|
|
578
|
+
"src/lib/parse-obj.ts"() {
|
|
579
|
+
init_src();
|
|
580
|
+
init_parse_obj_meshes();
|
|
581
|
+
init_get_obj_schema();
|
|
582
|
+
}
|
|
583
|
+
});
|
|
584
|
+
|
|
585
|
+
// src/obj-loader.ts
|
|
586
|
+
function testOBJFile(text) {
|
|
587
|
+
return text[0] === "v";
|
|
588
|
+
}
|
|
589
|
+
var VERSION, OBJLoader;
|
|
590
|
+
var init_obj_loader = __esm({
|
|
591
|
+
"src/obj-loader.ts"() {
|
|
592
|
+
VERSION = typeof __VERSION__ !== "undefined" ? __VERSION__ : "latest";
|
|
593
|
+
OBJLoader = {
|
|
594
|
+
name: "OBJ",
|
|
595
|
+
id: "obj",
|
|
596
|
+
module: "obj",
|
|
597
|
+
version: VERSION,
|
|
598
|
+
worker: true,
|
|
599
|
+
extensions: ["obj"],
|
|
600
|
+
mimeTypes: ["text/plain"],
|
|
601
|
+
testText: testOBJFile,
|
|
602
|
+
options: {
|
|
603
|
+
obj: {}
|
|
604
|
+
}
|
|
605
|
+
};
|
|
606
|
+
}
|
|
607
|
+
});
|
|
608
|
+
|
|
609
|
+
// src/lib/parse-mtl.ts
|
|
610
|
+
function parseMTL(text, options) {
|
|
611
|
+
const materials = [];
|
|
612
|
+
let currentMaterial = { name: "placeholder" };
|
|
613
|
+
const lines = text.split("\n");
|
|
614
|
+
for (let line of lines) {
|
|
615
|
+
line = line.trim();
|
|
616
|
+
if (line.length === 0 || line.charAt(0) === "#") {
|
|
617
|
+
continue;
|
|
618
|
+
}
|
|
619
|
+
const pos = line.indexOf(" ");
|
|
620
|
+
let key = pos >= 0 ? line.substring(0, pos) : line;
|
|
621
|
+
key = key.toLowerCase();
|
|
622
|
+
let value = pos >= 0 ? line.substring(pos + 1) : "";
|
|
623
|
+
value = value.trim();
|
|
624
|
+
switch (key) {
|
|
625
|
+
case "newmtl":
|
|
626
|
+
currentMaterial = { name: value };
|
|
627
|
+
materials.push(currentMaterial);
|
|
628
|
+
break;
|
|
629
|
+
case "ka":
|
|
630
|
+
currentMaterial.ambientColor = parseColor(value);
|
|
631
|
+
break;
|
|
632
|
+
case "kd":
|
|
633
|
+
currentMaterial.diffuseColor = parseColor(value);
|
|
634
|
+
break;
|
|
635
|
+
case "map_kd":
|
|
636
|
+
currentMaterial.diffuseTextureUrl = value;
|
|
637
|
+
break;
|
|
638
|
+
case "ks":
|
|
639
|
+
currentMaterial.specularColor = parseColor(value);
|
|
640
|
+
break;
|
|
641
|
+
case "map_ks":
|
|
642
|
+
currentMaterial.specularTextureUrl = value;
|
|
643
|
+
break;
|
|
644
|
+
case "ke":
|
|
645
|
+
currentMaterial.emissiveColor = parseColor(value);
|
|
646
|
+
break;
|
|
647
|
+
case "map_ke":
|
|
648
|
+
currentMaterial.emissiveTextureUrl = value;
|
|
649
|
+
break;
|
|
650
|
+
case "ns":
|
|
651
|
+
currentMaterial.shininess = parseFloat(value);
|
|
652
|
+
break;
|
|
653
|
+
case "map_ns":
|
|
654
|
+
break;
|
|
655
|
+
case "ni":
|
|
656
|
+
currentMaterial.refraction = parseFloat(value);
|
|
657
|
+
break;
|
|
658
|
+
case "illum":
|
|
659
|
+
currentMaterial.illumination = parseFloat(value);
|
|
660
|
+
break;
|
|
661
|
+
default:
|
|
662
|
+
break;
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
return materials;
|
|
666
|
+
}
|
|
667
|
+
function parseColor(value, options) {
|
|
668
|
+
const rgb = value.split(DELIMITER_PATTERN, 3);
|
|
669
|
+
const color = [
|
|
670
|
+
parseFloat(rgb[0]),
|
|
671
|
+
parseFloat(rgb[1]),
|
|
672
|
+
parseFloat(rgb[2])
|
|
673
|
+
];
|
|
674
|
+
return color;
|
|
675
|
+
}
|
|
676
|
+
var DELIMITER_PATTERN;
|
|
677
|
+
var init_parse_mtl = __esm({
|
|
678
|
+
"src/lib/parse-mtl.ts"() {
|
|
679
|
+
DELIMITER_PATTERN = /\s+/;
|
|
680
|
+
}
|
|
681
|
+
});
|
|
682
|
+
|
|
683
|
+
// src/mtl-loader.ts
|
|
684
|
+
var VERSION2, MTLLoader;
|
|
685
|
+
var init_mtl_loader = __esm({
|
|
686
|
+
"src/mtl-loader.ts"() {
|
|
687
|
+
VERSION2 = typeof __VERSION__ !== "undefined" ? __VERSION__ : "latest";
|
|
688
|
+
MTLLoader = {
|
|
689
|
+
name: "MTL",
|
|
690
|
+
id: "mtl",
|
|
691
|
+
module: "mtl",
|
|
692
|
+
version: VERSION2,
|
|
693
|
+
worker: true,
|
|
694
|
+
extensions: ["mtl"],
|
|
695
|
+
mimeTypes: ["text/plain"],
|
|
696
|
+
testText: (text) => text.includes("newmtl"),
|
|
697
|
+
options: {
|
|
698
|
+
mtl: {}
|
|
699
|
+
}
|
|
700
|
+
};
|
|
701
|
+
}
|
|
702
|
+
});
|
|
703
|
+
|
|
704
|
+
// src/index.ts
|
|
705
|
+
var src_exports = {};
|
|
706
|
+
__export(src_exports, {
|
|
707
|
+
MTLLoader: () => MTLLoader2,
|
|
708
|
+
OBJLoader: () => OBJLoader2,
|
|
709
|
+
OBJWorkerLoader: () => OBJLoader,
|
|
710
|
+
_typecheckMTLLoader: () => _typecheckMTLLoader,
|
|
711
|
+
_typecheckOBJLoader: () => _typecheckOBJLoader
|
|
712
|
+
});
|
|
713
|
+
var OBJLoader2, MTLLoader2, _typecheckOBJLoader, _typecheckMTLLoader;
|
|
714
|
+
var init_src2 = __esm({
|
|
715
|
+
"src/index.ts"() {
|
|
716
|
+
init_parse_obj();
|
|
717
|
+
init_obj_loader();
|
|
718
|
+
init_parse_mtl();
|
|
719
|
+
init_mtl_loader();
|
|
720
|
+
OBJLoader2 = {
|
|
721
|
+
...OBJLoader,
|
|
722
|
+
parse: async (arrayBuffer, options) => parseOBJ(new TextDecoder().decode(arrayBuffer), options),
|
|
723
|
+
parseTextSync: (text, options) => parseOBJ(text, options)
|
|
724
|
+
};
|
|
725
|
+
MTLLoader2 = {
|
|
726
|
+
...MTLLoader,
|
|
727
|
+
parse: async (arrayBuffer, options) => parseMTL(new TextDecoder().decode(arrayBuffer), options?.mtl),
|
|
728
|
+
parseTextSync: (text, options) => parseMTL(text, options?.mtl)
|
|
729
|
+
};
|
|
730
|
+
_typecheckOBJLoader = OBJLoader2;
|
|
731
|
+
_typecheckMTLLoader = MTLLoader2;
|
|
732
|
+
}
|
|
733
|
+
});
|
|
734
|
+
|
|
735
|
+
// src/bundle.ts
|
|
736
|
+
var require_bundle = __commonJS({
|
|
737
|
+
"src/bundle.ts"(exports, module) {
|
|
738
|
+
var moduleExports = (init_src2(), src_exports);
|
|
739
|
+
globalThis.loaders = globalThis.loaders || {};
|
|
740
|
+
module.exports = Object.assign(globalThis.loaders, moduleExports);
|
|
741
|
+
}
|
|
742
|
+
});
|
|
743
|
+
require_bundle();
|
|
744
|
+
})();
|