brepjs 18.20.5 → 18.22.0
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/2d.cjs +6 -6
- package/dist/2d.js +6 -6
- package/dist/{blueprint-B6vmOy5_.cjs → blueprint-BRsNfnfQ.cjs} +5 -5
- package/dist/{blueprint-0bBVK6Be.js → blueprint-CQ04Ov5Z.js} +5 -5
- package/dist/{blueprintFns-Aiise3pc.cjs → blueprintFns-C5DCLCtZ.cjs} +2 -2
- package/dist/{blueprintFns-BJbTjW94.js → blueprintFns-DpPZNhFx.js} +2 -2
- package/dist/{blueprintSketcher-D_Z8NfOF.cjs → blueprintSketcher-DaF5OR4M.cjs} +3 -3
- package/dist/{blueprintSketcher-BkZrvGoG.js → blueprintSketcher-OwXVDMOb.js} +3 -3
- package/dist/{boolean2D-BAJ3efk_.js → boolean2D-BQKMy6dN.js} +4 -4
- package/dist/{boolean2D-1gc4kqNS.cjs → boolean2D-gwOq0VXi.cjs} +4 -4
- package/dist/{booleanFns-BsjoPJAS.js → booleanFns-CuXl5XQP.js} +4 -4
- package/dist/{booleanFns-D3mYqZxL.cjs → booleanFns-cmeKRsth.cjs} +4 -4
- package/dist/brepjs.cjs +24 -24
- package/dist/brepjs.js +24 -24
- package/dist/{cameraFns-QK8ahyDz.js → cameraFns-DC2ShyXC.js} +2 -2
- package/dist/{cameraFns-DgTBC2w3.cjs → cameraFns-LurBny3f.cjs} +2 -2
- package/dist/core.cjs +1 -1
- package/dist/core.js +1 -1
- package/dist/{cornerFinder-CkLZ23Kp.cjs → cornerFinder-BjjFVnDq.cjs} +1 -1
- package/dist/{cornerFinder-BaSsAk69.js → cornerFinder-CF8fVEx2.js} +1 -1
- package/dist/{curveFns-CE3b2sDD.cjs → curveFns-BR8gQOAc.cjs} +1 -1
- package/dist/{curveFns-BiSx9FTh.js → curveFns-Cimni2kq.js} +1 -1
- package/dist/{drawFns-BtHAHYa-.js → drawFns-Bh1LGuSX.js} +12 -12
- package/dist/{drawFns-BaxDgrlX.cjs → drawFns-btYAn61y.cjs} +12 -12
- package/dist/{extrudeFns-CRG478Q3.js → extrudeFns-BmF17qhf.js} +1 -1
- package/dist/{extrudeFns-DUPpueiL.cjs → extrudeFns-CLrrRprF.cjs} +1 -1
- package/dist/{faceFns-CLzDRrUE.cjs → faceFns-BFEUkmn7.cjs} +2 -2
- package/dist/{faceFns-C3C6l-X0.js → faceFns-D9UAkqPb.js} +2 -2
- package/dist/{helpers-DwG3OFk0.cjs → helpers-BnF1MObz.cjs} +6 -6
- package/dist/{helpers-rNVdiDLn.js → helpers-DnrXynu0.js} +6 -6
- package/dist/{historyFns-DSCnjCkQ.cjs → historyFns-BX9Bu5NT.cjs} +4 -4
- package/dist/{historyFns-CEr9D6ay.js → historyFns-DGDKVD6-.js} +4 -4
- package/dist/{importFns-Hh3S9NPm.js → importFns-B9RUaVsc.js} +191 -139
- package/dist/{importFns-A8v4Pdw2.cjs → importFns-BMN4KCmX.cjs} +191 -139
- package/dist/io.cjs +2 -2
- package/dist/io.js +2 -2
- package/dist/kernel/occt/advancedOps.d.ts +9 -13
- package/dist/{measureFns-DMyJp_x3.cjs → measureFns-CaOR1TEA.cjs} +3 -3
- package/dist/{measureFns--uvW_r_P.js → measureFns-CiCx5o_s.js} +3 -3
- package/dist/measurement.cjs +1 -1
- package/dist/measurement.js +1 -1
- package/dist/{meshFns-DTn__aNb.cjs → meshFns-CIdP0f35.cjs} +2 -2
- package/dist/{meshFns-Bxt57KX1.js → meshFns-k-gSXquL.js} +2 -2
- package/dist/operations.cjs +2 -2
- package/dist/operations.js +2 -2
- package/dist/{primitiveFns-CX5c_YGt.cjs → primitiveFns-Ds2LNkol.cjs} +55 -34
- package/dist/{primitiveFns-w1zNsxTH.js → primitiveFns-OvPYb4CU.js} +55 -34
- package/dist/projection.cjs +1 -1
- package/dist/projection.js +1 -1
- package/dist/query.cjs +2 -2
- package/dist/query.js +2 -2
- package/dist/{shapeFns-cTuUm-aP.cjs → shapeFns-BD6oYLMM.cjs} +2 -2
- package/dist/{shapeFns-Dsxp5d_u.js → shapeFns-ByuSx62n.js} +2 -2
- package/dist/shapeRef.cjs +1 -1
- package/dist/shapeRef.js +1 -1
- package/dist/{shapeRefFns-zFWzAmQZ.js → shapeRefFns-Bv3Jj1vz.js} +4 -4
- package/dist/{shapeRefFns-SctbRFju.cjs → shapeRefFns-CybMlSCu.cjs} +4 -4
- package/dist/{shapeTypes-DmHPJc_M.js → shapeTypes-BdIQ-d5X.js} +119 -127
- package/dist/{shapeTypes-C1FUZ2zE.cjs → shapeTypes-D6hfaPZq.cjs} +119 -127
- package/dist/sketching.cjs +3 -3
- package/dist/sketching.js +3 -3
- package/dist/{solidBuilders-BGJvTrDt.cjs → solidBuilders-DAHTAqeh.cjs} +2 -2
- package/dist/{solidBuilders-CJ8ckc61.js → solidBuilders-TJZOIga_.js} +2 -2
- package/dist/{surfaceBuilders-B7A2uoBJ.cjs → surfaceBuilders-CzRFME5_.cjs} +2 -2
- package/dist/{surfaceBuilders-B_wXW8QS.js → surfaceBuilders-rNgtRqTR.js} +2 -2
- package/dist/text.cjs +2 -2
- package/dist/text.js +2 -2
- package/dist/{textBlueprints-LYHgEdsx.js → textBlueprints-C9eKTxef.js} +7 -7
- package/dist/{textBlueprints-BCTQk9T8.cjs → textBlueprints-D7gWCZ88.cjs} +7 -7
- package/dist/{textMetrics-Dd-Vva8S.js → textMetrics-0y73spLE.js} +1 -1
- package/dist/{textMetrics-BNfyRNxm.cjs → textMetrics-B5SN90x5.cjs} +1 -1
- package/dist/topology.cjs +7 -7
- package/dist/topology.js +7 -7
- package/dist/{topologyQueryFns-CcHXn5M2.js → topologyQueryFns-Ds2H75YB.js} +1 -1
- package/dist/{topologyQueryFns-DCICDnwA.cjs → topologyQueryFns-hG0APAJN.cjs} +1 -1
- package/package.json +2 -1
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
const require_shapeTypes = require("./shapeTypes-
|
|
1
|
+
const require_shapeTypes = require("./shapeTypes-D6hfaPZq.cjs");
|
|
2
2
|
const require_errors = require("./errors-DxoD7zgx.cjs");
|
|
3
3
|
const require_vecOps = require("./vecOps-CCnJt-yH.cjs");
|
|
4
|
-
const require_faceFns = require("./faceFns-
|
|
5
|
-
const require_shapeFns = require("./shapeFns-
|
|
6
|
-
const require_booleanFns = require("./booleanFns-
|
|
4
|
+
const require_faceFns = require("./faceFns-BFEUkmn7.cjs");
|
|
5
|
+
const require_shapeFns = require("./shapeFns-BD6oYLMM.cjs");
|
|
6
|
+
const require_booleanFns = require("./booleanFns-cmeKRsth.cjs");
|
|
7
7
|
//#region src/utils/uuid.ts
|
|
8
8
|
/** Generate a v4-style UUID string using `crypto.getRandomValues`. */
|
|
9
9
|
function uuidv() {
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { B as createKernelHandle, Z as getKernel, t as castShape } from "./shapeTypes-
|
|
1
|
+
import { B as createKernelHandle, Z as getKernel, t as castShape } from "./shapeTypes-BdIQ-d5X.js";
|
|
2
2
|
import { A as ok, b as err, d as validationError, n as computationError, r as ioError } from "./errors-BJSTLaDI.js";
|
|
3
3
|
import { d as vecNormalize, s as vecIsZero } from "./vecOps-SKPRvPH-.js";
|
|
4
|
-
import { v as fromBREP } from "./faceFns-
|
|
5
|
-
import { s as toBREP } from "./shapeFns-
|
|
6
|
-
import { a as fuseAll } from "./booleanFns-
|
|
4
|
+
import { v as fromBREP } from "./faceFns-D9UAkqPb.js";
|
|
5
|
+
import { s as toBREP } from "./shapeFns-ByuSx62n.js";
|
|
6
|
+
import { a as fuseAll } from "./booleanFns-CuXl5XQP.js";
|
|
7
7
|
//#region src/utils/uuid.ts
|
|
8
8
|
/** Generate a v4-style UUID string using `crypto.getRandomValues`. */
|
|
9
9
|
function uuidv() {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { Z as getKernel, t as castShape } from "./shapeTypes-
|
|
1
|
+
import { Z as getKernel, t as castShape } from "./shapeTypes-BdIQ-d5X.js";
|
|
2
2
|
import { n as wasmIndex, t as vec3At$1 } from "./vec3-Dpha8d5k.js";
|
|
3
3
|
import { A as ok, b as err, r as ioError, t as BrepErrorCode } from "./errors-BJSTLaDI.js";
|
|
4
4
|
import { n as getAtOrThrow } from "./arrayAccess-DrUGPADn.js";
|
|
5
|
-
import { f as make2dSegmentCurve, m as make2dThreePointArc, s as make2dBezierCurve, t as Blueprint } from "./blueprint-
|
|
5
|
+
import { f as make2dSegmentCurve, m as make2dThreePointArc, s as make2dBezierCurve, t as Blueprint } from "./blueprint-CQ04Ov5Z.js";
|
|
6
6
|
//#region src/io/objExportFns.ts
|
|
7
7
|
/** Read a vec3 from a typed array at the given vertex index. */
|
|
8
8
|
function vec3At(arr, i) {
|
|
@@ -160,6 +160,52 @@ function exportGlb(mesh, options) {
|
|
|
160
160
|
output.set(binChunk, binOffset + 8);
|
|
161
161
|
return glb;
|
|
162
162
|
}
|
|
163
|
+
function buildSingleAccessors(triangles, vertices, normals, min, max) {
|
|
164
|
+
return [
|
|
165
|
+
{
|
|
166
|
+
bufferView: 0,
|
|
167
|
+
componentType: UNSIGNED_INT,
|
|
168
|
+
count: triangles.length,
|
|
169
|
+
type: "SCALAR"
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
bufferView: 1,
|
|
173
|
+
componentType: FLOAT,
|
|
174
|
+
count: vertices.length / 3,
|
|
175
|
+
type: "VEC3",
|
|
176
|
+
min,
|
|
177
|
+
max
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
bufferView: 2,
|
|
181
|
+
componentType: FLOAT,
|
|
182
|
+
count: normals.length / 3,
|
|
183
|
+
type: "VEC3"
|
|
184
|
+
}
|
|
185
|
+
];
|
|
186
|
+
}
|
|
187
|
+
function buildSingleBufferViews(indicesByteLength, verticesByteLength, normalsByteLength) {
|
|
188
|
+
return [
|
|
189
|
+
{
|
|
190
|
+
buffer: 0,
|
|
191
|
+
byteOffset: 0,
|
|
192
|
+
byteLength: indicesByteLength,
|
|
193
|
+
target: ELEMENT_ARRAY_BUFFER
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
buffer: 0,
|
|
197
|
+
byteOffset: align4(indicesByteLength),
|
|
198
|
+
byteLength: verticesByteLength,
|
|
199
|
+
target: ARRAY_BUFFER
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
buffer: 0,
|
|
203
|
+
byteOffset: align4(indicesByteLength) + verticesByteLength,
|
|
204
|
+
byteLength: normalsByteLength,
|
|
205
|
+
target: ARRAY_BUFFER
|
|
206
|
+
}
|
|
207
|
+
];
|
|
208
|
+
}
|
|
163
209
|
function buildGltfDocument(mesh, mode, options) {
|
|
164
210
|
const { vertices, normals, triangles } = mesh;
|
|
165
211
|
const materialMap = options?.materials;
|
|
@@ -184,48 +230,8 @@ function buildGltfDocument(mesh, mode, options) {
|
|
|
184
230
|
},
|
|
185
231
|
indices: 0
|
|
186
232
|
}] }],
|
|
187
|
-
accessors:
|
|
188
|
-
|
|
189
|
-
bufferView: 0,
|
|
190
|
-
componentType: UNSIGNED_INT,
|
|
191
|
-
count: triangles.length,
|
|
192
|
-
type: "SCALAR"
|
|
193
|
-
},
|
|
194
|
-
{
|
|
195
|
-
bufferView: 1,
|
|
196
|
-
componentType: FLOAT,
|
|
197
|
-
count: vertices.length / 3,
|
|
198
|
-
type: "VEC3",
|
|
199
|
-
min,
|
|
200
|
-
max
|
|
201
|
-
},
|
|
202
|
-
{
|
|
203
|
-
bufferView: 2,
|
|
204
|
-
componentType: FLOAT,
|
|
205
|
-
count: normals.length / 3,
|
|
206
|
-
type: "VEC3"
|
|
207
|
-
}
|
|
208
|
-
],
|
|
209
|
-
bufferViews: [
|
|
210
|
-
{
|
|
211
|
-
buffer: 0,
|
|
212
|
-
byteOffset: 0,
|
|
213
|
-
byteLength: indicesByteLength,
|
|
214
|
-
target: ELEMENT_ARRAY_BUFFER
|
|
215
|
-
},
|
|
216
|
-
{
|
|
217
|
-
buffer: 0,
|
|
218
|
-
byteOffset: align4(indicesByteLength),
|
|
219
|
-
byteLength: verticesByteLength,
|
|
220
|
-
target: ARRAY_BUFFER
|
|
221
|
-
},
|
|
222
|
-
{
|
|
223
|
-
buffer: 0,
|
|
224
|
-
byteOffset: align4(indicesByteLength) + verticesByteLength,
|
|
225
|
-
byteLength: normalsByteLength,
|
|
226
|
-
target: ARRAY_BUFFER
|
|
227
|
-
}
|
|
228
|
-
],
|
|
233
|
+
accessors: buildSingleAccessors(triangles, vertices, normals, min, max),
|
|
234
|
+
bufferViews: buildSingleBufferViews(indicesByteLength, verticesByteLength, normalsByteLength),
|
|
229
235
|
buffers: [{ byteLength: totalByteLength }]
|
|
230
236
|
};
|
|
231
237
|
if (mode === "base64") {
|
|
@@ -335,24 +341,17 @@ function computeMaterialLayout(mesh, materialMap) {
|
|
|
335
341
|
uniqueMaterials
|
|
336
342
|
};
|
|
337
343
|
}
|
|
338
|
-
|
|
339
|
-
* Build a glTF document from material layout.
|
|
340
|
-
*/
|
|
341
|
-
function buildGltfDocFromLayout(mesh, layout) {
|
|
344
|
+
function appendVertexNormalSections(mesh, verticesOffset, accessors, bufferViews) {
|
|
342
345
|
const { vertices, normals } = mesh;
|
|
343
|
-
const { primitiveData, indexBufferInfos, verticesOffset, totalByteLength, uniqueMaterials } = layout;
|
|
344
346
|
const { min, max } = computeMinMax(vertices);
|
|
345
|
-
const
|
|
346
|
-
const bufferViews = [];
|
|
347
|
-
const primitives = [];
|
|
348
|
-
const verticesBvIdx = 0;
|
|
347
|
+
const verticesBvIdx = bufferViews.length;
|
|
349
348
|
bufferViews.push({
|
|
350
349
|
buffer: 0,
|
|
351
350
|
byteOffset: verticesOffset,
|
|
352
351
|
byteLength: vertices.byteLength,
|
|
353
352
|
target: ARRAY_BUFFER
|
|
354
353
|
});
|
|
355
|
-
const verticesAccIdx =
|
|
354
|
+
const verticesAccIdx = accessors.length;
|
|
356
355
|
accessors.push({
|
|
357
356
|
bufferView: verticesBvIdx,
|
|
358
357
|
componentType: FLOAT,
|
|
@@ -361,20 +360,27 @@ function buildGltfDocFromLayout(mesh, layout) {
|
|
|
361
360
|
min,
|
|
362
361
|
max
|
|
363
362
|
});
|
|
364
|
-
const normalsBvIdx =
|
|
363
|
+
const normalsBvIdx = bufferViews.length;
|
|
365
364
|
bufferViews.push({
|
|
366
365
|
buffer: 0,
|
|
367
366
|
byteOffset: verticesOffset + vertices.byteLength,
|
|
368
367
|
byteLength: normals.byteLength,
|
|
369
368
|
target: ARRAY_BUFFER
|
|
370
369
|
});
|
|
371
|
-
const normalsAccIdx =
|
|
370
|
+
const normalsAccIdx = accessors.length;
|
|
372
371
|
accessors.push({
|
|
373
372
|
bufferView: normalsBvIdx,
|
|
374
373
|
componentType: FLOAT,
|
|
375
374
|
count: normals.length / 3,
|
|
376
375
|
type: "VEC3"
|
|
377
376
|
});
|
|
377
|
+
return {
|
|
378
|
+
verticesAccIdx,
|
|
379
|
+
normalsAccIdx
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
function appendIndexPrimitives(primitiveData, indexBufferInfos, verticesAccIdx, normalsAccIdx, accessors, bufferViews) {
|
|
383
|
+
const primitives = [];
|
|
378
384
|
for (let pi = 0; pi < primitiveData.length; pi++) {
|
|
379
385
|
const pd = getAtOrThrow(primitiveData, pi);
|
|
380
386
|
const info = getAtOrThrow(indexBufferInfos, pi);
|
|
@@ -402,6 +408,16 @@ function buildGltfDocFromLayout(mesh, layout) {
|
|
|
402
408
|
if (pd.materialIdx >= 0) prim.material = pd.materialIdx;
|
|
403
409
|
primitives.push(prim);
|
|
404
410
|
}
|
|
411
|
+
return primitives;
|
|
412
|
+
}
|
|
413
|
+
/**
|
|
414
|
+
* Build a glTF document from material layout.
|
|
415
|
+
*/
|
|
416
|
+
function buildGltfDocFromLayout(mesh, layout) {
|
|
417
|
+
const { primitiveData, indexBufferInfos, verticesOffset, totalByteLength, uniqueMaterials } = layout;
|
|
418
|
+
const accessors = [];
|
|
419
|
+
const bufferViews = [];
|
|
420
|
+
const { verticesAccIdx, normalsAccIdx } = appendVertexNormalSections(mesh, verticesOffset, accessors, bufferViews);
|
|
405
421
|
return {
|
|
406
422
|
asset: {
|
|
407
423
|
version: "2.0",
|
|
@@ -410,7 +426,7 @@ function buildGltfDocFromLayout(mesh, layout) {
|
|
|
410
426
|
scene: 0,
|
|
411
427
|
scenes: [{ nodes: [0] }],
|
|
412
428
|
nodes: [{ mesh: 0 }],
|
|
413
|
-
meshes: [{ primitives }],
|
|
429
|
+
meshes: [{ primitives: appendIndexPrimitives(primitiveData, indexBufferInfos, verticesAccIdx, normalsAccIdx, accessors, bufferViews) }],
|
|
414
430
|
accessors,
|
|
415
431
|
bufferViews,
|
|
416
432
|
buffers: [{ byteLength: totalByteLength }],
|
|
@@ -587,6 +603,91 @@ function crc32(data) {
|
|
|
587
603
|
for (const byte of data) crc = crcTable[(crc ^ byte) & 255] ^ crc >>> 8;
|
|
588
604
|
return (crc ^ 4294967295) >>> 0;
|
|
589
605
|
}
|
|
606
|
+
function writeLocalHeader(view, bytes, pos, entry) {
|
|
607
|
+
view.setUint32(pos, 67324752, true);
|
|
608
|
+
pos += 4;
|
|
609
|
+
view.setUint16(pos, 20, true);
|
|
610
|
+
pos += 2;
|
|
611
|
+
view.setUint16(pos, 0, true);
|
|
612
|
+
pos += 2;
|
|
613
|
+
view.setUint16(pos, 0, true);
|
|
614
|
+
pos += 2;
|
|
615
|
+
view.setUint16(pos, 0, true);
|
|
616
|
+
pos += 2;
|
|
617
|
+
view.setUint16(pos, 0, true);
|
|
618
|
+
pos += 2;
|
|
619
|
+
view.setUint32(pos, entry.crc, true);
|
|
620
|
+
pos += 4;
|
|
621
|
+
view.setUint32(pos, entry.data.length, true);
|
|
622
|
+
pos += 4;
|
|
623
|
+
view.setUint32(pos, entry.data.length, true);
|
|
624
|
+
pos += 4;
|
|
625
|
+
view.setUint16(pos, entry.name.length, true);
|
|
626
|
+
pos += 2;
|
|
627
|
+
view.setUint16(pos, 0, true);
|
|
628
|
+
pos += 2;
|
|
629
|
+
bytes.set(entry.name, pos);
|
|
630
|
+
pos += entry.name.length;
|
|
631
|
+
bytes.set(entry.data, pos);
|
|
632
|
+
pos += entry.data.length;
|
|
633
|
+
return pos;
|
|
634
|
+
}
|
|
635
|
+
function writeCentralDirEntry(view, bytes, pos, localOff, entry) {
|
|
636
|
+
view.setUint32(pos, 33639248, true);
|
|
637
|
+
pos += 4;
|
|
638
|
+
view.setUint16(pos, 20, true);
|
|
639
|
+
pos += 2;
|
|
640
|
+
view.setUint16(pos, 20, true);
|
|
641
|
+
pos += 2;
|
|
642
|
+
view.setUint16(pos, 0, true);
|
|
643
|
+
pos += 2;
|
|
644
|
+
view.setUint16(pos, 0, true);
|
|
645
|
+
pos += 2;
|
|
646
|
+
view.setUint16(pos, 0, true);
|
|
647
|
+
pos += 2;
|
|
648
|
+
view.setUint16(pos, 0, true);
|
|
649
|
+
pos += 2;
|
|
650
|
+
view.setUint32(pos, entry.crc, true);
|
|
651
|
+
pos += 4;
|
|
652
|
+
view.setUint32(pos, entry.data.length, true);
|
|
653
|
+
pos += 4;
|
|
654
|
+
view.setUint32(pos, entry.data.length, true);
|
|
655
|
+
pos += 4;
|
|
656
|
+
view.setUint16(pos, entry.name.length, true);
|
|
657
|
+
pos += 2;
|
|
658
|
+
view.setUint16(pos, 0, true);
|
|
659
|
+
pos += 2;
|
|
660
|
+
view.setUint16(pos, 0, true);
|
|
661
|
+
pos += 2;
|
|
662
|
+
view.setUint16(pos, 0, true);
|
|
663
|
+
pos += 2;
|
|
664
|
+
view.setUint16(pos, 0, true);
|
|
665
|
+
pos += 2;
|
|
666
|
+
view.setUint32(pos, 0, true);
|
|
667
|
+
pos += 4;
|
|
668
|
+
view.setUint32(pos, localOff, true);
|
|
669
|
+
pos += 4;
|
|
670
|
+
bytes.set(entry.name, pos);
|
|
671
|
+
pos += entry.name.length;
|
|
672
|
+
return pos;
|
|
673
|
+
}
|
|
674
|
+
function writeEndOfCentralDir(view, pos, entryCount, centralStart, centralSize) {
|
|
675
|
+
view.setUint32(pos, 101010256, true);
|
|
676
|
+
pos += 4;
|
|
677
|
+
view.setUint16(pos, 0, true);
|
|
678
|
+
pos += 2;
|
|
679
|
+
view.setUint16(pos, 0, true);
|
|
680
|
+
pos += 2;
|
|
681
|
+
view.setUint16(pos, entryCount, true);
|
|
682
|
+
pos += 2;
|
|
683
|
+
view.setUint16(pos, entryCount, true);
|
|
684
|
+
pos += 2;
|
|
685
|
+
view.setUint32(pos, centralSize, true);
|
|
686
|
+
pos += 4;
|
|
687
|
+
view.setUint32(pos, centralStart, true);
|
|
688
|
+
pos += 4;
|
|
689
|
+
view.setUint16(pos, 0, true);
|
|
690
|
+
}
|
|
590
691
|
function buildZip(entries) {
|
|
591
692
|
let offset = 0;
|
|
592
693
|
const localHeaders = [];
|
|
@@ -605,87 +706,9 @@ function buildZip(entries) {
|
|
|
605
706
|
const view = new DataView(buf);
|
|
606
707
|
const bytes = new Uint8Array(buf);
|
|
607
708
|
let pos = 0;
|
|
608
|
-
for (const { entry } of localHeaders)
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
view.setUint16(pos, 20, true);
|
|
612
|
-
pos += 2;
|
|
613
|
-
view.setUint16(pos, 0, true);
|
|
614
|
-
pos += 2;
|
|
615
|
-
view.setUint16(pos, 0, true);
|
|
616
|
-
pos += 2;
|
|
617
|
-
view.setUint16(pos, 0, true);
|
|
618
|
-
pos += 2;
|
|
619
|
-
view.setUint16(pos, 0, true);
|
|
620
|
-
pos += 2;
|
|
621
|
-
view.setUint32(pos, entry.crc, true);
|
|
622
|
-
pos += 4;
|
|
623
|
-
view.setUint32(pos, entry.data.length, true);
|
|
624
|
-
pos += 4;
|
|
625
|
-
view.setUint32(pos, entry.data.length, true);
|
|
626
|
-
pos += 4;
|
|
627
|
-
view.setUint16(pos, entry.name.length, true);
|
|
628
|
-
pos += 2;
|
|
629
|
-
view.setUint16(pos, 0, true);
|
|
630
|
-
pos += 2;
|
|
631
|
-
bytes.set(entry.name, pos);
|
|
632
|
-
pos += entry.name.length;
|
|
633
|
-
bytes.set(entry.data, pos);
|
|
634
|
-
pos += entry.data.length;
|
|
635
|
-
}
|
|
636
|
-
for (const { offset: localOff, entry } of localHeaders) {
|
|
637
|
-
view.setUint32(pos, 33639248, true);
|
|
638
|
-
pos += 4;
|
|
639
|
-
view.setUint16(pos, 20, true);
|
|
640
|
-
pos += 2;
|
|
641
|
-
view.setUint16(pos, 20, true);
|
|
642
|
-
pos += 2;
|
|
643
|
-
view.setUint16(pos, 0, true);
|
|
644
|
-
pos += 2;
|
|
645
|
-
view.setUint16(pos, 0, true);
|
|
646
|
-
pos += 2;
|
|
647
|
-
view.setUint16(pos, 0, true);
|
|
648
|
-
pos += 2;
|
|
649
|
-
view.setUint16(pos, 0, true);
|
|
650
|
-
pos += 2;
|
|
651
|
-
view.setUint32(pos, entry.crc, true);
|
|
652
|
-
pos += 4;
|
|
653
|
-
view.setUint32(pos, entry.data.length, true);
|
|
654
|
-
pos += 4;
|
|
655
|
-
view.setUint32(pos, entry.data.length, true);
|
|
656
|
-
pos += 4;
|
|
657
|
-
view.setUint16(pos, entry.name.length, true);
|
|
658
|
-
pos += 2;
|
|
659
|
-
view.setUint16(pos, 0, true);
|
|
660
|
-
pos += 2;
|
|
661
|
-
view.setUint16(pos, 0, true);
|
|
662
|
-
pos += 2;
|
|
663
|
-
view.setUint16(pos, 0, true);
|
|
664
|
-
pos += 2;
|
|
665
|
-
view.setUint16(pos, 0, true);
|
|
666
|
-
pos += 2;
|
|
667
|
-
view.setUint32(pos, 0, true);
|
|
668
|
-
pos += 4;
|
|
669
|
-
view.setUint32(pos, localOff, true);
|
|
670
|
-
pos += 4;
|
|
671
|
-
bytes.set(entry.name, pos);
|
|
672
|
-
pos += entry.name.length;
|
|
673
|
-
}
|
|
674
|
-
view.setUint32(pos, 101010256, true);
|
|
675
|
-
pos += 4;
|
|
676
|
-
view.setUint16(pos, 0, true);
|
|
677
|
-
pos += 2;
|
|
678
|
-
view.setUint16(pos, 0, true);
|
|
679
|
-
pos += 2;
|
|
680
|
-
view.setUint16(pos, entries.length, true);
|
|
681
|
-
pos += 2;
|
|
682
|
-
view.setUint16(pos, entries.length, true);
|
|
683
|
-
pos += 2;
|
|
684
|
-
view.setUint32(pos, centralSize, true);
|
|
685
|
-
pos += 4;
|
|
686
|
-
view.setUint32(pos, centralStart, true);
|
|
687
|
-
pos += 4;
|
|
688
|
-
view.setUint16(pos, 0, true);
|
|
709
|
+
for (const { entry } of localHeaders) pos = writeLocalHeader(view, bytes, pos, entry);
|
|
710
|
+
for (const { offset: localOff, entry } of localHeaders) pos = writeCentralDirEntry(view, bytes, pos, localOff, entry);
|
|
711
|
+
writeEndOfCentralDir(view, pos, entries.length, centralStart, centralSize);
|
|
689
712
|
return buf;
|
|
690
713
|
}
|
|
691
714
|
/** Escape XML special characters in attribute values. */
|
|
@@ -696,7 +719,7 @@ function colorToHex(rgba) {
|
|
|
696
719
|
const to8 = (v) => Math.round(Math.max(0, Math.min(1, v)) * 255).toString(16).padStart(2, "0").toUpperCase();
|
|
697
720
|
return `#${to8(rgba[0])}${to8(rgba[1])}${to8(rgba[2])}${to8(rgba[3])}`;
|
|
698
721
|
}
|
|
699
|
-
function
|
|
722
|
+
function buildVertexLines(mesh) {
|
|
700
723
|
const vertices = [];
|
|
701
724
|
for (let i = 0; i < mesh.vertices.length; i += 3) {
|
|
702
725
|
const x = mesh.vertices[i] ?? 0;
|
|
@@ -704,6 +727,9 @@ function build3MFModel(mesh, name, unit, colors, materials) {
|
|
|
704
727
|
const z = mesh.vertices[i + 2] ?? 0;
|
|
705
728
|
vertices.push(` <vertex x="${x}" y="${y}" z="${z}" />`);
|
|
706
729
|
}
|
|
730
|
+
return vertices;
|
|
731
|
+
}
|
|
732
|
+
function buildColorPalette(colors) {
|
|
707
733
|
const colorIndexByHex = /* @__PURE__ */ new Map();
|
|
708
734
|
const colorHexList = [];
|
|
709
735
|
if (colors !== void 0 && colors.size > 0) for (const rgba of colors.values()) {
|
|
@@ -713,6 +739,12 @@ function build3MFModel(mesh, name, unit, colors, materials) {
|
|
|
713
739
|
colorHexList.push(hex);
|
|
714
740
|
}
|
|
715
741
|
}
|
|
742
|
+
return {
|
|
743
|
+
colorIndexByHex,
|
|
744
|
+
colorHexList
|
|
745
|
+
};
|
|
746
|
+
}
|
|
747
|
+
function buildMaterialList(materials) {
|
|
716
748
|
const materialIndexByName = /* @__PURE__ */ new Map();
|
|
717
749
|
const materialList = [];
|
|
718
750
|
if (materials !== void 0 && materials.size > 0) {
|
|
@@ -721,6 +753,12 @@ function build3MFModel(mesh, name, unit, colors, materials) {
|
|
|
721
753
|
materialList.push(mat);
|
|
722
754
|
}
|
|
723
755
|
}
|
|
756
|
+
return {
|
|
757
|
+
materialIndexByName,
|
|
758
|
+
materialList
|
|
759
|
+
};
|
|
760
|
+
}
|
|
761
|
+
function buildTriangleAttrs(mesh, colors, materials, colorIndexByHex, materialIndexByName) {
|
|
724
762
|
const triangleAttrs = /* @__PURE__ */ new Map();
|
|
725
763
|
for (const group of mesh.faceGroups) {
|
|
726
764
|
const triStart = group.start / 3;
|
|
@@ -750,6 +788,9 @@ function build3MFModel(mesh, name, unit, colors, materials) {
|
|
|
750
788
|
}
|
|
751
789
|
if (attrs !== void 0) for (let t = triStart; t < triStart + triCount; t++) triangleAttrs.set(t, attrs);
|
|
752
790
|
}
|
|
791
|
+
return triangleAttrs;
|
|
792
|
+
}
|
|
793
|
+
function buildTriangleLines(mesh, triangleAttrs) {
|
|
753
794
|
const triangles = [];
|
|
754
795
|
for (let i = 0; i < mesh.triangles.length; i += 3) {
|
|
755
796
|
const triIdx = i / 3;
|
|
@@ -760,6 +801,9 @@ function build3MFModel(mesh, name, unit, colors, materials) {
|
|
|
760
801
|
if (attrs !== void 0) triangles.push(` <triangle v1="${v1}" v2="${v2}" v3="${v3}" pid="${attrs.pid}" p1="${attrs.p1}" />`);
|
|
761
802
|
else triangles.push(` <triangle v1="${v1}" v2="${v2}" v3="${v3}" />`);
|
|
762
803
|
}
|
|
804
|
+
return triangles;
|
|
805
|
+
}
|
|
806
|
+
function buildResourceBlocks(colorHexList, materialList) {
|
|
763
807
|
const resourceBlocks = [];
|
|
764
808
|
if (colorHexList.length > 0) {
|
|
765
809
|
const colorItems = colorHexList.map((hex) => ` <color color="${hex}" />`).join("\n");
|
|
@@ -772,6 +816,14 @@ function build3MFModel(mesh, name, unit, colors, materials) {
|
|
|
772
816
|
}).join("\n");
|
|
773
817
|
resourceBlocks.push(` <basematerials id="3">\n${matItems}\n </basematerials>`);
|
|
774
818
|
}
|
|
819
|
+
return resourceBlocks;
|
|
820
|
+
}
|
|
821
|
+
function build3MFModel(mesh, name, unit, colors, materials) {
|
|
822
|
+
const vertices = buildVertexLines(mesh);
|
|
823
|
+
const { colorIndexByHex, colorHexList } = buildColorPalette(colors);
|
|
824
|
+
const { materialIndexByName, materialList } = buildMaterialList(materials);
|
|
825
|
+
const triangles = buildTriangleLines(mesh, buildTriangleAttrs(mesh, colors, materials, colorIndexByHex, materialIndexByName));
|
|
826
|
+
const resourceBlocks = buildResourceBlocks(colorHexList, materialList);
|
|
775
827
|
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
776
828
|
<model unit="${unit}" xmlns="http://schemas.microsoft.com/3dmanufacturing/core/2015/02"${materialList.length > 0 ? "\n xmlns:m=\"http://schemas.microsoft.com/3dmanufacturing/material/2015/02\"" : ""}>
|
|
777
829
|
<resources>${resourceBlocks.length > 0 ? "\n" + resourceBlocks.join("\n") : ""}
|