Skip to content

Commit 3205f78

Browse files
authored
CameraTransition: invalidate on change, pass options (#867)
* CameraTransition: invalidate on change, pass options * Fix transition
1 parent e4f6c21 commit 3205f78

File tree

2 files changed

+24
-24
lines changed

2 files changed

+24
-24
lines changed

src/r3f/components/CameraTransition.jsx

Lines changed: 22 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import { forwardRef, useEffect, useMemo } from 'react';
22
import { useFrame, useThree } from '@react-three/fiber';
33
import { CameraTransitionManager } from '3d-tiles-renderer';
4+
import { useDeepOptions } from '../utilities/useOptions';
45

56
export const CameraTransition = forwardRef( function CameraTransition( props, ref ) {
67

7-
const { mode = 'perspective', onTransitionStart, onTransitionEnd, perspectiveCamera, orthographicCamera } = props;
8+
const { mode = 'perspective', perspectiveCamera, orthographicCamera, ...options } = props;
89
const [ set, invalidate, controls, camera, size ] = useThree( state => [ state.set, state.invalidate, state.controls, state.camera, state.size ] );
910

1011
// create the manager
@@ -84,29 +85,6 @@ export const CameraTransition = forwardRef( function CameraTransition( props, re
8485

8586
}, [ manager, set ] );
8687

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-
11088
// assign cameras
11189
useEffect( () => {
11290

@@ -156,6 +134,26 @@ export const CameraTransition = forwardRef( function CameraTransition( props, re
156134

157135
}, [ mode, manager, invalidate, controls ] );
158136

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+
159157
// update animation
160158
useFrame( () => {
161159

src/three/controls/CameraTransitionManager.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,9 @@ export class CameraTransitionManager extends EventDispatcher {
7575

7676
toggle() {
7777

78+
// reset the clock for cases where we're not calling "update" every frame
7879
this._target = this._target === 1 ? 0 : 1;
80+
this._clock.getDelta();
7981

8082
}
8183

0 commit comments

Comments
 (0)