package Ġcom . code vik ing . kx g . util Ċ Ċ import Ġcom . code vik ing . kx g . Input Manager Ċ import Ġcom . code vik ing . kx g . K xg Context Ċ import Ġcom . code vik ing . kx g . math . Mutable Vec 2 f Ċ import Ġcom . code vik ing . kx g . math . Vec 2 f Ċ Ċ /** Ċ Ġ* ĠEvalu ates Ġstandard Ġtouch Ġgest ures Ġ( pin ch - to - zoom , Ġtwo - f inger Ġdrag ) Ċ Ġ*/ Ċ Ċ open Ġclass ĠTouch Gesture Evaluator Ġ{ ĊĊĠĠĠ Ġvar Ġcurrent Gesture Ġ= ĠGest ure () ĊĠĠĠĠĠĠĠ Ġprotected Ġset ĊĊĠĠĠ Ġprivate Ġval Ġactive Pointers Ġ= Ġmutable ListOf < Input Manager . Pointer >() ĊĠĠĠ Ġprivate Ġval Ġtmp Vec 1 Ġ= ĠMutable Vec 2 f () ĊĠĠĠ Ġprivate Ġval Ġtmp Vec 2 Ġ= ĠMutable Vec 2 f () ĊĊĠĠĠ Ġprotected Ġval Ġstart Positions Ġ= Ġmutable Map Of < Int , ĠVec 2 f >() ĊĠĠĠ Ġprotected Ġvar Ġscreen D pi Ġ= Ġ 9 6 f ĊĊĠĠĠ Ġfun Ġevaluate ( ctx : ĠK xg Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġscreen D pi Ġ= Ġctx . screen D pi ĊĠĠĠĠĠĠĠ Ġctx . input Mgr . getActive Pointers ( active Pointers ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( active Pointers . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( current Gesture . type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠINVALID Ġ-> Ġon Gesture Init ( active Pointers ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIN DE TERMIN ATE Ġ-> Ġon Det ermine Gesture ( active Pointers ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPIN CH Ġ-> Ġhandle Gesture ( active Pointers ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTWO _ F ING ER _ DR AG Ġ-> Ġhandle Gesture ( active Pointers ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġnot Ġenough Ġvalid Ġpointers Ġfor Ġa Ġmulti - touch Ġgesture ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Gesture . type Ġ= ĠINVALID ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Positions . clear () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġon Gesture Init ( pointers : ĠMutable List < Input Manager . Pointer >) Ġ{ ĊĠĠĠĠĠĠĠ Ġpointers . forEach Ġ{ Ġstart Positions [ it . id ] Ġ= ĠVec 2 f ( it . x , Ġit . y ) Ġ} ĊĠĠĠĠĠĠĠ Ġcurrent Gesture . type Ġ= ĠIN DE TERMIN ATE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġon Det ermine Gesture ( pointers : ĠMutable List < Input Manager . Pointer >) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġremove Ġany Ġmissing Ġpointer ĊĠĠĠĠĠĠĠ Ġstart Positions . keys . removeAll Ġ{ Ġptr Id Ġ-> Ġpointers . find Ġ{ Ġit . id Ġ== Ġptr Id Ġ} Ġ== Ġnull Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġadd Ġany Ġnew Ġpointer ĊĠĠĠĠĠĠĠ Ġpointers . filter Ġ{ Ġ! start Positions . containsKey ( it . id ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġstart Positions [ it . id ] Ġ= ĠVec 2 f ( it . x , Ġit . y ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġtry Ġto Ġmatch Ġgesture ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Pin ch ( pointers ) Ġ-> Ġcurrent Gesture . type Ġ= ĠPIN CH ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Two F inger Drag ( pointers ) Ġ-> Ġcurrent Gesture . type Ġ= ĠTWO _ F ING ER _ DR AG ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġis Pin ch ( pointers : ĠMutable List < Input Manager . Pointer >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġtwo Ġpointers Ġmoving Ġin Ġopp osing Ġdirection ĊĠĠĠĠĠĠĠ Ġif Ġ( pointers . size Ġ== Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtmp Vec 1 . set ( pointers [ 0 ]. x , Ġpointers [ 0 ]. y ). subtract ( start Positions [ pointers [ 0 ]. id ] !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtmp Vec 2 . set ( pointers [ 1 ]. x , Ġpointers [ 1 ]. y ). subtract ( start Positions [ pointers [ 1 ]. id ] !! ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtmp Vec 1 . scale ( 9 6 f Ġ/ Ġscreen D pi ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtmp Vec 2 . scale ( 9 6 f Ġ/ Ġscreen D pi ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tmp Vec 1 . length () Ġ> Ġ 5 f Ġ&& Ġtmp Vec 2 . length () Ġ> Ġ 5 f Ġ&& Ġtmp Vec 1 Ġ* Ġtmp Vec 2 Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtmp Vec 1 . set ( start Positions [ pointers [ 0 ]. id ] !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtmp Vec 2 . set ( start Positions [ pointers [ 1 ]. id ] !! ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Gesture . init ( PIN CH , Ġtmp Vec 1 , Ġtmp Vec 2 , Ġscreen D pi ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Gesture ( pointers ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġis Two F inger Drag ( pointers : ĠMutable List < Input Manager . Pointer >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġtwo Ġpointers Ġmoving Ġin Ġsame Ġdirection ĊĠĠĠĠĠĠĠ Ġif Ġ( pointers . size Ġ== Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtmp Vec 1 . set ( pointers [ 0 ]. x , Ġpointers [ 0 ]. y ). subtract ( start Positions [ pointers [ 0 ]. id ] !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtmp Vec 2 . set ( pointers [ 1 ]. x , Ġpointers [ 1 ]. y ). subtract ( start Positions [ pointers [ 1 ]. id ] !! ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtmp Vec 1 . scale ( 9 6 f Ġ/ Ġscreen D pi ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtmp Vec 2 . scale ( 9 6 f Ġ/ Ġscreen D pi ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tmp Vec 1 . length () Ġ> Ġ 5 f Ġ&& Ġtmp Vec 2 . length () Ġ> Ġ 5 f Ġ&& Ġtmp Vec 1 Ġ* Ġtmp Vec 2 Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtmp Vec 1 . set ( start Positions [ pointers [ 0 ]. id ] !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtmp Vec 2 . set ( start Positions [ pointers [ 1 ]. id ] !! ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Gesture . init ( TWO _ F ING ER _ DR AG , Ġtmp Vec 1 , Ġtmp Vec 2 , Ġscreen D pi ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Gesture ( pointers ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġhandle Gesture ( pointers : ĠMutable List < Input Manager . Pointer >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( pointers . size Ġ== Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtmp Vec 1 . set ( pointers [ 0 ]. x , Ġpointers [ 0 ]. y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtmp Vec 2 . set ( pointers [ 1 ]. x , Ġpointers [ 1 ]. y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Gesture . update ( tmp Vec 1 , Ġtmp Vec 2 , Ġscreen D pi ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Gesture . type Ġ= ĠINVALID ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠINVALID Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠIN DE TERMIN ATE Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPIN CH Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTWO _ F ING ER _ DR AG Ġ= Ġ 2 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġclass ĠGest ure Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcenter Start Ġ= ĠMutable Vec 2 f () ĊĠĠĠĠĠĠĠ Ġval Ġcenter Current Ġ= ĠMutable Vec 2 f () ĊĠĠĠĠĠĠĠ Ġval Ġcenter Shift Ġ= ĠMutable Vec 2 f () ĊĠĠĠĠĠĠĠ Ġval Ġd Center Ġ= ĠMutable Vec 2 f () ĊĊĠĠĠĠĠĠĠ Ġvar Ġpin ch Amount Start Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġvar Ġpin ch Amount Current Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġvar Ġd Pin ch Amount Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġval Ġpin ch Amount Rel : ĠFloat ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġ( pin ch Amount Current Ġ- Ġpin ch Amount Start ) Ġ/ Ġpin ch Amount Start Ġ+ Ġ 1 f ĊĊĠĠĠĠĠĠĠ Ġvar Ġtype Ġ= ĠINVALID ĊĊĠĠĠĠĠĠĠ Ġvar Ġnum Updates Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġinit ( type : ĠInt , Ġptr 1 : ĠVec 2 f , Ġptr 2 : ĠVec 2 f , Ġdpi : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . type Ġ= Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcenter Start . set ( ptr 1 ). add ( ptr 2 ). scale ( 0 . 5 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcenter Current . set ( center Start ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcenter Shift . set ( Vec 2 f . ZERO ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd Center . set ( Vec 2 f . ZERO ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġpin ch Amount Start Ġ= Ġptr 1 . distance ( ptr 2 ) Ġ* Ġ 9 6 f Ġ/ Ġdpi ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpin ch Amount Current Ġ= Ġpin ch Amount Start ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd Pin ch Amount Ġ= Ġ 0 f ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġnum Updates Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġupdate ( ptr 1 : ĠVec 2 f , Ġptr 2 : ĠVec 2 f , Ġdpi : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd Center . set ( ptr 1 ). add ( ptr 2 ). scale ( 0 . 5 f ). subtract ( center Current ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcenter Current . set ( ptr 1 ). add ( ptr 2 ). scale ( 0 . 5 f ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcenter Shift . set ( center Current ). subtract ( center Start ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpin ch Ġ= Ġptr 1 . distance ( ptr 2 ) Ġ* Ġ 9 6 f Ġ/ Ġdpi ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd Pin ch Amount Ġ= Ġpin ch Ġ- Ġpin ch Amount Current ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpin ch Amount Current Ġ= Ġpin ch ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġnum Updates ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ