abstract-3d 2.10.3 → 2.10.4
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.
|
@@ -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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"}
|
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.4",
|
|
4
|
+
"gitHead": "3b89c07f73237736facd6511e618fd0a5aebb02d",
|
|
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
|
<>
|