abstract-3d 2.2.1 → 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 +109 -72
- package/lib/renderers/react/react-camera.js.map +1 -1
- package/lib/renderers/react/react-material.d.ts +13 -1
- package/lib/renderers/react/react-material.d.ts.map +1 -1
- package/lib/renderers/react/react-material.js +22 -5
- package/lib/renderers/react/react-material.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 +152 -75
- package/src/renderers/react/react-material.tsx +26 -5
- package/src/renderers/react/react.tsx +7 -1
|
@@ -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":"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"}
|
|
@@ -7,102 +7,120 @@ 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);
|
|
14
14
|
const initialDistRef = useRef(null);
|
|
15
15
|
const initialTargetRef = useRef(new Vector3());
|
|
16
|
+
const initialFovRef = useRef(null);
|
|
16
17
|
const viewPortAspect = useThree(({ viewport: { aspect } }) => aspect);
|
|
18
|
+
const canvasSize = useThree(({ size }) => size);
|
|
17
19
|
const { invalidate } = useThree();
|
|
18
20
|
const resetZoomOnGizmoClick = () => {
|
|
19
|
-
if (!controls || initialDistRef.current == null || !perspectiveRef.current)
|
|
21
|
+
if (!controls || initialDistRef.current == null || (!perspectiveRef.current && !orthographicRef.current)) {
|
|
20
22
|
return;
|
|
21
|
-
|
|
23
|
+
}
|
|
24
|
+
const newCamera = camera.type === "Perspective" ? perspectiveRef.current : orthographicRef.current;
|
|
22
25
|
const target = initialTargetRef.current.clone();
|
|
23
26
|
controls.target.copy(target);
|
|
24
27
|
const dist = initialDistRef.current;
|
|
25
|
-
const dir =
|
|
26
|
-
|
|
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();
|
|
27
44
|
controls.update();
|
|
28
45
|
invalidate();
|
|
29
46
|
};
|
|
30
47
|
useLayoutEffect(() => {
|
|
31
|
-
const [posX, posY, posZ, size, sceneAspect] = (
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
1,
|
|
56
|
-
0,
|
|
57
|
-
0,
|
|
58
|
-
vec3(scene.size_deprecated.z, scene.size_deprecated.y, scene.size_deprecated.x),
|
|
59
|
-
scene.size_deprecated.z / scene.size_deprecated.y,
|
|
60
|
-
];
|
|
61
|
-
case "left":
|
|
62
|
-
return [
|
|
63
|
-
-1,
|
|
64
|
-
0,
|
|
65
|
-
0,
|
|
66
|
-
vec3(scene.size_deprecated.z, scene.size_deprecated.y, scene.size_deprecated.x),
|
|
67
|
-
scene.size_deprecated.z / scene.size_deprecated.y,
|
|
68
|
-
];
|
|
69
|
-
default:
|
|
70
|
-
return exhaustiveCheck(view);
|
|
71
|
-
}
|
|
72
|
-
})();
|
|
73
|
-
const dist = cameraDist(size, camera.type === "Perspective" ? camera.fov ?? 45 : 45);
|
|
74
|
-
initialDistRef.current = dist;
|
|
48
|
+
const [posX, posY, posZ, size, sceneAspect] = getViewTransform(view, scene);
|
|
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
|
+
// ------------------------------------------------------------------
|
|
75
72
|
if (camera.type === "Orthographic" && orthographicRef.current) {
|
|
76
|
-
const
|
|
77
|
-
|
|
78
|
-
|
|
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;
|
|
79
97
|
orthographicRef.current.position.set(posX * dist, posY * dist, posZ * dist);
|
|
80
|
-
orthographicRef.current.
|
|
81
|
-
orthographicRef.current.right = right;
|
|
82
|
-
orthographicRef.current.bottom = bottom;
|
|
83
|
-
orthographicRef.current.top = top;
|
|
98
|
+
orthographicRef.current.zoom = 1;
|
|
84
99
|
orthographicRef.current.updateProjectionMatrix();
|
|
100
|
+
// ------------------------------------------------------------------
|
|
101
|
+
// PERSPECTIVE
|
|
102
|
+
// ------------------------------------------------------------------
|
|
85
103
|
}
|
|
86
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;
|
|
87
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);
|
|
88
121
|
perspectiveRef.current.updateProjectionMatrix();
|
|
89
122
|
}
|
|
90
|
-
}, [camera, viewPortAspect]);
|
|
91
|
-
// const prevScene = React.useRef(scene)
|
|
92
|
-
// useEffect(() => {
|
|
93
|
-
// prevScene.current = scene;
|
|
94
|
-
// }, [scene]);
|
|
95
|
-
// useFrame(() => {
|
|
96
|
-
// if (useAnimations && camera && prevScene.current !== scene) {
|
|
97
|
-
// const [, , z] = cameraDist(scene);
|
|
98
|
-
// vector3.set(camera.position.x, camera.position.y, z);
|
|
99
|
-
// camera.position.lerp(vector3, 0.12);
|
|
100
|
-
// ref.current.enabled = false;
|
|
101
|
-
// invalidate();
|
|
102
|
-
// } else {
|
|
103
|
-
// ref.current.enabled = true;
|
|
104
|
-
// }
|
|
105
|
-
// });
|
|
123
|
+
}, [camera, viewPortAspect, canvasSize, bufferZones, view, scene, fitPadding]);
|
|
106
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) => {
|
|
107
125
|
setControls(c);
|
|
108
126
|
} }), (() => {
|
|
@@ -138,4 +156,23 @@ const ControlsWrapper = (props) => {
|
|
|
138
156
|
return _jsx(OrbitControls, { ...props, makeDefault: true, ref: ref });
|
|
139
157
|
};
|
|
140
158
|
export const cameraDist = (size, fov) => size.z * 0.5 + (size.x > size.y ? size.x : size.y) / (1 / 2 / Math.tan((Math.PI * fov) / 180 / 2));
|
|
159
|
+
function getViewTransform(view, scene) {
|
|
160
|
+
const size = scene.size_deprecated;
|
|
161
|
+
switch (view) {
|
|
162
|
+
case "front":
|
|
163
|
+
return [0, 0, 1, size, size.x / size.y];
|
|
164
|
+
case "back":
|
|
165
|
+
return [0, 0, -1, size, size.x / size.y];
|
|
166
|
+
case "top":
|
|
167
|
+
return [0, 1, 0, vec3(size.x, size.z, size.y), size.x / size.z];
|
|
168
|
+
case "bottom":
|
|
169
|
+
return [0, -1, 0, vec3(size.x, size.z, size.y), size.x / size.z];
|
|
170
|
+
case "right":
|
|
171
|
+
return [1, 0, 0, vec3(size.z, size.y, size.x), size.z / size.y];
|
|
172
|
+
case "left":
|
|
173
|
+
return [-1, 0, 0, vec3(size.z, size.y, size.x), size.z / size.y];
|
|
174
|
+
default:
|
|
175
|
+
return exhaustiveCheck(view);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
141
178
|
//# sourceMappingURL=react-camera.js.map
|
|
@@ -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":"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"}
|
|
@@ -1,6 +1,18 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { Material } from "../../abstract-3d.js";
|
|
3
|
-
export
|
|
3
|
+
export declare enum MinificationFilter {
|
|
4
|
+
Nearest = 1003,
|
|
5
|
+
Linear = 1006,
|
|
6
|
+
LinearMipmap = 1008
|
|
7
|
+
}
|
|
8
|
+
export declare enum MagnificationFilter {
|
|
9
|
+
Nearest = 1003,
|
|
10
|
+
Linear = 1006
|
|
11
|
+
}
|
|
12
|
+
export type TextureFilter = {
|
|
13
|
+
readonly min: MinificationFilter;
|
|
14
|
+
readonly mag: MagnificationFilter;
|
|
15
|
+
};
|
|
4
16
|
export type MaterialState = "Accept" | "Error" | "Warning";
|
|
5
17
|
export declare const ERROR_IMG_KEY = "error";
|
|
6
18
|
export declare function ReactMaterial({ material, id, selectedIds, hoveredId, disabled, materialStateImages, state, isText, isHotSpot, drawBackOnly, useAlphaTest, }: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react-material.d.ts","sourceRoot":"","sources":["../../../src/renderers/react/react-material.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoB,MAAM,OAAO,CAAC;AAYzC,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAKhD,MAAM,MAAM,aAAa,GAAG,
|
|
1
|
+
{"version":3,"file":"react-material.d.ts","sourceRoot":"","sources":["../../../src/renderers/react/react-material.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoB,MAAM,OAAO,CAAC;AAYzC,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAKhD,oBAAY,kBAAkB;IAC5B,OAAO,OAAO;IACd,MAAM,OAAO;IACb,YAAY,OAAO;CACpB;AAED,oBAAY,mBAAmB;IAC7B,OAAO,OAAO;IACd,MAAM,OAAO;CACd;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,GAAG,EAAE,kBAAkB,CAAC;IACjC,QAAQ,CAAC,GAAG,EAAE,mBAAmB,CAAC;CACnC,CAAA;AAED,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;AAC3D,eAAO,MAAM,aAAa,UAAU,CAAC;AAErC,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,EAAO,EACP,WAAW,EACX,SAAS,EACT,QAAQ,EACR,mBAAmB,EACnB,KAAK,EACL,MAAM,EACN,SAAS,EACT,YAAY,EACZ,YAAY,GACb,EAAE;IACD,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAC3D,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtD,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;IAC3C,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;CACjC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CA4EpB"}
|
|
@@ -4,6 +4,18 @@ import { suspend } from "suspend-react";
|
|
|
4
4
|
import { BackSide, DoubleSide, FrontSide, SRGBColorSpace, TextureLoader, } from "three";
|
|
5
5
|
import { shade } from "../../utils.js";
|
|
6
6
|
const decreasedOpacity = 0.125;
|
|
7
|
+
export var MinificationFilter;
|
|
8
|
+
(function (MinificationFilter) {
|
|
9
|
+
MinificationFilter[MinificationFilter["Nearest"] = 1003] = "Nearest";
|
|
10
|
+
MinificationFilter[MinificationFilter["Linear"] = 1006] = "Linear";
|
|
11
|
+
MinificationFilter[MinificationFilter["LinearMipmap"] = 1008] = "LinearMipmap";
|
|
12
|
+
})(MinificationFilter || (MinificationFilter = {}));
|
|
13
|
+
;
|
|
14
|
+
export var MagnificationFilter;
|
|
15
|
+
(function (MagnificationFilter) {
|
|
16
|
+
MagnificationFilter[MagnificationFilter["Nearest"] = 1003] = "Nearest";
|
|
17
|
+
MagnificationFilter[MagnificationFilter["Linear"] = 1006] = "Linear";
|
|
18
|
+
})(MagnificationFilter || (MagnificationFilter = {}));
|
|
7
19
|
export const ERROR_IMG_KEY = "error";
|
|
8
20
|
export function ReactMaterial({ material, id = "", selectedIds, hoveredId, disabled, materialStateImages, state, isText, isHotSpot, drawBackOnly, useAlphaTest, }) {
|
|
9
21
|
const mat = !state || material.imageUrl === "UrlImage"
|
|
@@ -29,7 +41,7 @@ export function ReactMaterial({ material, id = "", selectedIds, hoveredId, disab
|
|
|
29
41
|
: mat.normal;
|
|
30
42
|
const opacity = material.opacity !== undefined ? material.opacity : materialDefaults.opacity;
|
|
31
43
|
if (material.imageUrl) {
|
|
32
|
-
return (_jsx(TextureMaterial, { url: state === "Error" ? materialStateImages?.[ERROR_IMG_KEY] ?? material.imageUrl : material.imageUrl, color: color, material: mat, useAlphaTest: useAlphaTest }));
|
|
44
|
+
return (_jsx(TextureMaterial, { url: state === "Error" ? materialStateImages?.[ERROR_IMG_KEY] ?? material.imageUrl : material.imageUrl, color: color, material: mat, useAlphaTest: useAlphaTest, filter: { mag: MagnificationFilter.Linear, min: MinificationFilter.LinearMipmap } }));
|
|
33
45
|
}
|
|
34
46
|
if (isText) {
|
|
35
47
|
return (_jsx("meshBasicMaterial", { color: colorText, side: FrontSide, transparent: true, ...(opacity < 1 ? { opacity } : materialDefaults) }, `mesh_material_text}`));
|
|
@@ -47,13 +59,18 @@ export function ReactMaterial({ material, id = "", selectedIds, hoveredId, disab
|
|
|
47
59
|
: materialDefaults) }, `mesh_material_standard_${mat.normal}_${mat.metalness}_${mat.opacity}_${mat.roughness}`));
|
|
48
60
|
}
|
|
49
61
|
const materialDefaults = { transparent: false, depthWrite: true, depthTest: true, opacity: 1.0 };
|
|
50
|
-
function TextureMaterial({ url, color, material, useAlphaTest = true, filter =
|
|
62
|
+
function TextureMaterial({ url, color, material, useAlphaTest = true, filter = {
|
|
63
|
+
min: MinificationFilter.LinearMipmap,
|
|
64
|
+
mag: MagnificationFilter.Linear
|
|
65
|
+
}, }) {
|
|
51
66
|
const texture = suspend(new Promise((res) => textureLoader.load(url, (data) => {
|
|
52
67
|
data.colorSpace = SRGBColorSpace;
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
68
|
+
data.minFilter = filter.min;
|
|
69
|
+
data.magFilter = filter.mag;
|
|
70
|
+
if (filter.min === MinificationFilter.LinearMipmap) {
|
|
71
|
+
data.generateMipmaps = true;
|
|
56
72
|
}
|
|
73
|
+
data.anisotropy = 4;
|
|
57
74
|
res(data);
|
|
58
75
|
}, undefined, () => res(null))), [url]);
|
|
59
76
|
useEffect(() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react-material.js","sourceRoot":"","sources":["../../../src/renderers/react/react-material.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EACL,QAAQ,EAER,UAAU,EACV,SAAS,EAET,cAAc,EAEd,aAAa,GACd,MAAM,OAAO,CAAC;AAEf,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvC,MAAM,gBAAgB,GAAG,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"react-material.js","sourceRoot":"","sources":["../../../src/renderers/react/react-material.tsx"],"names":[],"mappings":"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"}
|
|
@@ -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);
|
|
@@ -52,103 +70,140 @@ export function ReactCamera({
|
|
|
52
70
|
|
|
53
71
|
const initialDistRef = useRef<number | null>(null);
|
|
54
72
|
const initialTargetRef = useRef(new Vector3());
|
|
73
|
+
const initialFovRef = useRef<number | null>(null);
|
|
55
74
|
|
|
56
75
|
const viewPortAspect = useThree(({ viewport: { aspect } }) => aspect);
|
|
76
|
+
const canvasSize = useThree(({ size }) => size);
|
|
57
77
|
const { invalidate } = useThree();
|
|
58
78
|
|
|
59
79
|
const resetZoomOnGizmoClick = (): void => {
|
|
60
|
-
if (!controls || initialDistRef.current == null || !perspectiveRef.current)
|
|
80
|
+
if (!controls || initialDistRef.current == null || (!perspectiveRef.current && !orthographicRef.current)) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
61
83
|
|
|
62
|
-
const
|
|
84
|
+
const newCamera = camera.type === "Perspective" ? perspectiveRef.current : orthographicRef.current;
|
|
63
85
|
const target = initialTargetRef.current.clone();
|
|
86
|
+
|
|
64
87
|
controls.target.copy(target);
|
|
88
|
+
|
|
65
89
|
const dist = initialDistRef.current;
|
|
66
|
-
const dir =
|
|
67
|
-
|
|
90
|
+
const dir = newCamera.position.clone().sub(target).normalize();
|
|
91
|
+
newCamera.fov = initialFovRef.current;
|
|
92
|
+
newCamera.zoom = 1;
|
|
93
|
+
newCamera.position.copy(target.clone().add(dir.multiplyScalar(dist)));
|
|
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
|
+
}
|
|
68
106
|
|
|
107
|
+
newCamera.updateProjectionMatrix();
|
|
69
108
|
controls.update();
|
|
70
109
|
invalidate();
|
|
71
110
|
};
|
|
72
111
|
|
|
73
112
|
useLayoutEffect(() => {
|
|
74
|
-
const [posX, posY, posZ, size, sceneAspect] = (
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
scene.size_deprecated.x / scene.size_deprecated.z,
|
|
95
|
-
];
|
|
96
|
-
case "right":
|
|
97
|
-
return [
|
|
98
|
-
1,
|
|
99
|
-
0,
|
|
100
|
-
0,
|
|
101
|
-
vec3(scene.size_deprecated.z, scene.size_deprecated.y, scene.size_deprecated.x),
|
|
102
|
-
scene.size_deprecated.z / scene.size_deprecated.y,
|
|
103
|
-
];
|
|
104
|
-
case "left":
|
|
105
|
-
return [
|
|
106
|
-
-1,
|
|
107
|
-
0,
|
|
108
|
-
0,
|
|
109
|
-
vec3(scene.size_deprecated.z, scene.size_deprecated.y, scene.size_deprecated.x),
|
|
110
|
-
scene.size_deprecated.z / scene.size_deprecated.y,
|
|
111
|
-
];
|
|
112
|
-
default:
|
|
113
|
-
return exhaustiveCheck(view);
|
|
114
|
-
}
|
|
115
|
-
})();
|
|
113
|
+
const [posX, posY, posZ, size, sceneAspect] = getViewTransform(view, scene);
|
|
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;
|
|
116
133
|
|
|
117
|
-
|
|
118
|
-
|
|
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;
|
|
119
138
|
|
|
139
|
+
initialFovRef.current = camera.type === "Perspective" ? fov : null;
|
|
140
|
+
|
|
141
|
+
// ------------------------------------------------------------------
|
|
142
|
+
// ORTHOGRAPHIC
|
|
143
|
+
// ------------------------------------------------------------------
|
|
120
144
|
if (camera.type === "Orthographic" && orthographicRef.current) {
|
|
121
|
-
const
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
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
|
+
|
|
125
173
|
orthographicRef.current.position.set(posX * dist, posY * dist, posZ * dist);
|
|
126
|
-
orthographicRef.current.
|
|
127
|
-
orthographicRef.current.right = right;
|
|
128
|
-
orthographicRef.current.bottom = bottom;
|
|
129
|
-
orthographicRef.current.top = top;
|
|
174
|
+
orthographicRef.current.zoom = 1;
|
|
130
175
|
orthographicRef.current.updateProjectionMatrix();
|
|
176
|
+
|
|
177
|
+
// ------------------------------------------------------------------
|
|
178
|
+
// PERSPECTIVE
|
|
179
|
+
// ------------------------------------------------------------------
|
|
131
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;
|
|
132
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
|
+
|
|
133
203
|
perspectiveRef.current.updateProjectionMatrix();
|
|
134
204
|
}
|
|
135
|
-
}, [camera, viewPortAspect]);
|
|
136
|
-
|
|
137
|
-
// useEffect(() => {
|
|
138
|
-
// prevScene.current = scene;
|
|
139
|
-
// }, [scene]);
|
|
140
|
-
|
|
141
|
-
// useFrame(() => {
|
|
142
|
-
// if (useAnimations && camera && prevScene.current !== scene) {
|
|
143
|
-
// const [, , z] = cameraDist(scene);
|
|
144
|
-
// vector3.set(camera.position.x, camera.position.y, z);
|
|
145
|
-
// camera.position.lerp(vector3, 0.12);
|
|
146
|
-
// ref.current.enabled = false;
|
|
147
|
-
// invalidate();
|
|
148
|
-
// } else {
|
|
149
|
-
// ref.current.enabled = true;
|
|
150
|
-
// }
|
|
151
|
-
// });
|
|
205
|
+
}, [camera, viewPortAspect, canvasSize, bufferZones, view, scene, fitPadding]);
|
|
206
|
+
|
|
152
207
|
return (
|
|
153
208
|
<>
|
|
154
209
|
<PerspectiveCamera
|
|
@@ -260,3 +315,25 @@ type GenericProps = {
|
|
|
260
315
|
|
|
261
316
|
export const cameraDist = (size: Vec3, fov: number): number =>
|
|
262
317
|
size.z * 0.5 + (size.x > size.y ? size.x : size.y) / (1 / 2 / Math.tan((Math.PI * fov) / 180 / 2));
|
|
318
|
+
|
|
319
|
+
type ViewTransform = readonly [number, number, number, Vec3, number];
|
|
320
|
+
function getViewTransform(view: View, scene: Scene): ViewTransform {
|
|
321
|
+
const size = scene.size_deprecated;
|
|
322
|
+
|
|
323
|
+
switch (view) {
|
|
324
|
+
case "front":
|
|
325
|
+
return [0, 0, 1, size, size.x / size.y] as const;
|
|
326
|
+
case "back":
|
|
327
|
+
return [0, 0, -1, size, size.x / size.y] as const;
|
|
328
|
+
case "top":
|
|
329
|
+
return [0, 1, 0, vec3(size.x, size.z, size.y), size.x / size.z] as const;
|
|
330
|
+
case "bottom":
|
|
331
|
+
return [0, -1, 0, vec3(size.x, size.z, size.y), size.x / size.z] as const;
|
|
332
|
+
case "right":
|
|
333
|
+
return [1, 0, 0, vec3(size.z, size.y, size.x), size.z / size.y] as const;
|
|
334
|
+
case "left":
|
|
335
|
+
return [-1, 0, 0, vec3(size.z, size.y, size.x), size.z / size.y] as const;
|
|
336
|
+
default:
|
|
337
|
+
return exhaustiveCheck(view);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
@@ -15,7 +15,22 @@ import { shade } from "../../utils.js";
|
|
|
15
15
|
|
|
16
16
|
const decreasedOpacity = 0.125;
|
|
17
17
|
|
|
18
|
-
export
|
|
18
|
+
export enum MinificationFilter {
|
|
19
|
+
Nearest = 1003,
|
|
20
|
+
Linear = 1006,
|
|
21
|
+
LinearMipmap = 1008,
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export enum MagnificationFilter {
|
|
25
|
+
Nearest = 1003,
|
|
26
|
+
Linear = 1006,
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export type TextureFilter = {
|
|
30
|
+
readonly min: MinificationFilter;
|
|
31
|
+
readonly mag: MagnificationFilter;
|
|
32
|
+
}
|
|
33
|
+
|
|
19
34
|
export type MaterialState = "Accept" | "Error" | "Warning";
|
|
20
35
|
export const ERROR_IMG_KEY = "error";
|
|
21
36
|
|
|
@@ -74,6 +89,7 @@ export function ReactMaterial({
|
|
|
74
89
|
color={color}
|
|
75
90
|
material={mat}
|
|
76
91
|
useAlphaTest={useAlphaTest}
|
|
92
|
+
filter={{ mag: MagnificationFilter.Linear, min: MinificationFilter.LinearMipmap }}
|
|
77
93
|
/>
|
|
78
94
|
);
|
|
79
95
|
}
|
|
@@ -126,7 +142,10 @@ function TextureMaterial({
|
|
|
126
142
|
color,
|
|
127
143
|
material,
|
|
128
144
|
useAlphaTest = true,
|
|
129
|
-
filter =
|
|
145
|
+
filter = {
|
|
146
|
+
min: MinificationFilter.LinearMipmap,
|
|
147
|
+
mag: MagnificationFilter.Linear
|
|
148
|
+
},
|
|
130
149
|
}: {
|
|
131
150
|
readonly url: string;
|
|
132
151
|
readonly color: string | Color | undefined;
|
|
@@ -140,10 +159,12 @@ function TextureMaterial({
|
|
|
140
159
|
url,
|
|
141
160
|
(data) => {
|
|
142
161
|
data.colorSpace = SRGBColorSpace;
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
162
|
+
data.minFilter = filter.min;
|
|
163
|
+
data.magFilter = filter.mag;
|
|
164
|
+
if(filter.min === MinificationFilter.LinearMipmap) {
|
|
165
|
+
data.generateMipmaps = true;
|
|
146
166
|
}
|
|
167
|
+
data.anisotropy = 4;
|
|
147
168
|
res(data);
|
|
148
169
|
},
|
|
149
170
|
undefined,
|
|
@@ -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}
|