abstract-3d 3.1.2 → 4.0.0-beta.10
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 +53 -1
- package/lib/abstract-3d.d.ts +27 -1
- package/lib/abstract-3d.d.ts.map +1 -1
- package/lib/abstract-3d.js +26 -2
- package/lib/abstract-3d.js.map +1 -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 +56 -32
- package/lib/renderers/react/react.js.map +1 -1
- package/lib/renderers/three/appearance/appearance.d.ts +46 -0
- package/lib/renderers/three/appearance/appearance.d.ts.map +1 -0
- package/lib/renderers/three/appearance/appearance.js +102 -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 +53 -0
- package/lib/renderers/three/build/build.d.ts.map +1 -0
- package/lib/renderers/three/build/build.js +181 -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 +20 -0
- package/lib/renderers/three/build/materials.d.ts.map +1 -0
- package/lib/renderers/three/build/materials.js +168 -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 +43 -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/environment/studio.d.ts +9 -0
- package/lib/renderers/three/environment/studio.d.ts.map +1 -0
- package/lib/renderers/three/environment/studio.js +15 -0
- package/lib/renderers/three/environment/studio.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 +141 -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 +18 -0
- package/lib/renderers/three/quality/quality.d.ts.map +1 -0
- package/lib/renderers/three/quality/quality.js +28 -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/key-light.d.ts +6 -0
- package/lib/renderers/three/shadow/key-light.d.ts.map +1 -0
- package/lib/renderers/three/shadow/key-light.js +39 -0
- package/lib/renderers/three/shadow/key-light.js.map +1 -0
- package/lib/renderers/three/shadow/shadow.d.ts +21 -0
- package/lib/renderers/three/shadow/shadow.d.ts.map +1 -0
- package/lib/renderers/three/shadow/shadow.js +120 -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 +82 -0
- package/lib/renderers/three/viewer/options.d.ts.map +1 -0
- package/lib/renderers/three/viewer/options.js +34 -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 +102 -0
- package/lib/renderers/three/viewer/viewer.d.ts.map +1 -0
- package/lib/renderers/three/viewer/viewer.js +488 -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/abstract-3d.ts +60 -2
- package/src/renderers/dxf/dxf-encoding/dxf-build.ts +1 -2
- package/src/renderers/ifc/ifc.test.ts +7 -5
- package/src/renderers/index.ts +1 -0
- package/src/renderers/react/index.ts +2 -5
- package/src/renderers/react/react.tsx +107 -181
- package/src/renderers/three/appearance/appearance.test.ts +153 -0
- package/src/renderers/three/appearance/appearance.ts +150 -0
- package/src/renderers/three/build/build.test.ts +149 -0
- package/src/renderers/three/build/build.ts +278 -0
- package/src/renderers/three/build/materials.ts +222 -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 +94 -0
- package/src/renderers/three/compile/compile.test.ts +126 -0
- package/src/renderers/three/compile/compile.ts +151 -0
- package/src/renderers/three/environment/studio.ts +18 -0
- package/src/renderers/three/geometry/geometry.test.ts +121 -0
- package/src/renderers/three/geometry/geometry.ts +189 -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 +36 -0
- package/src/renderers/three/shadow/key-light.ts +43 -0
- package/src/renderers/three/shadow/shadow.ts +170 -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 +112 -0
- package/src/renderers/three/viewer/overlays.ts +71 -0
- package/src/renderers/three/viewer/viewer.ts +596 -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
|
@@ -1,33 +1,57 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
});
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import React, { useEffect, useLayoutEffect, useRef, useState } from "react";
|
|
3
|
+
import { createPortal } from "react-dom";
|
|
4
|
+
import { createViewer, disposeViewer, updateViewer } from "../three/index.js";
|
|
5
|
+
export function Viewer(props) {
|
|
6
|
+
const { scene, createGroupId, useAlphaTest, selectedIds, hoveredIdsExternal, onClickGroup, view, bufferZones, fitPadding, controls } = props;
|
|
7
|
+
const { lights, environmentIntensity, studio, groundShadow, shadows, quality, showDimensions, popovers, getTooltips } = props;
|
|
8
|
+
const { onHoverGroup, onContextMenuGroup, onClickRelation, onPointerMissed, sceneFallback, className, style } = props;
|
|
9
|
+
// Equal by value, so inline objects don't refit the camera, recreate the gizmo or rebuild the scene
|
|
10
|
+
const camera = useStableValue(props.camera);
|
|
11
|
+
const gizmo = useStableValue(props.controlsHelper);
|
|
12
|
+
const activeComponents = useStableValue(props.activeComponents);
|
|
13
|
+
const activeRelations = useStableValue(props.activeRelations);
|
|
14
|
+
const materialStateImages = useStableValue(props.materialStateImages);
|
|
15
|
+
const container = useRef(null);
|
|
16
|
+
const viewer = useRef(undefined);
|
|
17
|
+
const [overlays, setOverlays] = useState([]);
|
|
18
|
+
const [loaded, setLoaded] = useState(false);
|
|
19
|
+
useLayoutEffect(() => {
|
|
20
|
+
viewer.current = createViewer(container.current, { onOverlays: setOverlays, onLoad: () => setLoaded(true) });
|
|
21
|
+
return () => disposeViewer(viewer.current);
|
|
22
|
+
}, []);
|
|
23
|
+
// The latest createGroupId through a stable function, so an inline one doesn't rebuild the scene each render, as 3.x didn't; a new scene does
|
|
24
|
+
const latestGroupId = useRef(createGroupId);
|
|
25
|
+
useLayoutEffect(() => {
|
|
26
|
+
latestGroupId.current = createGroupId;
|
|
27
|
+
});
|
|
28
|
+
const [stableGroupId] = useState(() => (g) => latestGroupId.current?.(g) ?? "");
|
|
29
|
+
useEffect(() => updateViewer(viewer.current, { scene, createGroupId: stableGroupId }), [scene, stableGroupId]);
|
|
30
|
+
useEffect(() => updateViewer(viewer.current, { activeComponents, activeRelations, useAlphaTest, materialStateImages }), [activeComponents, activeRelations, useAlphaTest, materialStateImages]);
|
|
31
|
+
useEffect(() => updateViewer(viewer.current, { selectedIds, hoveredIds: hoveredIdsExternal, onClickGroup }), [selectedIds, hoveredIdsExternal, onClickGroup]);
|
|
32
|
+
useEffect(() => updateViewer(viewer.current, { view, bufferZones, fitPadding, camera }), [view, bufferZones, fitPadding, camera]);
|
|
33
|
+
useEffect(() => updateViewer(viewer.current, { controls }), [controls]);
|
|
34
|
+
useEffect(() => updateViewer(viewer.current, { gizmo }), [gizmo]);
|
|
35
|
+
useEffect(() => updateViewer(viewer.current, { lights, environmentIntensity, studio }), [lights, environmentIntensity, studio]);
|
|
36
|
+
useEffect(() => updateViewer(viewer.current, { quality }), [quality]);
|
|
37
|
+
useEffect(() => updateViewer(viewer.current, { showDimensions }), [showDimensions]);
|
|
38
|
+
useEffect(() => updateViewer(viewer.current, { groundShadow, shadows }), [groundShadow, shadows]);
|
|
39
|
+
useEffect(() => updateViewer(viewer.current, {
|
|
40
|
+
popovers: popovers?.map((p) => ({ ...p, content: p.id })),
|
|
41
|
+
getTooltips: getTooltips && ((id) => getTooltips(id).map((t) => ({ ...t, content: id }))),
|
|
42
|
+
}), [popovers, getTooltips]);
|
|
43
|
+
useEffect(() => updateViewer(viewer.current, { onHoverGroup, onContextMenuGroup, onClickRelation, onPointerMissed }), [onHoverGroup, onContextMenuGroup, onClickRelation, onPointerMissed]);
|
|
44
|
+
return (_jsxs("div", { ref: container, className: className, style: { position: "relative", width: "100%", height: "100%", overflow: "hidden", ...style }, children: [overlays.map((o) => createPortal(o.key.startsWith("popover:")
|
|
45
|
+
? popovers?.find((p) => p.id === o.content)?.content
|
|
46
|
+
: getTooltips?.(o.content).find((t) => `tooltip:${t.id}` === o.key)?.content, o.element, o.key)), (!scene || !loaded) && sceneFallback !== undefined && (_jsx("div", { style: { position: "absolute", inset: 0, display: "flex", alignItems: "center", justifyContent: "center", pointerEvents: "none" }, children: sceneFallback }))] }));
|
|
47
|
+
}
|
|
48
|
+
/** The previous value while the new one is equal by value */
|
|
49
|
+
function useStableValue(value) {
|
|
50
|
+
const [stable, setStable] = useState(value);
|
|
51
|
+
const changed = JSON.stringify(value) !== JSON.stringify(stable);
|
|
52
|
+
if (changed) {
|
|
53
|
+
setStable(value);
|
|
54
|
+
}
|
|
55
|
+
return changed ? value : stable;
|
|
56
|
+
}
|
|
33
57
|
//# sourceMappingURL=react.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react.js","sourceRoot":"","sources":["../../../src/renderers/react/react.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"react.js","sourceRoot":"","sources":["../../../src/renderers/react/react.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { type Vector4 } from "three";
|
|
2
|
+
import type { MaterialType } from "../../../abstract-3d.js";
|
|
3
|
+
import type { Item, Target } from "../compile/compile.js";
|
|
4
|
+
/** Material classes and per-instance colors of items, by the viewer's state, as the r3f renderer's materials */
|
|
5
|
+
export type MaterialState = "Accept" | "Error" | "Warning";
|
|
6
|
+
export declare const ERROR_IMG_KEY = "error";
|
|
7
|
+
/** The state that decides material classes, so changing it rebuilds the scene */
|
|
8
|
+
export type StructureState = {
|
|
9
|
+
readonly activeComponents?: Record<string, MaterialState>;
|
|
10
|
+
/** Relations are active, e.g. to pick one to insert a component on, so only the groups whose material state is Accept can be clicked */
|
|
11
|
+
readonly relationsActive: boolean;
|
|
12
|
+
};
|
|
13
|
+
/** A target's material state, and whether it's disabled: faded and not clickable while relations are active */
|
|
14
|
+
export type TargetState = {
|
|
15
|
+
readonly materialState?: MaterialState;
|
|
16
|
+
readonly disabled: boolean;
|
|
17
|
+
};
|
|
18
|
+
/** The state that only changes colors */
|
|
19
|
+
export type PaintState = StructureState & {
|
|
20
|
+
readonly selectedIds?: Record<string, boolean>;
|
|
21
|
+
readonly hoveredIds?: ReadonlySet<string>;
|
|
22
|
+
/** The target under the pointer */
|
|
23
|
+
readonly hoveredTarget?: number;
|
|
24
|
+
readonly dimensionsClickable: boolean;
|
|
25
|
+
};
|
|
26
|
+
/** Items of one material class share a material, and are drawn in one batch */
|
|
27
|
+
export type MaterialClass = {
|
|
28
|
+
readonly lit: boolean;
|
|
29
|
+
/** A physical finish of its own, instead of metalness and roughness */
|
|
30
|
+
readonly type?: MaterialType;
|
|
31
|
+
readonly metalness: number;
|
|
32
|
+
readonly roughness: number;
|
|
33
|
+
readonly side: "front" | "back" | "double";
|
|
34
|
+
readonly transparent: boolean;
|
|
35
|
+
/** Opaque solids whose material doesn't turn it off cast shadows */
|
|
36
|
+
readonly castShadow: boolean;
|
|
37
|
+
};
|
|
38
|
+
/** Bit flags of how a target is highlighted, so only targets whose highlight changed need a repaint */
|
|
39
|
+
export declare const HOVERED = 1;
|
|
40
|
+
export declare const SELECTED = 2;
|
|
41
|
+
export declare function getTargetStates(targets: ReadonlyArray<Target>, structure: StructureState): ReadonlyArray<TargetState>;
|
|
42
|
+
export declare function getMaterialClass(item: Item, { materialState, disabled }: TargetState): MaterialClass;
|
|
43
|
+
export declare function getHighlight(target: Target, targetIndex: number, state: PaintState): number;
|
|
44
|
+
/** The item's linear color and opacity by its target's highlight, written to `out`; hovered colors are darkened */
|
|
45
|
+
export declare function getItemColor(item: Item, { materialState, disabled }: TargetState, highlight: number, out: Vector4): Vector4;
|
|
46
|
+
//# sourceMappingURL=appearance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"appearance.d.ts","sourceRoot":"","sources":["../../../../src/renderers/three/appearance/appearance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,OAAO,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,KAAK,EAAY,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAGtE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE1D,gHAAgH;AAEhH,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;AAC3D,eAAO,MAAM,aAAa,UAAU,CAAC;AAErC,iFAAiF;AACjF,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC1D,wIAAwI;IACxI,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;CACnC,CAAC;AAEF,+GAA+G;AAC/G,MAAM,MAAM,WAAW,GAAG;IAAE,QAAQ,CAAC,aAAa,CAAC,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC;AAEjG,yCAAyC;AACzC,MAAM,MAAM,UAAU,GAAG,cAAc,GAAG;IACxC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/C,QAAQ,CAAC,UAAU,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC1C,mCAAmC;IACnC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;CACvC,CAAC;AAEF,+EAA+E;AAC/E,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB,uEAAuE;IACvE,QAAQ,CAAC,IAAI,CAAC,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;IAC3C,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,oEAAoE;IACpE,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B,CAAC;AAEF,uGAAuG;AACvG,eAAO,MAAM,OAAO,IAAI,CAAC;AACzB,eAAO,MAAM,QAAQ,IAAI,CAAC;AAgB1B,wBAAgB,eAAe,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,cAAc,GAAG,aAAa,CAAC,WAAW,CAAC,CAKrH;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAE,EAAE,WAAW,GAAG,aAAa,CAuBpG;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,MAAM,CAc3F;AAED,mHAAmH;AACnH,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAyB3H"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { Color } from "three";
|
|
2
|
+
import { materialTypes } from "../../../abstract-3d.js";
|
|
3
|
+
import { shade } from "../../../utils.js";
|
|
4
|
+
export const ERROR_IMG_KEY = "error";
|
|
5
|
+
/** Bit flags of how a target is highlighted, so only targets whose highlight changed need a repaint */
|
|
6
|
+
export const HOVERED = 1;
|
|
7
|
+
export const SELECTED = 2;
|
|
8
|
+
const disabledOpacity = 0.125;
|
|
9
|
+
const selectColor = "rgb(14,82,184)";
|
|
10
|
+
const textSelectColor = "rgb(0, 26, 65)";
|
|
11
|
+
/** Of the inverted hull around a relation's boxes */
|
|
12
|
+
const outlineColor = "rgb(0, 0, 0)";
|
|
13
|
+
const stateMaterials = {
|
|
14
|
+
Accept: { normal: "rgb(0,148,91)", metalness: 0.5, roughness: 0.5 },
|
|
15
|
+
Error: { normal: "#b82f3a", metalness: 0.5, roughness: 0.5 },
|
|
16
|
+
Warning: { normal: "rgb(240, 197, 48)", metalness: 0.5, roughness: 0.5 },
|
|
17
|
+
};
|
|
18
|
+
const unlit = { lit: false, metalness: 0, roughness: 1, transparent: false, castShadow: false };
|
|
19
|
+
/** Of glass without an opacity of its own */
|
|
20
|
+
const glassOpacity = 0.25;
|
|
21
|
+
export function getTargetStates(targets, structure) {
|
|
22
|
+
return targets.map((target) => {
|
|
23
|
+
const materialState = target.kind === "group" ? structure.activeComponents?.[target.id] : undefined;
|
|
24
|
+
return { materialState, disabled: target.kind === "group" && structure.relationsActive && materialState !== "Accept" };
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
export function getMaterialClass(item, { materialState, disabled }) {
|
|
28
|
+
const { material } = item.mesh;
|
|
29
|
+
switch (item.style) {
|
|
30
|
+
case "relation":
|
|
31
|
+
return { ...unlit, side: "double" };
|
|
32
|
+
case "outline":
|
|
33
|
+
return { ...unlit, side: "back" };
|
|
34
|
+
case "dimension":
|
|
35
|
+
return { ...unlit, side: "front", transparent: (material.opacity ?? 1) < 1 };
|
|
36
|
+
default: {
|
|
37
|
+
// A material state's color and finish replace the material's
|
|
38
|
+
const mat = materialState ? stateMaterials[materialState] : material;
|
|
39
|
+
// Only a known type, as data may have a type of its own, e.g. a number
|
|
40
|
+
const type = item.role === "solid" && materialTypes.includes(mat.type) ? mat.type : undefined;
|
|
41
|
+
return {
|
|
42
|
+
lit: item.role === "solid",
|
|
43
|
+
...(type ? { type, metalness: 0, roughness: 0 } : { metalness: mat.metalness ?? 0, roughness: mat.roughness ?? 1 }),
|
|
44
|
+
side: item.role === "text" || material.backfaceCulling ? "front" : "double",
|
|
45
|
+
transparent: getOpacity(material) < 1 || disabled,
|
|
46
|
+
castShadow: item.role === "solid" && getOpacity(material) === 1 && !disabled && material.castShadow !== false,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export function getHighlight(target, targetIndex, state) {
|
|
52
|
+
const hoveredByPointer = state.hoveredTarget === targetIndex;
|
|
53
|
+
switch (target.kind) {
|
|
54
|
+
case "relation":
|
|
55
|
+
return hoveredByPointer ? HOVERED : 0;
|
|
56
|
+
case "dimension":
|
|
57
|
+
return state.dimensionsClickable && !state.relationsActive && target.id !== undefined && (hoveredByPointer || !!state.selectedIds?.[target.id])
|
|
58
|
+
? SELECTED
|
|
59
|
+
: 0;
|
|
60
|
+
default:
|
|
61
|
+
return ((hoveredByPointer || (target.id !== "" && !!state.hoveredIds?.has(target.id)) ? HOVERED : 0) + (state.selectedIds?.[target.id] ? SELECTED : 0));
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/** The item's linear color and opacity by its target's highlight, written to `out`; hovered colors are darkened */
|
|
65
|
+
export function getItemColor(item, { materialState, disabled }, highlight, out) {
|
|
66
|
+
const { material } = item.mesh;
|
|
67
|
+
const hovered = highlight % SELECTED === HOVERED;
|
|
68
|
+
const selected = highlight >= SELECTED;
|
|
69
|
+
const opacity = getOpacity(material);
|
|
70
|
+
switch (item.style) {
|
|
71
|
+
case "relation":
|
|
72
|
+
return setColor(out, material.normal, hovered, 1);
|
|
73
|
+
case "outline":
|
|
74
|
+
return setColor(out, outlineColor, false, 1);
|
|
75
|
+
case "dimension":
|
|
76
|
+
return setColor(out, selected ? selectColor : material.normal, false, opacity);
|
|
77
|
+
default: {
|
|
78
|
+
const style = selected
|
|
79
|
+
? item.role === "text"
|
|
80
|
+
? textSelectColor
|
|
81
|
+
: selectColor
|
|
82
|
+
: materialState && item.role !== "image"
|
|
83
|
+
? stateMaterials[materialState].normal
|
|
84
|
+
: material.normal;
|
|
85
|
+
return item.role === "line"
|
|
86
|
+
? setColor(out, material.normal, false, 1)
|
|
87
|
+
: setColor(out, style, hovered, item.role === "solid" && disabled ? opacity * disabledOpacity : opacity);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/** Glass is mostly see-through unless its material says otherwise */
|
|
92
|
+
function getOpacity(material) {
|
|
93
|
+
return material.opacity ?? (material.type === "glass" ? glassOpacity : 1);
|
|
94
|
+
}
|
|
95
|
+
const colors = new Map();
|
|
96
|
+
function setColor(out, style, hovered, opacity) {
|
|
97
|
+
const key = hovered ? `hovered ${style}` : style;
|
|
98
|
+
const color = colors.get(key) ?? new Color(hovered ? (shade(-0.4, style) ?? style) : style);
|
|
99
|
+
colors.set(key, color);
|
|
100
|
+
return out.set(color.r, color.g, color.b, opacity);
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=appearance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"appearance.js","sourceRoot":"","sources":["../../../../src/renderers/three/appearance/appearance.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"appearance.test.d.ts","sourceRoot":"","sources":["../../../../src/renderers/three/appearance/appearance.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { Color, Vector4 } from "three";
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
import { box, line, text, vec3, vec3Zero } from "../../../abstract-3d.js";
|
|
4
|
+
import { shade } from "../../../utils.js";
|
|
5
|
+
import { getHighlight, getItemColor, getMaterialClass, getTargetStates, HOVERED, SELECTED } from "./appearance.js";
|
|
6
|
+
const red = "rgb(255, 0, 0)";
|
|
7
|
+
const select = "rgb(14,82,184)";
|
|
8
|
+
const item = (mesh, style = "group", role = "solid") => ({
|
|
9
|
+
mesh,
|
|
10
|
+
role,
|
|
11
|
+
style,
|
|
12
|
+
matrix: undefined,
|
|
13
|
+
target: 0,
|
|
14
|
+
data: undefined,
|
|
15
|
+
animation: undefined,
|
|
16
|
+
});
|
|
17
|
+
const solid = (material, style = "group") => item(box(vec3(1, 1, 1), material), style);
|
|
18
|
+
const group = { kind: "group", id: "fan", root: 0, rootData: undefined };
|
|
19
|
+
const relation = { kind: "relation", relation: { id: "r", pos: vec3Zero } };
|
|
20
|
+
const idle = { relationsActive: false, dimensionsClickable: true };
|
|
21
|
+
const round = (v) => Math.round(v * 1e4) / 1e4;
|
|
22
|
+
const rgba = (color, alpha = 1) => [...new Color(color).toArray(), alpha].map(round);
|
|
23
|
+
const classify = (i, target, state = {}) => getMaterialClass(i, getTargetStates([target], { ...idle, ...state })[0]);
|
|
24
|
+
const paint = (i, target, partial = {}) => {
|
|
25
|
+
const state = { ...idle, ...partial };
|
|
26
|
+
return getItemColor(i, getTargetStates([target], state)[0], getHighlight(target, 0, state), new Vector4())
|
|
27
|
+
.toArray()
|
|
28
|
+
.map(round);
|
|
29
|
+
};
|
|
30
|
+
describe("getMaterialClass", () => {
|
|
31
|
+
it("lights solids, with the material's metalness, roughness and side", () => {
|
|
32
|
+
expect(classify(solid({ normal: red, metalness: 0.3, roughness: 0.7 }), group)).toEqual({
|
|
33
|
+
lit: true,
|
|
34
|
+
metalness: 0.3,
|
|
35
|
+
roughness: 0.7,
|
|
36
|
+
side: "double",
|
|
37
|
+
transparent: false,
|
|
38
|
+
});
|
|
39
|
+
expect(classify(solid({ normal: red, backfaceCulling: true }), group)).toMatchObject({ side: "front", metalness: 0, roughness: 1 });
|
|
40
|
+
});
|
|
41
|
+
it("makes translucent materials and disabled groups transparent", () => {
|
|
42
|
+
expect(classify(solid({ normal: red, opacity: 0.5 }), group).transparent).toBe(true);
|
|
43
|
+
expect(classify(solid({ normal: red }), group, { relationsActive: true }).transparent).toBe(true);
|
|
44
|
+
expect(classify(solid({ normal: red }), group, { relationsActive: true, activeComponents: { fan: "Accept" } }).transparent).toBe(false);
|
|
45
|
+
});
|
|
46
|
+
it("uses the material state's metalness and roughness", () => {
|
|
47
|
+
expect(classify(solid({ normal: red }), group, { activeComponents: { fan: "Error" } })).toMatchObject({ metalness: 0.5, roughness: 0.5 });
|
|
48
|
+
});
|
|
49
|
+
it("draws relations unlit on both sides, and their outlines on the back", () => {
|
|
50
|
+
expect(classify(solid({ normal: red }, "relation"), relation)).toMatchObject({ lit: false, side: "double", transparent: false });
|
|
51
|
+
expect(classify(solid({ normal: red }, "outline"), relation)).toMatchObject({ lit: false, side: "back" });
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
describe("getHighlight", () => {
|
|
55
|
+
it("combines hover by the pointer or by id with selection", () => {
|
|
56
|
+
expect(getHighlight(group, 0, idle)).toBe(0);
|
|
57
|
+
expect(getHighlight(group, 0, { ...idle, hoveredTarget: 1 })).toBe(0);
|
|
58
|
+
expect(getHighlight(group, 0, { ...idle, hoveredTarget: 0, selectedIds: { fan: true } })).toBe(HOVERED + SELECTED);
|
|
59
|
+
expect(getHighlight(group, 0, { ...idle, hoveredIds: new Set(["fan"]) })).toBe(HOVERED);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
describe("getItemColor", () => {
|
|
63
|
+
it("is the material's color and opacity", () => {
|
|
64
|
+
expect(paint(solid({ normal: red, opacity: 0.5 }), group)).toEqual(rgba(red, 0.5));
|
|
65
|
+
});
|
|
66
|
+
it("darkens hovered groups, by the pointer or by id, and colors selected ones", () => {
|
|
67
|
+
expect(paint(solid({ normal: red }), group, { hoveredTarget: 0 })).toEqual(rgba(shade(-0.4, red)));
|
|
68
|
+
expect(paint(solid({ normal: red }), group, { hoveredIds: new Set(["fan"]) })).toEqual(rgba(shade(-0.4, red)));
|
|
69
|
+
expect(paint(solid({ normal: red }), group, { selectedIds: { fan: true } })).toEqual(rgba(select));
|
|
70
|
+
expect(paint(solid({ normal: red }), group, { selectedIds: { fan: true }, hoveredTarget: 0 })).toEqual(rgba(shade(-0.4, select)));
|
|
71
|
+
});
|
|
72
|
+
it("ignores hover by id for groups without an id", () => {
|
|
73
|
+
expect(paint(solid({ normal: red }), { ...group, id: "" }, { hoveredIds: new Set([""]) })).toEqual(rgba(red));
|
|
74
|
+
});
|
|
75
|
+
it("colors groups by their material state and fades disabled ones", () => {
|
|
76
|
+
expect(paint(solid({ normal: red }), group, { activeComponents: { fan: "Accept" } })).toEqual(rgba("rgb(0,148,91)"));
|
|
77
|
+
expect(paint(solid({ normal: red, opacity: 0.8 }), group, { relationsActive: true })).toEqual(rgba(red, 0.1));
|
|
78
|
+
});
|
|
79
|
+
it("selects text in a dark blue", () => {
|
|
80
|
+
expect(paint(item(text(vec3Zero, "A", 1, { normal: red }), "group", "text"), group, { selectedIds: { fan: true } })).toEqual(rgba("rgb(0, 26, 65)"));
|
|
81
|
+
});
|
|
82
|
+
it("keeps lines in their material's color", () => {
|
|
83
|
+
expect(paint(item(line(vec3Zero, vec3(1, 0, 0), 1, { normal: red }), "group", "line"), group, { selectedIds: { fan: true } })).toEqual(rgba(red));
|
|
84
|
+
});
|
|
85
|
+
it("highlights clickable dimensions when hovered or selected", () => {
|
|
86
|
+
const dimension = { kind: "dimension", id: "fan" };
|
|
87
|
+
const d = solid({ normal: red }, "dimension");
|
|
88
|
+
expect(paint(d, dimension, { hoveredTarget: 0 })).toEqual(rgba(select));
|
|
89
|
+
expect(paint(d, dimension, { selectedIds: { fan: true } })).toEqual(rgba(select));
|
|
90
|
+
expect(paint(d, dimension, { selectedIds: { fan: true }, dimensionsClickable: false })).toEqual(rgba(red));
|
|
91
|
+
expect(paint(d, dimension, { selectedIds: { fan: true }, relationsActive: true })).toEqual(rgba(red));
|
|
92
|
+
});
|
|
93
|
+
it("darkens hovered relations", () => {
|
|
94
|
+
expect(paint(solid({ normal: red }, "relation"), relation, { hoveredTarget: 0 })).toEqual(rgba(shade(-0.4, red)));
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
//# sourceMappingURL=appearance.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"appearance.test.js","sourceRoot":"","sources":["../../../../src/renderers/three/appearance/appearance.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { type Vector4 } from "three";
|
|
2
|
+
import type { Material } from "../../abstract-3d.js";
|
|
3
|
+
import type { Item, Target } from "./compile.js";
|
|
4
|
+
/** Material classes and per-instance colors of items, by the viewer's state */
|
|
5
|
+
export type MaterialState = "Accept" | "Error" | "Warning";
|
|
6
|
+
export declare const ERROR_IMG_KEY = "error";
|
|
7
|
+
/** The state that decides material classes, so changing it rebuilds the scene */
|
|
8
|
+
export type StructureState = {
|
|
9
|
+
readonly activeComponents?: Record<string, MaterialState>;
|
|
10
|
+
/** Relations are active, e.g. to pick one to insert a component on, so only the groups whose material state is Accept can be clicked */
|
|
11
|
+
readonly relationsActive: boolean;
|
|
12
|
+
};
|
|
13
|
+
/** The state that only changes colors */
|
|
14
|
+
export type PaintState = StructureState & {
|
|
15
|
+
readonly selectedIds?: Record<string, boolean>;
|
|
16
|
+
readonly hoveredIds?: ReadonlySet<string>;
|
|
17
|
+
/** The target under the pointer */
|
|
18
|
+
readonly hoveredTarget?: number;
|
|
19
|
+
readonly dimensionsClickable: boolean;
|
|
20
|
+
};
|
|
21
|
+
export type Side = "front" | "back" | "double";
|
|
22
|
+
/** Items of one material class share a material, and are drawn in one batch */
|
|
23
|
+
export type MaterialClass = {
|
|
24
|
+
readonly lit: boolean;
|
|
25
|
+
readonly metalness: number;
|
|
26
|
+
readonly roughness: number;
|
|
27
|
+
readonly side: Side;
|
|
28
|
+
readonly transparent: boolean;
|
|
29
|
+
};
|
|
30
|
+
export declare const selectMat: Material;
|
|
31
|
+
export declare const getMaterialState: (target: Target, state: StructureState) => MaterialState | undefined;
|
|
32
|
+
export declare const isDisabled: (target: Target, state: StructureState) => boolean;
|
|
33
|
+
export declare function getMaterialClass(item: Item, target: Target, state: StructureState): MaterialClass;
|
|
34
|
+
export declare const materialClassKey: (c: MaterialClass) => string;
|
|
35
|
+
/** Bit flags of how a target is highlighted, so only targets whose highlight changed need a repaint */
|
|
36
|
+
export declare const HOVERED = 1;
|
|
37
|
+
export declare const SELECTED = 2;
|
|
38
|
+
export declare function getHighlight(target: Target, targetIndex: number, state: PaintState): number;
|
|
39
|
+
/** The item's linear color and opacity by its target's highlight, written to `out` */
|
|
40
|
+
export declare function getItemColor(item: Item, target: Target, highlight: number, state: StructureState, out: Vector4): Vector4;
|
|
41
|
+
//# sourceMappingURL=appearance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"appearance.d.ts","sourceRoot":"","sources":["../../../src/renderers/three/appearance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,OAAO,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEjD,+EAA+E;AAE/E,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;AAC3D,eAAO,MAAM,aAAa,UAAU,CAAC;AAErC,iFAAiF;AACjF,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC1D,wIAAwI;IACxI,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;CACnC,CAAC;AAEF,yCAAyC;AACzC,MAAM,MAAM,UAAU,GAAG,cAAc,GAAG;IACxC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/C,QAAQ,CAAC,UAAU,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC1C,mCAAmC;IACnC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,IAAI,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE/C,+EAA+E;AAC/E,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;CAC/B,CAAC;AAMF,eAAO,MAAM,SAAS,EAAE,QAAqF,CAAC;AAI9G,eAAO,MAAM,gBAAgB,WAAY,MAAM,SAAS,cAAc,KAAG,aAAa,GAAG,SACd,CAAC;AAE5E,eAAO,MAAM,UAAU,WAAY,MAAM,SAAS,cAAc,KAAG,OAC+B,CAAC;AAEnG,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,aAAa,CAqBjG;AAED,eAAO,MAAM,gBAAgB,MAAO,aAAa,KAAG,MAA6E,CAAC;AAElI,uGAAuG;AACvG,eAAO,MAAM,OAAO,IAAI,CAAC;AACzB,eAAO,MAAM,QAAQ,IAAI,CAAC;AAE1B,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,MAAM,CAc3F;AAED,sFAAsF;AACtF,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAoBxH"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { Color } from "three";
|
|
2
|
+
import { shade } from "../../utils.js";
|
|
3
|
+
export const ERROR_IMG_KEY = "error";
|
|
4
|
+
const disabledOpacity = 0.125;
|
|
5
|
+
const acceptMat = { normal: "rgb(0,148,91)", opacity: 1.0, metalness: 0.5, roughness: 0.5 };
|
|
6
|
+
const errorMat = { normal: "#b82f3a", opacity: 1.0, metalness: 0.5, roughness: 0.5 };
|
|
7
|
+
const warningMat = { normal: "rgb(240, 197, 48)", opacity: 1.0, metalness: 0.5, roughness: 0.5 };
|
|
8
|
+
export const selectMat = { normal: "rgb(14,82,184)", opacity: 1.0, metalness: 0.5, roughness: 0.5 };
|
|
9
|
+
const textSelectMat = { normal: "rgb(0, 26, 65)", opacity: 1.0, metalness: 0.5, roughness: 0.5 };
|
|
10
|
+
const stateMats = { Accept: acceptMat, Error: errorMat, Warning: warningMat };
|
|
11
|
+
export const getMaterialState = (target, state) => target.kind === "group" ? state.activeComponents?.[target.id] : undefined;
|
|
12
|
+
export const isDisabled = (target, state) => target.kind === "group" && state.relationsActive && getMaterialState(target, state) !== "Accept";
|
|
13
|
+
export function getMaterialClass(item, target, state) {
|
|
14
|
+
const material = item.mesh.material;
|
|
15
|
+
switch (item.style) {
|
|
16
|
+
case "relation":
|
|
17
|
+
return { lit: false, metalness: 0, roughness: 1, side: "double", transparent: false };
|
|
18
|
+
case "outline":
|
|
19
|
+
return { lit: false, metalness: 0, roughness: 1, side: "back", transparent: false };
|
|
20
|
+
case "dimension":
|
|
21
|
+
return { lit: false, metalness: 0, roughness: 1, side: "front", transparent: getOpacity(material) < 1 };
|
|
22
|
+
default: {
|
|
23
|
+
const materialState = getMaterialState(target, state);
|
|
24
|
+
const mat = materialState ? stateMats[materialState] : material;
|
|
25
|
+
return {
|
|
26
|
+
lit: item.role === "solid",
|
|
27
|
+
metalness: mat.metalness ?? 0,
|
|
28
|
+
roughness: mat.roughness ?? 1,
|
|
29
|
+
side: item.role === "text" ? "front" : material.backfaceCulling ? "front" : "double",
|
|
30
|
+
transparent: getOpacity(material) < 1 || isDisabled(target, state),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export const materialClassKey = (c) => `${c.lit}|${c.metalness}|${c.roughness}|${c.side}|${c.transparent}`;
|
|
36
|
+
/** Bit flags of how a target is highlighted, so only targets whose highlight changed need a repaint */
|
|
37
|
+
export const HOVERED = 1;
|
|
38
|
+
export const SELECTED = 2;
|
|
39
|
+
export function getHighlight(target, targetIndex, state) {
|
|
40
|
+
const hoveredByPointer = state.hoveredTarget === targetIndex;
|
|
41
|
+
switch (target.kind) {
|
|
42
|
+
case "relation":
|
|
43
|
+
return hoveredByPointer ? HOVERED : 0;
|
|
44
|
+
case "dimension": {
|
|
45
|
+
const id = state.dimensionsClickable && !state.relationsActive ? target.id : undefined;
|
|
46
|
+
return id !== undefined && (hoveredByPointer || !!state.selectedIds?.[id]) ? SELECTED : 0;
|
|
47
|
+
}
|
|
48
|
+
default: {
|
|
49
|
+
const hovered = hoveredByPointer || (target.id !== "" && !!state.hoveredIds?.has(target.id));
|
|
50
|
+
return (hovered ? HOVERED : 0) + (state.selectedIds?.[target.id] ? SELECTED : 0);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/** The item's linear color and opacity by its target's highlight, written to `out` */
|
|
55
|
+
export function getItemColor(item, target, highlight, state, out) {
|
|
56
|
+
const material = item.mesh.material;
|
|
57
|
+
const hovered = highlight % SELECTED === HOVERED;
|
|
58
|
+
const selected = highlight >= SELECTED;
|
|
59
|
+
switch (item.style) {
|
|
60
|
+
case "relation":
|
|
61
|
+
case "outline":
|
|
62
|
+
return rgba(stateColor(false, hovered, material, selectMat), 1, out);
|
|
63
|
+
case "dimension":
|
|
64
|
+
return rgba(selected ? selectMat.normal : material.normal, getOpacity(material), out);
|
|
65
|
+
default: {
|
|
66
|
+
if (item.role === "line") {
|
|
67
|
+
return rgba(material.normal, 1, out);
|
|
68
|
+
}
|
|
69
|
+
const materialState = getMaterialState(target, state);
|
|
70
|
+
const mat = materialState && item.role !== "image" ? stateMats[materialState] : material;
|
|
71
|
+
const opacity = item.role === "solid" && isDisabled(target, state) ? getOpacity(material) * disabledOpacity : getOpacity(material);
|
|
72
|
+
return rgba(stateColor(selected, hovered, mat, item.role === "text" ? textSelectMat : selectMat), opacity, out);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
const getOpacity = (material) => material.opacity ?? 1;
|
|
77
|
+
function stateColor(selected, hovered, mat, selectedMat) {
|
|
78
|
+
const color = selected ? selectedMat.normal : mat.normal;
|
|
79
|
+
return hovered ? shaded(color) : color;
|
|
80
|
+
}
|
|
81
|
+
const shadedCache = new Map();
|
|
82
|
+
function shaded(color) {
|
|
83
|
+
const cached = shadedCache.get(color);
|
|
84
|
+
if (cached !== undefined) {
|
|
85
|
+
return cached;
|
|
86
|
+
}
|
|
87
|
+
const result = shade(-0.4, color) ?? color;
|
|
88
|
+
shadedCache.set(color, result);
|
|
89
|
+
return result;
|
|
90
|
+
}
|
|
91
|
+
const colorCache = new Map();
|
|
92
|
+
function rgba(style, opacity, out) {
|
|
93
|
+
const cached = colorCache.get(style);
|
|
94
|
+
const color = cached ?? new Color(style);
|
|
95
|
+
if (!cached) {
|
|
96
|
+
colorCache.set(style, color);
|
|
97
|
+
}
|
|
98
|
+
return out.set(color.r, color.g, color.b, opacity);
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=appearance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"appearance.js","sourceRoot":"","sources":["../../../src/renderers/three/appearance.ts"],"names":[],"mappings":"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"}
|