abstract-3d 3.1.2 → 4.0.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -1
- package/lib/renderers/dxf/dxf-encoding/dxf-build.d.ts.map +1 -1
- package/lib/renderers/dxf/dxf-encoding/dxf-build.js +1 -2
- package/lib/renderers/dxf/dxf-encoding/dxf-build.js.map +1 -1
- package/lib/renderers/ifc/ifc.test.d.ts +2 -0
- package/lib/renderers/ifc/ifc.test.d.ts.map +1 -0
- package/lib/renderers/ifc/ifc.test.js +380 -0
- package/lib/renderers/ifc/ifc.test.js.map +1 -0
- package/lib/renderers/index.d.ts +1 -0
- package/lib/renderers/index.d.ts.map +1 -1
- package/lib/renderers/index.js +1 -0
- package/lib/renderers/index.js.map +1 -1
- package/lib/renderers/react/index.d.ts +2 -5
- package/lib/renderers/react/index.d.ts.map +1 -1
- package/lib/renderers/react/index.js +1 -2
- package/lib/renderers/react/index.js.map +1 -1
- package/lib/renderers/react/react.d.ts +16 -42
- package/lib/renderers/react/react.d.ts.map +1 -1
- package/lib/renderers/react/react.js +50 -32
- package/lib/renderers/react/react.js.map +1 -1
- package/lib/renderers/three/appearance/appearance.d.ts +41 -0
- package/lib/renderers/three/appearance/appearance.d.ts.map +1 -0
- package/lib/renderers/three/appearance/appearance.js +92 -0
- package/lib/renderers/three/appearance/appearance.js.map +1 -0
- package/lib/renderers/three/appearance/appearance.test.d.ts +2 -0
- package/lib/renderers/three/appearance/appearance.test.d.ts.map +1 -0
- package/lib/renderers/three/appearance/appearance.test.js +97 -0
- package/lib/renderers/three/appearance/appearance.test.js.map +1 -0
- package/lib/renderers/three/appearance.d.ts +41 -0
- package/lib/renderers/three/appearance.d.ts.map +1 -0
- package/lib/renderers/three/appearance.js +100 -0
- package/lib/renderers/three/appearance.js.map +1 -0
- package/lib/renderers/three/build/build.d.ts +51 -0
- package/lib/renderers/three/build/build.d.ts.map +1 -0
- package/lib/renderers/three/build/build.js +178 -0
- package/lib/renderers/three/build/build.js.map +1 -0
- package/lib/renderers/three/build/build.test.d.ts +2 -0
- package/lib/renderers/three/build/build.test.d.ts.map +1 -0
- package/lib/renderers/three/build/build.test.js +120 -0
- package/lib/renderers/three/build/build.test.js.map +1 -0
- package/lib/renderers/three/build/materials.d.ts +16 -0
- package/lib/renderers/three/build/materials.d.ts.map +1 -0
- package/lib/renderers/three/build/materials.js +60 -0
- package/lib/renderers/three/build/materials.js.map +1 -0
- package/lib/renderers/three/build/parts.d.ts +65 -0
- package/lib/renderers/three/build/parts.d.ts.map +1 -0
- package/lib/renderers/three/build/parts.js +203 -0
- package/lib/renderers/three/build/parts.js.map +1 -0
- package/lib/renderers/three/build.d.ts +50 -0
- package/lib/renderers/three/build.d.ts.map +1 -0
- package/lib/renderers/three/build.js +210 -0
- package/lib/renderers/three/build.js.map +1 -0
- package/lib/renderers/three/camera/camera.d.ts +40 -0
- package/lib/renderers/three/camera/camera.d.ts.map +1 -0
- package/lib/renderers/three/camera/camera.js +51 -0
- package/lib/renderers/three/camera/camera.js.map +1 -0
- package/lib/renderers/three/camera/camera.test.d.ts +2 -0
- package/lib/renderers/three/camera/camera.test.d.ts.map +1 -0
- package/lib/renderers/three/camera/camera.test.js +46 -0
- package/lib/renderers/three/camera/camera.test.js.map +1 -0
- package/lib/renderers/three/camera/controls.d.ts +24 -0
- package/lib/renderers/three/camera/controls.d.ts.map +1 -0
- package/lib/renderers/three/camera/controls.js +39 -0
- package/lib/renderers/three/camera/controls.js.map +1 -0
- package/lib/renderers/three/camera/gizmo.d.ts +44 -0
- package/lib/renderers/three/camera/gizmo.d.ts.map +1 -0
- package/lib/renderers/three/camera/gizmo.js +42 -0
- package/lib/renderers/three/camera/gizmo.js.map +1 -0
- package/lib/renderers/three/camera.d.ts +63 -0
- package/lib/renderers/three/camera.d.ts.map +1 -0
- package/lib/renderers/three/camera.js +85 -0
- package/lib/renderers/three/camera.js.map +1 -0
- package/lib/renderers/three/compile/compile.d.ts +59 -0
- package/lib/renderers/three/compile/compile.d.ts.map +1 -0
- package/lib/renderers/three/compile/compile.js +88 -0
- package/lib/renderers/three/compile/compile.js.map +1 -0
- package/lib/renderers/three/compile/compile.test.d.ts +2 -0
- package/lib/renderers/three/compile/compile.test.d.ts.map +1 -0
- package/lib/renderers/three/compile/compile.test.js +93 -0
- package/lib/renderers/three/compile/compile.test.js.map +1 -0
- package/lib/renderers/three/compile.d.ts +58 -0
- package/lib/renderers/three/compile.d.ts.map +1 -0
- package/lib/renderers/three/compile.js +89 -0
- package/lib/renderers/three/compile.js.map +1 -0
- package/lib/renderers/three/controls.d.ts +27 -0
- package/lib/renderers/three/controls.d.ts.map +1 -0
- package/lib/renderers/three/controls.js +115 -0
- package/lib/renderers/three/controls.js.map +1 -0
- package/lib/renderers/three/geometry/geometry.d.ts +21 -0
- package/lib/renderers/three/geometry/geometry.d.ts.map +1 -0
- package/lib/renderers/three/geometry/geometry.js +132 -0
- package/lib/renderers/three/geometry/geometry.js.map +1 -0
- package/lib/renderers/three/geometry/geometry.test.d.ts +2 -0
- package/lib/renderers/three/geometry/geometry.test.d.ts.map +1 -0
- package/lib/renderers/three/geometry/geometry.test.js +80 -0
- package/lib/renderers/three/geometry/geometry.test.js.map +1 -0
- package/lib/renderers/three/geometry.d.ts +20 -0
- package/lib/renderers/three/geometry.d.ts.map +1 -0
- package/lib/renderers/three/geometry.js +164 -0
- package/lib/renderers/three/geometry.js.map +1 -0
- package/lib/renderers/three/gizmo.d.ts +49 -0
- package/lib/renderers/three/gizmo.d.ts.map +1 -0
- package/lib/renderers/three/gizmo.js +172 -0
- package/lib/renderers/three/gizmo.js.map +1 -0
- package/lib/renderers/three/index.d.ts +16 -0
- package/lib/renderers/three/index.d.ts.map +1 -0
- package/lib/renderers/three/index.js +6 -0
- package/lib/renderers/three/index.js.map +1 -0
- package/lib/renderers/three/input.d.ts +25 -0
- package/lib/renderers/three/input.d.ts.map +1 -0
- package/lib/renderers/three/input.js +71 -0
- package/lib/renderers/three/input.js.map +1 -0
- package/lib/renderers/three/lines.d.ts +16 -0
- package/lib/renderers/three/lines.d.ts.map +1 -0
- package/lib/renderers/three/lines.js +63 -0
- package/lib/renderers/three/lines.js.map +1 -0
- package/lib/renderers/three/materials.d.ts +15 -0
- package/lib/renderers/three/materials.d.ts.map +1 -0
- package/lib/renderers/three/materials.js +70 -0
- package/lib/renderers/three/materials.js.map +1 -0
- package/lib/renderers/three/options.d.ts +68 -0
- package/lib/renderers/three/options.d.ts.map +1 -0
- package/lib/renderers/three/options.js +64 -0
- package/lib/renderers/three/options.js.map +1 -0
- package/lib/renderers/three/overlays.d.ts +25 -0
- package/lib/renderers/three/overlays.d.ts.map +1 -0
- package/lib/renderers/three/overlays.js +57 -0
- package/lib/renderers/three/overlays.js.map +1 -0
- package/lib/renderers/three/quality/quality.d.ts +17 -0
- package/lib/renderers/three/quality/quality.d.ts.map +1 -0
- package/lib/renderers/three/quality/quality.js +27 -0
- package/lib/renderers/three/quality/quality.js.map +1 -0
- package/lib/renderers/three/quality/quality.test.d.ts +2 -0
- package/lib/renderers/three/quality/quality.test.d.ts.map +1 -0
- package/lib/renderers/three/quality/quality.test.js +23 -0
- package/lib/renderers/three/quality/quality.test.js.map +1 -0
- package/lib/renderers/three/quality.d.ts +24 -0
- package/lib/renderers/three/quality.d.ts.map +1 -0
- package/lib/renderers/three/quality.js +67 -0
- package/lib/renderers/three/quality.js.map +1 -0
- package/lib/renderers/three/shadow/shadow.d.ts +15 -0
- package/lib/renderers/three/shadow/shadow.d.ts.map +1 -0
- package/lib/renderers/three/shadow/shadow.js +81 -0
- package/lib/renderers/three/shadow/shadow.js.map +1 -0
- package/lib/renderers/three/text/text.d.ts +55 -0
- package/lib/renderers/three/text/text.d.ts.map +1 -0
- package/lib/renderers/three/text/text.js +90 -0
- package/lib/renderers/three/text/text.js.map +1 -0
- package/lib/renderers/three/text/text.test.d.ts +2 -0
- package/lib/renderers/three/text/text.test.d.ts.map +1 -0
- package/lib/renderers/three/text/text.test.js +70 -0
- package/lib/renderers/three/text/text.test.js.map +1 -0
- package/lib/renderers/three/text.d.ts +53 -0
- package/lib/renderers/three/text.d.ts.map +1 -0
- package/lib/renderers/three/text.js +151 -0
- package/lib/renderers/three/text.js.map +1 -0
- package/lib/renderers/three/viewer/options.d.ts +75 -0
- package/lib/renderers/three/viewer/options.d.ts.map +1 -0
- package/lib/renderers/three/viewer/options.js +33 -0
- package/lib/renderers/three/viewer/options.js.map +1 -0
- package/lib/renderers/three/viewer/options.test.d.ts +2 -0
- package/lib/renderers/three/viewer/options.test.d.ts.map +1 -0
- package/lib/renderers/three/viewer/options.test.js +38 -0
- package/lib/renderers/three/viewer/options.test.js.map +1 -0
- package/lib/renderers/three/viewer/overlays.d.ts +31 -0
- package/lib/renderers/three/viewer/overlays.d.ts.map +1 -0
- package/lib/renderers/three/viewer/overlays.js +43 -0
- package/lib/renderers/three/viewer/overlays.js.map +1 -0
- package/lib/renderers/three/viewer/viewer.d.ts +91 -0
- package/lib/renderers/three/viewer/viewer.d.ts.map +1 -0
- package/lib/renderers/three/viewer/viewer.js +436 -0
- package/lib/renderers/three/viewer/viewer.js.map +1 -0
- package/lib/renderers/three/viewer.d.ts +38 -0
- package/lib/renderers/three/viewer.d.ts.map +1 -0
- package/lib/renderers/three/viewer.js +435 -0
- package/lib/renderers/three/viewer.js.map +1 -0
- package/package.json +34 -16
- package/src/renderers/dxf/dxf-encoding/dxf-build.ts +1 -2
- package/src/renderers/index.ts +1 -0
- package/src/renderers/react/index.ts +2 -5
- package/src/renderers/react/react.tsx +97 -181
- package/src/renderers/three/appearance/appearance.test.ts +121 -0
- package/src/renderers/three/appearance/appearance.ts +135 -0
- package/src/renderers/three/build/build.test.ts +141 -0
- package/src/renderers/three/build/build.ts +273 -0
- package/src/renderers/three/build/materials.ts +91 -0
- package/src/renderers/three/build/parts.ts +277 -0
- package/src/renderers/three/camera/camera.test.ts +53 -0
- package/src/renderers/three/camera/camera.ts +82 -0
- package/src/renderers/three/camera/controls.ts +65 -0
- package/src/renderers/three/camera/gizmo.ts +93 -0
- package/src/renderers/three/compile/compile.test.ts +113 -0
- package/src/renderers/three/compile/compile.ts +151 -0
- package/src/renderers/three/geometry/geometry.test.ts +95 -0
- package/src/renderers/three/geometry/geometry.ts +179 -0
- package/src/renderers/three/index.ts +15 -0
- package/src/renderers/three/quality/quality.test.ts +37 -0
- package/src/renderers/three/quality/quality.ts +35 -0
- package/src/renderers/three/shadow/shadow.ts +116 -0
- package/src/renderers/three/text/text.test.ts +79 -0
- package/src/renderers/three/text/text.ts +128 -0
- package/src/renderers/three/viewer/options.ts +104 -0
- package/src/renderers/three/viewer/overlays.ts +71 -0
- package/src/renderers/three/viewer/viewer.ts +543 -0
- package/lib/renderers/react/react-hotspot.d.ts +0 -27
- package/lib/renderers/react/react-hotspot.d.ts.map +0 -1
- package/lib/renderers/react/react-hotspot.js +0 -37
- package/lib/renderers/react/react-hotspot.js.map +0 -1
- package/src/custom_typings/react-three-fiber.d.ts +0 -9
- package/src/custom_typings/react-three-postprocessing.d.ts +0 -1
- package/src/renderers/react/react-camera.tsx +0 -391
- package/src/renderers/react/react-dimension.tsx +0 -122
- package/src/renderers/react/react-group.test.ts +0 -56
- package/src/renderers/react/react-group.tsx +0 -202
- package/src/renderers/react/react-image-material.tsx +0 -139
- package/src/renderers/react/react-material.tsx +0 -91
- package/src/renderers/react/react-mesh.tsx +0 -512
- package/src/renderers/react/react-relation.tsx +0 -86
- package/src/renderers/react/react-scene.tsx +0 -111
- package/src/renderers/react/react-types.ts +0 -9
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Vector2, type Vector3 } from "three";
|
|
2
|
+
/** Pointer input on the canvas: one pick per frame at most, hover changes, clicks that weren't drags, and context menus */
|
|
3
|
+
export type PointerHit = {
|
|
4
|
+
readonly item: number;
|
|
5
|
+
/** What hover is tracked by, e.g. the item's target */
|
|
6
|
+
readonly key: number;
|
|
7
|
+
readonly point: Vector3;
|
|
8
|
+
};
|
|
9
|
+
export type InputHandlers = {
|
|
10
|
+
/** The interactive item under the pointer, at normalized device coordinates */
|
|
11
|
+
readonly pick: (ndc: Vector2) => PointerHit | undefined;
|
|
12
|
+
/** Picking pauses while the camera is dragged */
|
|
13
|
+
readonly isPaused: () => boolean;
|
|
14
|
+
readonly onHover: (hit: PointerHit | undefined, previous: PointerHit | undefined, event: PointerEvent) => void;
|
|
15
|
+
readonly onClick: (hit: PointerHit, event: MouseEvent) => void;
|
|
16
|
+
readonly onContextMenu: (hit: PointerHit, event: MouseEvent) => void;
|
|
17
|
+
};
|
|
18
|
+
export type Input = {
|
|
19
|
+
readonly hovered: () => PointerHit | undefined;
|
|
20
|
+
/** Picks again at the last pointer position, e.g. after the scene changed */
|
|
21
|
+
readonly refresh: () => void;
|
|
22
|
+
readonly dispose: () => void;
|
|
23
|
+
};
|
|
24
|
+
export declare function createInput(canvas: HTMLCanvasElement, handlers: InputHandlers): Input;
|
|
25
|
+
//# sourceMappingURL=input.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../../src/renderers/three/input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,OAAO,CAAC;AAE9C,2HAA2H;AAE3H,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,uDAAuD;IACvD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,+EAA+E;IAC/E,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,UAAU,GAAG,SAAS,CAAC;IACxD,iDAAiD;IACjD,QAAQ,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,UAAU,GAAG,SAAS,EAAE,QAAQ,EAAE,UAAU,GAAG,SAAS,EAAE,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IAC/G,QAAQ,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IAC/D,QAAQ,CAAC,aAAa,EAAE,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;CACtE,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG;IAClB,QAAQ,CAAC,OAAO,EAAE,MAAM,UAAU,GAAG,SAAS,CAAC;IAC/C,6EAA6E;IAC7E,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;CAC9B,CAAC;AAKF,wBAAgB,WAAW,CAAC,MAAM,EAAE,iBAAiB,EAAE,QAAQ,EAAE,aAAa,GAAG,KAAK,CAwErF"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { Vector2 } from "three";
|
|
2
|
+
/** Pointer travel in CSS pixels below which a press and release is a click, not a drag */
|
|
3
|
+
const clickTolerance = 4;
|
|
4
|
+
export function createInput(canvas, handlers) {
|
|
5
|
+
const ndc = new Vector2();
|
|
6
|
+
const state = { frame: 0 };
|
|
7
|
+
const pickAt = (event) => {
|
|
8
|
+
const rect = canvas.getBoundingClientRect();
|
|
9
|
+
return handlers.pick(ndc.set(((event.clientX - rect.left) / rect.width) * 2 - 1, -((event.clientY - rect.top) / rect.height) * 2 + 1));
|
|
10
|
+
};
|
|
11
|
+
const setHovered = (hit, event) => {
|
|
12
|
+
const previous = state.hovered;
|
|
13
|
+
state.hovered = hit;
|
|
14
|
+
canvas.style.cursor = hit ? "pointer" : "";
|
|
15
|
+
if (hit?.key !== previous?.key) {
|
|
16
|
+
handlers.onHover(hit, previous, event);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
const hover = () => {
|
|
20
|
+
state.frame = 0;
|
|
21
|
+
if (state.last && !handlers.isPaused()) {
|
|
22
|
+
setHovered(pickAt(state.last), state.last);
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
const onPointerMove = (event) => {
|
|
26
|
+
state.last = event;
|
|
27
|
+
state.frame ||= requestAnimationFrame(hover);
|
|
28
|
+
};
|
|
29
|
+
const onPointerLeave = (event) => {
|
|
30
|
+
state.last = undefined;
|
|
31
|
+
setHovered(undefined, event);
|
|
32
|
+
};
|
|
33
|
+
const onPointerDown = (event) => {
|
|
34
|
+
state.down = { x: event.clientX, y: event.clientY };
|
|
35
|
+
};
|
|
36
|
+
const onClick = (event) => {
|
|
37
|
+
const down = state.down;
|
|
38
|
+
const hit = down && Math.hypot(event.clientX - down.x, event.clientY - down.y) <= clickTolerance ? pickAt(event) : undefined;
|
|
39
|
+
if (hit) {
|
|
40
|
+
handlers.onClick(hit, event);
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
const onContextMenu = (event) => {
|
|
44
|
+
const hit = pickAt(event);
|
|
45
|
+
if (hit) {
|
|
46
|
+
handlers.onContextMenu(hit, event);
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
canvas.addEventListener("pointermove", onPointerMove);
|
|
50
|
+
canvas.addEventListener("pointerleave", onPointerLeave);
|
|
51
|
+
canvas.addEventListener("pointerdown", onPointerDown);
|
|
52
|
+
canvas.addEventListener("click", onClick);
|
|
53
|
+
canvas.addEventListener("contextmenu", onContextMenu);
|
|
54
|
+
return {
|
|
55
|
+
hovered: () => state.hovered,
|
|
56
|
+
refresh: () => {
|
|
57
|
+
if (state.last) {
|
|
58
|
+
onPointerMove(state.last);
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
dispose: () => {
|
|
62
|
+
cancelAnimationFrame(state.frame);
|
|
63
|
+
canvas.removeEventListener("pointermove", onPointerMove);
|
|
64
|
+
canvas.removeEventListener("pointerleave", onPointerLeave);
|
|
65
|
+
canvas.removeEventListener("pointerdown", onPointerDown);
|
|
66
|
+
canvas.removeEventListener("click", onClick);
|
|
67
|
+
canvas.removeEventListener("contextmenu", onContextMenu);
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input.js","sourceRoot":"","sources":["../../../src/renderers/three/input.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Vector3 } from "three";
|
|
2
|
+
import type { Vec3 } from "../../abstract-3d.js";
|
|
3
|
+
import type { Part } from "./build.js";
|
|
4
|
+
/** Lines of one pixel thickness in one draw call; culled lines are hidden while their normal faces away from the camera */
|
|
5
|
+
export type Segment = {
|
|
6
|
+
readonly start: Vec3;
|
|
7
|
+
readonly end: Vec3;
|
|
8
|
+
/** The front facing direction of a culled line */
|
|
9
|
+
readonly normal?: Vec3;
|
|
10
|
+
};
|
|
11
|
+
export type LinePart = Part & {
|
|
12
|
+
/** Hides the culled lines facing away from a camera at `cameraPosition` */
|
|
13
|
+
readonly cull: (cameraPosition: Vector3) => void;
|
|
14
|
+
};
|
|
15
|
+
export declare function createLinePart(segments: ReadonlyArray<Segment>, thickness: number): LinePart;
|
|
16
|
+
//# sourceMappingURL=lines.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lines.d.ts","sourceRoot":"","sources":["../../../src/renderers/three/lines.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,OAAO,EAAE,MAAM,OAAO,CAAC;AAI9C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,2HAA2H;AAE3H,MAAM,MAAM,OAAO,GAAG;IACpB,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC;IACnB,kDAAkD;IAClD,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,IAAI,GAAG;IAC5B,2EAA2E;IAC3E,QAAQ,CAAC,IAAI,EAAE,CAAC,cAAc,EAAE,OAAO,KAAK,IAAI,CAAC;CAClD,CAAC;AAEF,wBAAgB,cAAc,CAAC,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,QAAQ,CAgE5F"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { Vector3 } from "three";
|
|
2
|
+
import { LineSegmentsGeometry } from "three/addons/lines/LineSegmentsGeometry.js";
|
|
3
|
+
import { LineSegments2 } from "three/addons/lines/webgpu/LineSegments2.js";
|
|
4
|
+
import { Line2NodeMaterial } from "three/webgpu";
|
|
5
|
+
export function createLinePart(segments, thickness) {
|
|
6
|
+
const count = segments.length;
|
|
7
|
+
const geometry = new LineSegmentsGeometry();
|
|
8
|
+
geometry.setPositions(new Float32Array(count * 6));
|
|
9
|
+
geometry.setColors(new Float32Array(count * 6));
|
|
10
|
+
const material = new Line2NodeMaterial({ linewidth: thickness, vertexColors: true });
|
|
11
|
+
const line = new LineSegments2(geometry, material);
|
|
12
|
+
// Positions change after the geometry's bounds were computed
|
|
13
|
+
line.frustumCulled = false;
|
|
14
|
+
const positions = geometry.getAttribute("instanceStart");
|
|
15
|
+
const colors = geometry.getAttribute("instanceColorStart");
|
|
16
|
+
/** World start, end and normal of each segment, while positions hold collapsed segments for culled lines */
|
|
17
|
+
const world = new Float32Array(count * 9);
|
|
18
|
+
const visible = new Uint8Array(count).fill(1);
|
|
19
|
+
const writePosition = (slot) => {
|
|
20
|
+
const [w, p] = [slot * 9, slot * 6];
|
|
21
|
+
positions.data.array.set(visible[slot] ? world.subarray(w, w + 6) : [world[w], world[w + 1], world[w + 2], world[w], world[w + 1], world[w + 2]], p);
|
|
22
|
+
};
|
|
23
|
+
return {
|
|
24
|
+
object: line,
|
|
25
|
+
place: (slot, matrix) => {
|
|
26
|
+
const { start, end, normal } = segments[slot];
|
|
27
|
+
const s = scratch.set(start.x, start.y, start.z).applyMatrix4(matrix);
|
|
28
|
+
world.set([s.x, s.y, s.z], slot * 9);
|
|
29
|
+
const e = scratch.set(end.x, end.y, end.z).applyMatrix4(matrix);
|
|
30
|
+
world.set([e.x, e.y, e.z], slot * 9 + 3);
|
|
31
|
+
const n = normal ? scratch.set(normal.x, normal.y, normal.z).transformDirection(matrix) : scratch.set(0, 0, 0);
|
|
32
|
+
world.set([n.x, n.y, n.z], slot * 9 + 6);
|
|
33
|
+
writePosition(slot);
|
|
34
|
+
},
|
|
35
|
+
paint: (slot, color) => colors.data.array.set([color.x, color.y, color.z, color.x, color.y, color.z], slot * 6),
|
|
36
|
+
flush: () => {
|
|
37
|
+
positions.data.needsUpdate = true;
|
|
38
|
+
colors.data.needsUpdate = true;
|
|
39
|
+
},
|
|
40
|
+
cull: (cameraPosition) => {
|
|
41
|
+
segments.forEach((segment, slot) => {
|
|
42
|
+
if (!segment.normal) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const w = slot * 9;
|
|
46
|
+
const toCamera = scratch.set(cameraPosition.x - (world[w] + world[w + 3]) / 2, cameraPosition.y - (world[w + 1] + world[w + 4]) / 2, cameraPosition.z - (world[w + 2] + world[w + 5]) / 2);
|
|
47
|
+
const facing = toCamera.dot(normalScratch.fromArray(world, w + 6)) > 0 ? 1 : 0;
|
|
48
|
+
if (facing !== visible[slot]) {
|
|
49
|
+
visible[slot] = facing;
|
|
50
|
+
writePosition(slot);
|
|
51
|
+
positions.data.needsUpdate = true;
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
},
|
|
55
|
+
dispose: () => {
|
|
56
|
+
geometry.dispose();
|
|
57
|
+
material.dispose();
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
const scratch = new Vector3();
|
|
62
|
+
const normalScratch = new Vector3();
|
|
63
|
+
//# sourceMappingURL=lines.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lines.js","sourceRoot":"","sources":["../../../src/renderers/three/lines.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type Material, MeshBasicMaterial, type Texture } from "three";
|
|
2
|
+
import type { Image } from "../../abstract-3d.js";
|
|
3
|
+
import type { MaterialClass, MaterialState } from "./appearance.js";
|
|
4
|
+
/** White materials, colored per instance, for each material class; images' materials and textures */
|
|
5
|
+
export declare function createClassMaterial(c: MaterialClass): Material;
|
|
6
|
+
export declare function createImageMaterial(backfaceCulling: boolean | undefined, useAlphaTest: boolean): MeshBasicMaterial;
|
|
7
|
+
export declare function getImageUrl(image: Image, materialState: MaterialState | undefined, materialStateImages: Record<string, string> | undefined): string;
|
|
8
|
+
export type TextureLoad = (url: string) => Promise<Texture | undefined>;
|
|
9
|
+
export type TextureCache = {
|
|
10
|
+
readonly load: TextureLoad;
|
|
11
|
+
readonly dispose: () => void;
|
|
12
|
+
};
|
|
13
|
+
/** Loads each url's texture once, SVGs rasterized at up to 512 px */
|
|
14
|
+
export declare function createTextureCache(): TextureCache;
|
|
15
|
+
//# sourceMappingURL=materials.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"materials.d.ts","sourceRoot":"","sources":["../../../src/renderers/three/materials.ts"],"names":[],"mappings":"AACA,OAAO,EAOL,KAAK,QAAQ,EACb,iBAAiB,EAGjB,KAAK,OAAO,EAEb,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGpE,qGAAqG;AAErG,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,aAAa,GAAG,QAAQ,CAI9D;AAED,wBAAgB,mBAAmB,CAAC,eAAe,EAAE,OAAO,GAAG,SAAS,EAAE,YAAY,EAAE,OAAO,GAAG,iBAAiB,CAElH;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,aAAa,GAAG,SAAS,EAAE,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,GAAG,MAAM,CAGnJ;AAED,MAAM,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;AAExE,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;CAC9B,CAAC;AAEF,qEAAqE;AACrE,wBAAgB,kBAAkB,IAAI,YAAY,CAiBjD"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { createSVG } from "abstract-image";
|
|
2
|
+
import { BackSide, CanvasTexture, DoubleSide, FrontSide, LinearFilter, LinearMipmapLinearFilter, MeshBasicMaterial, MeshStandardMaterial, SRGBColorSpace, TextureLoader, } from "three";
|
|
3
|
+
import { ERROR_IMG_KEY } from "./appearance.js";
|
|
4
|
+
/** White materials, colored per instance, for each material class; images' materials and textures */
|
|
5
|
+
export function createClassMaterial(c) {
|
|
6
|
+
const side = c.side === "front" ? FrontSide : c.side === "back" ? BackSide : DoubleSide;
|
|
7
|
+
const common = { side, transparent: c.transparent, depthWrite: !c.transparent };
|
|
8
|
+
return c.lit ? new MeshStandardMaterial({ ...common, metalness: c.metalness, roughness: c.roughness }) : new MeshBasicMaterial(common);
|
|
9
|
+
}
|
|
10
|
+
export function createImageMaterial(backfaceCulling, useAlphaTest) {
|
|
11
|
+
return new MeshBasicMaterial({ side: backfaceCulling ? FrontSide : DoubleSide, alphaTest: useAlphaTest ? 0.8 : 0, transparent: true });
|
|
12
|
+
}
|
|
13
|
+
export function getImageUrl(image, materialState, materialStateImages) {
|
|
14
|
+
const errorUrl = materialState === "Error" ? materialStateImages?.[ERROR_IMG_KEY] : undefined;
|
|
15
|
+
return errorUrl ?? (image.type === "AbstractImage" ? `data:image/svg+xml,${createSVG(image.image)}` : image.url);
|
|
16
|
+
}
|
|
17
|
+
/** Loads each url's texture once, SVGs rasterized at up to 512 px */
|
|
18
|
+
export function createTextureCache() {
|
|
19
|
+
const textures = new Map();
|
|
20
|
+
return {
|
|
21
|
+
load: (url) => {
|
|
22
|
+
const cached = textures.get(url);
|
|
23
|
+
if (cached) {
|
|
24
|
+
return cached;
|
|
25
|
+
}
|
|
26
|
+
const loading = (isSvg(url) ? loadSvg(url) : loadImage(url)).then((texture) => texture && applyFilters(texture));
|
|
27
|
+
textures.set(url, loading);
|
|
28
|
+
return loading;
|
|
29
|
+
},
|
|
30
|
+
dispose: () => {
|
|
31
|
+
textures.forEach((loading) => void loading.then((texture) => texture?.dispose()));
|
|
32
|
+
textures.clear();
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
const isSvg = (url) => url.startsWith("data:image/svg+xml") || url.endsWith(".svg") || url.includes(".svg?");
|
|
37
|
+
const svgMaxSize = 512;
|
|
38
|
+
function loadSvg(url) {
|
|
39
|
+
return new Promise((resolve) => {
|
|
40
|
+
const img = new Image();
|
|
41
|
+
img.addEventListener("load", () => {
|
|
42
|
+
const [w, h] = [img.naturalWidth, img.naturalHeight];
|
|
43
|
+
const canvas = document.createElement("canvas");
|
|
44
|
+
canvas.width = w >= h ? svgMaxSize : svgMaxSize * (w / h);
|
|
45
|
+
canvas.height = h >= w ? svgMaxSize : svgMaxSize * (h / w);
|
|
46
|
+
const ctx = canvas.getContext("2d");
|
|
47
|
+
if (!ctx) {
|
|
48
|
+
resolve(undefined);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
ctx.imageSmoothingQuality = "high";
|
|
52
|
+
ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
|
|
53
|
+
resolve(new CanvasTexture(canvas));
|
|
54
|
+
});
|
|
55
|
+
img.addEventListener("error", () => resolve(undefined));
|
|
56
|
+
img.src = url;
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
const loader = new TextureLoader();
|
|
60
|
+
const loadImage = (url) => new Promise((resolve) => loader.load(url, (texture) => resolve(texture), undefined, () => resolve(undefined)));
|
|
61
|
+
function applyFilters(texture) {
|
|
62
|
+
texture.colorSpace = SRGBColorSpace;
|
|
63
|
+
texture.minFilter = LinearMipmapLinearFilter;
|
|
64
|
+
texture.magFilter = LinearFilter;
|
|
65
|
+
texture.generateMipmaps = true;
|
|
66
|
+
texture.anisotropy = 4;
|
|
67
|
+
texture.needsUpdate = true;
|
|
68
|
+
return texture;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=materials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"materials.js","sourceRoot":"","sources":["../../../src/renderers/three/materials.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EACL,QAAQ,EACR,aAAa,EACb,UAAU,EACV,SAAS,EACT,YAAY,EACZ,wBAAwB,EAExB,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EAEd,aAAa,GACd,MAAM,OAAO,CAAC;AAGf,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,qGAAqG;AAErG,MAAM,UAAU,mBAAmB,CAAC,CAAgB;IAClD,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC;IACxF,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAChF,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,oBAAoB,CAAC,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC;AACzI,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,eAAoC,EAAE,YAAqB;IAC7F,OAAO,IAAI,iBAAiB,CAAC,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;AACzI,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAY,EAAE,aAAwC,EAAE,mBAAuD;IACzI,MAAM,QAAQ,GAAG,aAAa,KAAK,OAAO,CAAC,CAAC,CAAC,mBAAmB,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9F,OAAO,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,eAAe,CAAC,CAAC,CAAC,sBAAsB,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACnH,CAAC;AASD,qEAAqE;AACrE,MAAM,UAAU,kBAAkB;IAChC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAwC,CAAC;IACjE,OAAO;QACL,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE;YACZ,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACjC,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,MAAM,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;YACjH,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAC3B,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,OAAO,EAAE,GAAG,EAAE;YACZ,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;YAClF,QAAQ,CAAC,KAAK,EAAE,CAAC;QACnB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,KAAK,GAAG,CAAC,GAAW,EAAW,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,oBAAoB,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAE9H,MAAM,UAAU,GAAG,GAAG,CAAC;AAEvB,SAAS,OAAO,CAAC,GAAW;IAC1B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,GAAG,CAAC,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE;YAChC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC;YACrD,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YAChD,MAAM,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1D,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3D,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,OAAO,CAAC,SAAS,CAAC,CAAC;gBACnB,OAAO;YACT,CAAC;YACD,GAAG,CAAC,qBAAqB,GAAG,MAAM,CAAC;YACnC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YACtD,OAAO,CAAC,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;QACxD,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC;IAChB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;AACnC,MAAM,SAAS,GAAG,CAAC,GAAW,EAAgC,EAAE,CAC9D,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CACtB,MAAM,CAAC,IAAI,CACT,GAAG,EACH,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAC7B,SAAS,EACT,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CACzB,CACF,CAAC;AAEJ,SAAS,YAAY,CAAC,OAAgB;IACpC,OAAO,CAAC,UAAU,GAAG,cAAc,CAAC;IACpC,OAAO,CAAC,SAAS,GAAG,wBAAwB,CAAC;IAC7C,OAAO,CAAC,SAAS,GAAG,YAAY,CAAC;IACjC,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAC/B,OAAO,CAAC,UAAU,GAAG,CAAC,CAAC;IACvB,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAC3B,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { Object3D, Texture } from "three";
|
|
2
|
+
import type { Group, Relation, Scene, Vec3, View } from "../../abstract-3d.js";
|
|
3
|
+
import type { MaterialState } from "./appearance.js";
|
|
4
|
+
import type { BufferZones, CameraOptions } from "./camera.js";
|
|
5
|
+
import type { ControlsOptions } from "./controls.js";
|
|
6
|
+
import type { ControlsHelper } from "./gizmo.js";
|
|
7
|
+
import type { MountOverlays } from "./overlays.js";
|
|
8
|
+
import type { Quality } from "./quality.js";
|
|
9
|
+
/** The viewer's options, and which of them changed in an update, so each change does only the work it needs */
|
|
10
|
+
export type Popover<Content> = {
|
|
11
|
+
readonly id: string;
|
|
12
|
+
readonly pos: Vec3;
|
|
13
|
+
readonly content: Content;
|
|
14
|
+
};
|
|
15
|
+
export type SceneEvent = {
|
|
16
|
+
readonly nativeEvent: MouseEvent;
|
|
17
|
+
/** Where the pointer hit, in world space */
|
|
18
|
+
readonly point: Vec3;
|
|
19
|
+
};
|
|
20
|
+
export type GroupCallback = (id: string | undefined, rootData: Record<string, string> | undefined, data: Record<string, string> | undefined, event: SceneEvent) => void;
|
|
21
|
+
export type ViewerOptions<Content> = {
|
|
22
|
+
/** Undefined shows the fallback */
|
|
23
|
+
readonly scene?: Scene;
|
|
24
|
+
/** The id of a top-level group, which its hover, selection, material state and events are by; groups without an id can't be clicked */
|
|
25
|
+
readonly createGroupId?: (g: Group) => string;
|
|
26
|
+
readonly selectedIds?: Record<string, boolean>;
|
|
27
|
+
readonly hoveredIds?: ReadonlyArray<string>;
|
|
28
|
+
readonly activeComponents?: Record<string, MaterialState>;
|
|
29
|
+
/**
|
|
30
|
+
* The ids of the relations whose shape is drawn to be clicked, e.g. where a component can be inserted. While defined, even when empty, only the
|
|
31
|
+
* groups whose material state is Accept can be clicked
|
|
32
|
+
*/
|
|
33
|
+
readonly activeRelations?: ReadonlyArray<string>;
|
|
34
|
+
readonly showDimensions?: boolean;
|
|
35
|
+
readonly camera?: CameraOptions;
|
|
36
|
+
readonly view?: View;
|
|
37
|
+
readonly bufferZones?: BufferZones;
|
|
38
|
+
readonly fitPadding?: number;
|
|
39
|
+
/** Smooth controls by default; `orbit` keeps the OrbitControls of the r3f renderer */
|
|
40
|
+
readonly controls?: ControlsOptions;
|
|
41
|
+
readonly gizmo?: ControlsHelper;
|
|
42
|
+
/** Replace the default lights */
|
|
43
|
+
readonly lights?: ReadonlyArray<Object3D> | ((scene: Scene) => ReadonlyArray<Object3D>);
|
|
44
|
+
/** An environment map, or `room` for a neutral studio, lighting metal surfaces */
|
|
45
|
+
readonly environment?: Texture | "room";
|
|
46
|
+
readonly environmentIntensity?: number;
|
|
47
|
+
/** Of the default directional lights */
|
|
48
|
+
readonly lightIntensity?: number;
|
|
49
|
+
readonly quality?: Quality;
|
|
50
|
+
/** WebGL 2 by default; read once, when the viewer is created */
|
|
51
|
+
readonly backend?: "webgl" | "webgpu";
|
|
52
|
+
readonly useAlphaTest?: boolean;
|
|
53
|
+
readonly materialStateImages?: Record<string, string>;
|
|
54
|
+
readonly popovers?: ReadonlyArray<Popover<Content>>;
|
|
55
|
+
readonly getTooltips?: (id: string) => ReadonlyArray<Popover<Content>>;
|
|
56
|
+
/** Shown while loading, and while there's no scene */
|
|
57
|
+
readonly fallback?: Content;
|
|
58
|
+
/** Mounts popover, tooltip and fallback content, e.g. as React portals; without it, strings and DOM nodes are mounted directly */
|
|
59
|
+
readonly onOverlays?: MountOverlays<Content>;
|
|
60
|
+
readonly onClickGroup?: GroupCallback;
|
|
61
|
+
readonly onHoverGroup?: GroupCallback;
|
|
62
|
+
readonly onContextMenuGroup?: (id: string, rootData: Record<string, string> | undefined, data: Record<string, string> | undefined, left: number, top: number, event: SceneEvent) => void;
|
|
63
|
+
readonly onClickRelation?: (relation: Relation, event: SceneEvent) => void;
|
|
64
|
+
};
|
|
65
|
+
/** What an update has to redo, from the most work to the least */
|
|
66
|
+
export type Change = "compile" | "build" | "camera" | "rig" | "fit" | "gizmo" | "lights" | "quality" | "paint" | "dimensions" | "overlays";
|
|
67
|
+
export declare function getChanges<Content>(previous: ViewerOptions<Content>, next: ViewerOptions<Content>): ReadonlySet<Change>;
|
|
68
|
+
//# sourceMappingURL=options.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../../src/renderers/three/options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAC/C,OAAO,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,+GAA+G;AAE/G,MAAM,MAAM,OAAO,CAAC,OAAO,IAAI;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC;IACnB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC;IACjC,4CAA4C;IAC5C,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,CAC1B,EAAE,EAAE,MAAM,GAAG,SAAS,EACtB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EAC5C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EACxC,KAAK,EAAE,UAAU,KACd,IAAI,CAAC;AAEV,MAAM,MAAM,aAAa,CAAC,OAAO,IAAI;IACnC,mCAAmC;IACnC,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;IACvB,uIAAuI;IACvI,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,MAAM,CAAC;IAC9C,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/C,QAAQ,CAAC,UAAU,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC5C,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC1D;;;OAGG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACjD,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;IACrB,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC;IACnC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,sFAAsF;IACtF,QAAQ,CAAC,QAAQ,CAAC,EAAE,eAAe,CAAC;IACpC,QAAQ,CAAC,KAAK,CAAC,EAAE,cAAc,CAAC;IAChC,iCAAiC;IACjC,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,KAAK,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;IACxF,kFAAkF;IAClF,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACxC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IACvC,wCAAwC;IACxC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,gEAAgE;IAChE,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IACtC,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtD,QAAQ,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IACpD,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IACvE,sDAAsD;IACtD,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,kIAAkI;IAClI,QAAQ,CAAC,UAAU,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;IAC7C,QAAQ,CAAC,YAAY,CAAC,EAAE,aAAa,CAAC;IACtC,QAAQ,CAAC,YAAY,CAAC,EAAE,aAAa,CAAC;IACtC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAC5B,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EAC5C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EACxC,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,UAAU,KACd,IAAI,CAAC;IACV,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;CAC5E,CAAC;AAEF,kEAAkE;AAClE,MAAM,MAAM,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,YAAY,GAAG,UAAU,CAAC;AAqC3I,wBAAgB,UAAU,CAAC,OAAO,EAAE,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,aAAa,CAAC,OAAO,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,CASvH"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/** How each option is compared, and what a change of it redoes; callbacks are read when used, so they need nothing */
|
|
2
|
+
const effects = {
|
|
3
|
+
scene: ["reference", ["compile", "build", "lights", "overlays"]],
|
|
4
|
+
createGroupId: ["reference", ["compile", "build"]],
|
|
5
|
+
activeComponents: ["contents", ["build"]],
|
|
6
|
+
activeRelations: ["value", ["build"]],
|
|
7
|
+
useAlphaTest: ["value", ["build"]],
|
|
8
|
+
materialStateImages: ["contents", ["build"]],
|
|
9
|
+
selectedIds: ["contents", ["paint"]],
|
|
10
|
+
hoveredIds: ["value", ["paint"]],
|
|
11
|
+
showDimensions: ["value", ["dimensions"]],
|
|
12
|
+
camera: ["value", ["camera", "rig", "fit"]],
|
|
13
|
+
view: ["value", ["fit"]],
|
|
14
|
+
bufferZones: ["value", ["fit"]],
|
|
15
|
+
fitPadding: ["value", ["fit"]],
|
|
16
|
+
controls: ["value", ["rig"]],
|
|
17
|
+
gizmo: ["value", ["gizmo"]],
|
|
18
|
+
lights: ["reference", ["lights"]],
|
|
19
|
+
environment: ["reference", ["lights"]],
|
|
20
|
+
environmentIntensity: ["value", ["lights"]],
|
|
21
|
+
lightIntensity: ["value", ["lights"]],
|
|
22
|
+
quality: ["value", ["quality"]],
|
|
23
|
+
backend: ["value", []],
|
|
24
|
+
popovers: ["reference", ["overlays"]],
|
|
25
|
+
getTooltips: ["reference", ["overlays"]],
|
|
26
|
+
fallback: ["reference", ["overlays"]],
|
|
27
|
+
onOverlays: ["reference", []],
|
|
28
|
+
onClickGroup: ["reference", ["paint"]],
|
|
29
|
+
onHoverGroup: ["reference", []],
|
|
30
|
+
onContextMenuGroup: ["reference", []],
|
|
31
|
+
onClickRelation: ["reference", []],
|
|
32
|
+
};
|
|
33
|
+
export function getChanges(previous, next) {
|
|
34
|
+
const changes = new Set();
|
|
35
|
+
Object.keys(effects).forEach((key) => {
|
|
36
|
+
const [comparison, redo] = effects[key];
|
|
37
|
+
if (!isEqual(comparison, previous[key], next[key])) {
|
|
38
|
+
redo.forEach((change) => changes.add(change));
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
return changes;
|
|
42
|
+
}
|
|
43
|
+
function isEqual(comparison, a, b) {
|
|
44
|
+
if (a === b) {
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
switch (comparison) {
|
|
48
|
+
case "reference":
|
|
49
|
+
return false;
|
|
50
|
+
case "contents":
|
|
51
|
+
return isShallowEqual(a, b);
|
|
52
|
+
default:
|
|
53
|
+
return JSON.stringify(a) === JSON.stringify(b);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function isShallowEqual(a, b) {
|
|
57
|
+
if (typeof a !== "object" || typeof b !== "object" || a === null || b === null) {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
const [ra, rb] = [a, b];
|
|
61
|
+
const keys = Object.keys(ra);
|
|
62
|
+
return keys.length === Object.keys(rb).length && keys.every((key) => Object.is(ra[key], rb[key]));
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=options.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.js","sourceRoot":"","sources":["../../../src/renderers/three/options.ts"],"names":[],"mappings":"AAuFA,sHAAsH;AACtH,MAAM,OAAO,GAAqG;IAChH,KAAK,EAAE,CAAC,WAAW,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;IAChE,aAAa,EAAE,CAAC,WAAW,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAClD,gBAAgB,EAAE,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,CAAC;IACzC,eAAe,EAAE,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC;IACrC,YAAY,EAAE,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC;IAClC,mBAAmB,EAAE,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,CAAC;IAC5C,WAAW,EAAE,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,CAAC;IACpC,UAAU,EAAE,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC;IAChC,cAAc,EAAE,CAAC,OAAO,EAAE,CAAC,YAAY,CAAC,CAAC;IACzC,MAAM,EAAE,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAC3C,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;IACxB,WAAW,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;IAC/B,UAAU,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;IAC9B,QAAQ,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;IAC5B,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC;IAC3B,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC;IACjC,WAAW,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC;IACtC,oBAAoB,EAAE,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC;IAC3C,cAAc,EAAE,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC;IACrC,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;IAC/B,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC;IACtB,QAAQ,EAAE,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,CAAC;IACrC,WAAW,EAAE,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,CAAC;IACxC,QAAQ,EAAE,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,CAAC;IACrC,UAAU,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;IAC7B,YAAY,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,CAAC;IACtC,YAAY,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;IAC/B,kBAAkB,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;IACrC,eAAe,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;CACnC,CAAC;AAEF,MAAM,UAAU,UAAU,CAAU,QAAgC,EAAE,IAA4B;IAChG,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAiD,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QACpF,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACnD,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;QAChD,CAAC;IACH,CAAC,CAAC,CAAC;IACH,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,OAAO,CAAC,UAAsB,EAAE,CAAU,EAAE,CAAU;IAC7D,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;IACD,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,WAAW;YACd,OAAO,KAAK,CAAC;QACf,KAAK,UAAU;YACb,OAAO,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9B;YACE,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,CAAU,EAAE,CAAU;IAC5C,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QAC/E,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAA4B,EAAE,CAA4B,CAAC,CAAC;IAC9E,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7B,OAAO,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACpG,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type Camera, Vector3 } from "three";
|
|
2
|
+
/** HTML elements over the canvas at projected 3D anchors, e.g. popovers and tooltips; their content is mounted by the app, or directly */
|
|
3
|
+
export type Overlay<Content> = {
|
|
4
|
+
readonly key: string;
|
|
5
|
+
/** In world space; without one the overlay is centered on the canvas */
|
|
6
|
+
readonly position?: Vector3;
|
|
7
|
+
readonly content: Content;
|
|
8
|
+
};
|
|
9
|
+
export type MountedOverlay<Content> = {
|
|
10
|
+
readonly key: string;
|
|
11
|
+
readonly element: HTMLElement;
|
|
12
|
+
readonly content: Content;
|
|
13
|
+
};
|
|
14
|
+
/** Mounts the overlays' content into their elements, called when the set of overlays or their content changes */
|
|
15
|
+
export type MountOverlays<Content> = (overlays: ReadonlyArray<MountedOverlay<Content>>) => void;
|
|
16
|
+
export type OverlayLayer<Content> = {
|
|
17
|
+
readonly set: (overlays: ReadonlyArray<Overlay<Content>>) => void;
|
|
18
|
+
/** Moves each element to its anchor's place on screen, hidden while the anchor is behind the camera */
|
|
19
|
+
readonly update: (camera: Camera, width: number, height: number) => void;
|
|
20
|
+
readonly dispose: () => void;
|
|
21
|
+
};
|
|
22
|
+
/** Mounts strings and DOM nodes as they are */
|
|
23
|
+
export declare const mountDirectly: <Content>(overlays: ReadonlyArray<MountedOverlay<Content>>) => void;
|
|
24
|
+
export declare function createOverlayLayer<Content>(container: HTMLElement, mount: MountOverlays<Content>): OverlayLayer<Content>;
|
|
25
|
+
//# sourceMappingURL=overlays.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overlays.d.ts","sourceRoot":"","sources":["../../../src/renderers/three/overlays.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAE7C,0IAA0I;AAE1I,MAAM,MAAM,OAAO,CAAC,OAAO,IAAI;IAC7B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,cAAc,CAAC,OAAO,IAAI;IACpC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,iHAAiH;AACjH,MAAM,MAAM,aAAa,CAAC,OAAO,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,CAAC;AAEhG,MAAM,MAAM,YAAY,CAAC,OAAO,IAAI;IAClC,QAAQ,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,CAAC;IAClE,uGAAuG;IACvG,QAAQ,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACzE,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;CAC9B,CAAC;AAEF,+CAA+C;AAC/C,eAAO,MAAM,aAAa,GAAI,OAAO,YAAY,aAAa,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,KAAG,IACsC,CAAC;AAEjI,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,GAAG,YAAY,CAAC,OAAO,CAAC,CAqDxH"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { Vector3 } from "three";
|
|
2
|
+
/** Mounts strings and DOM nodes as they are */
|
|
3
|
+
export const mountDirectly = (overlays) => overlays.forEach(({ element, content }) => element.replaceChildren(content instanceof Node ? content : String(content ?? "")));
|
|
4
|
+
export function createOverlayLayer(container, mount) {
|
|
5
|
+
const layer = document.createElement("div");
|
|
6
|
+
Object.assign(layer.style, { position: "absolute", inset: "0", overflow: "hidden", pointerEvents: "none" });
|
|
7
|
+
container.append(layer);
|
|
8
|
+
const mounted = new Map();
|
|
9
|
+
const projected = new Vector3();
|
|
10
|
+
return {
|
|
11
|
+
set: (overlays) => {
|
|
12
|
+
const keys = new Set(overlays.map((o) => o.key));
|
|
13
|
+
const changed = overlays.some((o) => mounted.get(o.key)?.overlay.content !== o.content) || [...mounted.keys()].some((key) => !keys.has(key));
|
|
14
|
+
mounted.forEach(({ element }, key) => {
|
|
15
|
+
if (!keys.has(key)) {
|
|
16
|
+
element.remove();
|
|
17
|
+
mounted.delete(key);
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
overlays.forEach((overlay) => {
|
|
21
|
+
const existing = mounted.get(overlay.key);
|
|
22
|
+
if (existing) {
|
|
23
|
+
existing.overlay = overlay;
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const element = document.createElement("div");
|
|
27
|
+
Object.assign(element.style, { position: "absolute", left: "0", top: "0", pointerEvents: "none", visibility: "hidden" });
|
|
28
|
+
layer.append(element);
|
|
29
|
+
mounted.set(overlay.key, { element, overlay });
|
|
30
|
+
});
|
|
31
|
+
if (changed) {
|
|
32
|
+
mount([...mounted.entries()].map(([key, { element, overlay }]) => ({ key, element, content: overlay.content })));
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
update: (camera, width, height) => mounted.forEach(({ element, overlay }) => {
|
|
36
|
+
if (overlay.position) {
|
|
37
|
+
projected.copy(overlay.position).project(camera);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
projected.set(0, 0, 0);
|
|
41
|
+
}
|
|
42
|
+
const behind = projected.z < -1 || projected.z > 1;
|
|
43
|
+
element.style.visibility = behind ? "hidden" : "visible";
|
|
44
|
+
if (!behind) {
|
|
45
|
+
const x = ((projected.x + 1) / 2) * width;
|
|
46
|
+
const y = ((1 - projected.y) / 2) * height;
|
|
47
|
+
element.style.transform = `translate(${x}px, ${y}px) translate(-50%, -50%)`;
|
|
48
|
+
}
|
|
49
|
+
}),
|
|
50
|
+
dispose: () => {
|
|
51
|
+
layer.remove();
|
|
52
|
+
mounted.clear();
|
|
53
|
+
mount([]);
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=overlays.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overlays.js","sourceRoot":"","sources":["../../../src/renderers/three/overlays.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Quality tiers by resolution, the cheapest lever on a weak GPU: low renders a pixel per CSS pixel, medium up to 1.5 and high up to 2 on high-density
|
|
3
|
+
* screens. `auto` starts high and drops to low for good once moving frames are slow, as model viewers lower their resolution under load
|
|
4
|
+
*/
|
|
5
|
+
export type Tier = "low" | "medium" | "high";
|
|
6
|
+
export type Quality = Tier | "auto";
|
|
7
|
+
/** `auto` starts at high, and drops to low for good once moving frames average slower than 40 per second */
|
|
8
|
+
export type TierGovernor = {
|
|
9
|
+
readonly quality: Quality;
|
|
10
|
+
tier: Tier;
|
|
11
|
+
sum: number;
|
|
12
|
+
count: number;
|
|
13
|
+
};
|
|
14
|
+
/** Records the time between two frames while the camera moves; true when that dropped the tier */
|
|
15
|
+
export declare function recordFrame(governor: TierGovernor, intervalMs: number): boolean;
|
|
16
|
+
export declare function getPixelRatio(tier: Tier, devicePixelRatio: number): number;
|
|
17
|
+
//# sourceMappingURL=quality.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quality.d.ts","sourceRoot":"","sources":["../../../../src/renderers/three/quality/quality.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,IAAI,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AAC7C,MAAM,MAAM,OAAO,GAAG,IAAI,GAAG,MAAM,CAAC;AAEpC,4GAA4G;AAC5G,MAAM,MAAM,YAAY,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAQjG,kGAAkG;AAClG,wBAAgB,WAAW,CAAC,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAY/E;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,GAAG,MAAM,CAE1E"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Quality tiers by resolution, the cheapest lever on a weak GPU: low renders a pixel per CSS pixel, medium up to 1.5 and high up to 2 on high-density
|
|
3
|
+
* screens. `auto` starts high and drops to low for good once moving frames are slow, as model viewers lower their resolution under load
|
|
4
|
+
*/
|
|
5
|
+
const pixelRatioCaps = { low: 1, medium: 1.5, high: 2 };
|
|
6
|
+
const windowSize = 30;
|
|
7
|
+
const slowFrameMs = 25;
|
|
8
|
+
/** Longer intervals are pauses between moves, not slow frames */
|
|
9
|
+
const pauseMs = 250;
|
|
10
|
+
/** Records the time between two frames while the camera moves; true when that dropped the tier */
|
|
11
|
+
export function recordFrame(governor, intervalMs) {
|
|
12
|
+
if (governor.quality !== "auto" || governor.tier === "low" || intervalMs > pauseMs) {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
governor.sum += intervalMs;
|
|
16
|
+
governor.count += 1;
|
|
17
|
+
if (governor.count < windowSize) {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
const slow = governor.sum / governor.count > slowFrameMs;
|
|
21
|
+
Object.assign(governor, { sum: 0, count: 0 }, slow ? { tier: "low" } : {});
|
|
22
|
+
return slow;
|
|
23
|
+
}
|
|
24
|
+
export function getPixelRatio(tier, devicePixelRatio) {
|
|
25
|
+
return Math.min(devicePixelRatio, pixelRatioCaps[tier]);
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=quality.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quality.js","sourceRoot":"","sources":["../../../../src/renderers/three/quality/quality.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,MAAM,cAAc,GAAyB,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AAC9E,MAAM,UAAU,GAAG,EAAE,CAAC;AACtB,MAAM,WAAW,GAAG,EAAE,CAAC;AACvB,iEAAiE;AACjE,MAAM,OAAO,GAAG,GAAG,CAAC;AAEpB,kGAAkG;AAClG,MAAM,UAAU,WAAW,CAAC,QAAsB,EAAE,UAAkB;IACpE,IAAI,QAAQ,CAAC,OAAO,KAAK,MAAM,IAAI,QAAQ,CAAC,IAAI,KAAK,KAAK,IAAI,UAAU,GAAG,OAAO,EAAE,CAAC;QACnF,OAAO,KAAK,CAAC;IACf,CAAC;IACD,QAAQ,CAAC,GAAG,IAAI,UAAU,CAAC;IAC3B,QAAQ,CAAC,KAAK,IAAI,CAAC,CAAC;IACpB,IAAI,QAAQ,CAAC,KAAK,GAAG,UAAU,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,GAAG,QAAQ,CAAC,KAAK,GAAG,WAAW,CAAC;IACzD,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC3E,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAU,EAAE,gBAAwB;IAChE,OAAO,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;AAC1D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quality.test.d.ts","sourceRoot":"","sources":["../../../../src/renderers/three/quality/quality.test.ts"],"names":[],"mappings":""}
|