package Ġio . c arius . lar s . ar _ flutter _ plugin Ċ Ċ import Ġandroid . R Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Context Ċ import Ġcom . google . ar . scene form . Node Ċ import Ġcom . google . ar . scene form . math . Vector 3 Ċ import Ġcom . google . ar . scene form . math . Quaternion Ċ import Ġcom . google . ar . scene form . assets . Render able Source Ċ Ċ import Ġjava . util . concurrent . Comp letableFuture Ċ import Ġandroid . net . Uri Ċ import Ġandroid . view . Gravity Ċ import Ġandroid . widget . Toast Ċ import Ġcom . google . ar . core .* Ċ import Ġcom . google . ar . scene form . Ar Scene View Ċ import Ġcom . google . ar . scene form . Frame Time Ċ import Ġcom . google . ar . scene form . math . Math Helper Ċ import Ġcom . google . ar . scene form . rendering .* Ċ import Ġcom . google . ar . scene form . utilities . Preconditions Ċ import Ġcom . google . ar . scene form . ux .* Ċ Ċ import Ġio . c arius . lar s . ar _ flutter _ plugin . Serialization .* Ċ Ċ import Ġio . flutter . Flutter Injector Ċ import Ġio . flutter . embedding . engine . loader . Flutter Loader Ċ import Ġio . flutter . plugin . common . Binary Messenger Ċ import Ġio . flutter . plugin . common . MethodCall Ċ import Ġio . flutter . plugin . common . Method Channel Ċ import Ġjava . security . Access Controller ĊĊ Ċ // ĠResp ons ible Ġfor Ġcreating ĠRender ables Ġand ĠNodes Ċ class ĠAr Model Builder Ġ{ ĊĊĠĠĠ Ġ// ĠCreates Ġfeature Ġpoint Ġnode ĊĠĠĠ Ġfun Ġmake Feature Point Node ( context : ĠContext , Ġx Pos : ĠFloat , Ġy Pos : ĠFloat , Ġz Pos : ĠFloat ): ĠNode Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfeature Point Ġ= ĠNode () ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĊĠĠĠĠĠĠĠ Ġvar Ġcube Render able : ĠModel Render able ? Ġ= Ġnull ĠĠĠĠĠĠĊĠĠĠĠĠĠĠ ĠMaterial Factory . make Opaque With Color ( context , ĠColor ( android . graphics . Color . YELLOW )) ĊĠĠĠĠĠĠĠ Ġ. then Accept Ġ{ Ġmaterial Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvector 3 Ġ= ĠVector 3 ( 0 . 0 1 f , Ġ 0 . 0 1 f , Ġ 0 . 0 1 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcube Render able Ġ= ĠShape Factory . make Cube ( vector 3 , ĠVector 3 ( x Pos , Ġy Pos , Ġz Pos ), Ġmaterial ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcube Render able ?. is Shadow C aster Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcube Render able ?. is Shadow Receiver Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfeature Point . render able Ġ= Ġcube Render able ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfeature Point ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠCreates Ġa Ġcoordinate Ġsystem Ġmodel Ġat Ġthe Ġworld Ġorigin Ġ( X - axis : Ġred , ĠY - axis : Ġgreen , ĠZ - axis : blue ) ĊĠĠĠ Ġ// ĠThe Ġcode Ġfor Ġthis Ġfunction Ġis Ġadapted Ġfrom ĠAlex ander 's Ġstack overflow Ġanswer Ġ( https :// stackoverflow . com / questions / 4 8 9 0 8 3 5 8 / ar core - how - to - display - world - origin - or - axes - in - debug - mode ) ĠĊĠĠĠ Ġfun Ġmake World Origin Node ( context : ĠContext ): ĠNode Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaxis Size Ġ= Ġ 0 . 1 f ĊĠĠĠĠĠĠĠ Ġval Ġaxis Radius Ġ= Ġ 0 . 0 0 5 f ĊĊĠĠĠĠĠĠĠ Ġval Ġroot Node Ġ= ĠNode () ĊĠĠĠĠĠĠĠ Ġval Ġx Node Ġ= ĠNode () ĊĠĠĠĠĠĠĠ Ġval Ġy Node Ġ= ĠNode () ĊĠĠĠĠĠĠĠ Ġval Ġz Node Ġ= ĠNode () ĊĊĠĠĠĠĠĠĠ Ġroot Node . addChild ( x Node ) ĊĠĠĠĠĠĠĠ Ġroot Node . addChild ( y Node ) ĊĠĠĠĠĠĠĠ Ġroot Node . addChild ( z Node ) ĊĊĠĠĠĠĠĠĠ Ġx Node . world Position Ġ= ĠVector 3 ( axis Size Ġ/ Ġ 2 , Ġ 0 f , Ġ 0 f ) ĊĠĠĠĠĠĠĠ Ġx Node . world Rotation Ġ= ĠQuaternion . axis Angle ( Vector 3 ( 0 f , Ġ 0 f , Ġ 1 f ), Ġ 9 0 f ) ĊĊĠĠĠĠĠĠĠ Ġy Node . world Position Ġ= ĠVector 3 ( 0 f , Ġaxis Size Ġ/ Ġ 2 , Ġ 0 f ) ĊĊĠĠĠĠĠĠĠ Ġz Node . world Position Ġ= ĠVector 3 ( 0 f , Ġ 0 f , Ġaxis Size Ġ/ Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġz Node . world Rotation Ġ= ĠQuaternion . axis Angle ( Vector 3 ( 1 f , Ġ 0 f , Ġ 0 f ), Ġ 9 0 f ) ĊĊĠĠĠĠĠĠĠ ĠMaterial Factory . make Opaque With Color ( context , ĠColor ( 2 5 5 f , Ġ 0 f , Ġ 0 f )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. then Accept Ġ{ Ġred Mat Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Node . render able Ġ= ĠShape Factory . make Cy linder ( axis Radius , Ġaxis Size , ĠVector 3 . zero (), Ġred Mat ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠMaterial Factory . make Opaque With Color ( context , ĠColor ( 0 f , Ġ 2 5 5 f , Ġ 0 f )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. then Accept Ġ{ Ġgreen Mat Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy Node . render able Ġ= ĠShape Factory . make Cy linder ( axis Radius , Ġaxis Size , ĠVector 3 . zero (), Ġgreen Mat ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠMaterial Factory . make Opaque With Color ( context , ĠColor ( 0 f , Ġ 0 f , Ġ 2 5 5 f )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. then Accept Ġ{ Ġblue Mat Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġz Node . render able Ġ= ĠShape Factory . make Cy linder ( axis Radius , Ġaxis Size , ĠVector 3 . zero (), Ġblue Mat ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġroot Node ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠCreates Ġa Ġnode Ġform Ġa Ġgiven Ġg lt f Ġmodel Ġpath Ġor ĠURL . ĠThe Ġg lt f Ġasset Ġloading Ġin ĠSc en form Ġis Ġasynchronous , Ġso Ġthe Ġfunction Ġreturns Ġa Ġcomplet able Ġfuture Ġof Ġtype ĠNode ĊĠĠĠ Ġfun Ġmake Node From G lt f ( context : ĠContext , Ġtransformation System : ĠTransformation System , Ġobject Manager Channel : ĠMethod Channel , Ġenable P ans : ĠBoolean , Ġenable Rotation : ĠBoolean , Ġname : ĠString , Ġmodel Path : ĠString , Ġtransformation : ĠArrayList < Double >): ĠCompletableFuture < Custom Transform able Node > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcomplet able Future Node : ĠCompletableFuture < Custom Transform able Node > Ġ= ĠCompletableFuture () ĊĊĠĠĠĠĠĠĠ Ġval Ġg lt f Node Ġ= ĠCustom Transform able Node ( transformation System , Ġobject Manager Channel , Ġenable P ans , Ġenable Rotation ) ĊĊĠĠĠĠĠĠĠ ĠModel Render able . builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Source ( context , ĠRender able Source . builder (). set Source ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUri . parse ( model Path ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRender able Source . Source Type . GL TF 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Registry Id ( model Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. then Accept { Ġrender able Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg lt f Node . render able Ġ= Ġrender able ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg lt f Node . name Ġ= Ġname ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransform Ġ= Ġdeserialize Matrix 4 ( transformation ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg lt f Node . world Scale Ġ= Ġtransform . first ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg lt f Node . world Position Ġ= Ġtransform . second ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg lt f Node . world Rotation Ġ= Ġtransform . third ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomplet able Future Node . complete ( gl tf Node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. exception ally Ġ{ Ġthrowable Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomplet able Future Node . complete Exception ally ( throwable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ// Ġreturn Ġnull Ġbecause Ġjava Ġexpects Ġvoid Ġreturn Ġ( in Ġjava , Ġvoid Ġhas Ġno Ġinstance , Ġwhereas Ġin ĠKotlin , Ġthis Ġclosure Ġreturns Ġa ĠUnit Ġwhich Ġhas Ġone Ġinstance ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġcomplet able Future Node ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠCreates Ġa Ġnode Ġform Ġa Ġgiven Ġgl b Ġmodel Ġpath Ġor ĠURL . ĠThe Ġg lt f Ġasset Ġloading Ġin ĠScene form Ġis Ġasynchronous , Ġso Ġthe Ġfunction Ġreturns Ġa Ġcomp le atable Ġfuture Ġof Ġtype ĠNode ĊĠĠĠ Ġfun Ġmake Node From G lb ( context : ĠContext , Ġtransformation System : ĠTransformation System , Ġobject Manager Channel : ĠMethod Channel , Ġenable P ans : ĠBoolean , Ġenable Rotation : ĠBoolean , Ġname : ĠString , Ġmodel Path : ĠString , Ġtransformation : ĠArrayList < Double >): ĠCompletableFuture < Custom Transform able Node > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcomplet able Future Node : ĠCompletableFuture < Custom Transform able Node > Ġ= ĠCompletableFuture () ĊĊĠĠĠĠĠĠĠ Ġval Ġg lt f Node Ġ= ĠCustom Transform able Node ( transformation System , Ġobject Manager Channel , Ġenable P ans , Ġenable Rotation ) ĊĠĠĠĠĠĠĠ Ġ// gl tf Node . scale Controller . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ// gl tf Node . translation Controller . isEnabled Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġ/* gl tf Node . remove Transformation Controller ( translation Controller ) ĊĠĠĠĠĠĠĠ Ġg lt f Node . add Tra ĊĠĠĠĠĠĠĠ Ġval Ġcustom Translation Controller Ġ= ĠDrag Controller ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg lt f Node , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransformation System . drag Recognizer , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Manager Channel , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransformation System ĊĠĠĠĠĠĠĠ Ġ) */ ĊĊĠĠĠĠĠĠĠ ĠModel Render able . builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Source ( context , ĠRender able Source . builder (). set Source ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUri . parse ( model Path ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRender able Source . Source Type . GL B ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Registry Id ( model Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. then Accept { Ġrender able Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg lt f Node . render able Ġ= Ġrender able ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg lt f Node . name Ġ= Ġname ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransform Ġ= Ġdeserialize Matrix 4 ( transformation ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg lt f Node . world Scale Ġ= Ġtransform . first ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg lt f Node . world Position Ġ= Ġtransform . second ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg lt f Node . world Rotation Ġ= Ġtransform . third ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomplet able Future Node . complete ( gl tf Node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. exception ally { throwable Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomplet able Future Node . complete Exception ally ( throwable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ// Ġreturn Ġnull Ġbecause Ġjava Ġexpects Ġvoid Ġreturn Ġ( in Ġjava , Ġvoid Ġhas Ġno Ġinstance , Ġwhereas Ġin ĠKotlin , Ġthis Ġclosure Ġreturns Ġa ĠUnit Ġwhich Ġhas Ġone Ġinstance ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcomplet able Future Node ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠCustom Transform able Node ( transformation System : ĠTransformation System , Ġobject Manager Channel : ĠMethod Channel , Ġenable P ans : ĠBoolean , Ġenable Rotation : ĠBoolean ) Ġ: ĊĠĠĠ ĠTransform able Node ( transformation System ) Ġ{ Ġ// ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcustom Translation Controller : ĠCustom Translation Controller ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcustom Rotation Controller : ĠCustom Rotation Controller ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠRemove Ġstandard Ġcontrollers ĊĠĠĠĠĠĠĠ Ġtranslation Controller . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġrotation Controller . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġscale Controller . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġremove Transformation Controller ( translation Controller ) ĊĠĠĠĠĠĠĠ Ġremove Transformation Controller ( rotation Controller ) ĊĠĠĠĠĠĠĠ Ġremove Transformation Controller ( scale Controller ) ĊĊĊĠĠĠĠĠĠĠ Ġ// ĠAdd Ġcustom Ġcontrollers Ġif Ġneeded ĊĠĠĠĠĠĠĠ Ġif Ġ( enable P ans ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom Translation Controller Ġ= ĠCustom Translation Controller ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransformation System . drag Recognizer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Manager Channel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Transformation Controller ( custom Translation Controller ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( enable Rotation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom Rotation Controller Ġ= ĠCustom Rotation Controller ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransformation System . tw ist Recognizer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Manager Channel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Transformation Controller ( custom Rotation Controller ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠCustom Translation Controller ( transform able Node : ĠBase Transform able Node , Ġgesture Recognizer : ĠDrag Gesture Recognizer , Ġobject Manager Channel : ĠMethod Channel ) Ġ: ĊĠĠĠ ĠTranslation Controller ( transform able Node , Ġgesture Recognizer ) Ġ{ ĊĊĠĠĠ Ġval Ġplatform Channel : ĠMethod Channel Ġ= Ġobject Manager Channel ĊĊĠĠĠ Ġoverride Ġfun Ġcan Start Transformation ( gesture : ĠDrag Gesture ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġplatform Channel . invoke Method (" on Pan Start ", Ġtransform able Node . name ) ĊĠĠĠĠĠĠĠ Ġsuper . can Start Transformation ( gesture ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtransform able Node . isSelected ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Continue Transformation ( gesture : ĠDrag Gesture ) Ġ{ ĊĠĠĠĠĠĠĠ Ġplatform Channel . invoke Method (" on Pan Change ", Ġtransform able Node . name ) ĊĠĠĠĠĠĠĠ Ġsuper . on Continue Transformation ( gesture ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon End Transformation ( gesture : ĠDrag Gesture ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġserialized Local Transformation Ġ= Ġserialize Local Transformation ( transform able Node ) ĊĠĠĠĠĠĠĠ Ġplatform Channel . invoke Method (" on Pan End ", Ġserialized Local Transformation ) ĊĠĠĠĠĠĠĠ Ġsuper . on End Transformation ( gesture ) ĊĠĠĠĠ Ġ} Ċ } Ċ Ċ class ĠCustom Rotation Controller ( transform able Node : ĠBase Transform able Node , Ġgesture Recognizer : ĠTw ist Gesture Recognizer , Ġobject Manager Channel : ĠMethod Channel ) Ġ: ĊĠĠĠ ĠRotation Controller ( transform able Node , Ġgesture Recognizer ) Ġ{ ĊĊĠĠĠ Ġval Ġplatform Channel : ĠMethod Channel Ġ= Ġobject Manager Channel ĊĊĠĠĠ Ġoverride Ġfun Ġcan Start Transformation ( gesture : ĠTw ist Gesture ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġplatform Channel . invoke Method (" on Rotation Start ", Ġtransform able Node . name ) ĊĠĠĠĠĠĠĠ Ġsuper . can Start Transformation ( gesture ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtransform able Node . isSelected ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Continue Transformation ( gesture : ĠTw ist Gesture ) Ġ{ ĊĠĠĠĠĠĠĠ Ġplatform Channel . invoke Method (" on Rotation Change ", Ġtransform able Node . name ) ĊĠĠĠĠĠĠĠ Ġsuper . on Continue Transformation ( gesture ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon End Transformation ( gesture : ĠTw ist Gesture ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġserialized Local Transformation Ġ= Ġserialize Local Transformation ( transform able Node ) ĊĠĠĠĠĠĠĠ Ġplatform Channel . invoke Method (" on Rotation End ", Ġserialized Local Transformation ) ĊĠĠĠĠĠĠĠ Ġsuper . on End Transformation ( gesture ) ĊĠĠĠĠ Ġ} Ċ } Ċ