|
1 | 1 | import { forwardRef, useEffect, useMemo } from 'react'; |
2 | 2 | import { useFrame, useThree } from '@react-three/fiber'; |
3 | 3 | import { CameraTransitionManager } from '3d-tiles-renderer'; |
| 4 | +import { useDeepOptions } from '../utilities/useOptions'; |
4 | 5 |
|
5 | 6 | export const CameraTransition = forwardRef( function CameraTransition( props, ref ) { |
6 | 7 |
|
7 | | - const { mode = 'perspective', onTransitionStart, onTransitionEnd, perspectiveCamera, orthographicCamera } = props; |
| 8 | + const { mode = 'perspective', perspectiveCamera, orthographicCamera, ...options } = props; |
8 | 9 | const [ set, invalidate, controls, camera, size ] = useThree( state => [ state.set, state.invalidate, state.controls, state.camera, state.size ] ); |
9 | 10 |
|
10 | 11 | // create the manager |
@@ -84,29 +85,6 @@ export const CameraTransition = forwardRef( function CameraTransition( props, re |
84 | 85 |
|
85 | 86 | }, [ manager, set ] ); |
86 | 87 |
|
87 | | - // register for events |
88 | | - useEffect( () => { |
89 | | - |
90 | | - if ( onTransitionEnd ) { |
91 | | - |
92 | | - manager.addEventListener( 'transition-end', onTransitionEnd ); |
93 | | - return () => manager.removeEventListener( 'transition-end', onTransitionEnd ); |
94 | | - |
95 | | - } |
96 | | - |
97 | | - }, [ onTransitionEnd, manager ] ); |
98 | | - |
99 | | - useEffect( () => { |
100 | | - |
101 | | - if ( onTransitionStart ) { |
102 | | - |
103 | | - manager.addEventListener( 'transition-start', onTransitionStart ); |
104 | | - return () => manager.removeEventListener( 'transition-start', onTransitionStart ); |
105 | | - |
106 | | - } |
107 | | - |
108 | | - }, [ onTransitionStart, manager ] ); |
109 | | - |
110 | 88 | // assign cameras |
111 | 89 | useEffect( () => { |
112 | 90 |
|
@@ -156,6 +134,26 @@ export const CameraTransition = forwardRef( function CameraTransition( props, re |
156 | 134 |
|
157 | 135 | }, [ mode, manager, invalidate, controls ] ); |
158 | 136 |
|
| 137 | + // rerender the frame when the transition animates |
| 138 | + useEffect( () => { |
| 139 | + |
| 140 | + const callback = () => invalidate(); |
| 141 | + manager.addEventListener( 'transition-start', callback ); |
| 142 | + manager.addEventListener( 'change', callback ); |
| 143 | + manager.addEventListener( 'transition-end', callback ); |
| 144 | + |
| 145 | + return () => { |
| 146 | + |
| 147 | + manager.removeEventListener( 'transition-start', callback ); |
| 148 | + manager.removeEventListener( 'change', callback ); |
| 149 | + manager.removeEventListener( 'transition-end', callback ); |
| 150 | + |
| 151 | + }; |
| 152 | + |
| 153 | + }, [ manager, invalidate ] ); |
| 154 | + |
| 155 | + useDeepOptions( manager, options ); |
| 156 | + |
159 | 157 | // update animation |
160 | 158 | useFrame( () => { |
161 | 159 |
|
|
0 commit comments