@danielsimonjr/sciengjs 0.5.1 → 0.7.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/README.md +3 -3
- package/THIRD_PARTY_NOTICES.md +9 -5
- package/assets/licenses/MIT-three.txt +21 -0
- package/assets/three.BufferGeometryUtils.js +1523 -0
- package/assets/three.GLTFLoader.js +5006 -0
- package/assets/three.OrbitControls.js +1985 -0
- package/assets/three.SkeletonUtils.js +496 -0
- package/assets/three.core.js +61162 -0
- package/assets/three.module.js +19537 -0
- package/dist/browser/pinned.d.ts +23 -0
- package/dist/browser/pinned.js +18 -0
- package/dist/browser/pinned.js.map +1 -1
- package/dist/browser/render.d.ts +9 -1
- package/dist/browser/render.js +17 -3
- package/dist/browser/render.js.map +1 -1
- package/dist/config.d.ts +4 -0
- package/dist/config.js +10 -1
- package/dist/config.js.map +1 -1
- package/dist/core.js +4 -0
- package/dist/core.js.map +1 -1
- package/dist/html/backend-md.d.ts +3 -0
- package/dist/html/backend-md.js +52 -0
- package/dist/html/backend-md.js.map +1 -0
- package/dist/html/convert.d.ts +35 -0
- package/dist/html/convert.js +434 -0
- package/dist/html/convert.js.map +1 -0
- package/dist/html/fetch-image.d.ts +28 -0
- package/dist/html/fetch-image.js +178 -0
- package/dist/html/fetch-image.js.map +1 -0
- package/dist/html/images.d.ts +11 -0
- package/dist/html/images.js +53 -0
- package/dist/html/images.js.map +1 -0
- package/dist/html/index.d.ts +2 -0
- package/dist/html/index.js +3 -0
- package/dist/html/index.js.map +1 -0
- package/dist/html/md.d.ts +23 -0
- package/dist/html/md.js +72 -0
- package/dist/html/md.js.map +1 -0
- package/dist/mesh/backend-glb.d.ts +25 -0
- package/dist/mesh/backend-glb.js +74 -0
- package/dist/mesh/backend-glb.js.map +1 -0
- package/dist/mesh/backend-html.d.ts +6 -0
- package/dist/mesh/backend-html.js +12 -0
- package/dist/mesh/backend-html.js.map +1 -0
- package/dist/mesh/backend-png.d.ts +6 -0
- package/dist/mesh/backend-png.js +35 -0
- package/dist/mesh/backend-png.js.map +1 -0
- package/dist/mesh/glb.d.ts +9 -0
- package/dist/mesh/glb.js +163 -0
- package/dist/mesh/glb.js.map +1 -0
- package/dist/mesh/index.d.ts +5 -0
- package/dist/mesh/index.js +5 -0
- package/dist/mesh/index.js.map +1 -0
- package/dist/mesh/pinned-three.d.ts +6 -0
- package/dist/mesh/pinned-three.js +21 -0
- package/dist/mesh/pinned-three.js.map +1 -0
- package/dist/mesh/read.d.ts +27 -0
- package/dist/mesh/read.js +56 -0
- package/dist/mesh/read.js.map +1 -0
- package/dist/mesh/viewer-script.d.ts +6 -0
- package/dist/mesh/viewer-script.js +207 -0
- package/dist/mesh/viewer-script.js.map +1 -0
- package/dist/mesh/viewer.d.ts +14 -0
- package/dist/mesh/viewer.js +39 -0
- package/dist/mesh/viewer.js.map +1 -0
- package/dist/registry.js +10 -0
- package/dist/registry.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/worker/entry.js +1 -1
- package/dist/worker/entry.js.map +1 -1
- package/dist/worker/protocol.d.ts +11 -1
- package/dist/worker/run.js +1 -1
- package/dist/worker/run.js.map +1 -1
- package/package.json +14 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-image.js","sourceRoot":"","sources":["../../src/html/fetch-image.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** The media type of a fetched image, with its bytes. */
|
|
2
|
+
export interface FetchedImage {
|
|
3
|
+
bytes: Uint8Array;
|
|
4
|
+
mime: string;
|
|
5
|
+
}
|
|
6
|
+
/** Fetches one remote image. The engine passes the network fetch; a test passes a double. */
|
|
7
|
+
export type FetchImage = (url: string) => Promise<FetchedImage>;
|
|
8
|
+
/** Decodes a data: URL. Returns undefined when the text is not a data: URL with a comma. */
|
|
9
|
+
export declare function decodeDataUrl(url: string): FetchedImage | undefined;
|
|
10
|
+
/** The file extension of a media type. An unknown media type gives "bin". */
|
|
11
|
+
export declare function extensionForMime(mime: string): string;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/** Decodes a data: URL. Returns undefined when the text is not a data: URL with a comma. */
|
|
2
|
+
export function decodeDataUrl(url) {
|
|
3
|
+
if (!url.startsWith("data:"))
|
|
4
|
+
return undefined;
|
|
5
|
+
const commaIndex = url.indexOf(",");
|
|
6
|
+
if (commaIndex === -1)
|
|
7
|
+
return undefined;
|
|
8
|
+
let header = url.slice(5, commaIndex).trim();
|
|
9
|
+
const payload = url.slice(commaIndex + 1);
|
|
10
|
+
let isBase64 = false;
|
|
11
|
+
const base64Flag = /;base64$/i.exec(header);
|
|
12
|
+
if (base64Flag !== null) {
|
|
13
|
+
isBase64 = true;
|
|
14
|
+
header = header.slice(0, base64Flag.index);
|
|
15
|
+
}
|
|
16
|
+
const mediaType = header === "" ? "text/plain;charset=US-ASCII" : header;
|
|
17
|
+
const mime = (mediaType.split(";")[0] ?? "").trim().toLowerCase() || "text/plain";
|
|
18
|
+
if (isBase64) {
|
|
19
|
+
return { bytes: new Uint8Array(Buffer.from(payload, "base64")), mime };
|
|
20
|
+
}
|
|
21
|
+
return { bytes: percentDecodeBytes(payload), mime };
|
|
22
|
+
}
|
|
23
|
+
/** Percent-decodes the text to bytes. A sequence that is not two hex digits stays as its bytes. */
|
|
24
|
+
function percentDecodeBytes(payload) {
|
|
25
|
+
const raw = Buffer.from(payload, "utf8");
|
|
26
|
+
const out = [];
|
|
27
|
+
for (let i = 0; i < raw.length; i++) {
|
|
28
|
+
const byte = raw[i];
|
|
29
|
+
const hex = raw.subarray(i + 1, i + 3).toString("latin1");
|
|
30
|
+
if (byte === 0x25 && /^[0-9A-Fa-f]{2}$/.test(hex)) {
|
|
31
|
+
out.push(parseInt(hex, 16));
|
|
32
|
+
i += 2;
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
out.push(byte);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return Uint8Array.from(out);
|
|
39
|
+
}
|
|
40
|
+
const EXTENSIONS = {
|
|
41
|
+
"image/png": "png",
|
|
42
|
+
"image/jpeg": "jpg",
|
|
43
|
+
"image/gif": "gif",
|
|
44
|
+
"image/webp": "webp",
|
|
45
|
+
"image/svg+xml": "svg",
|
|
46
|
+
"image/bmp": "bmp",
|
|
47
|
+
"image/avif": "avif",
|
|
48
|
+
};
|
|
49
|
+
/** The file extension of a media type. An unknown media type gives "bin". */
|
|
50
|
+
export function extensionForMime(mime) {
|
|
51
|
+
return EXTENSIONS[mime.toLowerCase()] ?? "bin";
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=images.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"images.js","sourceRoot":"","sources":["../../src/html/images.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/html/index.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type FetchImage } from "./images.ts";
|
|
2
|
+
import type { NetworkPolicy } from "../config.ts";
|
|
3
|
+
import type { RenderAsset } from "../types.ts";
|
|
4
|
+
/** The options of one page conversion. */
|
|
5
|
+
export interface PageOptions {
|
|
6
|
+
/** True saves each image as an asset. False keeps every image URL. */
|
|
7
|
+
downloadImages: boolean;
|
|
8
|
+
/** The network rule of the configuration. Remote images need "tex-bundles,images". */
|
|
9
|
+
allowNetwork: NetworkPolicy;
|
|
10
|
+
/** Fetches one remote image. Omitted, a download fails with a warning. */
|
|
11
|
+
fetchImage?: FetchImage;
|
|
12
|
+
}
|
|
13
|
+
/** The Markdown, its assets and the warnings of one conversion. */
|
|
14
|
+
export interface PageResult {
|
|
15
|
+
markdown: string;
|
|
16
|
+
assets: RenderAsset[];
|
|
17
|
+
warnings: string[];
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Converts one page to Markdown. An image that is a data: URL becomes an asset without a network call. A remote
|
|
21
|
+
* image is saved only when downloadImages is set and the network rule allows images. Any other remote image keeps its URL.
|
|
22
|
+
*/
|
|
23
|
+
export declare function convertPage(html: string, options: PageOptions): Promise<PageResult>;
|
package/dist/html/md.js
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { parse, serialize } from "parse5";
|
|
2
|
+
import { convertHtml, isDropped } from "./convert.js";
|
|
3
|
+
import { decodeDataUrl, extensionForMime } from "./images.js";
|
|
4
|
+
/** The img elements that the Markdown emits, in document order. A dropped element and a scieng block are not read. */
|
|
5
|
+
function imagesIn(nodes, out) {
|
|
6
|
+
for (const node of nodes) {
|
|
7
|
+
if (!("tagName" in node))
|
|
8
|
+
continue;
|
|
9
|
+
const el = node;
|
|
10
|
+
if (isDropped(el))
|
|
11
|
+
continue;
|
|
12
|
+
if (el.tagName === "img")
|
|
13
|
+
out.push(el);
|
|
14
|
+
imagesIn(el.childNodes, out);
|
|
15
|
+
}
|
|
16
|
+
return out;
|
|
17
|
+
}
|
|
18
|
+
function srcOf(el) {
|
|
19
|
+
const index = el.attrs.findIndex((a) => a.name === "src");
|
|
20
|
+
if (index === -1)
|
|
21
|
+
return undefined;
|
|
22
|
+
return { value: el.attrs[index].value, index };
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Converts one page to Markdown. An image that is a data: URL becomes an asset without a network call. A remote
|
|
26
|
+
* image is saved only when downloadImages is set and the network rule allows images. Any other remote image keeps its URL.
|
|
27
|
+
*/
|
|
28
|
+
export async function convertPage(html, options) {
|
|
29
|
+
const document = parse(html);
|
|
30
|
+
const assets = [];
|
|
31
|
+
const warnings = [];
|
|
32
|
+
const counter = { count: 0 };
|
|
33
|
+
for (const el of imagesIn(document.childNodes, [])) {
|
|
34
|
+
const src = srcOf(el);
|
|
35
|
+
if (src === undefined)
|
|
36
|
+
continue;
|
|
37
|
+
const url = src.value;
|
|
38
|
+
let fetched;
|
|
39
|
+
if (url.startsWith("data:")) {
|
|
40
|
+
if (!options.downloadImages)
|
|
41
|
+
continue;
|
|
42
|
+
fetched = decodeDataUrl(url);
|
|
43
|
+
}
|
|
44
|
+
else if (options.downloadImages) {
|
|
45
|
+
if (!/^https?:\/\//i.test(url)) {
|
|
46
|
+
warnings.push(`the image ${url} is not downloaded: only http and https images are fetched`);
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
if (options.allowNetwork !== "tex-bundles,images" || options.fetchImage === undefined) {
|
|
50
|
+
warnings.push(`the image ${url} is not downloaded: the network rule does not allow images`);
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
try {
|
|
54
|
+
fetched = await options.fetchImage(url);
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
warnings.push(`the image ${url} is not downloaded: ${err instanceof Error ? err.message : String(err)}`);
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if (fetched === undefined)
|
|
62
|
+
continue;
|
|
63
|
+
counter.count += 1;
|
|
64
|
+
const name = `image-${counter.count}.${extensionForMime(fetched.mime)}`;
|
|
65
|
+
assets.push({ name, bytes: fetched.bytes, mime: fetched.mime });
|
|
66
|
+
el.attrs[src.index] = { name: "src", value: name };
|
|
67
|
+
}
|
|
68
|
+
const converted = convertHtml(serialize(document), { counter });
|
|
69
|
+
const svgAssets = converted.assets.map((a) => ({ name: a.name, bytes: a.data, mime: a.mediaType }));
|
|
70
|
+
return { markdown: converted.markdown, assets: [...assets, ...svgAssets], warnings };
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=md.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"md.js","sourceRoot":"","sources":["../../src/html/md.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { BackendOutput, WorkerJob } from "../worker/protocol.ts";
|
|
2
|
+
import { readCad, type CadFormat, type CadMesh, type LinearUnit } from "./read.ts";
|
|
3
|
+
/**
|
|
4
|
+
* The number of copies of the geometry that a glb render holds at its peak: the typed arrays of the
|
|
5
|
+
* reader result, the arrays of the writer, the BIN chunk, and the output file.
|
|
6
|
+
*/
|
|
7
|
+
export declare const GLB_COPIES = 4;
|
|
8
|
+
/** Estimates the peak memory of the glb output of the meshes, in bytes, with all copies. */
|
|
9
|
+
export declare function estimateGlbBytes(meshes: CadMesh[]): number;
|
|
10
|
+
/**
|
|
11
|
+
* Checks the options of a glb render. STEP and IGES take linearUnit. BREP takes no option.
|
|
12
|
+
* An unknown key or an unknown unit rejects with E_INPUT.
|
|
13
|
+
*/
|
|
14
|
+
export declare function readMeshOptions(format: CadFormat, options: Record<string, unknown>): {
|
|
15
|
+
linearUnit: LinearUnit;
|
|
16
|
+
};
|
|
17
|
+
/** The reader of a glb render. A test gives a fake reader. */
|
|
18
|
+
export interface GlbDeps {
|
|
19
|
+
readCad: typeof readCad;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Renders a STEP, IGES or BREP file to glTF binary. The worker calls this function.
|
|
23
|
+
* An output over maxMemoryMb rejects with E_LIMIT before the writer starts.
|
|
24
|
+
*/
|
|
25
|
+
export declare function render(request: WorkerJob["request"], deps?: GlbDeps): Promise<BackendOutput>;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { RenderError } from "../errors.js";
|
|
2
|
+
import { writeGlb } from "./glb.js";
|
|
3
|
+
import { readCad } from "./read.js";
|
|
4
|
+
/** The linear units that the STEP and IGES readers accept. Each value has one definition, here. */
|
|
5
|
+
const LINEAR_UNITS = ["millimeter", "meter"];
|
|
6
|
+
/** The default linear unit of the STEP and IGES readers. */
|
|
7
|
+
const DEFAULT_LINEAR_UNIT = "millimeter";
|
|
8
|
+
/**
|
|
9
|
+
* The number of copies of the geometry that a glb render holds at its peak: the typed arrays of the
|
|
10
|
+
* reader result, the arrays of the writer, the BIN chunk, and the output file.
|
|
11
|
+
*/
|
|
12
|
+
export const GLB_COPIES = 4;
|
|
13
|
+
/** The largest glb file: the header holds the file length as a 32-bit unsigned integer. */
|
|
14
|
+
const MAX_GLB_BYTES = 0xffffffff;
|
|
15
|
+
/** The bytes of one copy of the geometry: positions, normals and indices, four bytes per value. */
|
|
16
|
+
function geometryBytes(meshes) {
|
|
17
|
+
return meshes.reduce((n, m) => n + 4 * (m.positions.length + (m.normals?.length ?? 0) + m.indices.length), 0);
|
|
18
|
+
}
|
|
19
|
+
/** Estimates the peak memory of the glb output of the meshes, in bytes, with all copies. */
|
|
20
|
+
export function estimateGlbBytes(meshes) {
|
|
21
|
+
return geometryBytes(meshes) * GLB_COPIES;
|
|
22
|
+
}
|
|
23
|
+
/** Rejects with E_LIMIT when the glb output of the meshes needs more than maxMemoryMb, or more than a glb file can hold. */
|
|
24
|
+
function checkGlbLimit(meshes, maxMemoryMb) {
|
|
25
|
+
const limitBytes = maxMemoryMb * 1048576;
|
|
26
|
+
const needed = estimateGlbBytes(meshes);
|
|
27
|
+
if (needed > limitBytes) {
|
|
28
|
+
throw new RenderError("E_LIMIT", "the glb output needs " + needed + " bytes; the limit is " + limitBytes + " bytes");
|
|
29
|
+
}
|
|
30
|
+
const single = geometryBytes(meshes);
|
|
31
|
+
if (single > MAX_GLB_BYTES) {
|
|
32
|
+
throw new RenderError("E_LIMIT", "the glb geometry has " + single + " bytes; a glb file holds at most " + MAX_GLB_BYTES + " bytes");
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/** The input formats of this backend. */
|
|
36
|
+
const FORMATS = ["step", "iges", "brep"];
|
|
37
|
+
/**
|
|
38
|
+
* Checks the options of a glb render. STEP and IGES take linearUnit. BREP takes no option.
|
|
39
|
+
* An unknown key or an unknown unit rejects with E_INPUT.
|
|
40
|
+
*/
|
|
41
|
+
export function readMeshOptions(format, options) {
|
|
42
|
+
for (const key of Object.keys(options)) {
|
|
43
|
+
if (format === "brep" || key !== "linearUnit") {
|
|
44
|
+
throw new RenderError("E_INPUT", `${format} to glb takes no option ${key}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const unit = options.linearUnit ?? DEFAULT_LINEAR_UNIT;
|
|
48
|
+
if (!LINEAR_UNITS.includes(unit)) {
|
|
49
|
+
throw new RenderError("E_INPUT", "option linearUnit must be millimeter or meter");
|
|
50
|
+
}
|
|
51
|
+
return { linearUnit: unit };
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Renders a STEP, IGES or BREP file to glTF binary. The worker calls this function.
|
|
55
|
+
* An output over maxMemoryMb rejects with E_LIMIT before the writer starts.
|
|
56
|
+
*/
|
|
57
|
+
export async function render(request, deps = { readCad }) {
|
|
58
|
+
const format = request.type;
|
|
59
|
+
if (!FORMATS.includes(format)) {
|
|
60
|
+
throw new RenderError("E_INPUT", `${request.type} is not a mesh input`);
|
|
61
|
+
}
|
|
62
|
+
if (!(request.source instanceof Uint8Array)) {
|
|
63
|
+
throw new RenderError("E_INPUT", `${format} takes bytes, not text`);
|
|
64
|
+
}
|
|
65
|
+
const { linearUnit } = readMeshOptions(format, request.options);
|
|
66
|
+
const meshes = await deps.readCad(format, request.source, linearUnit);
|
|
67
|
+
const triangles = meshes.reduce((n, m) => n + m.indices.length / 3, 0);
|
|
68
|
+
if (triangles === 0) {
|
|
69
|
+
throw new RenderError("E_INPUT", `the ${format} file holds no triangles`);
|
|
70
|
+
}
|
|
71
|
+
checkGlbLimit(meshes, request.settings.maxMemoryMb);
|
|
72
|
+
return { bytes: writeGlb(meshes) };
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=backend-glb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend-glb.js","sourceRoot":"","sources":["../../src/mesh/backend-glb.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { BackendOutput, WorkerJob } from "../worker/protocol.ts";
|
|
2
|
+
/**
|
|
3
|
+
* Renders a STEP, IGES or BREP file to html: one page with a Three.js viewer that embeds the glb. The page names the
|
|
4
|
+
* pinned Three.js URLs. The options are the options of the glb render. The worker calls this function.
|
|
5
|
+
*/
|
|
6
|
+
export declare function render(request: WorkerJob["request"]): Promise<BackendOutput>;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { render as renderGlb } from "./backend-glb.js";
|
|
2
|
+
import { viewerPageHtml } from "./viewer.js";
|
|
3
|
+
/**
|
|
4
|
+
* Renders a STEP, IGES or BREP file to html: one page with a Three.js viewer that embeds the glb. The page names the
|
|
5
|
+
* pinned Three.js URLs. The options are the options of the glb render. The worker calls this function.
|
|
6
|
+
*/
|
|
7
|
+
export async function render(request) {
|
|
8
|
+
const glb = await renderGlb(request);
|
|
9
|
+
const html = viewerPageHtml(glb.bytes, { title: `${request.type} model`, controls: true });
|
|
10
|
+
return { bytes: new TextEncoder().encode(html), warnings: glb.warnings };
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=backend-html.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend-html.js","sourceRoot":"","sources":["../../src/mesh/backend-html.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,IAAI,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,OAA6B;IACxD,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,IAAI,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3F,OAAO,EAAE,KAAK,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC;AAC3E,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { BackendOutput, WorkerJob } from "../worker/protocol.ts";
|
|
2
|
+
/**
|
|
3
|
+
* Renders a STEP, IGES or BREP file to png: the viewer page in the headless browser. The client fulfils the pinned
|
|
4
|
+
* Three.js URLs from the assets folder, so no request leaves the process. The worker calls this function.
|
|
5
|
+
*/
|
|
6
|
+
export declare function render(request: WorkerJob["request"]): Promise<BackendOutput>;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { blockedWarnings, browserPathOf, parsePngOptions } from "../browser/input.js";
|
|
2
|
+
import { renderHtmlPage } from "../browser/render.js";
|
|
3
|
+
import { render as renderGlb } from "./backend-glb.js";
|
|
4
|
+
import { pinnedThree } from "./pinned-three.js";
|
|
5
|
+
import { viewerPageHtml } from "./viewer.js";
|
|
6
|
+
/** The options that the png render reads itself. The glb render reads the others. */
|
|
7
|
+
const PNG_KEYS = ["width", "height", "scale"];
|
|
8
|
+
/**
|
|
9
|
+
* Renders a STEP, IGES or BREP file to png: the viewer page in the headless browser. The client fulfils the pinned
|
|
10
|
+
* Three.js URLs from the assets folder, so no request leaves the process. The worker calls this function.
|
|
11
|
+
*/
|
|
12
|
+
export async function render(request) {
|
|
13
|
+
const pngOptions = {};
|
|
14
|
+
const meshOptions = {};
|
|
15
|
+
for (const [key, value] of Object.entries(request.options)) {
|
|
16
|
+
(PNG_KEYS.includes(key) ? pngOptions : meshOptions)[key] = value;
|
|
17
|
+
}
|
|
18
|
+
const size = parsePngOptions(pngOptions);
|
|
19
|
+
const browser = browserPathOf(request.settings.browser);
|
|
20
|
+
const glb = await renderGlb({ ...request, options: meshOptions });
|
|
21
|
+
const pinned = pinnedThree(request.settings.assetsUrl);
|
|
22
|
+
const out = await renderHtmlPage({
|
|
23
|
+
html: viewerPageHtml(glb.bytes, { title: `${request.type} model`, controls: false }),
|
|
24
|
+
format: "png",
|
|
25
|
+
width: size.width,
|
|
26
|
+
height: size.height,
|
|
27
|
+
scale: size.scale,
|
|
28
|
+
browser,
|
|
29
|
+
timeoutMs: request.settings.timeoutMs,
|
|
30
|
+
pinned,
|
|
31
|
+
awaitReady: true,
|
|
32
|
+
});
|
|
33
|
+
return { bytes: out.bytes, warnings: [...(glb.warnings ?? []), ...blockedWarnings(out.blocked)] };
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=backend-png.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend-png.js","sourceRoot":"","sources":["../../src/mesh/backend-png.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EAAE,MAAM,IAAI,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,qFAAqF;AACrF,MAAM,QAAQ,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAU,CAAC;AAEvD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,OAA6B;IACxD,MAAM,UAAU,GAA4B,EAAE,CAAC;IAC/C,MAAM,WAAW,GAA4B,EAAE,CAAC;IAChD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3D,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAgC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAChG,CAAC;IACD,MAAM,IAAI,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACxD,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;IAClE,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACvD,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC;QAC/B,IAAI,EAAE,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,IAAI,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;QACpF,MAAM,EAAE,KAAK;QACb,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,OAAO;QACP,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC,SAAS;QACrC,MAAM;QACN,UAAU,EAAE,IAAI;KACjB,CAAC,CAAC;IACH,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,GAAG,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;AACpG,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { CadMesh } from "./read.ts";
|
|
2
|
+
/**
|
|
3
|
+
* Writes meshes as one glTF 2.0 binary file. Each mesh is one glTF mesh. Its triangles are grouped
|
|
4
|
+
* by face colour, and each colour is one primitive with one material. Faces without a colour use a
|
|
5
|
+
* default grey material. The positions and the normals are shared by the primitives of one mesh.
|
|
6
|
+
* A mesh without triangles is left out. Input with no triangle at all rejects with E_INPUT, because a
|
|
7
|
+
* glTF buffer cannot have zero bytes.
|
|
8
|
+
*/
|
|
9
|
+
export declare function writeGlb(meshes: CadMesh[]): Uint8Array;
|
package/dist/mesh/glb.js
ADDED
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { RenderError } from "../errors.js";
|
|
2
|
+
const MAGIC = 0x46546c67; // "glTF"
|
|
3
|
+
const VERSION = 2;
|
|
4
|
+
const CHUNK_JSON = 0x4e4f534a; // "JSON"
|
|
5
|
+
const CHUNK_BIN = 0x004e4942; // "BIN" and a zero byte
|
|
6
|
+
const COMPONENT_UINT32 = 5125;
|
|
7
|
+
const COMPONENT_FLOAT32 = 5126;
|
|
8
|
+
const MODE_TRIANGLES = 4;
|
|
9
|
+
const DEFAULT_COLOUR = [0.8, 0.8, 0.8];
|
|
10
|
+
/** Maps each triangle of a mesh to the key of its material: a colour, or "default". */
|
|
11
|
+
function triangleGroups(mesh) {
|
|
12
|
+
const triangles = mesh.indices.length / 3;
|
|
13
|
+
const keyOf = new Array(triangles).fill("default");
|
|
14
|
+
for (const face of mesh.faces) {
|
|
15
|
+
if (face.color === null)
|
|
16
|
+
continue;
|
|
17
|
+
const key = face.color.join(",");
|
|
18
|
+
for (let t = face.first; t <= face.last && t < triangles; t++)
|
|
19
|
+
keyOf[t] = key;
|
|
20
|
+
}
|
|
21
|
+
const groups = new Map();
|
|
22
|
+
for (let t = 0; t < triangles; t++) {
|
|
23
|
+
const key = keyOf[t];
|
|
24
|
+
const list = groups.get(key);
|
|
25
|
+
if (list === undefined)
|
|
26
|
+
groups.set(key, [t]);
|
|
27
|
+
else
|
|
28
|
+
list.push(t);
|
|
29
|
+
}
|
|
30
|
+
return groups;
|
|
31
|
+
}
|
|
32
|
+
/** Packs a typed array as the bytes of one buffer view. */
|
|
33
|
+
function bytesOf(array) {
|
|
34
|
+
return new Uint8Array(array.buffer, array.byteOffset, array.byteLength);
|
|
35
|
+
}
|
|
36
|
+
/** Pads a byte array with the given byte to a multiple of four bytes. */
|
|
37
|
+
function pad4(bytes, fill) {
|
|
38
|
+
const padded = (bytes.byteLength + 3) & ~3;
|
|
39
|
+
if (padded === bytes.byteLength)
|
|
40
|
+
return bytes;
|
|
41
|
+
const out = new Uint8Array(padded).fill(fill);
|
|
42
|
+
out.set(bytes);
|
|
43
|
+
return out;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Writes meshes as one glTF 2.0 binary file. Each mesh is one glTF mesh. Its triangles are grouped
|
|
47
|
+
* by face colour, and each colour is one primitive with one material. Faces without a colour use a
|
|
48
|
+
* default grey material. The positions and the normals are shared by the primitives of one mesh.
|
|
49
|
+
* A mesh without triangles is left out. Input with no triangle at all rejects with E_INPUT, because a
|
|
50
|
+
* glTF buffer cannot have zero bytes.
|
|
51
|
+
*/
|
|
52
|
+
export function writeGlb(meshes) {
|
|
53
|
+
const materials = [];
|
|
54
|
+
const materialIndex = new Map();
|
|
55
|
+
const materialOf = (key) => {
|
|
56
|
+
let index = materialIndex.get(key);
|
|
57
|
+
if (index === undefined) {
|
|
58
|
+
index = materials.length;
|
|
59
|
+
const colour = key === "default" ? DEFAULT_COLOUR : key.split(",").map(Number);
|
|
60
|
+
materials.push({ name: key === "default" ? "default" : `face ${key}`, colour });
|
|
61
|
+
materialIndex.set(key, index);
|
|
62
|
+
}
|
|
63
|
+
return index;
|
|
64
|
+
};
|
|
65
|
+
const accessors = [];
|
|
66
|
+
const addAccessor = (accessor) => {
|
|
67
|
+
accessors.push(accessor);
|
|
68
|
+
return accessors.length - 1;
|
|
69
|
+
};
|
|
70
|
+
const gltfMeshes = [];
|
|
71
|
+
const nodes = [];
|
|
72
|
+
for (const mesh of meshes) {
|
|
73
|
+
// A mesh with no triangle gets no accessor, so that the file holds no unused accessor.
|
|
74
|
+
const groups = triangleGroups(mesh);
|
|
75
|
+
if (groups.size === 0)
|
|
76
|
+
continue;
|
|
77
|
+
const positions = Float32Array.from(mesh.positions);
|
|
78
|
+
const vertexCount = positions.length / 3;
|
|
79
|
+
const min = [Infinity, Infinity, Infinity];
|
|
80
|
+
const max = [-Infinity, -Infinity, -Infinity];
|
|
81
|
+
for (let i = 0; i < positions.length; i++) {
|
|
82
|
+
const k = i % 3;
|
|
83
|
+
min[k] = Math.min(min[k], positions[i]);
|
|
84
|
+
max[k] = Math.max(max[k], positions[i]);
|
|
85
|
+
}
|
|
86
|
+
const attributes = {
|
|
87
|
+
POSITION: addAccessor({ bytes: bytesOf(positions), componentType: COMPONENT_FLOAT32, type: "VEC3", count: vertexCount, min, max }),
|
|
88
|
+
};
|
|
89
|
+
if (mesh.normals !== undefined) {
|
|
90
|
+
const normals = Float32Array.from(mesh.normals);
|
|
91
|
+
attributes.NORMAL = addAccessor({ bytes: bytesOf(normals), componentType: COMPONENT_FLOAT32, type: "VEC3", count: normals.length / 3 });
|
|
92
|
+
}
|
|
93
|
+
const primitives = [];
|
|
94
|
+
for (const [key, triangles] of groups) {
|
|
95
|
+
const indices = new Uint32Array(triangles.length * 3);
|
|
96
|
+
triangles.forEach((t, n) => {
|
|
97
|
+
indices[n * 3] = mesh.indices[t * 3];
|
|
98
|
+
indices[n * 3 + 1] = mesh.indices[t * 3 + 1];
|
|
99
|
+
indices[n * 3 + 2] = mesh.indices[t * 3 + 2];
|
|
100
|
+
});
|
|
101
|
+
const indexAccessor = addAccessor({ bytes: bytesOf(indices), componentType: COMPONENT_UINT32, type: "SCALAR", count: indices.length });
|
|
102
|
+
primitives.push({ attributes, indices: indexAccessor, material: materialOf(key), mode: MODE_TRIANGLES });
|
|
103
|
+
}
|
|
104
|
+
nodes.push({ mesh: gltfMeshes.length, name: mesh.name });
|
|
105
|
+
gltfMeshes.push({ name: mesh.name, primitives });
|
|
106
|
+
}
|
|
107
|
+
if (gltfMeshes.length === 0) {
|
|
108
|
+
throw new RenderError("E_INPUT", "the meshes hold no triangles");
|
|
109
|
+
}
|
|
110
|
+
// Lay out the buffer: one buffer view per accessor, each on a four-byte boundary.
|
|
111
|
+
const views = [];
|
|
112
|
+
const chunks = [];
|
|
113
|
+
let total = 0;
|
|
114
|
+
for (const accessor of accessors) {
|
|
115
|
+
chunks.push(accessor.bytes);
|
|
116
|
+
views.push({ byteOffset: total, byteLength: accessor.bytes.byteLength });
|
|
117
|
+
total += accessor.bytes.byteLength;
|
|
118
|
+
}
|
|
119
|
+
const bin = new Uint8Array(total);
|
|
120
|
+
let cursor = 0;
|
|
121
|
+
for (const chunk of chunks) {
|
|
122
|
+
bin.set(chunk, cursor);
|
|
123
|
+
cursor += chunk.byteLength;
|
|
124
|
+
}
|
|
125
|
+
const json = {
|
|
126
|
+
asset: { version: "2.0", generator: "sciengjs" },
|
|
127
|
+
scene: 0,
|
|
128
|
+
scenes: [{ nodes: nodes.map((_, i) => i) }],
|
|
129
|
+
nodes,
|
|
130
|
+
meshes: gltfMeshes,
|
|
131
|
+
materials: materials.map((m) => ({
|
|
132
|
+
name: m.name,
|
|
133
|
+
pbrMetallicRoughness: { baseColorFactor: [...m.colour, 1], metallicFactor: 0, roughnessFactor: 1 },
|
|
134
|
+
})),
|
|
135
|
+
accessors: accessors.map((a, i) => ({
|
|
136
|
+
bufferView: i,
|
|
137
|
+
byteOffset: 0,
|
|
138
|
+
componentType: a.componentType,
|
|
139
|
+
count: a.count,
|
|
140
|
+
type: a.type,
|
|
141
|
+
...(a.min !== undefined ? { min: a.min, max: a.max } : {}),
|
|
142
|
+
})),
|
|
143
|
+
bufferViews: views.map((v) => ({ buffer: 0, byteOffset: v.byteOffset, byteLength: v.byteLength })),
|
|
144
|
+
buffers: [{ byteLength: total }],
|
|
145
|
+
};
|
|
146
|
+
const jsonBytes = pad4(new TextEncoder().encode(JSON.stringify(json)), 0x20);
|
|
147
|
+
const binBytes = pad4(bin, 0);
|
|
148
|
+
const length = 12 + 8 + jsonBytes.byteLength + 8 + binBytes.byteLength;
|
|
149
|
+
const out = new Uint8Array(length);
|
|
150
|
+
const view = new DataView(out.buffer);
|
|
151
|
+
view.setUint32(0, MAGIC, true);
|
|
152
|
+
view.setUint32(4, VERSION, true);
|
|
153
|
+
view.setUint32(8, length, true);
|
|
154
|
+
view.setUint32(12, jsonBytes.byteLength, true);
|
|
155
|
+
view.setUint32(16, CHUNK_JSON, true);
|
|
156
|
+
out.set(jsonBytes, 20);
|
|
157
|
+
const binHeader = 20 + jsonBytes.byteLength;
|
|
158
|
+
view.setUint32(binHeader, binBytes.byteLength, true);
|
|
159
|
+
view.setUint32(binHeader + 4, CHUNK_BIN, true);
|
|
160
|
+
out.set(binBytes, binHeader + 8);
|
|
161
|
+
return out;
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=glb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glb.js","sourceRoot":"","sources":["../../src/mesh/glb.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** The mesh stage: STEP, IGES and BREP through occt-import-js, and the glTF binary writer. */
|
|
2
|
+
export { readCad } from "./read.ts";
|
|
3
|
+
export type { CadFormat, CadFace, CadMesh, LinearUnit } from "./read.ts";
|
|
4
|
+
export { writeGlb } from "./glb.ts";
|
|
5
|
+
export { readMeshOptions } from "./backend-glb.ts";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mesh/index.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { PinnedBytes } from "../browser/render.ts";
|
|
2
|
+
/**
|
|
3
|
+
* Reads the pinned Three.js files from the assets folder and checks the SHA-256 of each. A missing file rejects with
|
|
4
|
+
* E_STAGE_MISSING. A file with other bytes rejects with E_INTEGRITY, so a changed copy never runs in a page.
|
|
5
|
+
*/
|
|
6
|
+
export declare function pinnedThree(assetsUrl: string): ReadonlyMap<string, PinnedBytes>;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { THREE_MODULES } from "../browser/pinned.js";
|
|
3
|
+
import { readAsset } from "../assets.js";
|
|
4
|
+
import { RenderError } from "../errors.js";
|
|
5
|
+
/**
|
|
6
|
+
* Reads the pinned Three.js files from the assets folder and checks the SHA-256 of each. A missing file rejects with
|
|
7
|
+
* E_STAGE_MISSING. A file with other bytes rejects with E_INTEGRITY, so a changed copy never runs in a page.
|
|
8
|
+
*/
|
|
9
|
+
export function pinnedThree(assetsUrl) {
|
|
10
|
+
const map = new Map();
|
|
11
|
+
for (const m of THREE_MODULES) {
|
|
12
|
+
const bytes = readAsset(assetsUrl, m.file);
|
|
13
|
+
const hash = createHash("sha256").update(bytes).digest("hex");
|
|
14
|
+
if (hash !== m.sha256) {
|
|
15
|
+
throw new RenderError("E_INTEGRITY", `${m.file} has the SHA-256 ${hash}, not the pinned ${m.sha256}`);
|
|
16
|
+
}
|
|
17
|
+
map.set(m.url, { bytes, mime: m.mime });
|
|
18
|
+
}
|
|
19
|
+
return map;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=pinned-three.js.map
|