Require Opt modifier for orbiting (#286)
This commit is contained in:
parent
dbe6a6176e
commit
494c60d0c3
3 changed files with 1188 additions and 2 deletions
File diff suppressed because it is too large
Load diff
109
packages/r3f/src/extension/components/OrbitControls/index.tsx
Normal file
109
packages/r3f/src/extension/components/OrbitControls/index.tsx
Normal file
|
@ -0,0 +1,109 @@
|
||||||
|
import type {EventManager, ReactThreeFiber} from '@react-three/fiber'
|
||||||
|
import {useFrame, useThree} from '@react-three/fiber'
|
||||||
|
import * as React from 'react'
|
||||||
|
import {forwardRef, useEffect, useMemo} from 'react'
|
||||||
|
import type {Camera, Event} from 'three'
|
||||||
|
import {OrbitControlsImpl as OrbitControlsImpl} from './OrbitControlsImpl'
|
||||||
|
|
||||||
|
export type OrbitControlsProps = Omit<
|
||||||
|
ReactThreeFiber.Overwrite<
|
||||||
|
ReactThreeFiber.Object3DNode<OrbitControlsImpl, typeof OrbitControlsImpl>,
|
||||||
|
{
|
||||||
|
camera?: Camera
|
||||||
|
domElement?: HTMLElement
|
||||||
|
enableDamping?: boolean
|
||||||
|
makeDefault?: boolean
|
||||||
|
onChange?: (e?: Event) => void
|
||||||
|
onEnd?: (e?: Event) => void
|
||||||
|
onStart?: (e?: Event) => void
|
||||||
|
regress?: boolean
|
||||||
|
target?: ReactThreeFiber.Vector3
|
||||||
|
}
|
||||||
|
>,
|
||||||
|
'ref'
|
||||||
|
>
|
||||||
|
|
||||||
|
export const OrbitControls = forwardRef<OrbitControlsImpl, OrbitControlsProps>(
|
||||||
|
(
|
||||||
|
{
|
||||||
|
makeDefault,
|
||||||
|
camera,
|
||||||
|
regress,
|
||||||
|
domElement,
|
||||||
|
enableDamping = true,
|
||||||
|
onChange,
|
||||||
|
onStart,
|
||||||
|
onEnd,
|
||||||
|
...restProps
|
||||||
|
},
|
||||||
|
ref,
|
||||||
|
) => {
|
||||||
|
const invalidate = useThree(({invalidate}) => invalidate)
|
||||||
|
const defaultCamera = useThree(({camera}) => camera)
|
||||||
|
const gl = useThree(({gl}) => gl)
|
||||||
|
const events = useThree(({events}) => events) as EventManager<HTMLElement>
|
||||||
|
const set = useThree(({set}) => set)
|
||||||
|
const get = useThree(({get}) => get)
|
||||||
|
const performance = useThree(({performance}) => performance)
|
||||||
|
const explCamera = camera || defaultCamera
|
||||||
|
const explDomElement =
|
||||||
|
domElement ||
|
||||||
|
(typeof events.connected !== 'boolean' ? events.connected : gl.domElement)
|
||||||
|
const controls = useMemo(
|
||||||
|
() => new OrbitControlsImpl(explCamera),
|
||||||
|
[explCamera],
|
||||||
|
)
|
||||||
|
|
||||||
|
useFrame(() => {
|
||||||
|
if (controls.enabled) controls.update()
|
||||||
|
})
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const callback = (e: Event) => {
|
||||||
|
invalidate()
|
||||||
|
if (regress) performance.regress()
|
||||||
|
if (onChange) onChange(e)
|
||||||
|
}
|
||||||
|
|
||||||
|
controls.connect(explDomElement)
|
||||||
|
controls.addEventListener('change', callback)
|
||||||
|
|
||||||
|
if (onStart) controls.addEventListener('start', onStart)
|
||||||
|
if (onEnd) controls.addEventListener('end', onEnd)
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
controls.removeEventListener('change', callback)
|
||||||
|
if (onStart) controls.removeEventListener('start', onStart)
|
||||||
|
if (onEnd) controls.removeEventListener('end', onEnd)
|
||||||
|
controls.dispose()
|
||||||
|
}
|
||||||
|
}, [
|
||||||
|
explDomElement,
|
||||||
|
onChange,
|
||||||
|
onStart,
|
||||||
|
onEnd,
|
||||||
|
regress,
|
||||||
|
controls,
|
||||||
|
invalidate,
|
||||||
|
])
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (makeDefault) {
|
||||||
|
const old = get().controls
|
||||||
|
set({controls})
|
||||||
|
return () => set({controls: old})
|
||||||
|
}
|
||||||
|
}, [makeDefault, controls])
|
||||||
|
|
||||||
|
return (
|
||||||
|
<primitive
|
||||||
|
ref={ref}
|
||||||
|
object={controls}
|
||||||
|
enableDamping={enableDamping}
|
||||||
|
{...restProps}
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
export {OrbitControlsImpl}
|
|
@ -1,5 +1,6 @@
|
||||||
import {OrbitControls, PerspectiveCamera} from '@react-three/drei'
|
import {PerspectiveCamera} from '@react-three/drei'
|
||||||
import type {OrbitControls as OrbitControlsImpl} from 'three-stdlib'
|
import {OrbitControls} from './OrbitControls'
|
||||||
|
import type {OrbitControlsImpl} from './OrbitControls'
|
||||||
import type {MutableRefObject} from 'react'
|
import type {MutableRefObject} from 'react'
|
||||||
import {useLayoutEffect, useRef} from 'react'
|
import {useLayoutEffect, useRef} from 'react'
|
||||||
import React from 'react'
|
import React from 'react'
|
||||||
|
|
Loading…
Reference in a new issue