abstract-3d 2.2.2 → 2.3.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/lib/renderers/react/react-camera.d.ts +9 -1
- package/lib/renderers/react/react-camera.d.ts.map +1 -1
- package/lib/renderers/react/react-camera.js +80 -14
- package/lib/renderers/react/react-camera.js.map +1 -1
- package/lib/renderers/react/react.d.ts +4 -2
- package/lib/renderers/react/react.d.ts.map +1 -1
- package/lib/renderers/react/react.js +2 -2
- package/lib/renderers/react/react.js.map +1 -1
- package/package.json +2 -2
- package/src/renderers/react/react-camera.tsx +119 -23
- package/src/renderers/react/react.tsx +7 -1
- package/src/.DS_Store +0 -0
- package/src/renderers/.DS_Store +0 -0
|
@@ -15,6 +15,12 @@ export type A3dOrthographicCamera = {
|
|
|
15
15
|
readonly near?: number;
|
|
16
16
|
readonly far?: number;
|
|
17
17
|
};
|
|
18
|
+
export type BufferZones = {
|
|
19
|
+
readonly left?: number;
|
|
20
|
+
readonly right?: number;
|
|
21
|
+
readonly top?: number;
|
|
22
|
+
readonly bottom?: number;
|
|
23
|
+
};
|
|
18
24
|
export type ControlsHelper = (Viewcube | Viewport) & {
|
|
19
25
|
readonly props: Pick<GizmoHelperProps, "alignment" | "margin">;
|
|
20
26
|
};
|
|
@@ -26,13 +32,15 @@ type Viewport = {
|
|
|
26
32
|
readonly type: "Viewport";
|
|
27
33
|
readonly viewportProps: GizmoViewportProps;
|
|
28
34
|
};
|
|
29
|
-
export declare function ReactCamera({ useAnimations, camera, view, scene, controlsHelper, orbitContolsProps, }: {
|
|
35
|
+
export declare function ReactCamera({ useAnimations, camera, view, scene, controlsHelper, orbitContolsProps, bufferZones, fitPadding, }: {
|
|
30
36
|
readonly useAnimations: boolean;
|
|
31
37
|
readonly camera: Camera;
|
|
32
38
|
readonly view: View;
|
|
33
39
|
readonly scene: Scene;
|
|
34
40
|
readonly controlsHelper?: ControlsHelper;
|
|
35
41
|
readonly orbitContolsProps?: OrbitControlsProps;
|
|
42
|
+
readonly bufferZones?: BufferZones;
|
|
43
|
+
readonly fitPadding?: number;
|
|
36
44
|
}): React.JSX.Element;
|
|
37
45
|
type GizmoViewportProps = React.JSX.IntrinsicElements["group"] & {
|
|
38
46
|
readonly axisColors?: [string, string, string];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react-camera.d.ts","sourceRoot":"","sources":["../../../src/renderers/react/react-camera.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA4C,MAAM,OAAO,CAAC;AACjE,OAAO,EACL,KAAK,gBAAgB,EAGrB,KAAK,kBAAkB,EAKxB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,KAAK,UAAU,EAAY,MAAM,oBAAoB,CAAC;AAG/D,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAQ,MAAM,sBAAsB,CAAC;AAE/D,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;
|
|
1
|
+
{"version":3,"file":"react-camera.d.ts","sourceRoot":"","sources":["../../../src/renderers/react/react-camera.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA4C,MAAM,OAAO,CAAC;AACjE,OAAO,EACL,KAAK,gBAAgB,EAGrB,KAAK,kBAAkB,EAKxB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,KAAK,UAAU,EAAY,MAAM,oBAAoB,CAAC;AAG/D,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAQ,MAAM,sBAAsB,CAAC;AAE/D,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;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,aAAa,EAAE,YAAY,CAAA;CAAE,CAAC;AACpF,KAAK,QAAQ,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,aAAa,EAAE,kBAAkB,CAAA;CAAE,CAAC;AAE1F,wBAAgB,WAAW,CAAC,EAC1B,aAAa,EACb,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,CA+MpB;AAiBD,KAAK,kBAAkB,GAAG,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,OAAO,CAAC,GAAG;IAC/D,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/C,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9C,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IACpC,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC;IACvD,QAAQ,CAAC,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAC3C,CAAC;AAEF,KAAK,YAAY,GAAG;IAClB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC;IACvD,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC/B,QAAQ,CAAC,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAC3C,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,MAAM,IAAI,EAAE,KAAK,MAAM,KAAG,MAC+C,CAAC"}
|
|
@@ -7,7 +7,7 @@ import { useThree } from "@react-three/fiber";
|
|
|
7
7
|
import { exhaustiveCheck } from "ts-exhaustive-check";
|
|
8
8
|
import { Vector3 } from "three";
|
|
9
9
|
import { vec3 } from "../../abstract-3d.js";
|
|
10
|
-
export function ReactCamera({ useAnimations, camera, view, scene, controlsHelper, orbitContolsProps, }) {
|
|
10
|
+
export function ReactCamera({ useAnimations, camera, view, scene, controlsHelper, orbitContolsProps, bufferZones = {}, fitPadding = 0, }) {
|
|
11
11
|
const [controls, setControls] = useState(null);
|
|
12
12
|
const perspectiveRef = useRef(undefined);
|
|
13
13
|
const orthographicRef = useRef(undefined);
|
|
@@ -15,6 +15,7 @@ export function ReactCamera({ useAnimations, camera, view, scene, controlsHelper
|
|
|
15
15
|
const initialTargetRef = useRef(new Vector3());
|
|
16
16
|
const initialFovRef = useRef(null);
|
|
17
17
|
const viewPortAspect = useThree(({ viewport: { aspect } }) => aspect);
|
|
18
|
+
const canvasSize = useThree(({ size }) => size);
|
|
18
19
|
const { invalidate } = useThree();
|
|
19
20
|
const resetZoomOnGizmoClick = () => {
|
|
20
21
|
if (!controls || initialDistRef.current == null || (!perspectiveRef.current && !orthographicRef.current)) {
|
|
@@ -28,33 +29,98 @@ export function ReactCamera({ useAnimations, camera, view, scene, controlsHelper
|
|
|
28
29
|
newCamera.fov = initialFovRef.current;
|
|
29
30
|
newCamera.zoom = 1;
|
|
30
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
|
+
}
|
|
31
43
|
newCamera.updateProjectionMatrix();
|
|
32
44
|
controls.update();
|
|
33
45
|
invalidate();
|
|
34
46
|
};
|
|
35
47
|
useLayoutEffect(() => {
|
|
36
48
|
const [posX, posY, posZ, size, sceneAspect] = getViewTransform(view, scene);
|
|
37
|
-
//
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
49
|
+
// size.x/y are scene width/height in screen space (remapped per view direction)
|
|
50
|
+
const screenW = size.x;
|
|
51
|
+
const screenH = size.y;
|
|
52
|
+
const fov = camera.type === "Perspective" ? camera.fov ?? 45 : 45;
|
|
53
|
+
// Buffer zones in CSS pixels
|
|
54
|
+
const bufLeft = bufferZones.left ?? 0;
|
|
55
|
+
const bufRight = bufferZones.right ?? 0;
|
|
56
|
+
const bufTop = bufferZones.top ?? 0;
|
|
57
|
+
const bufBottom = bufferZones.bottom ?? 0;
|
|
58
|
+
// Canvas size in CSS pixels — use R3F's reactive size so the effect
|
|
59
|
+
// re-runs on resize and is correct on first mount.
|
|
60
|
+
const canvasW = canvasSize.width;
|
|
61
|
+
const canvasH = canvasSize.height;
|
|
62
|
+
if (canvasW === 0 || canvasH === 0)
|
|
63
|
+
return;
|
|
64
|
+
// Usable area in CSS pixels
|
|
65
|
+
const usableW = Math.max(1, canvasW - bufLeft - bufRight);
|
|
66
|
+
const usableH = Math.max(1, canvasH - bufTop - bufBottom);
|
|
67
|
+
const usableAspect = usableW / usableH;
|
|
68
|
+
initialFovRef.current = camera.type === "Perspective" ? fov : null;
|
|
69
|
+
// ------------------------------------------------------------------
|
|
70
|
+
// ORTHOGRAPHIC
|
|
71
|
+
// ------------------------------------------------------------------
|
|
41
72
|
if (camera.type === "Orthographic" && orthographicRef.current) {
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
|
|
73
|
+
const dist = cameraDist(size, fov);
|
|
74
|
+
initialDistRef.current = dist;
|
|
75
|
+
// Fit scene into the usable area
|
|
76
|
+
let sceneHalfW;
|
|
77
|
+
let sceneHalfH;
|
|
78
|
+
const padFactor = 1 + fitPadding;
|
|
79
|
+
if (sceneAspect > usableAspect) {
|
|
80
|
+
// Scene wider than usable area — constrain by width
|
|
81
|
+
sceneHalfW = (screenW / 2) * padFactor;
|
|
82
|
+
sceneHalfH = (screenW / 2 / usableAspect) * padFactor;
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
// Scene taller — constrain by height
|
|
86
|
+
sceneHalfH = (screenH / 2) * padFactor;
|
|
87
|
+
sceneHalfW = ((usableAspect * screenH) / 2) * padFactor;
|
|
88
|
+
}
|
|
89
|
+
// World units per CSS pixel in the usable area
|
|
90
|
+
const wpp = (sceneHalfW * 2) / usableW;
|
|
91
|
+
const hpp = (sceneHalfH * 2) / usableH;
|
|
92
|
+
// Extend frustum outward by buffer pixel amounts
|
|
93
|
+
orthographicRef.current.left = -sceneHalfW - bufLeft * wpp;
|
|
94
|
+
orthographicRef.current.right = sceneHalfW + bufRight * wpp;
|
|
95
|
+
orthographicRef.current.top = sceneHalfH + bufTop * hpp;
|
|
96
|
+
orthographicRef.current.bottom = -sceneHalfH - bufBottom * hpp;
|
|
45
97
|
orthographicRef.current.position.set(posX * dist, posY * dist, posZ * dist);
|
|
46
|
-
orthographicRef.current.
|
|
47
|
-
orthographicRef.current.right = right;
|
|
48
|
-
orthographicRef.current.bottom = bottom;
|
|
49
|
-
orthographicRef.current.top = top;
|
|
98
|
+
orthographicRef.current.zoom = 1;
|
|
50
99
|
orthographicRef.current.updateProjectionMatrix();
|
|
100
|
+
// ------------------------------------------------------------------
|
|
101
|
+
// PERSPECTIVE
|
|
102
|
+
// ------------------------------------------------------------------
|
|
51
103
|
}
|
|
52
104
|
else if (camera.type === "Perspective" && perspectiveRef.current) {
|
|
105
|
+
const fovRad = (fov * Math.PI) / 180;
|
|
106
|
+
// Horizontal FOV across just the *usable* area (not the full canvas) —
|
|
107
|
+
// this is what the camera's fov/aspect should describe.
|
|
108
|
+
const fovHRad = 2 * Math.atan(Math.tan(fovRad / 2) * usableAspect);
|
|
109
|
+
// Fit the scene into the usable area only. No fraction math needed —
|
|
110
|
+
// fov/aspect now directly describe the usable area's frustum.
|
|
111
|
+
const distForH = screenH / 2 / Math.tan(fovRad / 2) + size.z * 0.5;
|
|
112
|
+
const distForW = screenW / 2 / Math.tan(fovHRad / 2) + size.z * 0.5;
|
|
113
|
+
const dist = Math.max(distForH, distForW) * (1 + fitPadding);
|
|
114
|
+
initialDistRef.current = dist;
|
|
115
|
+
perspectiveRef.current.fov = fov;
|
|
116
|
+
perspectiveRef.current.aspect = usableAspect;
|
|
53
117
|
perspectiveRef.current.position.set(posX * dist, posY * dist, posZ * dist);
|
|
118
|
+
// Slice/extend the rendered frustum from the usable-area-sized window
|
|
119
|
+
// out to the full canvas, asymmetrically per buffer side.
|
|
120
|
+
perspectiveRef.current.setViewOffset(usableW, usableH, -bufLeft, -bufTop, canvasW, canvasH);
|
|
54
121
|
perspectiveRef.current.updateProjectionMatrix();
|
|
55
122
|
}
|
|
56
|
-
}, [camera, viewPortAspect]);
|
|
57
|
-
// --------------------------------------------------------------
|
|
123
|
+
}, [camera, viewPortAspect, canvasSize, bufferZones, view, scene, fitPadding]);
|
|
58
124
|
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) => {
|
|
59
125
|
setControls(c);
|
|
60
126
|
} }), (() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react-camera.js","sourceRoot":"","sources":["../../../src/renderers/react/react-camera.tsx"],"names":[],"mappings":";AAAA,uDAAuD;AACvD,sDAAsD;AACtD,OAAc,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjE,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,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,EAAqB,IAAI,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"react-camera.js","sourceRoot":"","sources":["../../../src/renderers/react/react-camera.tsx"],"names":[],"mappings":";AAAA,uDAAuD;AACvD,sDAAsD;AACtD,OAAc,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjE,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,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,EAAqB,IAAI,EAAE,MAAM,sBAAsB,CAAC;AA+B/D,MAAM,UAAU,WAAW,CAAC,EAC1B,aAAa,EACb,MAAM,EACN,IAAI,EACJ,KAAK,EACL,cAAc,EACd,iBAAiB,EACjB,WAAW,GAAG,EAAE,EAChB,UAAU,GAAG,CAAC,GAUf;IACC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAa,IAAI,CAAC,CAAC;IAC3D,MAAM,cAAc,GAAG,MAAM,CAAkB,SAAS,CAAC,CAAC;IAC1D,MAAM,eAAe,GAAG,MAAM,CAAkB,SAAS,CAAC,CAAC;IAE3D,MAAM,cAAc,GAAG,MAAM,CAAgB,IAAI,CAAC,CAAC;IACnD,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;IAC/C,MAAM,aAAa,GAAG,MAAM,CAAgB,IAAI,CAAC,CAAC;IAElD,MAAM,cAAc,GAAG,QAAQ,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;IACtE,MAAM,UAAU,GAAG,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IAChD,MAAM,EAAE,UAAU,EAAE,GAAG,QAAQ,EAAE,CAAC;IAElC,MAAM,qBAAqB,GAAG,GAAS,EAAE;QACvC,IAAI,CAAC,QAAQ,IAAI,cAAc,CAAC,OAAO,IAAI,IAAI,IAAI,CAAC,CAAC,cAAc,CAAC,OAAO,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;YACzG,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC;QACnG,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAEhD,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAE7B,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,CAAC;QACpC,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC;QAC/D,SAAS,CAAC,GAAG,GAAG,aAAa,CAAC,OAAO,CAAC;QACtC,SAAS,CAAC,IAAI,GAAG,CAAC,CAAC;QACnB,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEtE,IAAI,MAAM,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YAClC,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,IAAI,CAAC,CAAC;YACtC,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,IAAI,CAAC,CAAC;YACxC,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,IAAI,CAAC,CAAC;YACpC,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,IAAI,CAAC,CAAC;YAC1C,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC;YACjC,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC;YAClC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC,CAAC;YAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC,CAAC;YAC1D,SAAS,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACjF,CAAC;QAED,SAAS,CAAC,sBAAsB,EAAE,CAAC;QACnC,QAAQ,CAAC,MAAM,EAAE,CAAC;QAClB,UAAU,EAAE,CAAC;IACf,CAAC,CAAC;IAEF,eAAe,CAAC,GAAG,EAAE;QACnB,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,GAAG,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAE5E,gFAAgF;QAChF,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC;QAEvB,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAElE,6BAA6B;QAC7B,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,IAAI,CAAC,CAAC;QACtC,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,IAAI,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,IAAI,CAAC,CAAC;QACpC,MAAM,SAAS,GAAG,WAAW,CAAC,MAAO,IAAI,CAAC,CAAC;QAE3C,oEAAoE;QACpE,mDAAmD;QACnD,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC;QACjC,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC;QAElC,IAAI,OAAO,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC;YAAE,OAAO;QAE3C,4BAA4B;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC,CAAC;QAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC,CAAC;QAC1D,MAAM,YAAY,GAAG,OAAO,GAAG,OAAO,CAAC;QAEvC,aAAa,CAAC,OAAO,GAAG,MAAM,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;QAEnE,qEAAqE;QACrE,eAAe;QACf,qEAAqE;QACrE,IAAI,MAAM,CAAC,IAAI,KAAK,cAAc,IAAI,eAAe,CAAC,OAAO,EAAE,CAAC;YAC9D,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YACnC,cAAc,CAAC,OAAO,GAAG,IAAI,CAAC;YAE9B,iCAAiC;YACjC,IAAI,UAAkB,CAAC;YACvB,IAAI,UAAkB,CAAC;YAEvB,MAAM,SAAS,GAAG,CAAC,GAAG,UAAU,CAAC;YACjC,IAAI,WAAW,GAAG,YAAY,EAAE,CAAC;gBAC/B,oDAAoD;gBACpD,UAAU,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC;gBACvC,UAAU,GAAG,CAAC,OAAO,GAAG,CAAC,GAAG,YAAY,CAAC,GAAG,SAAS,CAAC;YACxD,CAAC;iBAAM,CAAC;gBACN,qCAAqC;gBACrC,UAAU,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC;gBACvC,UAAU,GAAG,CAAC,CAAC,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC;YAC1D,CAAC;YAED,+CAA+C;YAC/C,MAAM,GAAG,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC;YACvC,MAAM,GAAG,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC;YAEvC,iDAAiD;YACjD,eAAe,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,UAAU,GAAG,OAAO,GAAG,GAAG,CAAC;YAC3D,eAAe,CAAC,OAAO,CAAC,KAAK,GAAG,UAAU,GAAG,QAAQ,GAAG,GAAG,CAAC;YAC5D,eAAe,CAAC,OAAO,CAAC,GAAG,GAAG,UAAU,GAAG,MAAM,GAAG,GAAG,CAAC;YACxD,eAAe,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,UAAU,GAAG,SAAS,GAAG,GAAG,CAAC;YAE/D,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC,CAAC;YAC5E,eAAe,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC;YACjC,eAAe,CAAC,OAAO,CAAC,sBAAsB,EAAE,CAAC;YAEjD,qEAAqE;YACrE,cAAc;YACd,qEAAqE;QACvE,CAAC;aAAM,IAAI,MAAM,CAAC,IAAI,KAAK,aAAa,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;YACnE,MAAM,MAAM,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;YAErC,uEAAuE;YACvE,wDAAwD;YACxD,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC;YAEnE,qEAAqE;YACrE,8DAA8D;YAC9D,MAAM,QAAQ,GAAG,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC;YACnE,MAAM,QAAQ,GAAG,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC;YAEpE,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC;YAC7D,cAAc,CAAC,OAAO,GAAG,IAAI,CAAC;YAE9B,cAAc,CAAC,OAAO,CAAC,GAAG,GAAG,GAAG,CAAC;YACjC,cAAc,CAAC,OAAO,CAAC,MAAM,GAAG,YAAY,CAAC;YAC7C,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC,CAAC;YAE3E,sEAAsE;YACtE,0DAA0D;YAC1D,cAAc,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAE5F,cAAc,CAAC,OAAO,CAAC,sBAAsB,EAAE,CAAC;QAClD,CAAC;IACH,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC;IAE/E,OAAO,CACL,8BACE,KAAC,iBAAiB,IAChB,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,MAAM,CAAC,IAAI,EACjB,GAAG,EAAE,MAAM,CAAC,GAAG,EACf,GAAG,EAAE,MAAM,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EACpD,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,IAAI,EACZ,WAAW,EAAE,MAAM,CAAC,IAAI,KAAK,aAAa,GAC1C,EACF,KAAC,kBAAkB,IACjB,GAAG,EAAE,eAAe,EACpB,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EACb,IAAI,EAAE,MAAM,CAAC,IAAI,EACjB,GAAG,EAAE,MAAM,CAAC,GAAG,EACf,MAAM,EAAE,IAAI,EACZ,WAAW,EAAE,MAAM,CAAC,IAAI,KAAK,cAAc,GAC3C,EAEF,KAAC,eAAe,OACV,iBAAiB,EACrB,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE;oBACjB,WAAW,CAAC,CAAC,CAAC,CAAC;gBACjB,CAAC,GACD,EAED,CAAC,GAAG,EAAE;gBACL,QAAQ,cAAc,EAAE,IAAI,EAAE,CAAC;oBAC7B,KAAK,UAAU;wBACb,OAAO,CACL,KAAC,WAAW,OACN,cAAc,CAAC,KAAK,EACxB,QAAQ,EAAE,GAAG,EAAE;gCACb,IAAI,cAAc,CAAC,aAAa,CAAC,sBAAsB,EAAE,CAAC;oCACxD,qBAAqB,EAAE,CAAC;gCAC1B,CAAC;gCACD,OAAO,QAAQ,EAAE,MAAiB,CAAC;4BACrC,CAAC,EACD,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,YAEpC,KAAC,aAAa,OAAK,cAAc,CAAC,aAAa,GAAI,GACvC,CACf,CAAC;oBACJ,KAAK,UAAU;wBACb,OAAO,CACL,KAAC,WAAW,OACN,cAAc,CAAC,KAAK,EACxB,QAAQ,EAAE,GAAG,EAAE;gCACb,IAAI,cAAc,CAAC,aAAa,CAAC,sBAAsB,EAAE,CAAC;oCACxD,qBAAqB,EAAE,CAAC;gCAC1B,CAAC;gCACD,OAAO,QAAQ,EAAE,MAAiB,CAAC;4BACrC,CAAC,EACD,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,YAEpC,KAAC,aAAa,OAAK,cAAc,CAAC,aAAa,GAAI,GACvC,CACf,CAAC;oBACJ,KAAK,SAAS,CAAC;oBACf;wBACE,OAAO,IAAI,CAAC;gBAChB,CAAC;YACH,CAAC,CAAC,EAAE,IACH,CACJ,CAAC;AACJ,CAAC;AAED,MAAM,eAAe,GAAG,CACtB,KAEC,EACkB,EAAE;IACrB,MAAM,GAAG,GAAG,MAAM,CAAM,IAAI,CAAC,CAAC;IAE9B,eAAe,CAAC,GAAG,EAAE;QACnB,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QACD,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IACH,OAAO,KAAC,aAAa,OAAK,KAAK,EAAE,WAAW,QAAC,GAAG,EAAE,GAAG,GAAI,CAAC;AAC5D,CAAC,CAAC;AA2BF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAU,EAAE,GAAW,EAAU,EAAE,CAC5D,IAAI,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;AAGrG,SAAS,gBAAgB,CAAC,IAAU,EAAE,KAAY;IAChD,MAAM,IAAI,GAAG,KAAK,CAAC,eAAe,CAAC;IAEnC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,OAAO;YACV,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAU,CAAC;QACnD,KAAK,MAAM;YACT,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAU,CAAC;QACpD,KAAK,KAAK;YACR,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAU,CAAC;QAC3E,KAAK,QAAQ;YACX,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAU,CAAC;QAC5E,KAAK,OAAO;YACV,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAU,CAAC;QAC3E,KAAK,MAAM;YACT,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAU,CAAC;QAC5E;YACE,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;AACH,CAAC"}
|
|
@@ -3,7 +3,7 @@ import { type CanvasProps, type ThreeEvent } from "@react-three/fiber";
|
|
|
3
3
|
import { type OrbitControlsProps } from "@react-three/drei";
|
|
4
4
|
import { ReactPopover } from "./react-scene.js";
|
|
5
5
|
import { Scene, View, Group } from "../../abstract-3d.js";
|
|
6
|
-
import { ControlsHelper, Camera } from "./react-camera.js";
|
|
6
|
+
import { ControlsHelper, Camera, BufferZones } from "./react-camera.js";
|
|
7
7
|
import { HotSpotInfo } from "./react-hotspot.js";
|
|
8
8
|
import { MaterialState } from "./react-material.js";
|
|
9
9
|
type ReactProps = {
|
|
@@ -26,6 +26,8 @@ type ReactProps = {
|
|
|
26
26
|
readonly materialStateImages?: Record<string, string>;
|
|
27
27
|
readonly sceneFallback?: React.JSX.Element;
|
|
28
28
|
readonly useOldMode?: boolean;
|
|
29
|
+
readonly bufferZones?: BufferZones;
|
|
30
|
+
readonly fitPadding?: number;
|
|
29
31
|
readonly onClickGroup?: (id: string | undefined, rootData: Record<string, string> | undefined, data: Record<string, string> | undefined, e: ThreeEvent<MouseEvent>) => void;
|
|
30
32
|
readonly onHoverGroup?: (id: string | undefined, rootData: Record<string, string> | undefined, data: Record<string, string> | undefined, e: ThreeEvent<MouseEvent>) => void;
|
|
31
33
|
readonly onContextMenuGroup?: (id: string, rootData: Record<string, string> | undefined, data: Record<string, string> | undefined, left: number, top: number, e: ThreeEvent<MouseEvent>) => void;
|
|
@@ -33,6 +35,6 @@ type ReactProps = {
|
|
|
33
35
|
readonly createGroupKey?: (g: Group, idx: number, rootData: Record<string, string> | undefined, id: string) => string;
|
|
34
36
|
readonly createGroupId?: (g: Group) => string;
|
|
35
37
|
};
|
|
36
|
-
export declare const render: React.MemoExoticComponent<({ scene, selectedIds, useOldMode, activeHotSpots, activeComponents, hoveredIdExternal, hotSpotTexts, popovers: reactPopovers, showHotSpotTexts, showDimensions, useAnimations, camera, view, controlsHelper, canvasProps, orbitContolsProps, materialStateImages, sceneFallback, useAlphaTest, onClickGroup, onHoverGroup, onContextMenuGroup, onClickHotSpot, createGroupKey, createGroupId, }: ReactProps) => React.JSX.Element>;
|
|
38
|
+
export declare const render: React.MemoExoticComponent<({ scene, selectedIds, useOldMode, activeHotSpots, activeComponents, hoveredIdExternal, hotSpotTexts, popovers: reactPopovers, showHotSpotTexts, showDimensions, useAnimations, camera, view, controlsHelper, canvasProps, orbitContolsProps, materialStateImages, sceneFallback, useAlphaTest, onClickGroup, onHoverGroup, onContextMenuGroup, onClickHotSpot, createGroupKey, createGroupId, bufferZones, fitPadding, }: ReactProps) => React.JSX.Element>;
|
|
37
39
|
export {};
|
|
38
40
|
//# sourceMappingURL=react.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../../src/renderers/react/react.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAe,MAAM,OAAO,CAAC;AACpC,OAAO,EAAU,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EAAe,KAAK,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEzE,OAAO,EAAE,YAAY,EAAc,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAe,cAAc,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../../src/renderers/react/react.tsx"],"names":[],"mappings":"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"}
|
|
@@ -5,9 +5,9 @@ import { Html } from "@react-three/drei";
|
|
|
5
5
|
import { EffectComposer, N8AO } from "@react-three/postprocessing";
|
|
6
6
|
import { ReactScene } from "./react-scene.js";
|
|
7
7
|
import { ReactCamera } from "./react-camera.js";
|
|
8
|
-
export const render = memo(({ scene, selectedIds, useOldMode, activeHotSpots, activeComponents, hoveredIdExternal, hotSpotTexts, popovers: reactPopovers, showHotSpotTexts = false, showDimensions = true, useAnimations = false, camera = { type: "Perspective" }, view = "front", controlsHelper, canvasProps, orbitContolsProps, materialStateImages, sceneFallback, useAlphaTest = true, onClickGroup, onHoverGroup, onContextMenuGroup, onClickHotSpot, createGroupKey, createGroupId, }) => {
|
|
8
|
+
export const render = memo(({ scene, selectedIds, useOldMode, activeHotSpots, activeComponents, hoveredIdExternal, hotSpotTexts, popovers: reactPopovers, showHotSpotTexts = false, showDimensions = true, useAnimations = false, camera = { type: "Perspective" }, view = "front", controlsHelper, canvasProps, orbitContolsProps, materialStateImages, sceneFallback, useAlphaTest = true, onClickGroup, onHoverGroup, onContextMenuGroup, onClickHotSpot, createGroupKey, createGroupId, bufferZones, fitPadding, }) => {
|
|
9
9
|
const intensity = useOldMode ? 2 : 0.4;
|
|
10
|
-
return scene ? (_jsx(Canvas, { dpr: [1, window.devicePixelRatio], frameloop: "demand", ...canvasProps, children: _jsxs(React.Suspense, { fallback: _jsx(Html, { center: true, children: sceneFallback ?? _jsx(_Fragment, {}) }), children: [_jsx(ReactCamera, { scene: scene, useAnimations: useAnimations, camera: camera, view: view, controlsHelper: controlsHelper, orbitContolsProps: orbitContolsProps }), _jsx("ambientLight", { intensity: 3.5 }), _jsx("directionalLight", { position: [
|
|
10
|
+
return scene ? (_jsx(Canvas, { dpr: [1, window.devicePixelRatio], frameloop: "demand", ...canvasProps, children: _jsxs(React.Suspense, { fallback: _jsx(Html, { center: true, children: sceneFallback ?? _jsx(_Fragment, {}) }), children: [_jsx(ReactCamera, { bufferZones: bufferZones, fitPadding: fitPadding, scene: scene, useAnimations: useAnimations, camera: camera, view: view, controlsHelper: controlsHelper, orbitContolsProps: orbitContolsProps }), _jsx("ambientLight", { intensity: 3.5 }), _jsx("directionalLight", { position: [
|
|
11
11
|
-(scene.center_deprecated?.x ?? 0) - 1.5 * scene.size_deprecated.x,
|
|
12
12
|
-(scene.center_deprecated?.y ?? 0) + 1.5 * scene.size_deprecated.y,
|
|
13
13
|
-(scene.center_deprecated?.z ?? 0),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react.js","sourceRoot":"","sources":["../../../src/renderers/react/react.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AACpC,OAAO,EAAE,MAAM,EAAqC,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EAAE,IAAI,EAAkC,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAgB,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE5D,OAAO,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"react.js","sourceRoot":"","sources":["../../../src/renderers/react/react.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "abstract-3d",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.3.0",
|
|
4
4
|
"description": "Abstract 3D",
|
|
5
5
|
"author": "Divid AB <info@divid.se>",
|
|
6
6
|
"repository": "https://github.com/dividab/abstract-visuals/tree/master/packages/abstract-3d",
|
|
@@ -65,5 +65,5 @@
|
|
|
65
65
|
"@types/three": "^0.180.0",
|
|
66
66
|
"react": "^19.2.6"
|
|
67
67
|
},
|
|
68
|
-
"gitHead": "
|
|
68
|
+
"gitHead": "525e0aa7ee4a93067f5ad15826a0f31c0c73f9a2"
|
|
69
69
|
}
|
|
@@ -25,9 +25,23 @@ export type A3dPerspectiveCamera = {
|
|
|
25
25
|
readonly far?: number;
|
|
26
26
|
readonly fov?: number;
|
|
27
27
|
};
|
|
28
|
-
export type A3dOrthographicCamera = { readonly type: "Orthographic"; readonly near?: number; readonly far?: number };
|
|
29
28
|
|
|
30
|
-
export type
|
|
29
|
+
export type A3dOrthographicCamera = {
|
|
30
|
+
readonly type: "Orthographic";
|
|
31
|
+
readonly near?: number;
|
|
32
|
+
readonly far?: number;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
export type BufferZones = {
|
|
36
|
+
readonly left?: number;
|
|
37
|
+
readonly right?: number;
|
|
38
|
+
readonly top?: number;
|
|
39
|
+
readonly bottom?: number;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
export type ControlsHelper = (Viewcube | Viewport) & {
|
|
43
|
+
readonly props: Pick<GizmoHelperProps, "alignment" | "margin">;
|
|
44
|
+
};
|
|
31
45
|
type Viewcube = { readonly type: "Viewcube"; readonly viewcubeProps: GenericProps };
|
|
32
46
|
type Viewport = { readonly type: "Viewport"; readonly viewportProps: GizmoViewportProps };
|
|
33
47
|
|
|
@@ -38,6 +52,8 @@ export function ReactCamera({
|
|
|
38
52
|
scene,
|
|
39
53
|
controlsHelper,
|
|
40
54
|
orbitContolsProps,
|
|
55
|
+
bufferZones = {},
|
|
56
|
+
fitPadding = 0,
|
|
41
57
|
}: {
|
|
42
58
|
readonly useAnimations: boolean;
|
|
43
59
|
readonly camera: Camera;
|
|
@@ -45,6 +61,8 @@ export function ReactCamera({
|
|
|
45
61
|
readonly scene: Scene;
|
|
46
62
|
readonly controlsHelper?: ControlsHelper;
|
|
47
63
|
readonly orbitContolsProps?: OrbitControlsProps;
|
|
64
|
+
readonly bufferZones?: BufferZones;
|
|
65
|
+
readonly fitPadding?: number;
|
|
48
66
|
}): React.JSX.Element {
|
|
49
67
|
const [controls, setControls] = useState<any | null>(null);
|
|
50
68
|
const perspectiveRef = useRef<any | undefined>(undefined);
|
|
@@ -55,6 +73,7 @@ export function ReactCamera({
|
|
|
55
73
|
const initialFovRef = useRef<number | null>(null);
|
|
56
74
|
|
|
57
75
|
const viewPortAspect = useThree(({ viewport: { aspect } }) => aspect);
|
|
76
|
+
const canvasSize = useThree(({ size }) => size);
|
|
58
77
|
const { invalidate } = useThree();
|
|
59
78
|
|
|
60
79
|
const resetZoomOnGizmoClick = (): void => {
|
|
@@ -72,36 +91,119 @@ export function ReactCamera({
|
|
|
72
91
|
newCamera.fov = initialFovRef.current;
|
|
73
92
|
newCamera.zoom = 1;
|
|
74
93
|
newCamera.position.copy(target.clone().add(dir.multiplyScalar(dist)));
|
|
75
|
-
newCamera.updateProjectionMatrix();
|
|
76
94
|
|
|
95
|
+
if (camera.type === "Perspective") {
|
|
96
|
+
const bufLeft = bufferZones.left ?? 0;
|
|
97
|
+
const bufRight = bufferZones.right ?? 0;
|
|
98
|
+
const bufTop = bufferZones.top ?? 0;
|
|
99
|
+
const bufBottom = bufferZones.bottom ?? 0;
|
|
100
|
+
const canvasW = canvasSize.width;
|
|
101
|
+
const canvasH = canvasSize.height;
|
|
102
|
+
const usableW = Math.max(1, canvasW - bufLeft - bufRight);
|
|
103
|
+
const usableH = Math.max(1, canvasH - bufTop - bufBottom);
|
|
104
|
+
newCamera.setViewOffset(usableW, usableH, -bufLeft, -bufTop, canvasW, canvasH);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
newCamera.updateProjectionMatrix();
|
|
77
108
|
controls.update();
|
|
78
109
|
invalidate();
|
|
79
110
|
};
|
|
80
111
|
|
|
81
112
|
useLayoutEffect(() => {
|
|
82
113
|
const [posX, posY, posZ, size, sceneAspect] = getViewTransform(view, scene);
|
|
83
|
-
// --------------------------------------------------------------
|
|
84
|
-
const dist = cameraDist(size, camera.type === "Perspective" ? camera.fov ?? 45 : 45);
|
|
85
|
-
initialDistRef.current = dist;
|
|
86
|
-
initialFovRef.current = camera.type === "Perspective" ? camera.fov ?? 45 : null;
|
|
87
114
|
|
|
115
|
+
// size.x/y are scene width/height in screen space (remapped per view direction)
|
|
116
|
+
const screenW = size.x;
|
|
117
|
+
const screenH = size.y;
|
|
118
|
+
|
|
119
|
+
const fov = camera.type === "Perspective" ? camera.fov ?? 45 : 45;
|
|
120
|
+
|
|
121
|
+
// Buffer zones in CSS pixels
|
|
122
|
+
const bufLeft = bufferZones.left ?? 0;
|
|
123
|
+
const bufRight = bufferZones.right ?? 0;
|
|
124
|
+
const bufTop = bufferZones.top ?? 0;
|
|
125
|
+
const bufBottom = bufferZones.bottom! ?? 0;
|
|
126
|
+
|
|
127
|
+
// Canvas size in CSS pixels — use R3F's reactive size so the effect
|
|
128
|
+
// re-runs on resize and is correct on first mount.
|
|
129
|
+
const canvasW = canvasSize.width;
|
|
130
|
+
const canvasH = canvasSize.height;
|
|
131
|
+
|
|
132
|
+
if (canvasW === 0 || canvasH === 0) return;
|
|
133
|
+
|
|
134
|
+
// Usable area in CSS pixels
|
|
135
|
+
const usableW = Math.max(1, canvasW - bufLeft - bufRight);
|
|
136
|
+
const usableH = Math.max(1, canvasH - bufTop - bufBottom);
|
|
137
|
+
const usableAspect = usableW / usableH;
|
|
138
|
+
|
|
139
|
+
initialFovRef.current = camera.type === "Perspective" ? fov : null;
|
|
140
|
+
|
|
141
|
+
// ------------------------------------------------------------------
|
|
142
|
+
// ORTHOGRAPHIC
|
|
143
|
+
// ------------------------------------------------------------------
|
|
88
144
|
if (camera.type === "Orthographic" && orthographicRef.current) {
|
|
89
|
-
const
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
145
|
+
const dist = cameraDist(size, fov);
|
|
146
|
+
initialDistRef.current = dist;
|
|
147
|
+
|
|
148
|
+
// Fit scene into the usable area
|
|
149
|
+
let sceneHalfW: number;
|
|
150
|
+
let sceneHalfH: number;
|
|
151
|
+
|
|
152
|
+
const padFactor = 1 + fitPadding;
|
|
153
|
+
if (sceneAspect > usableAspect) {
|
|
154
|
+
// Scene wider than usable area — constrain by width
|
|
155
|
+
sceneHalfW = (screenW / 2) * padFactor;
|
|
156
|
+
sceneHalfH = (screenW / 2 / usableAspect) * padFactor;
|
|
157
|
+
} else {
|
|
158
|
+
// Scene taller — constrain by height
|
|
159
|
+
sceneHalfH = (screenH / 2) * padFactor;
|
|
160
|
+
sceneHalfW = ((usableAspect * screenH) / 2) * padFactor;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// World units per CSS pixel in the usable area
|
|
164
|
+
const wpp = (sceneHalfW * 2) / usableW;
|
|
165
|
+
const hpp = (sceneHalfH * 2) / usableH;
|
|
166
|
+
|
|
167
|
+
// Extend frustum outward by buffer pixel amounts
|
|
168
|
+
orthographicRef.current.left = -sceneHalfW - bufLeft * wpp;
|
|
169
|
+
orthographicRef.current.right = sceneHalfW + bufRight * wpp;
|
|
170
|
+
orthographicRef.current.top = sceneHalfH + bufTop * hpp;
|
|
171
|
+
orthographicRef.current.bottom = -sceneHalfH - bufBottom * hpp;
|
|
172
|
+
|
|
93
173
|
orthographicRef.current.position.set(posX * dist, posY * dist, posZ * dist);
|
|
94
|
-
orthographicRef.current.
|
|
95
|
-
orthographicRef.current.right = right;
|
|
96
|
-
orthographicRef.current.bottom = bottom;
|
|
97
|
-
orthographicRef.current.top = top;
|
|
174
|
+
orthographicRef.current.zoom = 1;
|
|
98
175
|
orthographicRef.current.updateProjectionMatrix();
|
|
176
|
+
|
|
177
|
+
// ------------------------------------------------------------------
|
|
178
|
+
// PERSPECTIVE
|
|
179
|
+
// ------------------------------------------------------------------
|
|
99
180
|
} else if (camera.type === "Perspective" && perspectiveRef.current) {
|
|
181
|
+
const fovRad = (fov * Math.PI) / 180;
|
|
182
|
+
|
|
183
|
+
// Horizontal FOV across just the *usable* area (not the full canvas) —
|
|
184
|
+
// this is what the camera's fov/aspect should describe.
|
|
185
|
+
const fovHRad = 2 * Math.atan(Math.tan(fovRad / 2) * usableAspect);
|
|
186
|
+
|
|
187
|
+
// Fit the scene into the usable area only. No fraction math needed —
|
|
188
|
+
// fov/aspect now directly describe the usable area's frustum.
|
|
189
|
+
const distForH = screenH / 2 / Math.tan(fovRad / 2) + size.z * 0.5;
|
|
190
|
+
const distForW = screenW / 2 / Math.tan(fovHRad / 2) + size.z * 0.5;
|
|
191
|
+
|
|
192
|
+
const dist = Math.max(distForH, distForW) * (1 + fitPadding);
|
|
193
|
+
initialDistRef.current = dist;
|
|
194
|
+
|
|
195
|
+
perspectiveRef.current.fov = fov;
|
|
196
|
+
perspectiveRef.current.aspect = usableAspect;
|
|
100
197
|
perspectiveRef.current.position.set(posX * dist, posY * dist, posZ * dist);
|
|
198
|
+
|
|
199
|
+
// Slice/extend the rendered frustum from the usable-area-sized window
|
|
200
|
+
// out to the full canvas, asymmetrically per buffer side.
|
|
201
|
+
perspectiveRef.current.setViewOffset(usableW, usableH, -bufLeft, -bufTop, canvasW, canvasH);
|
|
202
|
+
|
|
101
203
|
perspectiveRef.current.updateProjectionMatrix();
|
|
102
204
|
}
|
|
103
|
-
}, [camera, viewPortAspect]);
|
|
104
|
-
|
|
205
|
+
}, [camera, viewPortAspect, canvasSize, bufferZones, view, scene, fitPadding]);
|
|
206
|
+
|
|
105
207
|
return (
|
|
106
208
|
<>
|
|
107
209
|
<PerspectiveCamera
|
|
@@ -221,22 +323,16 @@ function getViewTransform(view: View, scene: Scene): ViewTransform {
|
|
|
221
323
|
switch (view) {
|
|
222
324
|
case "front":
|
|
223
325
|
return [0, 0, 1, size, size.x / size.y] as const;
|
|
224
|
-
|
|
225
326
|
case "back":
|
|
226
327
|
return [0, 0, -1, size, size.x / size.y] as const;
|
|
227
|
-
|
|
228
328
|
case "top":
|
|
229
329
|
return [0, 1, 0, vec3(size.x, size.z, size.y), size.x / size.z] as const;
|
|
230
|
-
|
|
231
330
|
case "bottom":
|
|
232
331
|
return [0, -1, 0, vec3(size.x, size.z, size.y), size.x / size.z] as const;
|
|
233
|
-
|
|
234
332
|
case "right":
|
|
235
333
|
return [1, 0, 0, vec3(size.z, size.y, size.x), size.z / size.y] as const;
|
|
236
|
-
|
|
237
334
|
case "left":
|
|
238
335
|
return [-1, 0, 0, vec3(size.z, size.y, size.x), size.z / size.y] as const;
|
|
239
|
-
|
|
240
336
|
default:
|
|
241
337
|
return exhaustiveCheck(view);
|
|
242
338
|
}
|
|
@@ -4,7 +4,7 @@ import { Html, Stats, type OrbitControlsProps } from "@react-three/drei";
|
|
|
4
4
|
import { EffectComposer, N8AO } from "@react-three/postprocessing";
|
|
5
5
|
import { ReactPopover, ReactScene } from "./react-scene.js";
|
|
6
6
|
import { Scene, View, Group } from "../../abstract-3d.js";
|
|
7
|
-
import { ReactCamera, ControlsHelper, Camera } from "./react-camera.js";
|
|
7
|
+
import { ReactCamera, ControlsHelper, Camera, BufferZones } from "./react-camera.js";
|
|
8
8
|
import { HotSpotInfo } from "./react-hotspot.js";
|
|
9
9
|
import { MaterialState } from "./react-material.js";
|
|
10
10
|
|
|
@@ -28,6 +28,8 @@ type ReactProps = {
|
|
|
28
28
|
readonly materialStateImages?: Record<string, string>;
|
|
29
29
|
readonly sceneFallback?: React.JSX.Element;
|
|
30
30
|
readonly useOldMode?: boolean;
|
|
31
|
+
readonly bufferZones?: BufferZones;
|
|
32
|
+
readonly fitPadding?: number;
|
|
31
33
|
readonly onClickGroup?: (
|
|
32
34
|
id: string | undefined,
|
|
33
35
|
rootData: Record<string, string> | undefined,
|
|
@@ -80,12 +82,16 @@ export const render = memo(
|
|
|
80
82
|
onClickHotSpot,
|
|
81
83
|
createGroupKey,
|
|
82
84
|
createGroupId,
|
|
85
|
+
bufferZones,
|
|
86
|
+
fitPadding,
|
|
83
87
|
}: ReactProps): React.JSX.Element => {
|
|
84
88
|
const intensity = useOldMode ? 2 : 0.4;
|
|
85
89
|
return scene ? (
|
|
86
90
|
<Canvas dpr={[1, window.devicePixelRatio]} frameloop="demand" {...canvasProps}>
|
|
87
91
|
<React.Suspense fallback={<Html center>{sceneFallback ?? <></>}</Html>}>
|
|
88
92
|
<ReactCamera
|
|
93
|
+
bufferZones={bufferZones}
|
|
94
|
+
fitPadding={fitPadding}
|
|
89
95
|
scene={scene}
|
|
90
96
|
useAnimations={useAnimations}
|
|
91
97
|
camera={camera}
|
package/src/.DS_Store
DELETED
|
Binary file
|
package/src/renderers/.DS_Store
DELETED
|
Binary file
|