@@ -466,13 +466,8 @@ pub struct ZoomState {
466466 pub rotation : [ f32 ; 3 ] ,
467467 /// À quel point un préset 3D est installé (0..1) : la force de la région quand elle en porte
468468 /// un, 0 sinon ; interpolé entre deux régions chaînées, et refermé en milieu de course
469- /// quand leurs présets diffèrent. C'est la porte de `dynamic_tilt`.
469+ /// quand leurs présets diffèrent. C'est la porte de `dynamic_tilt` (`tilt_gate`) .
470470 pub tilt : f32 ,
471- /// Poids de l'impact du clic (0..1) : 1 sur une région qui l'active (`click_impact`),
472- /// interpolé entre deux régions chaînées. Ne suffit pas seul : sous un angle fixe, l'impact
473- /// passe aussi par la porte de `tilt` (`dynamic_tilt`) ; sous la caméra réelle, par son poids
474- /// (l'œil recule, `camera::PRESS`).
475- pub click_impact : f32 ,
476471 /// Poids de la caméra réelle (`camera.rs`, 0..1) : la force de la région `follow-cursor`, 0
477472 /// sinon. Jamais non nul en même temps que `rotation` (cf. la transition chaînée).
478473 pub camera : f32 ,
@@ -487,7 +482,6 @@ const IDENTITY_ZOOM: ZoomState = ZoomState {
487482 focus : [ 0.5 , 0.5 ] ,
488483 rotation : [ 0.0 , 0.0 , 0.0 ] ,
489484 tilt : 0.0 ,
490- click_impact : 0.0 ,
491485 camera : 0.0 ,
492486 aim : [ 0.5 , 0.5 ] ,
493487 orbit : [ 0.5 , 0.5 ] ,
@@ -573,16 +567,6 @@ fn weighted(p: [f32; 2], camera: f32) -> [f32; 2] {
573567 p. map ( |a| 0.5 + ( a - 0.5 ) * camera)
574568}
575569
576- /// 1 si la région active l'impact du clic, 0 sinon. Sous un angle fixe, le clic presse l'écran ;
577- /// sous la caméra réelle, l'écran reste immobile et c'est l'œil qui recule.
578- fn impact_flag ( region : & SceneZoomRegion ) -> f32 {
579- if region. click_impact {
580- 1.0
581- } else {
582- 0.0
583- }
584- }
585-
586570/// Port de `easeConnectedPan` (TS) : cubic-bezier(0.1, 0, 0.2, 1).
587571fn ease_connected_pan ( t : f32 ) -> f32 {
588572 cubic_bezier ( 0.1 , 0.0 , 0.2 , 1.0 , t)
@@ -883,7 +867,6 @@ pub fn zoom_state_in(
883867 ] ,
884868 rotation,
885869 tilt : lerp ( fixed_flag ( cur) , fixed_flag ( next) , progress) * crossing,
886- click_impact : lerp ( impact_flag ( cur) , impact_flag ( next) , progress) ,
887870 camera,
888871 aim : weighted ( mix ( a. aim , b. aim ) , camera) ,
889872 orbit : weighted ( mix ( a. orbit , b. orbit ) , camera) ,
@@ -902,7 +885,6 @@ pub fn zoom_state_in(
902885 focus : resolve_focus ( next, t, cursor, clock) ,
903886 rotation : fixed_rotation ( next) ,
904887 tilt : fixed_flag ( next) ,
905- click_impact : impact_flag ( next) ,
906888 camera,
907889 aim : weighted ( seen. aim , camera) ,
908890 orbit : weighted ( seen. orbit , camera) ,
@@ -956,7 +938,6 @@ pub fn zoom_state_in(
956938 focus : [ ease ( focus[ 0 ] ) , ease ( focus[ 1 ] ) ] ,
957939 rotation : lerp_rotation3d ( [ 0.0 , 0.0 , 0.0 ] , fixed_rotation ( r) , strength) ,
958940 tilt : fixed_flag ( r) * strength,
959- click_impact : impact_flag ( r) ,
960941 camera,
961942 aim : weighted ( seen. aim , camera) ,
962943 orbit : weighted ( seen. orbit , camera) ,
@@ -1389,7 +1370,7 @@ pub fn dynamic_tilt(
13891370 strength : f32 ,
13901371 impact : [ f32 ; 3 ] ,
13911372) -> [ f32 ; 3 ] {
1392- let gate = smoothstep ( PARALLAX_GATE_START , 1.0 , strength) ;
1373+ let gate = tilt_gate ( strength) ;
13931374 if gate <= 0.0 {
13941375 return [ 0.0 ; 3 ] ;
13951376 }
@@ -1414,6 +1395,13 @@ pub fn dynamic_tilt(
14141395 clamp_dynamic_tilt ( sum) . map ( |d| d * gate)
14151396}
14161397
1398+ /// La porte de `dynamic_tilt` : 0 tant qu'un angle fixe n'est pas installé, 1 une fois en place.
1399+ /// Sur l'écran qu'elle laisse droit, l'impact du clic fait reculer l'écran à la place
1400+ /// (`frame_geometry::plan_frame`) : aucune bascule ne part de l'écran droit.
1401+ pub fn tilt_gate ( strength : f32 ) -> f32 {
1402+ smoothstep ( PARALLAX_GATE_START , 1.0 , strength)
1403+ }
1404+
14171405/// Durée de l'impact du clic : la fenêtre de `CursorTrack::bounce`, pour que le plan et le
14181406/// pointeur lisent comme un seul contact.
14191407pub const CLICK_IMPACT_WINDOW_S : f32 = 0.26 ;
@@ -1488,9 +1476,9 @@ pub fn click_impact(
14881476 ]
14891477}
14901478
1491- /// Le recul de la caméra réelle au temps `t` : la somme des `tap` des mêmes clics que
1492- /// ` click_impact` (dans la fenêtre du clip, visibles), bornée à [−1, 1], −1 au contact. Sans leur
1493- /// position : l'écran ne bascule pas, l'œil recule tout droit.
1479+ /// Le recul au temps `t`, celui de l'œil sous la caméra réelle ou celui de l'écran droit : la somme
1480+ /// des `tap` des mêmes clics que ` click_impact` (dans la fenêtre du clip, visibles), bornée à
1481+ /// [−1, 1], −1 au contact. Sans leur position : rien ne bascule, tout recule droit.
14941482pub fn click_press (
14951483 t : f32 ,
14961484 track : & CursorTrack ,
@@ -1615,7 +1603,6 @@ mod zoom_focus_tests {
16151603 rotation : None ,
16161604 under_trim : false ,
16171605 hide_cursor : false ,
1618- click_impact : false ,
16191606 }
16201607 }
16211608
@@ -2494,7 +2481,6 @@ mod tilt_tests {
24942481 rotation : rotation. map ( Into :: into) ,
24952482 under_trim : false ,
24962483 hide_cursor : false ,
2497- click_impact : false ,
24982484 } ;
24992485 // `follow-cursor` n'incline pas l'écran (caméra réelle, `camera.rs`) : chaînée à un angle
25002486 // fixe, la transition passe par l'écran droit, que ce balayage couvre aussi.
@@ -2902,31 +2888,6 @@ mod tilt_tests {
29022888 }
29032889 }
29042890
2905- #[ test]
2906- fn the_click_impact_weight_follows_the_region_flag ( ) {
2907- let region = |click_impact : bool | SceneZoomRegion {
2908- id : "z" . into ( ) ,
2909- clip_index : None ,
2910- start_sec : 2.0 ,
2911- end_sec : 8.0 ,
2912- scale : 2.0 ,
2913- focus_x : 0.5 ,
2914- focus_y : 0.5 ,
2915- focus_mode : None ,
2916- rotation : Some ( "left" . into ( ) ) ,
2917- under_trim : false ,
2918- hide_cursor : false ,
2919- click_impact,
2920- } ;
2921- assert_eq ! ( zoom_state_at( & [ region( true ) ] , 5.0 , None ) . click_impact, 1.0 ) ;
2922- assert_eq ! ( zoom_state_at( & [ region( false ) ] , 5.0 , None ) . click_impact, 0.0 ) ;
2923- assert_eq ! (
2924- zoom_state_at( & [ region( true ) ] , 0.0 , None ) . click_impact,
2925- 0.0 ,
2926- "hors région"
2927- ) ;
2928- }
2929-
29302891 /// `ZoomState::tilt` : la force pour une région à préset, 0 sans préset.
29312892 #[ test]
29322893 fn the_tilt_gate_follows_the_region_strength_only_with_a_preset ( ) {
@@ -2942,7 +2903,6 @@ mod tilt_tests {
29422903 rotation : rotation. map ( Into :: into) ,
29432904 under_trim : false ,
29442905 hide_cursor : false ,
2945- click_impact : false ,
29462906 } ;
29472907 assert_eq ! ( zoom_state_at( & [ region( Some ( "left" ) ) ] , 5.0 , None ) . tilt, 1.0 ) ;
29482908 assert_eq ! ( zoom_state_at( & [ region( None ) ] , 5.0 , None ) . tilt, 0.0 ) ;
@@ -3249,7 +3209,6 @@ mod follow_camera_tests {
32493209 rotation : Some ( rotation. into ( ) ) ,
32503210 under_trim : false ,
32513211 hide_cursor : false ,
3252- click_impact : true ,
32533212 }
32543213 }
32553214
@@ -3278,17 +3237,16 @@ mod follow_camera_tests {
32783237
32793238 /// Sous `follow-cursor`, l'écran n'est pas incliné et ne glisse pas (focus au centre, quel que
32803239 /// soit le réglage de la région) : seule la caméra, de poids la force de la région, vise et
3281- /// tourne avec le pointeur. L'impact du clic passe (l'œil recule). Hors région, l'état plat
3282- /// exact.
3240+ /// tourne avec le pointeur. Hors région, l'état plat exact.
32833241 #[ test]
32843242 fn follow_cursor_rides_the_zoom_envelope ( ) {
32853243 let tr = track ( |_| ( 0.85 , 0.5 ) ) ;
32863244 let f = whole ( & tr) ;
32873245 let r = [ region ( "follow-cursor" , 2.0 , 8.0 ) ] ;
32883246 let full = zoom_state_in ( & r, 5.0 , Some ( & tr) , & f, & ScreenClock :: default ( ) ) ;
32893247 assert_eq ! (
3290- ( full. rotation, full. tilt, full. click_impact , full . camera) ,
3291- ( [ 0.0 ; 3 ] , 0.0 , 1.0 , 1.0 )
3248+ ( full. rotation, full. tilt, full. camera) ,
3249+ ( [ 0.0 ; 3 ] , 0.0 , 1.0 )
32923250 ) ;
32933251 assert_eq ! ( ( full. scale, full. focus) , ( 2.0 , [ 0.5 , 0.5 ] ) ) ;
32943252 assert ! (
@@ -3326,7 +3284,7 @@ mod follow_camera_tests {
33263284 assert_eq ! ( ( blind. aim, blind. orbit) , ( [ 0.5 , 0.5 ] , [ 0.5 , 0.5 ] ) ) ;
33273285 // Un angle fixe garde exactement son état.
33283286 let left = zoom_state_in ( & [ region ( "left" , 2.0 , 8.0 ) ] , 5.0 , Some ( & tr) , & f, & ScreenClock :: default ( ) ) ;
3329- assert_eq ! ( ( left. rotation, left. camera, left . click_impact ) , ( [ -12.0 , -18.0 , -2.0 ] , 0.0 , 1 .0) ) ;
3287+ assert_eq ! ( ( left. rotation, left. camera) , ( [ -12.0 , -18.0 , -2.0 ] , 0.0 ) ) ;
33303288 let unknown = zoom_state_in ( & [ region ( "orbit" , 2.0 , 8.0 ) ] , 5.0 , Some ( & tr) , & f, & ScreenClock :: default ( ) ) ;
33313289 assert_eq ! ( ( unknown. rotation, unknown. tilt, unknown. camera) , ( [ 0.0 ; 3 ] , 0.0 , 0.0 ) ) ;
33323290 }
0 commit comments