abstract-3d 3.1.2 → 4.0.0-beta.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 +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 +49 -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 +89 -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 +174 -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 +12 -0
- package/lib/renderers/three/build/materials.d.ts.map +1 -0
- package/lib/renderers/three/build/materials.js +55 -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 +37 -0
- package/lib/renderers/three/quality/quality.d.ts.map +1 -0
- package/lib/renderers/three/quality/quality.js +64 -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/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 +71 -0
- package/lib/renderers/three/viewer/options.d.ts.map +1 -0
- package/lib/renderers/three/viewer/options.js +31 -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 +90 -0
- package/lib/renderers/three/viewer/viewer.d.ts.map +1 -0
- package/lib/renderers/three/viewer/viewer.js +432 -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 +36 -16
- package/src/custom_typings/n8ao.d.ts +11 -0
- 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 +96 -181
- package/src/renderers/three/appearance/appearance.test.ts +116 -0
- package/src/renderers/three/appearance/appearance.ts +132 -0
- package/src/renderers/three/build/build.test.ts +141 -0
- package/src/renderers/three/build/build.ts +270 -0
- package/src/renderers/three/build/materials.ts +85 -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 +30 -0
- package/src/renderers/three/quality/quality.ts +95 -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 +98 -0
- package/src/renderers/three/viewer/overlays.ts +71 -0
- package/src/renderers/three/viewer/viewer.ts +540 -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":"AAAA,OAAO,EAAgB,OAAO,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,4CAA4C,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,4CAA4C,CAAC;AAC3E,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAkBjD,MAAM,UAAU,cAAc,CAAC,QAAgC,EAAE,SAAiB;IAChF,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC;IAC9B,MAAM,QAAQ,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC5C,QAAQ,CAAC,YAAY,CAAC,IAAI,YAAY,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;IACnD,QAAQ,CAAC,SAAS,CAAC,IAAI,YAAY,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,IAAI,iBAAiB,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;IACrF,MAAM,IAAI,GAAG,IAAI,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACnD,6DAA6D;IAC7D,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;IAC3B,MAAM,SAAS,GAAG,QAAQ,CAAC,YAAY,CAAC,eAAe,CAAyF,CAAC;IACjJ,MAAM,MAAM,GAAG,QAAQ,CAAC,YAAY,CAAC,oBAAoB,CAAyF,CAAC;IACnJ,4GAA4G;IAC5G,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAE9C,MAAM,aAAa,GAAG,CAAC,IAAY,EAAQ,EAAE;QAC3C,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;QACpC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CACtB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAE,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAE,EAAE,KAAK,CAAC,CAAC,CAAE,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAE,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,EAC7H,CAAC,CACF,CAAC;IACJ,CAAC,CAAC;IAEF,OAAO;QACL,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,CAAC,IAAI,EAAE,MAAe,EAAE,EAAE;YAC/B,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAE,CAAC;YAC/C,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YACtE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;YACrC,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAChE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YACzC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/G,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YACzC,aAAa,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;QACD,KAAK,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC;QAC/G,KAAK,EAAE,GAAG,EAAE;YACV,SAAS,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACjC,CAAC;QACD,IAAI,EAAE,CAAC,cAAc,EAAE,EAAE;YACvB,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;gBACjC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;oBACpB,OAAO;gBACT,CAAC;gBACD,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;gBACnB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAC1B,cAAc,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAE,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,GAAG,CAAC,EAClD,cAAc,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,GAAG,CAAC,EACtD,cAAc,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,GAAG,CAAC,CACvD,CAAC;gBACF,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/E,IAAI,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC7B,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;oBACvB,aAAa,CAAC,IAAI,CAAC,CAAC;oBACpB,SAAS,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;gBACpC,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,EAAE,GAAG,EAAE;YACZ,QAAQ,CAAC,OAAO,EAAE,CAAC;YACnB,QAAQ,CAAC,OAAO,EAAE,CAAC;QACrB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAC9B,MAAM,aAAa,GAAG,IAAI,OAAO,EAAE,CAAC"}
|
|
@@ -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":"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"}
|
|
@@ -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,37 @@
|
|
|
1
|
+
import type { OrthographicCamera, PerspectiveCamera, Scene, WebGLRenderer } from "three";
|
|
2
|
+
import { EffectComposer } from "three/addons/postprocessing/EffectComposer.js";
|
|
3
|
+
/**
|
|
4
|
+
* Quality tiers that spend the GPU where it shows: the camera is still most of the time, and a still frame can afford ambient occlusion that a moving
|
|
5
|
+
* one can't on a weak GPU. Low renders directly; medium adds ambient occlusion at rest, faded in; high has it while moving too. Effects only at rest
|
|
6
|
+
* is how progressive model viewers such as Sketchfab's stay fast; the AO is N8AO, configured as the r3f renderer's
|
|
7
|
+
*/
|
|
8
|
+
export type Tier = "low" | "medium" | "high";
|
|
9
|
+
export type Quality = Tier | "auto";
|
|
10
|
+
/** `auto` starts at medium, and drops to low for good once moving frames average slower than 40 per second */
|
|
11
|
+
export type TierGovernor = {
|
|
12
|
+
readonly quality: Quality;
|
|
13
|
+
tier: Tier;
|
|
14
|
+
sum: number;
|
|
15
|
+
count: number;
|
|
16
|
+
};
|
|
17
|
+
export type RenderPath = {
|
|
18
|
+
readonly tier: Tier;
|
|
19
|
+
/** With ambient occlusion, faded in by its intensity over the first frames at rest */
|
|
20
|
+
readonly composer: EffectComposer | undefined;
|
|
21
|
+
readonly ao: {
|
|
22
|
+
readonly configuration: {
|
|
23
|
+
intensity: number;
|
|
24
|
+
};
|
|
25
|
+
} | undefined;
|
|
26
|
+
readonly fade: {
|
|
27
|
+
frame: number;
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
/** Records the time between two frames while the camera moves; true when that dropped the tier */
|
|
31
|
+
export declare function recordFrame(governor: TierGovernor, intervalMs: number): boolean;
|
|
32
|
+
/** Also sets the renderer's pixel ratio, capped by the tier */
|
|
33
|
+
export declare function createRenderPath(renderer: WebGLRenderer, scene: Scene, camera: PerspectiveCamera | OrthographicCamera, tier: Tier): RenderPath;
|
|
34
|
+
/** Renders a frame; true while the frame at rest needs more frames to fade its ambient occlusion in */
|
|
35
|
+
export declare function renderPath(path: RenderPath, renderer: WebGLRenderer, scene: Scene, camera: PerspectiveCamera | OrthographicCamera, moving: boolean): boolean;
|
|
36
|
+
export declare function disposeRenderPath(path: RenderPath): void;
|
|
37
|
+
//# 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":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACzF,OAAO,EAAE,cAAc,EAAE,MAAM,+CAA+C,CAAC;AAG/E;;;;GAIG;AAEH,MAAM,MAAM,IAAI,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AAC7C,MAAM,MAAM,OAAO,GAAG,IAAI,GAAG,MAAM,CAAC;AAEpC,8GAA8G;AAC9G,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;AAEjG,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,sFAAsF;IACtF,QAAQ,CAAC,QAAQ,EAAE,cAAc,GAAG,SAAS,CAAC;IAC9C,QAAQ,CAAC,EAAE,EAAE;QAAE,QAAQ,CAAC,aAAa,EAAE;YAAE,SAAS,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,GAAG,SAAS,CAAC;IAC3E,QAAQ,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAClC,CAAC;AAUF,kGAAkG;AAClG,wBAAgB,WAAW,CAAC,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAY/E;AAED,+DAA+D;AAC/D,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,GAAG,kBAAkB,EAAE,IAAI,EAAE,IAAI,GAAG,UAAU,CAqB9I;AAED,uGAAuG;AACvG,wBAAgB,UAAU,CACxB,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,aAAa,EACvB,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,iBAAiB,GAAG,kBAAkB,EAC9C,MAAM,EAAE,OAAO,GACd,OAAO,CAUT;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAGxD"}
|