package Ġinfo . la ht . three kt . core Ċ Ċ import Ġinfo . la ht . three kt . cam eras . Camera Ċ import Ġinfo . la ht . three kt . cam eras . Or tho graphic Camera Ċ import Ġinfo . la ht . three kt . cam eras . Perspective Camera Ċ import Ġinfo . la ht . three kt . cam eras . un project Ċ import Ġinfo . la ht . three kt . math . Ray Ċ import Ġinfo . la ht . three kt . math . Vector 2 Ċ import Ġinfo . la ht . three kt . math . Vector 3 Ċ Ċ class ĠRay caster Ġ@ Jvm Over loads Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġorigin : ĠVector 3 Ġ= ĠVector 3 (), ĊĠĠĠĠĠĠĠ Ġdirection : ĠVector 3 Ġ= ĠVector 3 (), ĊĠĠĠĠĠĠĠ Ġval Ġnear : ĠFloat Ġ= Ġ 0 f , ĊĠĠĠĠĠĠĠ Ġval Ġfar : ĠFloat Ġ= ĠFloat . POSITIVE _ INFINITY Ċ ) Ġ{ ĊĊĠĠĠ Ġval Ġray Ġ= ĠRay ( origin , Ġdirection ) ĊĠĠĠ Ġprivate Ġvar Ġcamera : ĠCamera ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUpdates Ġthe Ġray Ġwith Ġa Ġnew Ġorigin Ġand Ġdirection . ĊĠĠĠĠ Ġ* Ġ@ param Ġorigin ĠThe Ġorigin Ġvector Ġwhere Ġthe Ġray Ġcast s Ġfrom . ĊĠĠĠĠ Ġ* Ġ@ param Ġdirection ĠThe Ġnormalized Ġdirection Ġvector Ġthat Ġgives Ġdirection Ġto Ġthe Ġray . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset ( origin : ĠVector 3 , Ġdirection : ĠVector 3 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . ray . set ( origin , Ġdirection ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUpdates Ġthe Ġray Ġwith Ġa Ġnew Ġorigin Ġand Ġdirection . ĊĠĠĠĠ Ġ* Ġ@ param Ġcoords Ġ 2 D Ġcoordinates Ġof Ġthe Ġmouse , Ġin Ġnormalized Ġdevice Ġcoordinates Ġ( N DC ) --- X Ġand ĠY Ġcomponents Ġshould Ġbe Ġbetween Ġ- 1 Ġand Ġ 1 . ĊĠĠĠĠ Ġ* Ġ@ param Ġcamera Ġcamera Ġfrom Ġwhich Ġthe Ġray Ġshould Ġorig inate ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset From Camera ( coords : ĠVector 2 , Ġcamera : ĠCamera ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( camera ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPers pective Camera Ġ-> Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . ray . origin . set From Matrix Position ( camera . matrix World ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . ray . direction . set ( coords . x , Ġcoords . y , Ġ 0 . 5 f ). un project ( camera ). sub ( this . ray . origin ). normalize () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . camera Ġ= Ġcamera ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠOr tho graphic Camera Ġ-> Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . ray . origin . set ( coords . x , Ġcoords . y , Ġ( camera . near Ġ+ Ġcamera . far ) Ġ/ Ġ( camera . near Ġ- Ġcamera . far )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. un project ( camera ) Ġ// Ġset Ġorigin Ġin Ġplane Ġof Ġcamera ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . ray . direction . set ( 0 f , Ġ 0 f , Ġ- 1 f ). transform Direction ( camera . matrix World ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . camera Ġ= Ġcamera ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Unsupported Ġcamera Ġtype : Ġ$ camera ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġintersect Object (` object `: ĠObject 3 D , Ġray caster : ĠRay caster , Ġintersect s : ĠMutable List < Intersection >, Ġrecursive : ĠBoolean ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! ` object `. visible ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġ` object `. ray cast ( ray caster , Ġintersect s ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( recursive ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ` object `. children . forEach Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintersect Object ( it , Ġray caster , Ġintersect s , Ġtrue ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġall Ġintersection Ġbetween Ġthe Ġray Ġand Ġthe Ġobject Ġwith Ġor Ġwithout Ġthe Ġdesc endants . ĠInter sections Ġare Ġreturned Ġsorted Ġby Ġdistance , Ġclosest Ġfirst . ĊĠĠĠĠ Ġ* Ġ@ param Ġobject ĠThe Ġobject Ġto Ġcheck Ġfor Ġintersection Ġwith Ġthe Ġray . ĊĠĠĠĠ Ġ* Ġ@ param Ġrecursive ĠIf Ġtrue , Ġit Ġalso Ġchecks Ġall Ġdesc endants . ĠOtherwise Ġit Ġonly Ġchecks Ġintersect on Ġwith Ġthe Ġobject . ĠDefault Ġis Ġfalse . ĊĠĠĠĠ Ġ* Ġ@ param Ġoptional Target Ġ( optional ) Ġtarget Ġto Ġset Ġthe Ġresult . ĠOtherwise Ġa Ġnew ĠArray Ġis Ġinstantiated . ĠIf Ġset , Ġyou Ġmust Ġclear Ġthis Ġarray Ġprior Ġto Ġeach Ġcall Ġ( i . e ., Ġarray . length Ġ= Ġ 0 ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġfun Ġintersect Object ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ` object `: ĠObject 3 D , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecursive : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintersect s : ĠMutable List < Intersection > Ġ= Ġmutable ListOf () ĊĠĠĠ Ġ): ĠList < Intersection > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġintersect Object (` object `, Ġthis , Ġintersect s , Ġrecursive ) ĊĊĠĠĠĠĠĠĠ Ġintersect s . sort () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġintersect s ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġall Ġintersection Ġbetween Ġthe Ġray Ġand Ġthe Ġobjects Ġwith Ġor Ġwithout Ġthe Ġdesc endants . ĠInter sections Ġare Ġreturned Ġsorted Ġby Ġdistance , Ġclosest Ġfirst . ĠInter sections Ġare Ġof Ġthe Ġsame Ġform Ġas Ġthose Ġreturned Ġby Ġ. intersect Object . ĊĠĠĠĠ Ġ* Ġ@ param Ġobjects ĠThe Ġobjects Ġto Ġcheck Ġfor Ġintersection Ġwith Ġthe Ġray . ĊĠĠĠĠ Ġ* Ġ@ param Ġrecursive ĠIf Ġtrue , Ġit Ġalso Ġchecks Ġall Ġdesc endants Ġof Ġthe Ġobjects . ĠOtherwise Ġit Ġonly Ġchecks Ġintersect on Ġwith Ġthe Ġobjects . ĠDefault Ġis Ġfalse . ĊĠĠĠĠ Ġ* Ġ@ param Ġoptional Target Ġ( optional ) Ġtarget Ġto Ġset Ġthe Ġresult . ĠOtherwise Ġa Ġnew ĠArray Ġis Ġinstantiated . ĠIf Ġset , Ġyou Ġmust Ġclear Ġthis Ġarray Ġprior Ġto Ġeach Ġcall Ġ( i . e ., Ġarray . length Ġ= Ġ 0 ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġfun Ġintersect Objects ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobjects : ĠList < Object 3 D >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecursive : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintersect s : ĠMutable List < Intersection > Ġ= Ġmutable ListOf () ĊĠĠĠ Ġ): ĠList < Intersection > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġobjects . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintersect Object ( it , Ġthis , Ġintersect s , Ġrecursive ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġintersect s . sort () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġintersect s ĊĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ data Ġclass ĠIntersection Ġinternal Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġvar Ġdistance : ĠFloat , ĊĠĠĠĠĠĠĠ Ġvar Ġdistance To Ray : ĠFloat ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġvar Ġpoint : ĠVector 3 , ĊĠĠĠĠĠĠĠ Ġvar Ġindex : ĠInt ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġvar Ġface : ĠFace 3 ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġvar Ġface Index : ĠInt ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġvar Ġ` object `: ĠObject 3 D , ĊĠĠĠĠĠĠĠ Ġvar Ġuv : ĠVector 2 ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġvar Ġuv 2 : ĠVector 2 ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġvar Ġinstance Id : ĠInt ? Ġ= Ġnull Ċ ) Ġ: ĠComparable < Intersection > Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġcompare To ( other : ĠIntersection ): ĠInt Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġdiff Ġ= Ġdistance Ġ- Ġother . distance ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdiff Ġ== Ġ 0 f Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdiff Ġ> Ġ 0 Ġ-> Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ- 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ