package Ġio . github . scene view . node Ċ Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . View Configuration Ċ import Ġandroidx . lifecycle . Lifecycle Owner Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġcom . google . ar . scene form . Pick Hit Result Ċ import Ġcom . google . ar . scene form . collision . Collider Ċ import Ġcom . google . ar . scene form . collision . Collision Shape Ċ import Ġcom . google . ar . scene form . collision . Collision System Ċ import Ġcom . google . ar . scene form . common . Transform Provider Ċ import Ġcom . google . ar . scene form . math . Math Helper . clamp Ċ import Ġcom . google . ar . scene form . math . Matrix Ċ import Ġcom . google . ar . scene form . math . Vector 3 Ċ import Ġcom . google . ar . scene form . rendering .* Ċ import Ġdev . rom a ing uy . kotlin . math .* Ċ import Ġio . github . scene view . Scene Lifecycle Ċ import Ġio . github . scene view . Scene Lifecycle Observer Ċ import Ġio . github . scene view . Scene View Ċ import Ġio . github . scene view . math .* Ċ import Ġio . github . scene view . utils . Frame Time Ċ Ċ // ĠThis Ġis Ġthe Ġdefault Ġfrom Ġthe ĠView Configuration Ġclass . Ċ private Ġconst Ġval Ġdefault Touch S lop Ġ= Ġ 8 Ċ Ċ /** Ċ Ġ* Ġ### ĠA ĠNode Ġrepresents Ġa Ġtransformation Ġwithin Ġthe Ġscene Ġgraph 's Ġhierarchy . Ċ Ġ* Ċ Ġ* ĠIt Ġcan Ġcontain Ġa Ġrender able Ġfor Ġthe Ġrendering Ġengine Ġto Ġrender . Ċ Ġ* Ċ Ġ* ĠEach Ġnode Ġcan Ġhave Ġan Ġarbitrary Ġnumber Ġof Ġchild Ġnodes Ġand Ġone Ġparent . ĠThe Ġparent Ġmay Ġbe Ċ Ġ* Ġanother Ġnode , Ġor Ġthe Ġscene . Ċ Ġ* Ċ Ġ* Ġ------- Ġ+ y Ġ----- Ġ- z Ċ Ġ* Ċ Ġ* Ġ ---------| ---- / ---- Ċ Ġ* Ċ Ġ* Ġ--------- |-- / ------ Ċ Ġ* Ċ Ġ* Ġ- x Ġ- Ġ- Ġ- Ġ 0 Ġ- Ġ- Ġ- Ġ+ x Ċ Ġ* Ċ Ġ* Ġ------ / -- | --------- Ċ Ġ* Ċ Ġ* Ġ---- / ----| --------- Ċ Ġ* Ċ Ġ* Ġ+ z Ġ---- Ġ- y Ġ-------- Ċ Ġ*/ Ċ open Ġclass ĠNode Ġ: ĠNode Parent , ĠTransform Provider , ĠScene Lifecycle Observer Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠDEFAULT _ POSITION Ġget () Ġ= ĠPosition ( x Ġ= Ġ 0 . 0 f , Ġy Ġ= Ġ 0 . 0 f , Ġz Ġ= Ġ- 4 . 0 f ) ĊĠĠĠĠĠĠĠ Ġval ĠDEFAULT _ QU AT ERN ION Ġget () Ġ= ĠQuaternion () ĊĠĠĠĠĠĠĠ Ġval ĠDEFAULT _ ROT ATION Ġ= ĠDEFAULT _ QU AT ERN ION . to Euler Angles () ĊĠĠĠĠĠĠĠ Ġval ĠDEFAULT _ SCALE Ġget () Ġ= ĠScale ( 1 . 0 f ) ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDEFAULT _ ROT ATION _ DOT _ THRESHOLD Ġ= Ġ 0 . 9 5 f ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ### ĠThe Ġscene Ġthat Ġthis Ġnode Ġis Ġpart Ġof , Ġnull Ġif Ġit Ġisn 't Ġpart Ġof Ġany Ġscene ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠA Ġnode Ġis Ġpart Ġof Ġa Ġscene Ġif Ġits Ġhighest Ġlevel Ġancestor Ġis Ġa Ġ[ Scene View ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġopen Ġval Ġscene View : ĠScene View ? Ġget () Ġ= Ġparent Ġas ? ĠScene View Ġ?: Ġparent Node ?. scene View ĊĊĠĠĠ Ġ// ĠTODO Ġ: ĠRemove Ġwhen Ġevery Ġdependent Ġis Ġk ot lined ĊĠĠĠ Ġfun Ġget Scene View Internal () Ġ= Ġscene View ĊĠĠĠ Ġprotected Ġopen Ġval Ġlifecycle : ĠScene Lifecycle ? Ġget () Ġ= Ġscene View ?. lifecycle ĊĠĠĠ Ġprotected Ġval Ġlifecycle Scope Ġget () Ġ= Ġscene View ?. lifecycle Scope ĊĠĠĠ Ġprotected Ġval Ġrenderer : ĠRenderer ? Ġget () Ġ= Ġscene View ?. renderer ĊĠĠĠ Ġprivate Ġval Ġcollision System : ĠCollision System ? Ġget () Ġ= Ġscene View ?. collision System ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ### ĠDefine Ġyour Ġown Ġcustom Ġname ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġname : ĠString ? Ġ= Ġnull ĊĊĠĠĠ Ġval Ġis Attached Ġget () Ġ= Ġscene View Ġ!= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ### ĠThe Ġnode Ġposition ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġnode 's Ġposition Ġloc ates Ġit Ġwithin Ġthe Ġcoordinate Ġsystem Ġof Ġits Ġparent . ĊĠĠĠĠ Ġ* ĠThe Ġdefault Ġposition Ġis Ġthe Ġzero Ġvector , Ġindicating Ġthat Ġthe Ġnode Ġis Ġplaced Ġat Ġthe Ġorigin Ġof ĊĠĠĠĠ Ġ* Ġthe Ġparent Ġnode 's Ġcoordinate Ġsystem . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ** Horizontal Ġ( X ):** ĊĠĠĠĠ Ġ* Ġ- Ġleft : Ġx Ġ< Ġ 0 . 0 f ĊĠĠĠĠ Ġ* Ġ- Ġcenter Ġhorizontal : Ġx Ġ= Ġ 0 . 0 f ĊĠĠĠĠ Ġ* Ġ- Ġright : Ġx Ġ> Ġ 0 . 0 f ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ** Vertical Ġ( Y ):** ĊĠĠĠĠ Ġ* Ġ- Ġtop : Ġy Ġ> Ġ 0 . 0 f ĊĠĠĠĠ Ġ* Ġ- Ġcenter Ġvertical Ġ: Ġy Ġ= Ġ 0 . 0 f ĊĠĠĠĠ Ġ* Ġ- Ġbottom : Ġy Ġ< Ġ 0 . 0 f ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ** Depth Ġ( Z ):** ĊĠĠĠĠ Ġ* Ġ- Ġforward : Ġz Ġ< Ġ 0 . 0 f ĊĠĠĠĠ Ġ* Ġ- Ġorigin / camera Ġposition : Ġz Ġ= Ġ 0 . 0 f ĊĠĠĠĠ Ġ* Ġ- Ġbackward : Ġz Ġ> Ġ 0 . 0 f ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ------- Ġ+ y Ġ----- Ġ- z ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ ---------| ---- / ---- ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ--------- |-- / ------ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ- x Ġ- Ġ- Ġ- Ġ 0 Ġ- Ġ- Ġ- Ġ+ x ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ------ / -- | --------- ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ---- / ----| --------- ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ+ z Ġ---- Ġ- y Ġ-------- ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġposition : ĠPosition Ġ= ĠDEFAULT _ POSITION ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTODO : ĠDoc ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġquaternion : ĠQuaternion Ġ= ĠDEFAULT _ QU AT ERN ION ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ### ĠThe Ġnode Ġorientation Ġin ĠE uler ĠAng les ĠDe grees Ġper Ġaxis . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ`[ 0 .. 3 6 0 ]` ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġthree - component Ġrotation Ġvector Ġspecifies Ġthe Ġdirection Ġof Ġthe Ġrotation Ġaxis Ġin Ġdegrees . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġdefault Ġrotation Ġis Ġthe Ġzero Ġvector , Ġspecifying Ġno Ġrotation . ĊĠĠĠĠ Ġ* ĠRotation Ġis Ġapplied Ġrelative Ġto Ġthe Ġnode 's Ġorigin Ġproperty . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNote Ġthat Ġmodifying Ġthe Ġindividual Ġcomponents Ġof Ġthe Ġreturned Ġrotation Ġdoesn 't Ġhave Ġany Ġeffect . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ------- Ġ+ y Ġ----- Ġ- z ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ ---------| ---- / ---- ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ--------- |-- / ------ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ- x Ġ- Ġ- Ġ- Ġ 0 Ġ- Ġ- Ġ- Ġ+ x ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ------ / -- | --------- ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ---- / ----| --------- ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ+ z Ġ---- Ġ- y Ġ-------- ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġrotation : ĠRotation ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġquaternion . to Euler Angles () ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquaternion Ġ= ĠQuaternion . from Euler ( value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ### ĠThe Ġnode Ġscale Ġon Ġeach Ġaxis . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ- Ġreduce Ġsize : Ġscale Ġ< Ġ 1 . 0 f ĊĠĠĠĠ Ġ* Ġ- Ġsame Ġsize : Ġscale Ġ= Ġ 1 . 0 f ĊĠĠĠĠ Ġ* Ġ- Ġincrease Ġsize : Ġscale Ġ> Ġ 1 . 0 f ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġscale : ĠScale Ġ= ĠDEFAULT _ SCALE ĊĊĠĠĠ Ġopen Ġvar Ġtransform : ĠTransform ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġtranslation ( position ) Ġ* Ġrotation ( qu aternion ) Ġ* Ġscale ( scale ) ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition Ġ= ĠPosition ( value . position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquaternion Ġ= Ġrotation ( value ). to Quaternion () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscale Ġ= ĠScale ( value . scale ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ### ĠThe Ġnode Ġworld - space Ġposition ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġworld Ġposition Ġof Ġthis Ġnode Ġ( i . e . Ġrelative Ġto Ġthe Ġ[ Scene View ]). ĊĠĠĠĠ Ġ* ĠThis Ġis Ġthe Ġcomposition Ġof Ġthis Ġcomponent 's Ġlocal Ġposition Ġwith Ġits Ġparent 's Ġworld ĊĠĠĠĠ Ġ* Ġposition . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see Ġworld Transform ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġvar Ġworld Position : ĠPosition ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġworld Transform . position ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition Ġ= Ġ( world To Parent Ġ* ĠFloat 4 ( value , Ġ 1 f )). xyz ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ### ĠThe Ġnode Ġworld - space Ġquaternion ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġworld Ġquaternion Ġof Ġthis Ġnode Ġ( i . e . Ġrelative Ġto Ġthe Ġ[ Scene View ]). ĊĠĠĠĠ Ġ* ĠThis Ġis Ġthe Ġcomposition Ġof Ġthis Ġcomponent 's Ġlocal Ġquaternion Ġwith Ġits Ġparent 's Ġworld ĊĠĠĠĠ Ġ* Ġquaternion . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see Ġworld Transform ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġvar Ġworld Quaternion : ĠQuaternion ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġworld Transform . to Quaternion () ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquaternion Ġ= Ġworld To Parent . to Quaternion () Ġ* Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ### ĠThe Ġnode Ġworld - space Ġrotation ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġworld Ġrotation Ġof Ġthis Ġnode Ġ( i . e . Ġrelative Ġto Ġthe Ġ[ Scene View ]). ĊĠĠĠĠ Ġ* ĠThis Ġis Ġthe Ġcomposition Ġof Ġthis Ġcomponent 's Ġlocal Ġrotation Ġwith Ġits Ġparent 's Ġworld ĊĠĠĠĠ Ġ* Ġrotation . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see Ġworld Transform ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġvar Ġworld Rotation : ĠRotation ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġworld Transform . rotation ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquaternion Ġ= Ġworld To Parent . to Quaternion () Ġ* ĠQuaternion . from Euler ( value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ### ĠThe Ġnode Ġworld - space Ġscale ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġworld Ġscale Ġof Ġthis Ġnode Ġ( i . e . Ġrelative Ġto Ġthe Ġ[ Scene View ]). ĊĠĠĠĠ Ġ* ĠThis Ġis Ġthe Ġcomposition Ġof Ġthis Ġcomponent 's Ġlocal Ġscale Ġwith Ġits Ġparent 's Ġworld ĊĠĠĠĠ Ġ* Ġscale . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see Ġworld Transform ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġvar Ġworld Scale : ĠScale ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġworld Transform . scale ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscale Ġ= Ġ( world To Parent Ġ* Ġscale ( value )). scale ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġval Ġworld Transform : ĠMat 4 ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġparent Node ?. let Ġ{ Ġit . world Transform Ġ* Ġtransform Ġ} Ġ?: Ġtransform ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ### ĠThe Ġtransform Ġfrom Ġthe Ġworld Ġcoordinate Ġsystem Ġto Ġthe Ġcoordinate Ġsystem Ġof Ġthe Ġparent Ġnode ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġworld To Parent : ĠTransform ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġparent Node ?. let Ġ{ Ġinverse ( it . world Transform ) Ġ} Ġ?: ĠTransform () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ## ĠThe Ġsmooth Ġposition , Ġrotation Ġand Ġscale Ġspeed ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠExp ressed Ġin Ġunits Ġper Ġseconds . ĊĠĠĠĠ Ġ* ĠOn Ġan ĠAR Ġcontext , Ġ 1 Ġunit Ġ= Ġ 1 Ġmeter . ĠSo , Ġfor Ġposition , Ġthis Ġvalue Ġdefines Ġthe Ġmeters Ġper ĊĠĠĠĠ Ġ* Ġseconds Ġfor Ġa Ġnode Ġmove . ĊĠĠĠĠ Ġ* ĠThis Ġvalue Ġis Ġused Ġby Ġ[ smooth ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġsmooth Speed Ġ= Ġ 5 . 0 f ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ## ĠThe Ġsmooth Ġrotation Ġminimum Ġchange Ġlimit ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġis Ġused Ġto Ġavoid Ġvery Ġnear Ġrot ations Ġsmooth Ġmodifications . ĠIt Ġprevents Ġthe Ġrotation Ġto ĊĠĠĠĠ Ġ* Ġappear Ġtoo Ġquick Ġif Ġthe Ġranges Ġare Ġtoo Ġclose Ġand Ġuses Ġlinear ly Ġinterpolation Ġfor Ġupper Ġdot ĊĠĠĠĠ Ġ* Ġproducts . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠExp ressed Ġin Ġquaternion Ġdot Ġproduct ĊĠĠĠĠ Ġ* ĠThis Ġvalue Ġis Ġused Ġby Ġ[ smooth ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġsmooth Rotation Threshold Ġ= ĠDEFAULT _ ROT ATION _ DOT _ THRESHOLD ĊĊĠĠĠ Ġprivate Ġvar Ġsmooth Position : ĠPosition ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġsmooth Quaternion : ĠQuaternion ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ### ĠThe Ġnode Ġcan Ġbe Ġfocused Ġwithin Ġthe Ġ[ com . google . ar . scene form . collision . Collision System ] ĊĠĠĠĠ Ġ* Ġwhen Ġa Ġtouch Ġevent Ġhappened ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġtrue Ġif Ġthe Ġnode Ġcan Ġbe Ġselected ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġis Focus able Ġ= Ġtrue ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ### ĠThe Ġvisible Ġstate Ġof Ġthis Ġnode . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNote Ġthat Ġa ĠNode Ġmay Ġbe Ġenabled Ġbut Ġstill Ġinactive Ġif Ġit Ġisn 't Ġpart Ġof Ġthe Ġscene Ġor Ġif Ġits ĊĠĠĠĠ Ġ* Ġparent Ġis Ġinactive . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġvar Ġis Visible Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field Ġ!= Ġvalue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Visibility () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ### ĠThe Ġactive Ġstatus ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠA Ġnode Ġis Ġconsidered Ġactive Ġif Ġit Ġme ets ĠALL Ġof Ġthe Ġfollowing Ġconditions : ĊĠĠĠĠ Ġ* Ġ- ĠThe Ġnode Ġis Ġpart Ġof Ġa Ġscene . ĊĠĠĠĠ Ġ* Ġ- Ġthe Ġnode 's Ġparent Ġis Ġactive . ĊĠĠĠĠ Ġ* Ġ- ĠThe Ġnode Ġis Ġenabled . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠAn Ġactive ĠNode Ġhas Ġthe Ġfollowing Ġbehavior : ĊĠĠĠĠ Ġ* Ġ- ĠThe Ġnode 's Ġ[ on Frame ] Ġfunction Ġwill Ġbe Ġcalled Ġevery Ġframe . ĊĠĠĠĠ Ġ* Ġ- ĠThe Ġnode 's Ġ[ Render able ] Ġwill Ġbe Ġrendered . ĊĠĠĠĠ Ġ* Ġ- ĠThe Ġnode 's Ġ[ collision Shape ] Ġwill Ġbe Ġchecked Ġin Ġcalls Ġto ĠScene . hit Test . ĊĠĠĠĠ Ġ* Ġ- ĠThe Ġnode 's Ġ[ on Touch Event ] Ġfunction Ġwill Ġbe Ġcalled Ġwhen Ġthe Ġnode Ġis Ġtouched . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġval ĠshouldBe Rendered : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġis Visible Ġ&& Ġis Attached ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġparent Node ?. shouldBe Rendered Ġ!= Ġfalse ĊĊĠĠĠ Ġopen Ġvar Ġis Rendered Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġinternal Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field Ġ!= Ġvalue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollision System ?. let Ġ{ Ġcoll ider ?. set Attached Collision System ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoll ider ?. set Attached Collision System ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Rendering Changed ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ### ĠThe Ġ[ Node ] Ġparent Ġif Ġthe Ġparent Ġextends Ġ[ Node ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠReturns Ġnull Ġif Ġthe Ġparent Ġis Ġnot Ġa Ġ[ Node ]. ĊĠĠĠĠ Ġ* Ġ= ĠReturns Ġnull Ġif Ġthe Ġparent Ġis Ġa Ġ[ Scene View ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġparent Node Ġget () Ġ= Ġparent Ġas ? ĠNode ĊĠĠĠ Ġoverride Ġvar Ġ_ children Ġ= ĠlistOf < Node >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ### ĠChanges Ġthe Ġparent Ġnode Ġof Ġthis Ġnode ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġset Ġto Ġnull , Ġthis Ġnode Ġwill Ġbe Ġdet ached Ġ([ removeChild ]) Ġfrom Ġits Ġparent . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġparent Ġmay Ġbe Ġanother Ġ[ Node ] Ġor Ġa Ġ[ Scene View ]. ĊĠĠĠĠ Ġ* ĠIf Ġit Ġis Ġa Ġscene , Ġthen Ġthis Ġ[ Node ] Ġis Ġconsidered Ġtop Ġlevel . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġlocal Ġposition , Ġrotation , Ġand Ġscale Ġof Ġthis Ġnode Ġwill Ġremain Ġthe Ġsame . ĊĠĠĠĠ Ġ* ĠTherefore , Ġthe Ġworld Ġposition , Ġrotation , Ġand Ġscale Ġof Ġthis Ġnode Ġmay Ġbe Ġdifferent Ġafter Ġthe ĊĠĠĠĠ Ġ* Ġparent Ġchanges . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIn Ġaddition Ġto Ġsetting Ġthis Ġfield , Ġset Parent Ġwill Ġalso Ġdo Ġthe Ġfollowing Ġthings : ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ- ĠRemove Ġthis Ġnode Ġfrom Ġits Ġprevious Ġparent 's Ġchildren . ĊĠĠĠĠ Ġ* Ġ- ĠAdd Ġthis Ġnode Ġto Ġits Ġnew Ġparent 's Ġchildren . ĊĠĠĠĠ Ġ* Ġ- ĠRe cursively Ġupdate Ġthe Ġnode 's Ġtransformation Ġto Ġreflect Ġthe Ġchange Ġin Ġparent ĊĠĠĠĠ Ġ* Ġ- Re cursively Ġupdate Ġthe Ġscene Ġfield Ġto Ġmatch Ġthe Ġnew Ġparent 's Ġscene Ġfield . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġparent : ĠNode Parent ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field Ġ!= Ġvalue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRemove Ġfrom Ġold Ġparent Ġif Ġnot Ġalready Ġremoved ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield ?. take If Ġ{ Ġthis Ġin Ġit . children Ġ} ?. removeChild ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFind Ġthe Ġold Ġparent ĠScene View ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( field Ġas ? ĠScene View ) Ġ?: Ġ( field Ġas ? ĠNode )?. scene View )?. let Ġ{ Ġscene View Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMake Ġsure Ġto Ġlisten Ġto Ġat Ġleast Ġone Ġlifecycle Ġin Ġcase Ġof Ġno Ġmore Ġparent Ġin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġorder Ġto Ġunsure Ġdestroy ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscene View . lifecycle . remove Observer ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Detach From Scene ( scene View ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd Ġto Ġnew Ġparent Ġif Ġnot Ġalready Ġadded ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ?. take If Ġ{ Ġthis Ġ! in Ġit . children Ġ} ?. addChild ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFind Ġthe Ġnew Ġparent ĠScene View ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( value Ġas ? ĠScene View ) Ġ?: Ġ( value Ġas ? ĠNode )?. scene View )?. let Ġ{ Ġscene View Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscene View . lifecycle . add Observer ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Attach To Scene ( scene View ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Visibility () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġallow Dispatch Transform Changed Ġ= Ġtrue ĊĊĠĠĠ Ġ// ĠCollision Ġfields . ĊĠĠĠ Ġvar Ġcoll ider : ĠColl ider ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġ// ĠStores Ġdata Ġused Ġfor Ġdetect ing Ġwhen Ġa Ġtap Ġhas Ġoccurred Ġon Ġthis Ġnode . ĊĠĠĠ Ġprivate Ġvar Ġtouch Tracking Data : ĠT ap Tracking Data ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** Ġ### ĠListener Ġfor Ġ[ on Frame ] Ġcall Ġ*/ ĊĠĠĠ Ġval Ġon Frame Ġ= Ġmutable ListOf < (( frame Time : ĠFrame Time , Ġnode : ĠNode ) Ġ-> ĠUnit ) >() ĊĊĠĠĠ Ġ/** Ġ### ĠListener Ġfor Ġ[ on Attach To Scene ] Ġcall Ġ*/ ĊĠĠĠ Ġval Ġon Attached To Scene Ġ= Ġmutable ListOf < (( scene : ĠScene View ) Ġ-> ĠUnit ) >() ĊĊĠĠĠ Ġ/** Ġ### ĠListener Ġfor Ġ[ on Detached From Scene ] Ġcall Ġ*/ ĊĠĠĠ Ġval Ġon Detached From Scene Ġ= Ġmutable ListOf < (( scene : ĠScene View ) Ġ-> ĠUnit ) >() ĊĊĠĠĠ Ġ/** Ġ### ĠListener Ġfor Ġ[ on Rendering Changed ] Ġcall Ġ*/ ĊĠĠĠ Ġval Ġon Rendering Changed Ġ= Ġmutable ListOf < (( node : ĠNode , Ġis Rendering : ĠBoolean ) Ġ-> ĠUnit ) >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ### ĠThe Ġtransformation Ġ( position , Ġrotation Ġor Ġscale ) Ġof Ġthe Ġ[ Node ] Ġhas Ġchanged ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġnode ĠA 's Ġposition Ġis Ġchanged , Ġthen Ġthat Ġwill Ġtrigger Ġ[ on Transform Changed ] Ġto Ġbe ĊĠĠĠĠ Ġ* Ġcalled Ġfor Ġall Ġof Ġit 's Ġdesc endants . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġon Transform Changed Ġ= Ġmutable ListOf <( node : ĠNode ) Ġ-> ĠUnit >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ### ĠRegisters Ġa Ġcallback Ġto Ġbe Ġinvoked Ġwhen Ġa Ġtouch Ġevent Ġis Ġdis patched Ġto Ġthis Ġnode ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġway Ġthat Ġtouch Ġevents Ġare Ġpropag ated Ġmir rors Ġthe Ġway Ġto uches Ġare Ġpropag ated Ġto ĠAndroid ĊĠĠĠĠ Ġ* ĠViews . ĠThis Ġis Ġonly Ġcalled Ġwhen Ġthe Ġnode Ġis Ġactive . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠWhen Ġan ĠACTION _ DOWN Ġevent Ġoccurs , Ġthat Ġrepresents Ġthe Ġstart Ġof Ġa Ġgesture . ĠACTION _ UP Ġor ĊĠĠĠĠ Ġ* ĠACTION _ CANCEL Ġrepresents Ġwhen Ġa Ġgesture Ġends . ĠWhen Ġa Ġgesture Ġstarts , Ġthe Ġfollowing Ġis Ġdone : ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ- ĠDispatch Ġtouch Ġevents Ġto Ġthe Ġnode Ġthat Ġwas Ġtouched Ġas Ġdetected Ġby Ġhit Test . ĊĠĠĠĠ Ġ* Ġ- ĠIf Ġthe Ġnode Ġdoesn 't Ġconsume Ġthe Ġevent , Ġrecurse Ġup wards Ġthrough Ġthe Ġnode 's Ġparents Ġand ĊĠĠĠĠ Ġ* Ġdispatch Ġthe Ġtouch Ġevent Ġuntil Ġone Ġof Ġthe Ġnode 's Ġconsume s Ġthe Ġevent . ĊĠĠĠĠ Ġ* Ġ- ĠIf Ġno Ġnodes Ġconsume Ġthe Ġevent , Ġthe Ġgesture Ġis Ġignored Ġand Ġsubsequent Ġevents Ġthat Ġare Ġpart ĊĠĠĠĠ Ġ* Ġof Ġthe Ġgesture Ġwill Ġnot Ġbe Ġpassed Ġto Ġany Ġnodes . ĊĠĠĠĠ Ġ* Ġ- ĠIf Ġone Ġof Ġthe Ġnode 's Ġconsume s Ġthe Ġevent , Ġthen Ġthat Ġnode Ġwill Ġconsume Ġall Ġfuture Ġtouch ĊĠĠĠĠ Ġ* Ġevents Ġfor Ġthe Ġgesture . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠWhen Ġa Ġtouch Ġevent Ġis Ġdis patched Ġto Ġa Ġnode , Ġthe Ġevent Ġis Ġfirst Ġpassed Ġto Ġthe Ġnode 's . ĊĠĠĠĠ Ġ* ĠIf Ġthe Ġ[ on Touch Event ] Ġdoesn 't Ġhandle Ġthe Ġevent , Ġit Ġis Ġpassed Ġto Ġ[. on Touch Event ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ- Ġ` pick Hit Result ` Ġ- ĠRepresents Ġthe Ġnode Ġthat Ġwas Ġtouched Ġand Ġinformation Ġabout Ġwhere Ġit Ġwas ĊĠĠĠĠ Ġ* Ġtouched ĊĠĠĠĠ Ġ* Ġ- Ġ` motion Event ` Ġ- ĠThe ĠMotion Event Ġobject Ġcontaining Ġfull Ġinformation Ġabout Ġthe Ġevent ĊĠĠĠĠ Ġ* Ġ- Ġ` return ` Ġtrue Ġif Ġthe Ġlistener Ġhas Ġconsumed Ġthe Ġevent , Ġfalse Ġotherwise ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġon Touch Event : Ġ(( pick Hit Result : ĠPick Hit Result , Ġmotion Event : ĠMotion Event ) Ġ-> ĠBoolean )? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ### ĠRegisters Ġa Ġcallback Ġto Ġbe Ġinvoked Ġwhen Ġthis Ġnode Ġis Ġt apped . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġthere Ġis Ġa Ġcallback Ġregistered , Ġthen Ġtouch Ġevents Ġwill Ġnot Ġbubble Ġto Ġthis Ġnode 's Ġparent . ĊĠĠĠĠ Ġ* ĠIf Ġthe ĠNode . on Touch Event Ġis Ġoverridden Ġand Ġsuper . on Touch Event Ġis Ġnot Ġcalled , Ġthen Ġthe Ġtap ĊĠĠĠĠ Ġ* Ġwill Ġnot Ġoccur . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ- Ġ` pick Hit Result ` Ġ- Ġrepresents Ġthe Ġnode Ġthat Ġwas Ġt apped Ġand Ġinformation Ġabout Ġwhere Ġit Ġwas ĊĠĠĠĠ Ġ* Ġtouched ĊĠĠĠĠ Ġ* Ġ- Ġ` motion Event Ġ- ĠThe Ġ[ Motion Event . ACTION _ UP ] ĠMotion Event Ġthat Ġcaused Ġthe Ġtap ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġon Tou ched : Ġ(( pick Hit Result : ĠPick Hit Result , Ġmotion Event : ĠMotion Event ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ### ĠConstruct Ġa Ġ[ Node ] Ġwith Ġit ĠPosition , ĠRotation Ġand ĠScale ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġposition ĠSee Ġ[ Node . position ] ĊĠĠĠĠ Ġ* Ġ@ param Ġrotation ĠSee Ġ[ Node . rotation ] ĊĠĠĠĠ Ġ* Ġ@ param Ġscale ĠSee Ġ[ Node . scale ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġposition : ĠPosition Ġ= ĠDEFAULT _ POSITION , ĊĠĠĠĠĠĠĠ Ġrotation : ĠRotation Ġ= ĠDEFAULT _ ROT ATION , ĊĠĠĠĠĠĠĠ Ġscale : ĠScale Ġ= ĠDEFAULT _ SCALE ĊĠĠĠ Ġ) Ġ: Ġsuper () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . position Ġ= Ġposition ĊĠĠĠĠĠĠĠ Ġthis . rotation Ġ= Ġrotation ĊĠĠĠĠĠĠĠ Ġthis . scale Ġ= Ġscale ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġon Attach To Scene ( scene View : ĠScene View ) Ġ{ ĊĠĠĠĠĠĠĠ Ġon Attached To Scene . toList (). forEach Ġ{ Ġit ( scene View ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġon Detach From Scene ( scene View : ĠScene View ) Ġ{ ĊĠĠĠĠĠĠĠ Ġon Detached From Scene . toList (). forEach Ġ{ Ġit ( scene View ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ### ĠHandles Ġwhen Ġthis Ġnode Ġbecomes Ġrendered Ġ( display ed ) Ġor Ġnot ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠA ĠNode Ġis Ġrendered Ġif Ġit 's Ġvisible , Ġpart Ġof Ġa Ġscene , Ġand Ġits Ġparent Ġis Ġrendered . ĊĠĠĠĠ Ġ* ĠOverride Ġto Ġperform Ġany Ġsetup Ġthat Ġneeds Ġto Ġoccur Ġwhen Ġthe Ġnode Ġis Ġactive Ġor Ġnot . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġon Rendering Changed ( is Rendering : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġon Rendering Changed . toList (). forEach Ġ{ Ġit ( this , Ġis Rendering ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Frame ( frame Time : ĠFrame Time ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠSm ooth Ġvalue Ġcompare ĊĠĠĠĠĠĠĠ Ġval Ġl erp Factor Ġ= Ġclamp (( frame Time . interval Seconds Ġ* Ġsmooth Speed ). toFloat (), Ġ 0 . 0 f , Ġ 1 . 0 f ) ĊĠĠĠĠĠĠĠ Ġsmooth Position ?. take If Ġ{ Ġit Ġ!= Ġposition Ġ} ?. let Ġ{ Ġdesired Position Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition Ġ= Ġl erp ( position , Ġdesired Position , Ġl erp Factor ). take If Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdistance ( position , Ġit ) Ġ> Ġ 0 . 0 0 0 0 1 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġdesired Position ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( position Ġ== Ġdesired Position ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsmooth Position Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsmooth Quaternion ?. take If Ġ{ Ġit Ġ!= Ġquaternion Ġ} ?. let Ġ{ Ġdesired Quaternion Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquaternion Ġ= Ġs lerp ( qu aternion , Ġnormalize ( desired Quaternion ), Ġl erp Factor ). take If Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġangle ( qu aternion , Ġdesired Quaternion ) Ġ> Ġ 0 . 0 0 0 0 1 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġdesired Quaternion ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( qu aternion Ġ== Ġdesired Quaternion ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsmooth Quaternion Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġon Frame . forEach Ġ{ Ġit ( frame Time , Ġthis ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ### ĠThe Ġtransformation Ġ( position , Ġrotation Ġor Ġscale ) Ġof Ġthe Ġ[ Node ] Ġhas Ġchanged ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġnode ĠA 's Ġposition Ġis Ġchanged , Ġthen Ġthat Ġwill Ġtrigger Ġ[ on Transform Changed ] Ġto Ġbe ĊĠĠĠĠ Ġ* Ġcalled Ġfor Ġall Ġof Ġit 's Ġdesc endants . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġon Transform Changed () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġ: ĠKotlin ĠColl ider Ġfor Ġmore Ġcompreh ension ĊĠĠĠĠĠĠĠ Ġcoll ider ?. mark World Shape Dirty () ĊĠĠĠĠĠĠĠ Ġchildren . forEach Ġ{ Ġit . on Transform Changed () Ġ} ĊĠĠĠĠĠĠĠ Ġon Transform Changed . forEach Ġ{ Ġit ( this ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Child Added ( child : ĠNode ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Child Added ( child ) ĊĊĠĠĠĠĠĠĠ Ġon Transform Changed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Child Removed ( child : ĠNode ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . removeChild ( child ) ĊĊĠĠĠĠĠĠĠ Ġon Transform Changed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy ( owner : ĠLifecycle Owner ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdestroy () ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy ( owner ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġupdate Visibility () Ġ{ ĊĠĠĠĠĠĠĠ Ġis Rendered Ġ= ĠshouldBe Rendered ĊĠĠĠĠĠĠĠ Ġchildren . forEach Ġ{ Ġit . update Visibility () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ### ĠThe Ġnode Ġscale ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ- Ġreduce Ġsize : Ġscale Ġ< Ġ 1 . 0 f ĊĠĠĠĠ Ġ* Ġ- Ġsame Ġsize : Ġscale Ġ= Ġ 1 . 0 f ĊĠĠĠĠ Ġ* Ġ- Ġincrease Ġsize : Ġscale Ġ> Ġ 1 . 0 f ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġscale ( scale : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . scale . xyz Ġ= ĠScale ( scale ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ## ĠChange Ġthe Ġnode Ġtransform ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see Ġposition ĊĠĠĠĠ Ġ* Ġ@ see Ġrotation ĊĠĠĠĠ Ġ* Ġ@ see Ġscale ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġtransform ( ĊĠĠĠĠĠĠĠ Ġposition : ĠPosition Ġ= Ġthis . position , ĊĠĠĠĠĠĠĠ Ġquaternion : ĠQuaternion Ġ= Ġthis . qu aternion , ĊĠĠĠĠĠĠĠ Ġrotation : ĠRotation Ġ= Ġthis . rotation , ĊĠĠĠĠĠĠĠ Ġscale : ĠScale Ġ= Ġthis . scale ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . position Ġ= Ġposition ĊĠĠĠĠĠĠĠ Ġif Ġ( qu aternion Ġ!= Ġthis . qu aternion ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . qu aternion Ġ= Ġquaternion ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( rotation Ġ!= Ġthis . rotation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . rotation Ġ= Ġrotation ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . scale Ġ= Ġscale ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ## ĠSm ooth Ġmove , Ġrotate Ġand Ġscale Ġat Ġa Ġspecified Ġspeed ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see Ġposition ĊĠĠĠĠ Ġ* Ġ@ see Ġrotation ĊĠĠĠĠ Ġ* Ġ@ see Ġquaternion ĊĠĠĠĠ Ġ* Ġ@ see Ġscale ĊĠĠĠĠ Ġ* Ġ@ see Ġspeed ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsmooth ( ĊĠĠĠĠĠĠĠ Ġposition : ĠPosition Ġ= Ġthis . position , ĊĠĠĠĠĠĠĠ Ġquaternion : ĠQuaternion Ġ= Ġthis . qu aternion , ĊĠĠĠĠĠĠĠ Ġrotation : ĠRotation Ġ= Ġthis . rotation , ĊĠĠĠĠĠĠĠ Ġspeed : ĠFloat Ġ= Ġthis . smooth Speed ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . smooth Speed Ġ= Ġspeed ĊĠĠĠĠĠĠĠ Ġif Ġ( position Ġ!= Ġthis . position ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsmooth Position Ġ= Ġposition ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( qu aternion Ġ!= Ġthis . qu aternion ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsmooth Quaternion Ġ= Ġquaternion ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( rotation Ġ!= Ġthis . rotation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsmooth Quaternion Ġ= Ġrotation . to Quaternion () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTODO Ċ // Ċ // ĠĠĠ Ġ/** Ċ // ĠĠĠĠ Ġ* Ġ### ĠRot ates Ġthe Ġnode Ġto Ġface Ġa Ġpoint Ġin Ġworld Ġspace Ċ // ĠĠĠĠ Ġ* Ċ // ĠĠĠĠ Ġ* ĠWorld - space Ġup Ġ( 0 , Ġ 1 , Ġ 0 ) Ġwill Ġbe Ġused Ġto Ġdetermine Ġthe Ġorientation Ġof Ġthe Ġnode Ġaround Ġthe Ċ // ĠĠĠĠ Ġ* Ġdirection . Ċ // ĠĠĠĠ Ġ* Ċ // ĠĠĠĠ Ġ* Ġ@ param Ġposition ĠThe Ġposition Ġto Ġlook Ġat Ġin Ġworld Ġspace Ċ // ĠĠĠĠ Ġ* Ġ@ param Ġup ĠThe Ġup Ġdirection Ġwill Ġdetermine Ġthe Ġorientation Ġof Ġthe Ġnode Ġaround Ġthe Ġdirection Ċ // ĠĠĠĠ Ġ*/ Ċ // ĠĠĠ Ġfun Ġlook At ( position : ĠPosition , Ġup : ĠDirection Ġ= ĠDirection ( y = 1 . 0 f ), Ġsmooth : ĠBoolean Ġ= Ġfalse ) Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġif ( smooth ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġsmooth ( qu aternion Ġ= Ġrotation ( look At ( this . world Position , Ġposition , Ġup )). to Quaternion ()) Ċ // ĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġtransform ( rotation Ġ= Ġrotation ( look At ( this . world Position , Ġposition , Ġup )). to Quaternion ()) Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ### ĠChecks Ġwhether Ġthe Ġgiven Ġnode Ġparent Ġis Ġan Ġancestor Ġof Ġthis Ġnode Ġrecursively ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠReturn Ġtrue Ġif Ġthe Ġnode Ġis Ġan Ġancestor Ġof Ġthis Ġnode ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġis Desc endant Of ( ancestor : ĠNode Parent ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġparent Ġ== Ġancestor Ġ|| Ġparent Node ?. is Desc endant Of ( ancestor ) Ġ== Ġtrue ĊĊĠĠĠ Ġ// ĠTODO Ġ: ĠRemove Ġthis Ġto Ġfull ĠKotlin ĠMath ĊĠĠĠ Ġoverride Ġfun Ġget Transformation Matrix (): ĠMatrix Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠMatrix ( world Transform . to Columns Float Array ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠRe use Ġthis Ġto Ġlimit Ġframe Ġinstanti ations ĊĠĠĠ Ġprivate Ġval Ġ_ transformation Matrix In verted Ġ= ĠMatrix () ĊĠĠĠ Ġopen Ġval Ġtransformation Matrix In verted : ĠMatrix ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ transformation Matrix In verted . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMatrix . invert ( transformation Matrix , Ġthis ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ### ĠThe Ġshape Ġto Ġused Ġto Ġdetect Ġcollisions Ġfor Ġthis Ġ[ Node ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġthe Ġshape Ġis Ġnot Ġset Ġand Ġ[ render able ] Ġis Ġset , Ġthen Ġ[ Render able . get Collision Shape ] Ġis ĊĠĠĠĠ Ġ* Ġused Ġto Ġdetect Ġcollisions Ġfor Ġthis Ġ[ Node ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ[ Collision Shape ] Ġrepresents Ġa Ġge ometric Ġshape , Ġi . e . Ġsphere , Ġbox , Ġconvex Ġh ull . ĊĠĠĠĠ Ġ* ĠIf Ġnull , Ġthis Ġnode 's Ġcurrent Ġcollision Ġshape Ġwill Ġbe Ġremoved . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġcollision Shape : ĠCollision Shape ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġfield Ġ?: Ġcoll ider ?. shape ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġ: ĠCleanup ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġthe Ġcoll ider Ġif Ġit Ġdoesn 't Ġalready Ġexist . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( collider Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoll ider Ġ= ĠColl ider ( this , Ġvalue ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAttach Ġthe Ġcoll ider Ġto Ġthe Ġcollision Ġsystem Ġif Ġthe Ġnode Ġis Ġalready Ġactive . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Rendered Ġ&& Ġcollision System Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Attached Collision System ( collision System ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( collider !!. shape Ġ!= Ġvalue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSet Ġthe Ġcoll ider 's Ġshape Ġto Ġthe Ġnew Ġshape Ġif Ġneeded . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoll ider !!. shape Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDispose Ġof Ġthe Ġold Ġcoll ider ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoll ider ?. set Attached Collision System ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoll ider Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ### ĠHandles Ġwhen Ġthis Ġnode Ġis Ġtouched ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠOverride Ġto Ġperform Ġany Ġlogic Ġthat Ġshould Ġoccur Ġwhen Ġthis Ġnode Ġis Ġtouched . ĠThe Ġway Ġthat ĊĠĠĠĠ Ġ* Ġtouch Ġevents Ġare Ġpropag ated Ġmir rors Ġthe Ġway Ġto uches Ġare Ġpropag ated Ġto ĠAndroid ĠViews . ĠThis Ġis ĊĠĠĠĠ Ġ* Ġonly Ġcalled Ġwhen Ġthe Ġnode Ġis Ġactive . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠWhen Ġan ĠACTION _ DOWN Ġevent Ġoccurs , Ġthat Ġrepresents Ġthe Ġstart Ġof Ġa Ġgesture . ĠACTION _ UP Ġor ĊĠĠĠĠ Ġ* ĠACTION _ CANCEL Ġrepresents Ġwhen Ġa Ġgesture Ġends . ĠWhen Ġa Ġgesture Ġstarts , Ġthe Ġfollowing Ġis Ġdone : ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ- ĠDispatch Ġtouch Ġevents Ġto Ġthe Ġnode Ġthat Ġwas Ġtouched Ġas Ġdetected Ġby Ġhit Test . ĊĠĠĠĠ Ġ* Ġ- ĠIf Ġthe Ġnode Ġdoesn 't Ġconsume Ġthe Ġevent , Ġrecurse Ġup wards Ġthrough Ġthe Ġnode 's Ġparents Ġand ĊĠĠĠĠ Ġ* Ġdispatch Ġthe Ġtouch Ġevent Ġuntil Ġone Ġof Ġthe Ġnode 's Ġconsume s Ġthe Ġevent . ĊĠĠĠĠ Ġ* Ġ- ĠIf Ġno Ġnodes Ġconsume Ġthe Ġevent , Ġthe Ġgesture Ġis Ġignored Ġand Ġsubsequent Ġevents Ġthat Ġare Ġpart ĊĠĠĠĠ Ġ* Ġof Ġthe Ġgesture Ġwill Ġnot Ġbe Ġpassed Ġto Ġany Ġnodes . ĊĠĠĠĠ Ġ* Ġ- ĠIf Ġone Ġof Ġthe Ġnode 's Ġconsume s Ġthe Ġevent , Ġthen Ġthat Ġnode Ġwill Ġconsume Ġall Ġfuture Ġtouch ĊĠĠĠĠ Ġ* Ġevents Ġfor Ġthe Ġgesture . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠWhen Ġa Ġtouch Ġevent Ġis Ġdis patched Ġto Ġa Ġnode , Ġthe Ġevent Ġis Ġfirst Ġpassed Ġto Ġthe Ġnode 's . ĊĠĠĠĠ Ġ* ĠIf Ġthe Ġ[ on Touch Event ] Ġdoesn 't Ġhandle Ġthe Ġevent , Ġit Ġis Ġpassed Ġto Ġ[ on Touch Event ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġpick Hit Result ĠRepresents Ġthe Ġnode Ġthat Ġwas Ġtouched , Ġand Ġinformation Ġabout Ġwhere Ġit Ġwas ĊĠĠĠĠ Ġ* Ġtouched . ĠOn ĠACTION _ DOWN Ġevents , Ġ[ Pick Hit Result . getNode ] Ġwill Ġalways Ġbe Ġthis Ġnode Ġor ĊĠĠĠĠ Ġ* Ġone Ġof Ġits Ġchildren . ĠOn Ġother Ġevents , Ġthe Ġtouch Ġmay Ġhave Ġmoved Ġcausing Ġthe ĊĠĠĠĠ Ġ* Ġ[ Pick Hit Result . getNode ] Ġto Ġchange Ġ( or Ġpossibly Ġbe Ġnull ). ĊĠĠĠĠ Ġ* Ġ@ param Ġmotion Event ĠĠ ĠThe Ġmotion Ġevent . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġthe Ġevent Ġwas Ġhandled , Ġfalse Ġotherwise . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġon Touch Event ( pick Hit Result : ĠPick Hit Result , Ġmotion Event : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġ: ĠCleanup ĊĠĠĠĠĠĠĠ Ġvar Ġhandled Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġ// ĠReset Ġtap Ġtracking Ġdata Ġif Ġa Ġnew Ġgesture Ġhas Ġstarted Ġor Ġif Ġthe ĠNode Ġhas Ġbecome Ġinactive . ĊĠĠĠĠĠĠĠ Ġval Ġaction Mask ed Ġ= Ġmotion Event . action Mask ed ĊĠĠĠĠĠĠĠ Ġif Ġ( action Mask ed Ġ== ĠMotion Event . ACTION _ DOWN Ġ|| Ġ! is Rendered ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtouch Tracking Data Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwhen Ġ( action Mask ed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ DOWN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOnly Ġstart Ġtack ing Ġthe Ġtap Ġgesture Ġif Ġthere Ġis Ġa Ġtap Ġlistener Ġset . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġallows Ġthe Ġevent Ġto Ġbubble Ġup Ġto Ġthe Ġnode 's Ġparent Ġwhen Ġthere Ġis Ġno Ġlistener . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( on Tou ched Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpick Hit Result . node ?. let Ġ{ Ġhit Node Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdown Position Ġ= ĠVector 3 ( motion Event . x , Ġmotion Event . y , Ġ 0 . 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtouch Tracking Data Ġ= ĠT ap Tracking Data ( hit Node , Ġdown Position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ MOVE , ĠMotion Event . ACTION _ UP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAssign Ġto Ġlocal Ġvariable Ġfor Ġstatic Ġanalysis . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtouch Tracking Data ?. let Ġ{ Ġtouch Tracking Data Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDetermine Ġhow Ġmuch Ġthe Ġtouch Ġhas Ġmoved . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtouch S lop Ġ= Ġscene View ?. let Ġ{ Ġscene View Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠView Configuration . get ( scene View . context ). scaled Touch S lop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġdefault Touch S lop ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġup Position Ġ= ĠVector 3 ( motion Event . x , Ġmotion Event . y , Ġ 0 . 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtouch Delta Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVector 3 . subtract ( touch Tracking Data . down Position , Ġup Position ). length () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDetermine Ġif Ġthis Ġnode Ġor Ġa Ġchild Ġnode Ġis Ġstill Ġbeing Ġtouched . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhit Node Ġ= Ġpick Hit Result . node ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Hit Valid Ġ= Ġhit Node Ġ=== Ġtouch Tracking Data . down Node ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDetermine Ġif Ġthis Ġis Ġa Ġvalid Ġtap . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠisValid Touch Ġ= Ġis Hit Valid Ġ|| Ġtouch Delta Ġ< Ġtouch S lop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isValid Touch ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthis Ġis Ġan ĠACTION _ UP Ġevent , Ġit 's Ġtime Ġto Ġcall Ġthe Ġlistener . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( action Mask ed Ġ== ĠMotion Event . ACTION _ UP Ġ&& Ġon Tou ched Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Tou ched !!. invoke ( pick Hit Result , Ġmotion Event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . touch Tracking Data Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . touch Tracking Data Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġhandled ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ### ĠCalls Ġon Touch Event Ġif Ġthe Ġnode Ġis Ġactive ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠUsed Ġby ĠTouch Event System Ġto Ġdispatch Ġtouch Ġevents . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġpick Hit Result ĠRepresents Ġthe Ġnode Ġthat Ġwas Ġtouched , Ġand Ġinformation Ġabout Ġwhere Ġit Ġwas ĊĠĠĠĠ Ġ* Ġtouched . ĠOn ĠACTION _ DOWN Ġevents , Ġ[ Pick Hit Result . getNode ] Ġwill Ġalways Ġbe Ġthis Ġnode Ġor ĊĠĠĠĠ Ġ* Ġone Ġof Ġits Ġchildren . ĠOn Ġother Ġevents , Ġthe Ġtouch Ġmay Ġhave Ġmoved Ġcausing Ġthe ĊĠĠĠĠ Ġ* Ġ[ Pick Hit Result . getNode ] Ġto Ġchange Ġ( or Ġpossibly Ġbe Ġnull ). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmotion Event ĠĠ ĠThe Ġmotion Ġevent . ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġthe Ġevent Ġwas Ġhandled , Ġfalse Ġotherwise . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġdispatch Touch Event ( pick Hit Result : ĠPick Hit Result , Ġmotion Event : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( is Rendered ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( on Touch Event ?. invoke ( pick Hit Result , Ġmotion Event ) Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Touch Event ( pick Hit Result , Ġmotion Event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġclone () Ġ= Ġcopy ( Node ()) ĊĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġopen Ġfun Ġcopy ( to Node : ĠNode Ġ= ĠNode ()): ĠNode Ġ= Ġto Node . apply Ġ{ ĊĠĠĠĠĠĠĠ Ġposition Ġ= Ġthis @ Node . position ĊĠĠĠĠĠĠĠ Ġquaternion Ġ= Ġthis @ Node . qu aternion ĊĠĠĠĠĠĠĠ Ġscale Ġ= Ġthis @ Node . scale ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġ### ĠDet ach Ġand Ġdestroy Ġthe Ġnode Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġdestroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . parent Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTODO Ġ: ĠUse Ġkotlin Ġmath Ċ Ċ // ĠĠĠ Ġ/** Ċ // ĠĠĠĠ Ġ* Ġ### ĠSets Ġthe Ġdirection Ġthat Ġthe Ġnode Ġis Ġlooking Ġat Ġin Ġworld - space Ċ // ĠĠĠĠ Ġ* Ċ // ĠĠĠĠ Ġ* ĠAfter Ġcalling Ġthis , Ġ[ forward ] Ġwill Ġmatch Ġthe Ġlook Ġdirection Ġpassed Ġin . Ċ // ĠĠĠĠ Ġ* ĠThe Ġup Ġdirection Ġwill Ġdetermine Ġthe Ġorientation Ġof Ġthe Ġnode Ġaround Ġthe Ġdirection . Ċ // ĠĠĠĠ Ġ* ĠThe Ġlook Ġdirection Ġand Ġup Ġdirection Ġcannot Ġbe Ġcoin c ident Ġ( parallel ) Ġor Ġthe Ġorientation Ġwill Ċ // ĠĠĠĠ Ġ* Ġbe Ġinvalid . Ċ // ĠĠĠĠ Ġ* Ċ // ĠĠĠĠ Ġ* Ġ@ param Ġlook Direction Ġa Ġvector Ġrepresenting Ġthe Ġdesired Ġlook Ġdirection Ġin Ġworld - space Ċ // ĠĠĠĠ Ġ* Ġ@ param Ġup Direction ĠĠ Ġa Ġvector Ġrepresenting Ġa Ġvalid Ġup Ġvector Ġto Ġuse , Ġsuch Ġas ĠVector 3 . up () Ċ // ĠĠĠĠ Ġ*/ Ċ // ĠĠĠ Ġfun Ġset Look Direction ( look Direction : ĠVector 3 , Ġup Direction : ĠVector 3 ) Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġval Ġcamera Position : ĠVector 3 Ġ= Ġget Scene (). get Camera (). get World Position () Ċ // ĠĠĠĠĠĠĠ Ġval Ġcard Position : ĠVector 3 Ġ= Ġget World Position () Ċ // ĠĠĠĠĠĠĠ Ġscene View . renderer . camera . look At () Ċ // ĠĠĠĠĠĠĠ Ġval Ġdirection Ġ= ĠVector 3 . subtract ( camera Position , Ġcard Position ) Ċ // ĠĠĠĠĠĠĠ Ġval Ġlook Rotation Ġ= Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġcom . google . ar . scene form . math . Quaternion . look Rotation ( direction , ĠVector 3 . up ()) Ċ // ĠĠĠĠĠĠĠ Ġset World Rotation ( look Rotation ) Ċ // Ċ // Ċ // ĠĠĠĠĠĠĠ Ġorientation Ġ= ĠQuaternion . look Rotation ( look Direction , Ġup Direction ) Ċ // ĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ### ĠPerforms Ġthe Ġgiven Ġaction Ġwhen Ġthe Ġnode Ġis Ġattached Ġto Ġthe Ġscene . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġthe Ġnode Ġis Ġalready Ġattached Ġthe Ġaction Ġwill Ġbe Ġperformed Ġimmediately . ĊĠĠĠĠ Ġ* ĠElse Ġthis Ġaction Ġwill Ġbe Ġinvoked Ġthe Ġfirst Ġtime Ġthe Ġscene Ġis Ġattached . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ- Ġ` scene ` Ġ- Ġthe Ġattached Ġscene ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdo On Attached To Scene ( action : Ġ( scene : ĠScene View ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġscene View ?. let ( action ) Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Attached To Scene . add ( object Ġ: Ġ( Scene View ) Ġ-> ĠUnit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinvoke ( scene View : ĠScene View ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Attached To Scene Ġ-= Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction ( scene View ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUsed Ġto Ġkeep Ġtrack Ġof Ġdata Ġfor Ġdetect ing Ġif Ġa Ġtap Ġgesture Ġhas Ġoccurred Ġon Ġthis Ġnode . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġdata Ġclass ĠT ap Tracking Data ( ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġnode Ġthat Ġwas Ġbeing Ġtouched Ġwhen ĠACTION _ DOWN Ġoccurred . ĊĠĠĠĠĠĠĠ Ġval Ġdown Node : ĠNode , ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġscreen - space Ġposition Ġthat Ġwas Ġbeing Ġtouched Ġwhen ĠACTION _ DOWN Ġoccurred . ĊĠĠĠĠĠĠĠ Ġval Ġdown Position : ĠVector 3 ĊĠĠĠ Ġ) Ċ }