Skip to content

Commit

Permalink
Disable view control menu items and gizmo clicks conditionally
Browse files Browse the repository at this point in the history
  • Loading branch information
franknoirot committed Feb 27, 2025
1 parent 89bc93e commit e05f13d
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 7 deletions.
19 changes: 14 additions & 5 deletions src/components/Gizmo.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { SceneInfra } from 'clientSideScene/sceneInfra'
import { sceneInfra } from 'lib/singletons'
import { MutableRefObject, useEffect, useRef } from 'react'
import { MutableRefObject, useEffect, useMemo, useRef } from 'react'
import {
WebGLRenderer,
Scene,
Expand All @@ -27,6 +27,8 @@ import {
ViewControlContextMenu,
} from './ViewControlMenu'
import { AxisNames } from 'lib/constants'
import { useModelingContext } from 'hooks/useModelingContext'
import { useSettings } from 'machines/appMachine'

const CANVAS_SIZE = 80
const FRUSTUM_SIZE = 0.5
Expand All @@ -40,6 +42,11 @@ enum AxisColors {
}

export default function Gizmo() {
const { state: modelingState, send: modelingSend } = useModelingContext()
const settings = useSettings()
const shouldDisableOrbit =
modelingState.matches('Sketch') &&
!settings.app.allowOrbitInSketchMode.current
const menuItems = useViewControlMenuItems()
const wrapperRef = useRef<HTMLDivElement | null>(null)
const canvasRef = useRef<HTMLCanvasElement | null>(null)
Expand All @@ -64,7 +71,8 @@ export default function Gizmo() {
const { mouse, disposeMouseEvents } = initializeMouseEvents(
canvas,
raycasterIntersect,
sceneInfra
sceneInfra,
shouldDisableOrbit
)
const raycasterObjects = [...gizmoAxisHeads]

Expand Down Expand Up @@ -99,7 +107,7 @@ export default function Gizmo() {
renderer.dispose()
disposeMouseEvents()
}
}, [])
}, [shouldDisableOrbit])

return (
<div className="relative">
Expand Down Expand Up @@ -246,7 +254,8 @@ const quaternionsEqual = (
const initializeMouseEvents = (
canvas: HTMLCanvasElement,
raycasterIntersect: MutableRefObject<Intersection<Object3D> | null>,
sceneInfra: SceneInfra
sceneInfra: SceneInfra,
disableClicks: boolean
): { mouse: Vector2; disposeMouseEvents: () => void } => {
const mouse = new Vector2()
mouse.x = 1 // fix initial mouse position issue
Expand All @@ -258,7 +267,7 @@ const initializeMouseEvents = (
}

const handleClick = () => {
if (raycasterIntersect.current) {
if (raycasterIntersect.current && !disableClicks) {
const axisName = raycasterIntersect.current.object.name as AxisNames
sceneInfra.camControls.updateCameraToAxis(axisName).catch(reportRejection)
}
Expand Down
12 changes: 10 additions & 2 deletions src/components/ViewControlMenu.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,14 @@ import { AxisNames, VIEW_NAMES_SEMANTIC } from 'lib/constants'
import { useModelingContext } from 'hooks/useModelingContext'
import { useMemo } from 'react'
import { sceneInfra } from 'lib/singletons'
import { useSettings } from 'machines/appMachine'

export function useViewControlMenuItems() {
const { send: modelingSend } = useModelingContext()
const { state: modelingState, send: modelingSend } = useModelingContext()
const settings = useSettings()
const shouldLockView =
modelingState.matches('Sketch') &&
!settings.app.allowOrbitInSketchMode.current
const menuItems = useMemo(
() => [
...Object.entries(VIEW_NAMES_SEMANTIC).map(([axisName, axisSemantic]) => (
Expand All @@ -23,6 +28,7 @@ export function useViewControlMenuItems() {
.updateCameraToAxis(axisName as AxisNames)
.catch(reportRejection)
}}
disabled={shouldLockView}
>
{axisSemantic} view
</ContextMenuItem>
Expand All @@ -32,20 +38,22 @@ export function useViewControlMenuItems() {
onClick={() => {
sceneInfra.camControls.resetCameraPosition().catch(reportRejection)
}}
disabled={shouldLockView}
>
Reset view
</ContextMenuItem>,
<ContextMenuItem
onClick={() => {
modelingSend({ type: 'Center camera on selection' })
}}
disabled={shouldLockView}
>
Center view on selection
</ContextMenuItem>,
<ContextMenuDivider />,
<ContextMenuItemRefresh />,
],
[VIEW_NAMES_SEMANTIC]
[VIEW_NAMES_SEMANTIC, shouldLockView]
)
return menuItems
}
Expand Down

0 comments on commit e05f13d

Please sign in to comment.