@@ -10,6 +10,7 @@ import {
10
10
FirstPersonView ,
11
11
_GlobeView as GlobeView
12
12
} from '@deck.gl/core' ;
13
+ import { Timeline } from '@luma.gl/engine' ;
13
14
14
15
import testController from './test-controller' ;
15
16
@@ -96,6 +97,65 @@ test('OrthographicController#2d zoom', async t => {
96
97
t . end ( ) ;
97
98
} ) ;
98
99
100
+ test ( 'OrthographicController scroll zoom responds without transition lag' , t => {
101
+ const timeline = new Timeline ( ) ;
102
+ const view = new OrthographicView ( { controller : true } ) ;
103
+ const baseProps = {
104
+ id : 'test-view' ,
105
+ x : 0 ,
106
+ y : 0 ,
107
+ width : 100 ,
108
+ height : 100 ,
109
+ target : [ 0 , 0 , 0 ] ,
110
+ zoom : 0 ,
111
+ scrollZoom : true
112
+ } ;
113
+ const controllerProps = { ...view . controller , ...baseProps } ;
114
+ const ControllerClass = controllerProps . type ;
115
+
116
+ let currentProps = { ...controllerProps } ;
117
+ let lastViewState = currentProps ;
118
+
119
+ const controller = new ControllerClass ( {
120
+ timeline,
121
+ onViewStateChange : ( { viewState} ) => {
122
+ lastViewState = viewState ;
123
+ currentProps = { ...currentProps , ...viewState } ;
124
+ controller . setProps ( currentProps ) ;
125
+ } ,
126
+ onStateChange : ( ) => { } ,
127
+ makeViewport : viewState =>
128
+ view . makeViewport ( { width : currentProps . width , height : currentProps . height , viewState} )
129
+ } ) ;
130
+
131
+ controller . setProps ( currentProps ) ;
132
+
133
+ const wheelEvent = {
134
+ type : 'wheel' ,
135
+ offsetCenter : { x : 50 , y : 50 } ,
136
+ delta : - 1 ,
137
+ srcEvent : { preventDefault ( ) { } } ,
138
+ stopPropagation : ( ) => { }
139
+ } ;
140
+
141
+ controller . handleEvent ( wheelEvent as any ) ;
142
+
143
+ const speed = 0.01 ;
144
+ const { delta} = wheelEvent ;
145
+ let scale = 2 / ( 1 + Math . exp ( - Math . abs ( delta * speed ) ) ) ;
146
+ if ( delta < 0 && scale !== 0 ) {
147
+ scale = 1 / scale ;
148
+ }
149
+ const expectedZoom = baseProps . zoom + Math . log2 ( scale ) ;
150
+
151
+ t . ok (
152
+ Math . abs ( ( lastViewState . zoom as number ) - expectedZoom ) < 1e-6 ,
153
+ 'zoom level updates immediately when scroll zoom is not smooth'
154
+ ) ;
155
+
156
+ t . end ( ) ;
157
+ } ) ;
158
+
99
159
test ( 'FirstPersonController' , async t => {
100
160
await testController (
101
161
t ,
0 commit comments