diff --git a/components/canvas/nodes/ImageNode.tsx b/components/canvas/nodes/ImageNode.tsx index 40b7a807b..c15541825 100644 --- a/components/canvas/nodes/ImageNode.tsx +++ b/components/canvas/nodes/ImageNode.tsx @@ -238,6 +238,17 @@ const FLOATING_TOOLBAR_SCALE = 0.8; const IMAGE_EDIT_PANEL_SCALE = 0.5; const ANGLE_PREVIEW_HORIZONTAL_DRAG_MULTIPLIER = 0.72; const ANGLE_PREVIEW_VERTICAL_DRAG_MULTIPLIER = 0.46; +const ANGLE_PANEL_SOURCE_WIDTH = 520; +const ANGLE_PANEL_SOURCE_HEIGHT = 700; +const ANGLE_PANEL_PREVIEW_SIZE = 392; +const ANGLE_PANEL_CAMERA_SCENE_SIZE = 384; +const ANGLE_PANEL_WIREFRAME_RADIUS = 132; +const ANGLE_PANEL_WIREFRAME_CENTER = 160; +const ANGLE_PREVIEW_ORBIT_ROTATIONS = [ + 0, 14, 28, 42, 56, 70, 84, 98, 112, 126, 140, 154, 168, +]; +const ANGLE_PREVIEW_LATITUDE_RATIOS = [1, 0.9, 0.78, 0.64, 0.5]; +const ANGLE_PREVIEW_MERIDIAN_RATIOS = [1, 0.9, 0.78, 0.64]; const DEFAULT_CROP_PRESET_ID = "1:1"; const IMAGE_ADJUST_NOISE_DATA_URI = `data:image/svg+xml;utf8,${encodeURIComponent( "" @@ -469,12 +480,12 @@ function AngleEditPanelSlider({ valueLabel: string; }) { return ( -
+
- + {label} - + {valueLabel}
@@ -485,7 +496,7 @@ function AngleEditPanelSlider({ onValueChange={([nextValue]) => onChange(nextValue ?? value)} rangeClassName="bg-[#2d3035]" step={step} - thumbClassName="h-[22px] w-[22px] border-[5px] border-[#2d3035] bg-white shadow-[0_2px_10px_rgba(24,24,27,0.14)]" + thumbClassName="h-5 w-5 border-[4px] border-[#2d3035] bg-white shadow-[0_2px_10px_rgba(24,24,27,0.14)]" trackClassName="h-[4px] bg-[#e7e8ec]" value={[value]} /> @@ -2069,10 +2080,10 @@ export function ImageNode({ fitSizeWithinBox({ sourceWidth: angleSourceResolution.width, sourceHeight: angleSourceResolution.height, - maxWidth: anglePanelMode === "subject" ? 178 : 136, - maxHeight: anglePanelMode === "subject" ? 150 : 112, - minWidth: 74, - minHeight: 62, + maxWidth: anglePanelMode === "subject" ? 236 : 188, + maxHeight: anglePanelMode === "subject" ? 196 : 150, + minWidth: 96, + minHeight: 80, }), [anglePanelMode, angleSourceResolution.height, angleSourceResolution.width] ); @@ -2103,9 +2114,9 @@ export function ImageNode({ const angleCameraOrbitPosition = useMemo(() => { const horizontalRadians = (angleHorizontalAngle * Math.PI) / 180; const normalizedVertical = (angleVerticalAngle + 30) / 90; - const x = Math.sin(horizontalRadians) * 92; - const y = -normalizedVertical * 60 + 24; - const z = Math.cos(horizontalRadians) * 28; + const x = Math.sin(horizontalRadians) * 110; + const y = -normalizedVertical * 72 + 26; + const z = Math.cos(horizontalRadians) * 38; return { x: Number(x.toFixed(2)), y: Number(y.toFixed(2)), @@ -2127,8 +2138,18 @@ export function ImageNode({ length: Number(length.toFixed(2)), }; }, [angleCameraOrbitPosition]); + const angleOrbitWireframeStyle = useMemo( + () => ({ + transform: `rotateX(${-angleVerticalAngle * 0.22}deg) rotateY(${angleHorizontalAngle * 0.28}deg) rotateZ(${angleHorizontalAngle * 0.04}deg)`, + transformStyle: "preserve-3d", + transition: isAnglePreviewDragging + ? "none" + : "transform 180ms cubic-bezier(0.22, 1, 0.36, 1)", + }), + [angleHorizontalAngle, angleVerticalAngle, isAnglePreviewDragging] + ); const angleCameraSceneScale = useMemo( - () => Number((0.9 + (angleZoom / 100) * 0.24).toFixed(3)), + () => Number((0.94 + (angleZoom / 100) * 0.22).toFixed(3)), [angleZoom] ); const cropImageMetrics = useMemo(() => { @@ -3586,8 +3607,8 @@ export function ImageNode({ } const rect = containerRef.current.getBoundingClientRect(); - const panelWidth = 372 * IMAGE_EDIT_PANEL_SCALE; - const panelHeight = 760 * IMAGE_EDIT_PANEL_SCALE; + const panelWidth = ANGLE_PANEL_SOURCE_WIDTH * IMAGE_EDIT_PANEL_SCALE; + const panelHeight = ANGLE_PANEL_SOURCE_HEIGHT * IMAGE_EDIT_PANEL_SCALE; const spacing = 16; const maxTop = Math.max(12, window.innerHeight - panelHeight); @@ -8191,7 +8212,7 @@ export function ImageNode({ typeof document !== "undefined" && createPortal(
event.stopPropagation()} onMouseDown={(event) => event.stopPropagation()} onPointerDown={(event) => event.stopPropagation()} @@ -8228,7 +8249,7 @@ export function ImageNode({ return (
-
+
-
+
- - - - - - - + {ANGLE_PREVIEW_ORBIT_ROTATIONS.map((rotation, index) => ( + + ))} + {ANGLE_PREVIEW_LATITUDE_RATIOS.map((ratio, index) => ( + + ))} + {ANGLE_PREVIEW_MERIDIAN_RATIOS.map((ratio, index) => ( + + ))}
@@ -8387,7 +8399,7 @@ export function ImageNode({ style={{ width: `${anglePreviewFrameSize.width}px`, height: `${anglePreviewFrameSize.height}px`, - transform: `rotateX(${-angleVerticalAngle * 0.46}deg) rotateY(${angleHorizontalAngle * 0.62}deg) scale(${anglePreviewScale})`, + transform: `rotateX(${-angleVerticalAngle * 0.5}deg) rotateY(${angleHorizontalAngle * 0.68}deg) scale(${anglePreviewScale})`, transformStyle: "preserve-3d", transition: isAnglePreviewDragging ? "none" @@ -8397,7 +8409,7 @@ export function ImageNode({
) : (
{displayTitle} @@ -8492,7 +8506,7 @@ export function ImageNode({
+
) : null}
-
+
-
+