abstract-3d 2.10.3 → 2.10.5
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/lib/renderers/react/react-camera.d.ts.map +1 -1
- package/lib/renderers/react/react-camera.js +45 -49
- package/lib/renderers/react/react-camera.js.map +1 -1
- package/lib/renderers/react/react-group.d.ts +7 -2
- package/lib/renderers/react/react-group.d.ts.map +1 -1
- package/lib/renderers/react/react-group.js +18 -5
- package/lib/renderers/react/react-group.js.map +1 -1
- package/package.json +2 -2
- package/src/renderers/react/react-camera.tsx +54 -57
- package/src/renderers/react/react-group.test.ts +56 -0
- package/src/renderers/react/react-group.tsx +61 -39
- package/lib/renderers/dxf/color.d.ts +0 -7
- package/lib/renderers/dxf/color.d.ts.map +0 -1
- package/lib/renderers/dxf/color.js +0 -311
- package/lib/renderers/dxf/color.js.map +0 -1
- package/lib/renderers/dxf/dxf-encoding.d.ts +0 -17
- package/lib/renderers/dxf/dxf-encoding.d.ts.map +0 -1
- package/lib/renderers/dxf/dxf-encoding.js +0 -18467
- package/lib/renderers/dxf/dxf-encoding.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react-camera.d.ts","sourceRoot":"","sources":["../../../src/renderers/react/react-camera.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,gBAAgB,EAGrB,KAAK,kBAAkB,EAKxB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,KAAK,UAAU,EAAY,MAAM,oBAAoB,CAAC;AAC/D,OAAO,KAA4C,MAAM,OAAO,CAAC;AAIjE,OAAO,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAG9D,MAAM,MAAM,MAAM,GAAG,oBAAoB,GAAG,qBAAqB,CAAC;AAClE,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;AAExC,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAC,GAAG;IACnD,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAAE,WAAW,GAAG,QAAQ,CAAC,CAAC;CAChE,CAAC;AACF,KAAK,QAAQ,GAAG;IACd,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,aAAa,EAAE,YAAY,CAAC;CACtC,CAAC;AACF,KAAK,QAAQ,GAAG;IACd,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,aAAa,EAAE,kBAAkB,CAAC;CAC5C,CAAC;AAKF,wBAAgB,WAAW,CAAC,EAC1B,aAAa,EAAE,cAAc,EAC7B,MAAM,EACN,IAAI,EACJ,KAAK,EACL,cAAc,EACd,iBAAiB,EACjB,WAAgB,EAChB,UAAc,GACf,EAAE;IACD,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,cAAc,CAAC,EAAE,cAAc,CAAC;IACzC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,kBAAkB,CAAC;IAChD,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC;IACnC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,
|
|
1
|
+
{"version":3,"file":"react-camera.d.ts","sourceRoot":"","sources":["../../../src/renderers/react/react-camera.tsx"],"names":[],"mappings":"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"}
|
|
@@ -10,42 +10,14 @@ export function ReactCamera({ useAnimations: _useAnimations, camera, view, scene
|
|
|
10
10
|
const [controls, setControls] = useState(null);
|
|
11
11
|
const perspectiveRef = useRef(undefined);
|
|
12
12
|
const orthographicRef = useRef(undefined);
|
|
13
|
-
const initialDistRef = useRef(null);
|
|
14
13
|
const initialTargetRef = useRef(new Vector3());
|
|
15
|
-
const initialFovRef = useRef(null);
|
|
16
14
|
const viewPortAspect = useThree(({ viewport: { aspect } }) => aspect);
|
|
17
15
|
const canvasSize = useThree(({ size }) => size);
|
|
18
16
|
const invalidate = useThree(({ invalidate }) => invalidate);
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
const newCamera = (camera.type === "Perspective" ? perspectiveRef.current : orthographicRef.current);
|
|
24
|
-
const target = initialTargetRef.current.clone();
|
|
25
|
-
// oxlint-disable-next-line typescript/no-unsafe-call -- oxlint's type-aware checker resolves OrbitControlsInstance as `any` (see the note on its declaration above); tsc resolves it correctly
|
|
26
|
-
controls.target.copy(target);
|
|
27
|
-
const dist = initialDistRef.current;
|
|
28
|
-
const dir = newCamera.position.clone().sub(target).normalize();
|
|
29
|
-
newCamera.fov = initialFovRef.current;
|
|
30
|
-
newCamera.zoom = 1;
|
|
31
|
-
newCamera.position.copy(target.clone().add(dir.multiplyScalar(dist)));
|
|
32
|
-
if (camera.type === "Perspective") {
|
|
33
|
-
const bufLeft = bufferZones.left ?? 0;
|
|
34
|
-
const bufRight = bufferZones.right ?? 0;
|
|
35
|
-
const bufTop = bufferZones.top ?? 0;
|
|
36
|
-
const bufBottom = bufferZones.bottom ?? 0;
|
|
37
|
-
const canvasW = canvasSize.width;
|
|
38
|
-
const canvasH = canvasSize.height;
|
|
39
|
-
const usableW = Math.max(1, canvasW - bufLeft - bufRight);
|
|
40
|
-
const usableH = Math.max(1, canvasH - bufTop - bufBottom);
|
|
41
|
-
newCamera.setViewOffset(usableW, usableH, -bufLeft, -bufTop, canvasW, canvasH);
|
|
42
|
-
}
|
|
43
|
-
newCamera.updateProjectionMatrix();
|
|
44
|
-
// oxlint-disable-next-line typescript/no-unsafe-call -- oxlint's type-aware checker resolves OrbitControlsInstance as `any` (see the note on its declaration above); tsc resolves it correctly
|
|
45
|
-
controls.update();
|
|
46
|
-
invalidate();
|
|
47
|
-
};
|
|
48
|
-
useLayoutEffect(() => {
|
|
17
|
+
// Fits the active camera's frustum to the latest scene/canvas/buffer zones.
|
|
18
|
+
// Returns the fitted camera, its fit distance and the view's default direction;
|
|
19
|
+
// callers position the camera and call updateProjectionMatrix().
|
|
20
|
+
const fitCamera = () => {
|
|
49
21
|
const [posX, posY, posZ, size, sceneAspect] = getViewTransform(view, scene);
|
|
50
22
|
// size.x/y are scene width/height in screen space (remapped per view direction)
|
|
51
23
|
const screenW = size.x;
|
|
@@ -61,19 +33,19 @@ export function ReactCamera({ useAnimations: _useAnimations, camera, view, scene
|
|
|
61
33
|
const canvasW = canvasSize.width;
|
|
62
34
|
const canvasH = canvasSize.height;
|
|
63
35
|
if (canvasW === 0 || canvasH === 0) {
|
|
64
|
-
return;
|
|
36
|
+
return undefined;
|
|
65
37
|
}
|
|
66
38
|
// Usable area in CSS pixels
|
|
67
39
|
const usableW = Math.max(1, canvasW - bufLeft - bufRight);
|
|
68
40
|
const usableH = Math.max(1, canvasH - bufTop - bufBottom);
|
|
69
41
|
const usableAspect = usableW / usableH;
|
|
70
|
-
|
|
42
|
+
const viewDir = new Vector3(posX, posY, posZ);
|
|
71
43
|
// ------------------------------------------------------------------
|
|
72
44
|
// ORTHOGRAPHIC
|
|
73
45
|
// ------------------------------------------------------------------
|
|
74
46
|
if (camera.type === "Orthographic" && orthographicRef.current) {
|
|
47
|
+
const cam = orthographicRef.current;
|
|
75
48
|
const dist = cameraDist(size, fov);
|
|
76
|
-
initialDistRef.current = dist;
|
|
77
49
|
// Fit scene into the usable area
|
|
78
50
|
const padFactor = 1 + fitPadding;
|
|
79
51
|
const { sceneHalfW, sceneHalfH } = sceneAspect > usableAspect
|
|
@@ -91,18 +63,18 @@ export function ReactCamera({ useAnimations: _useAnimations, camera, view, scene
|
|
|
91
63
|
const wpp = (sceneHalfW * 2) / usableW;
|
|
92
64
|
const hpp = (sceneHalfH * 2) / usableH;
|
|
93
65
|
// Extend frustum outward by buffer pixel amounts
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
orthographicRef.current.updateProjectionMatrix();
|
|
66
|
+
cam.left = -sceneHalfW - bufLeft * wpp;
|
|
67
|
+
cam.right = sceneHalfW + bufRight * wpp;
|
|
68
|
+
cam.top = sceneHalfH + bufTop * hpp;
|
|
69
|
+
cam.bottom = -sceneHalfH - bufBottom * hpp;
|
|
70
|
+
cam.zoom = 1;
|
|
71
|
+
return { cam, dist, viewDir };
|
|
101
72
|
// ------------------------------------------------------------------
|
|
102
73
|
// PERSPECTIVE
|
|
103
74
|
// ------------------------------------------------------------------
|
|
104
75
|
}
|
|
105
76
|
else if (camera.type === "Perspective" && perspectiveRef.current) {
|
|
77
|
+
const cam = perspectiveRef.current;
|
|
106
78
|
const fovRad = (fov * Math.PI) / 180;
|
|
107
79
|
// Horizontal FOV across just the *usable* area (not the full canvas) —
|
|
108
80
|
// this is what the camera's fov/aspect should describe.
|
|
@@ -112,18 +84,42 @@ export function ReactCamera({ useAnimations: _useAnimations, camera, view, scene
|
|
|
112
84
|
const distForH = screenH / 2 / Math.tan(fovRad / 2) + size.z * 0.5;
|
|
113
85
|
const distForW = screenW / 2 / Math.tan(fovHRad / 2) + size.z * 0.5;
|
|
114
86
|
const dist = Math.max(distForH, distForW) * (1 + fitPadding);
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
perspectiveRef.current.position.set(posX * dist, posY * dist, posZ * dist);
|
|
87
|
+
cam.fov = fov;
|
|
88
|
+
cam.aspect = usableAspect;
|
|
89
|
+
cam.zoom = 1;
|
|
119
90
|
// Slice/extend the rendered frustum from the usable-area-sized window
|
|
120
91
|
// out to the full canvas, asymmetrically per buffer side.
|
|
121
|
-
|
|
122
|
-
|
|
92
|
+
cam.setViewOffset(usableW, usableH, -bufLeft, -bufTop, canvasW, canvasH);
|
|
93
|
+
return { cam, dist, viewDir };
|
|
94
|
+
}
|
|
95
|
+
return undefined;
|
|
96
|
+
};
|
|
97
|
+
const resetZoomOnGizmoClick = () => {
|
|
98
|
+
const fit = fitCamera();
|
|
99
|
+
if (!controls || !fit) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const target = initialTargetRef.current.clone();
|
|
103
|
+
// oxlint-disable-next-line typescript/no-unsafe-call -- oxlint's type-aware checker resolves OrbitControlsInstance as `any` (see the note on its declaration above); tsc resolves it correctly
|
|
104
|
+
controls.target.copy(target);
|
|
105
|
+
// Keep the current direction, the gizmo animates the rotation itself
|
|
106
|
+
const dir = fit.cam.position.clone().sub(target).normalize();
|
|
107
|
+
fit.cam.position.copy(target.add(dir.multiplyScalar(fit.dist)));
|
|
108
|
+
fit.cam.updateProjectionMatrix();
|
|
109
|
+
// oxlint-disable-next-line typescript/no-unsafe-call -- oxlint's type-aware checker resolves OrbitControlsInstance as `any` (see the note on its declaration above); tsc resolves it correctly
|
|
110
|
+
controls.update();
|
|
111
|
+
invalidate();
|
|
112
|
+
};
|
|
113
|
+
useLayoutEffect(() => {
|
|
114
|
+
const fit = fitCamera();
|
|
115
|
+
if (!fit) {
|
|
116
|
+
return;
|
|
123
117
|
}
|
|
118
|
+
fit.cam.position.copy(fit.viewDir.multiplyScalar(fit.dist));
|
|
119
|
+
fit.cam.updateProjectionMatrix();
|
|
124
120
|
//}, [camera, viewPortAspect, canvasSize, bufferZones, view, scene, fitPadding]);
|
|
125
121
|
// oxlint-disable-next-line react-hooks/exhaustive-deps -- deps intentionally trimmed, see b290bc3e;
|
|
126
|
-
}, [camera, viewPortAspect
|
|
122
|
+
}, [camera, viewPortAspect]);
|
|
127
123
|
return (_jsxs(_Fragment, { children: [_jsx(PerspectiveCamera, { ref: perspectiveRef, near: camera.near, far: camera.far, fov: camera.type === "Perspective" ? camera.fov : 75, aspect: viewPortAspect, manual: true, makeDefault: camera.type === "Perspective" }), _jsx(OrthographicCamera, { ref: orthographicRef, up: [0, 1, 0], near: camera.near, far: camera.far, manual: true, makeDefault: camera.type === "Orthographic" }), _jsx(ControlsWrapper, { ...orbitContolsProps, setControls: (c) => {
|
|
128
124
|
setControls(c);
|
|
129
125
|
} }), (() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react-camera.js","sourceRoot":"","sources":["../../../src/renderers/react/react-camera.tsx"],"names":[],"mappings":";AAAA,OAAO,EAEL,iBAAiB,EACjB,kBAAkB,EAElB,aAAa,EACb,WAAW,EACX,aAAa,EACb,aAAa,GACd,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAmB,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,KAAK,EAAE,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjE,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAwC5C,MAAM,UAAU,WAAW,CAAC,EAC1B,aAAa,EAAE,cAAc,EAC7B,MAAM,EACN,IAAI,EACJ,KAAK,EACL,cAAc,EACd,iBAAiB,EACjB,WAAW,GAAG,EAAE,EAChB,UAAU,GAAG,CAAC,GAUf;IACC,oQAAoQ;IACpQ,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAA+B,IAAI,CAAC,CAAC;IAC7E,MAAM,cAAc,GAAG,MAAM,CAAqC,SAAS,CAAC,CAAC;IAC7E,MAAM,eAAe,GAAG,MAAM,CAAsC,SAAS,CAAC,CAAC;IAE/E,MAAM,
|
|
1
|
+
{"version":3,"file":"react-camera.js","sourceRoot":"","sources":["../../../src/renderers/react/react-camera.tsx"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,9 @@ import React from "react";
|
|
|
3
3
|
import type { Group as Group_1 } from "../../abstract-3d.js";
|
|
4
4
|
import type { MaterialState } from "./react-material.js";
|
|
5
5
|
import type { ReactPopover } from "./react-types.js";
|
|
6
|
-
export declare
|
|
6
|
+
export declare const ReactGroup: React.MemoExoticComponent<typeof ReactGroupBase>;
|
|
7
|
+
declare function ReactGroupBase({ g, materialStateImages, hoveredIdsExternal, selectedIds, hotSpotsActive, activeComponents, useAlphaTest, id, rootData, hoveredParent, onClickGroup, onHoverGroup, onContextMenuGroup, createGroupKey, getTooltips, }: ReactGroupProps): React.JSX.Element;
|
|
8
|
+
export type ReactGroupProps = {
|
|
7
9
|
readonly g: Group_1;
|
|
8
10
|
readonly materialStateImages?: Record<string, string>;
|
|
9
11
|
readonly hoveredIdsExternal: ReadonlyArray<string> | undefined;
|
|
@@ -19,5 +21,8 @@ export declare function ReactGroup({ g, materialStateImages, hoveredIdsExternal,
|
|
|
19
21
|
readonly onContextMenuGroup?: (id: string, rootData: Record<string, string> | undefined, data: Record<string, string> | undefined, left: number, top: number, e: ThreeEvent<MouseEvent>) => void;
|
|
20
22
|
readonly getTooltips?: (id: string) => ReadonlyArray<ReactPopover>;
|
|
21
23
|
readonly createGroupKey?: (g: Group_1, idx: number, rootData: Record<string, string> | undefined, id: string) => string;
|
|
22
|
-
}
|
|
24
|
+
};
|
|
25
|
+
/** Shallow compare, except that selectedIds and activeComponents are only read at the group's own id (nested groups share it). */
|
|
26
|
+
export declare function groupPropsEqual(prev: ReactGroupProps, next: ReactGroupProps): boolean;
|
|
27
|
+
export {};
|
|
23
28
|
//# sourceMappingURL=react-group.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react-group.d.ts","sourceRoot":"","sources":["../../../src/renderers/react/react-group.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,KAAK,IAAI,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD,
|
|
1
|
+
{"version":3,"file":"react-group.d.ts","sourceRoot":"","sources":["../../../src/renderers/react/react-group.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,KAAK,IAAI,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD,eAAO,MAAM,UAAU,kDAA8C,CAAC;AAEtE,iBAAS,cAAc,CAAC,EACtB,CAAC,EACD,mBAAmB,EACnB,kBAAkB,EAClB,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,EAAE,EACF,QAAQ,EACR,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,WAAW,GACZ,EAAE,eAAe,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CA0HrC;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtD,QAAQ,CAAC,kBAAkB,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IAC/D,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAC1D,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,SAAS,CAAC;IACrE,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IACtD,QAAQ,CAAC,YAAY,CAAC,EAAE,CACtB,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,CAAC,EAAE,UAAU,CAAC,UAAU,CAAC,KACtB,IAAI,CAAC;IACV,QAAQ,CAAC,YAAY,CAAC,EAAE,CACtB,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,CAAC,EAAE,UAAU,CAAC,UAAU,CAAC,KACtB,IAAI,CAAC;IACV,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,CAAC,EAAE,UAAU,CAAC,UAAU,CAAC,KACtB,IAAI,CAAC;IACV,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,aAAa,CAAC,YAAY,CAAC,CAAC;IACnE,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EAAE,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC;CACzH,CAAC;AAEF,kIAAkI;AAClI,wBAAgB,eAAe,CAAC,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAUrF"}
|
|
@@ -5,7 +5,8 @@ import React from "react";
|
|
|
5
5
|
import { ImageMaterial } from "./react-image-material.js";
|
|
6
6
|
import { ReactMaterial } from "./react-material.js";
|
|
7
7
|
import { ReactMesh } from "./react-mesh.js";
|
|
8
|
-
export
|
|
8
|
+
export const ReactGroup = React.memo(ReactGroupBase, groupPropsEqual);
|
|
9
|
+
function ReactGroupBase({ g, materialStateImages, hoveredIdsExternal, selectedIds, hotSpotsActive, activeComponents, useAlphaTest, id, rootData, hoveredParent, onClickGroup, onHoverGroup, onContextMenuGroup, createGroupKey, getTooltips, }) {
|
|
9
10
|
const ref = React.useRef(undefined);
|
|
10
11
|
useFrame(({ invalidate }, delta) => {
|
|
11
12
|
if (g.animation) {
|
|
@@ -24,6 +25,11 @@ export function ReactGroup({ g, materialStateImages, hoveredIdsExternal, selecte
|
|
|
24
25
|
}
|
|
25
26
|
});
|
|
26
27
|
const [hovered, setHovered] = React.useState(false);
|
|
28
|
+
// Stable so the memoized child groups below can skip rendering
|
|
29
|
+
const onChildHoverGroup = React.useCallback((hId, rData, data, e) => {
|
|
30
|
+
setHovered(hId !== undefined);
|
|
31
|
+
onHoverGroup?.(hId, rData, data, e);
|
|
32
|
+
}, [onHoverGroup]);
|
|
27
33
|
// oxlint-disable-next-line typescript/prefer-nullish-coalescing -- `id && ...includes(id)` can legitimately be `false`, which must fall through to hoveredParent
|
|
28
34
|
const hoveredFinal = hovered || (id && hoveredIdsExternal?.includes(id)) || !!hoveredParent;
|
|
29
35
|
const selected = selectedIds?.[id ?? ""];
|
|
@@ -58,12 +64,19 @@ export function ReactGroup({ g, materialStateImages, hoveredIdsExternal, selecte
|
|
|
58
64
|
onContextMenuGroup(id, rootData, g.data, e.nativeEvent.x, e.nativeEvent.y, e);
|
|
59
65
|
}
|
|
60
66
|
},
|
|
61
|
-
}), children: [g.groups?.map((g, i) => (_jsx(ReactGroup, { g: g, selectedIds: selectedIds, hotSpotsActive: hotSpotsActive, activeComponents: activeComponents, materialStateImages: materialStateImages, hoveredIdsExternal: hoveredIdsExternal, hoveredParent: hoveredFinal, onClickGroup: onClickGroup, onHoverGroup: (
|
|
62
|
-
setHovered(hId !== undefined);
|
|
63
|
-
onHoverGroup?.(hId, rData, data, e);
|
|
64
|
-
}, onContextMenuGroup: onContextMenuGroup, getTooltips: getTooltips, id: id, rootData: rootData, createGroupKey: createGroupKey, useAlphaTest: useAlphaTest }, createGroupKey ? createGroupKey(g, i, rootData, id ?? "") : i))), g.meshes?.map((m, i) => (_jsx(ReactMesh, { mesh: m, children: m.geometry.type === "Image" ? (_jsx(ImageMaterial, { image: m.geometry.image, materialStateImages: materialStateImages, material: m.material, useAlphaTest: useAlphaTest, hovered: hoveredFinal, materialState: materialState, selected: selected })) : (_jsx(ReactMaterial, { material: m.material, selected: selected, isText: m.geometry.type === "Text", hovered: hoveredFinal, disabled: disabled, materialState: materialState })) }, i))), hovered &&
|
|
67
|
+
}), children: [g.groups?.map((g, i) => (_jsx(ReactGroup, { g: g, selectedIds: selectedIds, hotSpotsActive: hotSpotsActive, activeComponents: activeComponents, materialStateImages: materialStateImages, hoveredIdsExternal: hoveredIdsExternal, hoveredParent: hoveredFinal, onClickGroup: onClickGroup, onHoverGroup: onChildHoverGroup, onContextMenuGroup: onContextMenuGroup, getTooltips: getTooltips, id: id, rootData: rootData, createGroupKey: createGroupKey, useAlphaTest: useAlphaTest }, createGroupKey ? createGroupKey(g, i, rootData, id ?? "") : i))), g.meshes?.map((m, i) => (_jsx(ReactMesh, { mesh: m, children: m.geometry.type === "Image" ? (_jsx(ImageMaterial, { image: m.geometry.image, materialStateImages: materialStateImages, material: m.material, useAlphaTest: useAlphaTest, hovered: hoveredFinal, materialState: materialState, selected: selected })) : (_jsx(ReactMaterial, { material: m.material, selected: selected, isText: m.geometry.type === "Text", hovered: hoveredFinal, disabled: disabled, materialState: materialState })) }, i))), hovered &&
|
|
65
68
|
id &&
|
|
66
69
|
getTooltips &&
|
|
67
70
|
getTooltips(id).map((p) => (_jsx(Html, { position: [p.pos.x, p.pos.y, p.pos.z], center: true, pointerEvents: "none", style: { pointerEvents: "none" }, children: p.content }, p.id)))] }));
|
|
68
71
|
}
|
|
72
|
+
/** Shallow compare, except that selectedIds and activeComponents are only read at the group's own id (nested groups share it). */
|
|
73
|
+
export function groupPropsEqual(prev, next) {
|
|
74
|
+
const id = next.id ?? "";
|
|
75
|
+
if (prev.selectedIds?.[id] !== next.selectedIds?.[id] || prev.activeComponents?.[id] !== next.activeComponents?.[id]) {
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
const keys = Object.keys(next);
|
|
79
|
+
return (keys.length === Object.keys(prev).length &&
|
|
80
|
+
keys.every((key) => key === "selectedIds" || key === "activeComponents" || Object.is(prev[key], next[key])));
|
|
81
|
+
}
|
|
69
82
|
//# sourceMappingURL=react-group.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react-group.js","sourceRoot":"","sources":["../../../src/renderers/react/react-group.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE1D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,MAAM,
|
|
1
|
+
{"version":3,"file":"react-group.js","sourceRoot":"","sources":["../../../src/renderers/react/react-group.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "abstract-3d",
|
|
3
|
-
"version": "2.10.
|
|
4
|
-
"gitHead": "
|
|
3
|
+
"version": "2.10.5",
|
|
4
|
+
"gitHead": "752f155ce88522ae076c4e09d7881403ad35f653",
|
|
5
5
|
"description": "Abstract 3D",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"author": "Divid AB <info@divid.se>",
|
|
@@ -78,50 +78,22 @@ export function ReactCamera({
|
|
|
78
78
|
const perspectiveRef = useRef<ThreePerspectiveCamera | undefined>(undefined);
|
|
79
79
|
const orthographicRef = useRef<ThreeOrthographicCamera | undefined>(undefined);
|
|
80
80
|
|
|
81
|
-
const initialDistRef = useRef<number | null>(null);
|
|
82
81
|
const initialTargetRef = useRef(new Vector3());
|
|
83
|
-
const initialFovRef = useRef<number | null>(null);
|
|
84
82
|
|
|
85
83
|
const viewPortAspect = useThree(({ viewport: { aspect } }) => aspect);
|
|
86
84
|
const canvasSize = useThree(({ size }) => size);
|
|
87
85
|
const invalidate = useThree(({ invalidate }) => invalidate);
|
|
88
86
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
const dist = initialDistRef.current;
|
|
101
|
-
const dir = newCamera.position.clone().sub(target).normalize();
|
|
102
|
-
(newCamera as ThreePerspectiveCamera).fov = initialFovRef.current!;
|
|
103
|
-
newCamera.zoom = 1;
|
|
104
|
-
newCamera.position.copy(target.clone().add(dir.multiplyScalar(dist)));
|
|
105
|
-
|
|
106
|
-
if (camera.type === "Perspective") {
|
|
107
|
-
const bufLeft = bufferZones.left ?? 0;
|
|
108
|
-
const bufRight = bufferZones.right ?? 0;
|
|
109
|
-
const bufTop = bufferZones.top ?? 0;
|
|
110
|
-
const bufBottom = bufferZones.bottom ?? 0;
|
|
111
|
-
const canvasW = canvasSize.width;
|
|
112
|
-
const canvasH = canvasSize.height;
|
|
113
|
-
const usableW = Math.max(1, canvasW - bufLeft - bufRight);
|
|
114
|
-
const usableH = Math.max(1, canvasH - bufTop - bufBottom);
|
|
115
|
-
newCamera.setViewOffset(usableW, usableH, -bufLeft, -bufTop, canvasW, canvasH);
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
newCamera.updateProjectionMatrix();
|
|
119
|
-
// oxlint-disable-next-line typescript/no-unsafe-call -- oxlint's type-aware checker resolves OrbitControlsInstance as `any` (see the note on its declaration above); tsc resolves it correctly
|
|
120
|
-
controls.update();
|
|
121
|
-
invalidate();
|
|
122
|
-
};
|
|
123
|
-
|
|
124
|
-
useLayoutEffect(() => {
|
|
87
|
+
// Fits the active camera's frustum to the latest scene/canvas/buffer zones.
|
|
88
|
+
// Returns the fitted camera, its fit distance and the view's default direction;
|
|
89
|
+
// callers position the camera and call updateProjectionMatrix().
|
|
90
|
+
const fitCamera = ():
|
|
91
|
+
| {
|
|
92
|
+
readonly cam: ThreePerspectiveCamera | ThreeOrthographicCamera;
|
|
93
|
+
readonly dist: number;
|
|
94
|
+
readonly viewDir: Vector3;
|
|
95
|
+
}
|
|
96
|
+
| undefined => {
|
|
125
97
|
const [posX, posY, posZ, size, sceneAspect] = getViewTransform(view, scene);
|
|
126
98
|
|
|
127
99
|
// size.x/y are scene width/height in screen space (remapped per view direction)
|
|
@@ -142,22 +114,21 @@ export function ReactCamera({
|
|
|
142
114
|
const canvasH = canvasSize.height;
|
|
143
115
|
|
|
144
116
|
if (canvasW === 0 || canvasH === 0) {
|
|
145
|
-
return;
|
|
117
|
+
return undefined;
|
|
146
118
|
}
|
|
147
119
|
|
|
148
120
|
// Usable area in CSS pixels
|
|
149
121
|
const usableW = Math.max(1, canvasW - bufLeft - bufRight);
|
|
150
122
|
const usableH = Math.max(1, canvasH - bufTop - bufBottom);
|
|
151
123
|
const usableAspect = usableW / usableH;
|
|
152
|
-
|
|
153
|
-
initialFovRef.current = camera.type === "Perspective" ? fov : null;
|
|
124
|
+
const viewDir = new Vector3(posX, posY, posZ);
|
|
154
125
|
|
|
155
126
|
// ------------------------------------------------------------------
|
|
156
127
|
// ORTHOGRAPHIC
|
|
157
128
|
// ------------------------------------------------------------------
|
|
158
129
|
if (camera.type === "Orthographic" && orthographicRef.current) {
|
|
130
|
+
const cam = orthographicRef.current;
|
|
159
131
|
const dist = cameraDist(size, fov);
|
|
160
|
-
initialDistRef.current = dist;
|
|
161
132
|
|
|
162
133
|
// Fit scene into the usable area
|
|
163
134
|
const padFactor = 1 + fitPadding;
|
|
@@ -179,19 +150,18 @@ export function ReactCamera({
|
|
|
179
150
|
const hpp = (sceneHalfH * 2) / usableH;
|
|
180
151
|
|
|
181
152
|
// Extend frustum outward by buffer pixel amounts
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
orthographicRef.current.zoom = 1;
|
|
189
|
-
orthographicRef.current.updateProjectionMatrix();
|
|
153
|
+
cam.left = -sceneHalfW - bufLeft * wpp;
|
|
154
|
+
cam.right = sceneHalfW + bufRight * wpp;
|
|
155
|
+
cam.top = sceneHalfH + bufTop * hpp;
|
|
156
|
+
cam.bottom = -sceneHalfH - bufBottom * hpp;
|
|
157
|
+
cam.zoom = 1;
|
|
158
|
+
return { cam, dist, viewDir };
|
|
190
159
|
|
|
191
160
|
// ------------------------------------------------------------------
|
|
192
161
|
// PERSPECTIVE
|
|
193
162
|
// ------------------------------------------------------------------
|
|
194
163
|
} else if (camera.type === "Perspective" && perspectiveRef.current) {
|
|
164
|
+
const cam = perspectiveRef.current;
|
|
195
165
|
const fovRad = (fov * Math.PI) / 180;
|
|
196
166
|
|
|
197
167
|
// Horizontal FOV across just the *usable* area (not the full canvas) —
|
|
@@ -204,21 +174,48 @@ export function ReactCamera({
|
|
|
204
174
|
const distForW = screenW / 2 / Math.tan(fovHRad / 2) + size.z * 0.5;
|
|
205
175
|
|
|
206
176
|
const dist = Math.max(distForH, distForW) * (1 + fitPadding);
|
|
207
|
-
initialDistRef.current = dist;
|
|
208
177
|
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
178
|
+
cam.fov = fov;
|
|
179
|
+
cam.aspect = usableAspect;
|
|
180
|
+
cam.zoom = 1;
|
|
212
181
|
|
|
213
182
|
// Slice/extend the rendered frustum from the usable-area-sized window
|
|
214
183
|
// out to the full canvas, asymmetrically per buffer side.
|
|
215
|
-
|
|
184
|
+
cam.setViewOffset(usableW, usableH, -bufLeft, -bufTop, canvasW, canvasH);
|
|
185
|
+
return { cam, dist, viewDir };
|
|
186
|
+
}
|
|
187
|
+
return undefined;
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
const resetZoomOnGizmoClick = (): void => {
|
|
191
|
+
const fit = fitCamera();
|
|
192
|
+
if (!controls || !fit) {
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
const target = initialTargetRef.current.clone();
|
|
197
|
+
// oxlint-disable-next-line typescript/no-unsafe-call -- oxlint's type-aware checker resolves OrbitControlsInstance as `any` (see the note on its declaration above); tsc resolves it correctly
|
|
198
|
+
controls.target.copy(target);
|
|
216
199
|
|
|
217
|
-
|
|
200
|
+
// Keep the current direction, the gizmo animates the rotation itself
|
|
201
|
+
const dir = fit.cam.position.clone().sub(target).normalize();
|
|
202
|
+
fit.cam.position.copy(target.add(dir.multiplyScalar(fit.dist)));
|
|
203
|
+
fit.cam.updateProjectionMatrix();
|
|
204
|
+
// oxlint-disable-next-line typescript/no-unsafe-call -- oxlint's type-aware checker resolves OrbitControlsInstance as `any` (see the note on its declaration above); tsc resolves it correctly
|
|
205
|
+
controls.update();
|
|
206
|
+
invalidate();
|
|
207
|
+
};
|
|
208
|
+
|
|
209
|
+
useLayoutEffect(() => {
|
|
210
|
+
const fit = fitCamera();
|
|
211
|
+
if (!fit) {
|
|
212
|
+
return;
|
|
218
213
|
}
|
|
214
|
+
fit.cam.position.copy(fit.viewDir.multiplyScalar(fit.dist));
|
|
215
|
+
fit.cam.updateProjectionMatrix();
|
|
219
216
|
//}, [camera, viewPortAspect, canvasSize, bufferZones, view, scene, fitPadding]);
|
|
220
217
|
// oxlint-disable-next-line react-hooks/exhaustive-deps -- deps intentionally trimmed, see b290bc3e;
|
|
221
|
-
}, [camera, viewPortAspect
|
|
218
|
+
}, [camera, viewPortAspect]);
|
|
222
219
|
|
|
223
220
|
return (
|
|
224
221
|
<>
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { group } from "../../abstract-3d.js";
|
|
3
|
+
import { groupPropsEqual, type ReactGroupProps } from "./react-group.js";
|
|
4
|
+
|
|
5
|
+
const base: ReactGroupProps = {
|
|
6
|
+
g: group([]),
|
|
7
|
+
hoveredIdsExternal: undefined,
|
|
8
|
+
selectedIds: { a: true },
|
|
9
|
+
hotSpotsActive: false,
|
|
10
|
+
activeComponents: { a: "Error" },
|
|
11
|
+
id: "a",
|
|
12
|
+
rootData: undefined,
|
|
13
|
+
onClickGroup: () => undefined,
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
describe("groupPropsEqual", () => {
|
|
17
|
+
it("is equal for the same props", () => {
|
|
18
|
+
expect(groupPropsEqual(base, { ...base })).toBe(true);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it("ignores selectedIds and activeComponents objects that hold the same values for the group's id", () => {
|
|
22
|
+
expect(groupPropsEqual(base, { ...base, selectedIds: { a: true, b: false }, activeComponents: { a: "Error", b: "Warning" } })).toBe(true);
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it("is not equal when the group's own selection changes", () => {
|
|
26
|
+
expect(groupPropsEqual(base, { ...base, selectedIds: {} })).toBe(false);
|
|
27
|
+
expect(groupPropsEqual(base, { ...base, selectedIds: { a: false } })).toBe(false);
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it("is not equal when the group's own material state changes", () => {
|
|
31
|
+
expect(groupPropsEqual(base, { ...base, activeComponents: { a: "Warning" } })).toBe(false);
|
|
32
|
+
expect(groupPropsEqual(base, { ...base, activeComponents: undefined })).toBe(false);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it("is equal when only other groups' selection or material state changes", () => {
|
|
36
|
+
expect(groupPropsEqual(base, { ...base, selectedIds: { a: true, b: true }, activeComponents: { a: "Error", b: "Accept" } })).toBe(true);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it("is not equal when another prop changes identity", () => {
|
|
40
|
+
expect(groupPropsEqual(base, { ...base, g: group([]) })).toBe(false);
|
|
41
|
+
expect(groupPropsEqual(base, { ...base, onClickGroup: () => undefined })).toBe(false);
|
|
42
|
+
expect(groupPropsEqual(base, { ...base, hotSpotsActive: true })).toBe(false);
|
|
43
|
+
expect(groupPropsEqual(base, { ...base, id: "b" })).toBe(false);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it("is not equal when a prop is added or removed", () => {
|
|
47
|
+
expect(groupPropsEqual(base, { ...base, useAlphaTest: true })).toBe(false);
|
|
48
|
+
expect(groupPropsEqual({ ...base, useAlphaTest: true }, base)).toBe(false);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it("looks up the next id when the group has none", () => {
|
|
52
|
+
const anonymous = { ...base, id: undefined, selectedIds: { "": true }, activeComponents: undefined };
|
|
53
|
+
expect(groupPropsEqual(anonymous, { ...anonymous, selectedIds: { "": true, a: true } })).toBe(true);
|
|
54
|
+
expect(groupPropsEqual(anonymous, { ...anonymous, selectedIds: {} })).toBe(false);
|
|
55
|
+
});
|
|
56
|
+
});
|