@@ -3,7 +3,11 @@ use libmonado::{MndResult, Monado, Pose, ReferenceSpaceType};
33use wgui:: log:: LogErr ;
44
55use crate :: {
6- backend:: { input:: InputState , task:: PlayspaceTask } ,
6+ backend:: {
7+ input:: InputState ,
8+ playspace_common:: { SpaceGravity , SpaceGravityUpdateParams } ,
9+ task:: PlayspaceTask ,
10+ } ,
711 state:: AppState ,
812 windowing:: manager:: OverlayWindowManager ,
913} ;
@@ -19,6 +23,7 @@ struct MoverData<T> {
1923pub ( super ) struct PlayspaceMover {
2024 drag : Option < MoverData < Vec3A > > ,
2125 rotate : Option < MoverData < Quat > > ,
26+ gravity : SpaceGravity ,
2227}
2328
2429impl PlayspaceMover {
@@ -35,6 +40,7 @@ impl PlayspaceMover {
3540 Ok ( Self {
3641 drag : None ,
3742 rotate : None ,
43+ gravity : SpaceGravity :: new ( ) ,
3844 } )
3945 }
4046
@@ -140,21 +146,27 @@ impl PlayspaceMover {
140146 }
141147
142148 if let Some ( mut data) = self . drag . take ( ) {
143- let pointer = & app. input_state . pointers [ data. hand ] ;
144- if !pointer. now . space_drag {
145- log:: info!( "End space drag" ) ;
146- return ;
147- }
148-
149149 let new_hand = data
150150 . pose
151151 . transform_point3a ( app. input_state . pointers [ data. hand ] . raw_pose . translation ) ;
152-
153152 let relative_pos = if app. session . config . space_drag_unlocked {
154153 new_hand - data. hand_pose
155154 } else {
156155 vec3a ( 0. , new_hand. y - data. hand_pose . y , 0. )
157156 } * app. session . config . space_drag_multiplier ;
157+ let pointer = & app. input_state . pointers [ data. hand ] ;
158+
159+ if !pointer. now . space_drag {
160+ self . gravity . mark_end_drag (
161+ & app. session . config ,
162+ relative_pos,
163+ data. pose . translation ,
164+ app. delta_time ,
165+ ) ;
166+
167+ log:: info!( "End space drag" ) ;
168+ return ;
169+ }
158170
159171 if relative_pos. length_squared ( ) > 1000.0 {
160172 log:: warn!( "Space drag too fast, ignoring" ) ;
@@ -207,6 +219,17 @@ impl PlayspaceMover {
207219 }
208220 }
209221 }
222+
223+ if let Some ( playspace_pos) = self . gravity . update ( SpaceGravityUpdateParams {
224+ dt : app. delta_time ,
225+ dragging : self . drag . is_some ( ) ,
226+ config : & app. session . config ,
227+ } ) {
228+ apply_offset (
229+ Affine3A :: from_translation ( playspace_pos. into ( ) ) ,
230+ & mut monado. ipc ,
231+ ) ;
232+ }
210233 }
211234
212235 pub fn recenter ( & mut self , input : & InputState , monado : & mut Monado ) {
0 commit comments