package Ġinfo . la ht . three kt . math Ċ Ċ import Ġinfo . la ht . three kt . core . Clone able Ċ import Ġinfo . la ht . three kt . core . Float Buffer Attribute Ċ import Ġinfo . la ht . three kt . core . Object 3 D Ċ import Ġinfo . la ht . three kt . objects . Mesh Ċ Ċ class ĠBox 3 Ġ@ Jvm Over loads Ġconstructor ( ĊĠĠĠ Ġvar Ġmin : ĠVector 3 Ġ= ĠVector 3 ( Float . POSITIVE _ INFINITY , ĠFloat . POSITIVE _ INFINITY , ĠFloat . POSITIVE _ INFINITY ), ĊĠĠĠ Ġvar Ġmax : ĠVector 3 Ġ= ĠVector 3 ( Float . NEGATIVE _ INFINITY , ĠFloat . NEGATIVE _ INFINITY , ĠFloat . NEGATIVE _ INFINITY ) Ċ ): ĠClone able Ġ{ ĊĊĠĠĠ Ġfun Ġset ( min : ĠVector 3 , Ġmax : ĠVector 3 ): ĠBox 3 Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . min . copy ( min ) ĊĠĠĠĠĠĠĠ Ġthis . max . copy ( max ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset From Array ( array : ĠFloat Array ): ĠBox 3 Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġmin X Ġ= ĠFloat . POSITIVE _ INFINITY ĊĠĠĠĠĠĠĠ Ġvar Ġmin Y Ġ= ĠFloat . POSITIVE _ INFINITY ĊĠĠĠĠĠĠĠ Ġvar Ġmin Z Ġ= ĠFloat . POSITIVE _ INFINITY ĊĊĠĠĠĠĠĠĠ Ġvar Ġmax X Ġ= ĠFloat . NEGATIVE _ INFINITY ĊĠĠĠĠĠĠĠ Ġvar Ġmax Y Ġ= ĠFloat . NEGATIVE _ INFINITY ĊĠĠĠĠĠĠĠ Ġvar Ġmax Z Ġ= ĠFloat . NEGATIVE _ INFINITY ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġarray . size Ġstep Ġ 3 ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġarray [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġarray [ i Ġ+ Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġz Ġ= Ġarray [ i Ġ+ Ġ 2 ] ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( x Ġ< Ġmin X ) Ġmin X Ġ= Ġx ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( y Ġ< Ġmin Y ) Ġmin Y Ġ= Ġy ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( z Ġ< Ġmin Z ) Ġmin Z Ġ= Ġz ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( x Ġ> Ġmax X ) Ġmax X Ġ= Ġx ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( y Ġ> Ġmax Y ) Ġmax Y Ġ= Ġy ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( z Ġ> Ġmax Z ) Ġmax Z Ġ= Ġz ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthis . min . set ( min X , Ġmin Y , Ġmin Z ) ĊĠĠĠĠĠĠĠ Ġthis . max . set ( max X , Ġmax Y , Ġmax Z ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset From Buffer Attribute ( Ġattribute : ĠFloat Buffer Attribute Ġ): ĠBox 3 Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġmin X Ġ= ĠFloat . POSITIVE _ INFINITY ĊĠĠĠĠĠĠĠ Ġvar Ġmin Y Ġ= ĠFloat . POSITIVE _ INFINITY ĊĠĠĠĠĠĠĠ Ġvar Ġmin Z Ġ= ĠFloat . POSITIVE _ INFINITY ĊĊĠĠĠĠĠĠĠ Ġvar Ġmax X Ġ= ĠFloat . NEGATIVE _ INFINITY ĊĠĠĠĠĠĠĠ Ġvar Ġmax Y Ġ= ĠFloat . NEGATIVE _ INFINITY ĊĠĠĠĠĠĠĠ Ġvar Ġmax Z Ġ= ĠFloat . NEGATIVE _ INFINITY ĊĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġl Ġ= Ġattribute . count ĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġl ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġattribute . getX ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġattribute . getY ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġz Ġ= Ġattribute . getZ ( i ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( x Ġ< Ġmin X ) Ġmin X Ġ= Ġx ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( y Ġ< Ġmin Y ) Ġmin Y Ġ= Ġy ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( z Ġ< Ġmin Z ) Ġmin Z Ġ= Ġz ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( x Ġ> Ġmax X ) Ġmax X Ġ= Ġx ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( y Ġ> Ġmax Y ) Ġmax Y Ġ= Ġy ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( z Ġ> Ġmax Z ) Ġmax Z Ġ= Ġz ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthis . min . set ( min X , Ġmin Y , Ġmin Z ) ĊĠĠĠĠĠĠĠ Ġthis . max . set ( max X , Ġmax Y , Ġmax Z ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset From Points ( points : ĠList < Vector 3 >): ĠBox 3 Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . make Empty (); ĊĊĠĠĠĠĠĠĠ Ġpoints . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . expand By Point ( it ); ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis ; ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset From Center And Size ( center : ĠVector 3 , Ġsize : ĠVector 3 ): ĠBox 3 Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhalf Size Ġ= ĠVector 3 (). copy ( Ġsize Ġ). multiply Scalar ( Ġ 0 . 5 . toFloat () Ġ) ĊĊĠĠĠĠĠĠĠ Ġthis . min . copy ( Ġcenter Ġ). sub ( Ġhalf Size Ġ) ĊĠĠĠĠĠĠĠ Ġthis . max . copy ( Ġcenter Ġ). add ( Ġhalf Size Ġ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset From Object (` object `: ĠObject 3 D ): ĠBox 3 Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . make Empty () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis . expand By Object (` object `) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmake Empty (): ĠBox 3 Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . min . x Ġ= ĠFloat . POSITIVE _ INFINITY ĊĠĠĠĠĠĠĠ Ġthis . min . y Ġ= ĠFloat . POSITIVE _ INFINITY ĊĠĠĠĠĠĠĠ Ġthis . min . z Ġ= ĠFloat . POSITIVE _ INFINITY ĊĊĠĠĠĠĠĠĠ Ġthis . max . x Ġ= ĠFloat . NEGATIVE _ INFINITY ĊĠĠĠĠĠĠĠ Ġthis . max . y Ġ= ĠFloat . NEGATIVE _ INFINITY ĊĠĠĠĠĠĠĠ Ġthis . max . z Ġ= ĠFloat . NEGATIVE _ INFINITY ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis ; ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠisEmpty (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġthis Ġis Ġa Ġmore Ġrobust Ġcheck Ġfor Ġempty Ġthan Ġ( Ġvolume Ġ<= Ġ 0 Ġ) Ġbecause Ġvolume Ġcan Ġget Ġpositive Ġwith Ġtwo Ġnegative Ġaxes ĊĠĠĠĠĠĠĠ Ġreturn Ġ( this . max . x Ġ< Ġthis . min . x ) Ġ|| Ġ( this . max . y Ġ< Ġthis . min . y ) Ġ|| Ġ( this . max . z Ġ< Ġthis . min . z ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Center ( target : ĠVector 3 ): ĠVector 3 Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( this . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget . set ( 0 , Ġ 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget . add Vectors ( this . min , Ġthis . max ). multiply Scalar ( 0 . 5 . toFloat ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Size ( target : ĠVector 3 ): ĠVector 3 Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( this . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget . set ( 0 , Ġ 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget . sub Vectors ( this . max , Ġthis . min ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġexpand By Point ( point : ĠVector 3 ): ĠBox 3 Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . min . min ( point ) ĊĠĠĠĠĠĠĠ Ġthis . max . max ( point ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġexpand By Vector ( vector : ĠVector 3 ): ĠBox 3 Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . min . sub ( vector ) ĊĠĠĠĠĠĠĠ Ġthis . max . add ( vector ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġexpand By Scalar ( scalar : ĠFloat ): ĠBox 3 Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . min . add Scalar (- scalar ) ĊĠĠĠĠĠĠĠ Ġthis . max . add Scalar ( scalar ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġexpand By Object (` object `: ĠObject 3 D ): ĠBox 3 Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġv 1 Ġ= ĠVector 3 () ĊĊĠĠĠĠĠĠĠ Ġ` object `. update Matrix World ( true ) ĊĠĠĠĠĠĠĠ Ġ` object `. traverse Ġ{ Ġnode Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node Ġis ĠMesh ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgeometry Ġ= Ġnode . geometry ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgeometry . attributes . position ?. also Ġ{ Ġattribute Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġattribute . count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv 1 . from Buffer Attribute ( attribute , Ġi ). apply Matrix 4 ( node . matrix World ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpand By Point ( v 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcontains Point ( point : ĠVector 3 ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ!( point . x Ġ< Ġthis . min . x Ġ|| Ġpoint . x Ġ> Ġthis . max . x Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoint . y Ġ< Ġthis . min . y Ġ|| Ġpoint . y Ġ> Ġthis . max . y Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoint . z Ġ< Ġthis . min . z Ġ|| Ġpoint . z Ġ> Ġthis . max . z ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcontains Box ( box : ĠBox 3 ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . min . x Ġ<= Ġbox . min . x Ġ&& Ġbox . max . x Ġ<= Ġthis . max . x Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . min . y Ġ<= Ġbox . min . y Ġ&& Ġbox . max . y Ġ<= Ġthis . max . y Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . min . z Ġ<= Ġbox . min . z Ġ&& Ġbox . max . z Ġ<= Ġthis . max . z ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Parameter ( point : ĠVector 3 , Ġtarget : ĠVector 3 ): ĠVector 3 Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtarget . set ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( point . x Ġ- Ġthis . min . x ) Ġ/ Ġ( this . max . x Ġ- Ġthis . min . x ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( point . y Ġ- Ġthis . min . y ) Ġ/ Ġ( this . max . y Ġ- Ġthis . min . y ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( point . z Ġ- Ġthis . min . z ) Ġ/ Ġ( this . max . z Ġ- Ġthis . min . z ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġintersect s Box ( box : ĠBox 3 ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġusing Ġ 6 Ġsplitting Ġplanes Ġto Ġrule Ġout Ġinter sections . ĊĠĠĠĠĠĠĠ Ġreturn Ġ!( box . max . x Ġ< Ġthis . min . x Ġ|| Ġbox . min . x Ġ> Ġthis . max . x Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbox . max . y Ġ< Ġthis . min . y Ġ|| Ġbox . min . y Ġ> Ġthis . max . y Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbox . max . z Ġ< Ġthis . min . z Ġ|| Ġbox . min . z Ġ> Ġthis . max . z ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġintersect s Sphere ( sphere : ĠSphere ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclosest Point Ġ= ĠVector 3 (); ĊĠĠĠĠĠĠĠ Ġ// ĠFind Ġthe Ġpoint Ġon Ġthe ĠA ABB Ġclosest Ġto Ġthe Ġsphere Ġcenter . ĊĠĠĠĠĠĠĠ Ġthis . clamp Point ( Ġsphere . center , Ġclosest Point Ġ); ĊĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġthat Ġpoint Ġis Ġinside Ġthe Ġsphere , Ġthe ĠA ABB Ġand Ġsphere Ġintersect . ĊĠĠĠĠĠĠĠ Ġreturn Ġclosest Point . distance ToS quared ( Ġsphere . center Ġ) Ġ<= Ġ( Ġsphere . radius Ġ* Ġsphere . radius Ġ); ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġintersect s Plane ( plane : ĠPlane ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġcompute Ġthe Ġminimum Ġand Ġmaximum Ġdot Ġproduct Ġvalues . ĠIf Ġthose Ġvalues ĊĠĠĠĠĠĠĠ Ġ// Ġare Ġon Ġthe Ġsame Ġside Ġ( back Ġor Ġfront ) Ġof Ġthe Ġplane , Ġthen Ġthere Ġis Ġno Ġintersection . ĊĊĠĠĠĠĠĠĠ Ġvar Ġmin : ĠFloat ĊĠĠĠĠĠĠĠ Ġvar Ġmax : ĠFloat ĊĊĠĠĠĠĠĠĠ Ġif Ġ( plane . normal . x Ġ> Ġ 0 ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmin Ġ= Ġplane . normal . x Ġ* Ġthis . min . x ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax Ġ= Ġplane . normal . x Ġ* Ġthis . max . x ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmin Ġ= Ġplane . normal . x Ġ* Ġthis . max . x ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax Ġ= Ġplane . normal . x Ġ* Ġthis . min . x ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( plane . normal . y Ġ> Ġ 0 ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmin Ġ+= Ġplane . normal . y Ġ* Ġthis . min . y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax Ġ+= Ġplane . normal . y Ġ* Ġthis . max . y ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmin Ġ+= Ġplane . normal . y Ġ* Ġthis . max . y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax Ġ+= Ġplane . normal . y Ġ* Ġthis . min . y ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( plane . normal . z Ġ> Ġ 0 ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmin Ġ+= Ġplane . normal . z Ġ* Ġthis . min . z ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax Ġ+= Ġplane . normal . z Ġ* Ġthis . max . z ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmin Ġ+= Ġplane . normal . z Ġ* Ġthis . max . z ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax Ġ+= Ġplane . normal . z Ġ* Ġthis . min . z ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ- plane . constant Ġin Ġmin .. max ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclamp Point ( point : ĠVector 3 , Ġtarget : ĠVector 3 ): ĠVector 3 Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtarget . copy ( point ). clamp ( this . min , Ġthis . max ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdistance To Point ( point : ĠVector 3 ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclamp ed Point Ġ= ĠVector 3 (). copy ( point ). clamp ( this . min , Ġthis . max ) ĊĠĠĠĠĠĠĠ Ġreturn Ġclamp ed Point . sub ( point ). length () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Bounding Sphere ( target : ĠSphere ): ĠSphere Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . get Center ( target . center ) ĊĊĠĠĠĠĠĠĠ Ġtarget . radius Ġ= Ġthis . getSize ( Vector 3 ()). length () Ġ* Ġ 0 . 5 . toFloat () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtarget ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġintersect ( box : ĠBox 3 ): ĠBox 3 Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . min . max ( Ġbox . min Ġ) ĊĠĠĠĠĠĠĠ Ġthis . max . min ( Ġbox . max Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġensure Ġthat Ġif Ġthere Ġis Ġno Ġoverlap , Ġthe Ġresult Ġis Ġfully Ġempty , Ġnot Ġslightly Ġempty Ġwith Ġnon - inf /+ inf Ġvalues Ġthat Ġwill Ġcause Ġsub sequence Ġintersect s Ġto Ġerr one ously Ġreturn Ġvalid Ġvalues . ĊĠĠĠĠĠĠĠ Ġif Ġ( Ġthis . isEmpty () Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . make Empty () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis ; ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġunion ( box : ĠBox 3 ): ĠBox 3 Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . min . min ( Ġbox . min Ġ) ĊĠĠĠĠĠĠĠ Ġthis . max . max ( Ġbox . max Ġ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġapply Matrix 4 ( matrix : ĠMatrix 4 ): ĠBox 3 Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Ġtransform Ġof Ġempty Ġbox Ġis Ġan Ġempty Ġbox . ĊĠĠĠĠĠĠĠ Ġif Ġ( this . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠNOTE : ĠI Ġam Ġusing Ġa Ġbinary Ġpattern Ġto Ġspecify Ġall Ġ 2 ^ 3 Ġcombinations Ġbelow ĊĊĠĠĠĠĠĠĠ Ġsynchronized ( points ) Ġ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpoints [ 0 ]. set ( this . min . x , Ġthis . min . y , Ġthis . min . z ). apply Matrix 4 ( matrix ) Ġ// Ġ 0 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpoints [ 1 ]. set ( this . min . x , Ġthis . min . y , Ġthis . max . z ). apply Matrix 4 ( matrix ) Ġ// Ġ 0 0 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpoints [ 2 ]. set ( this . min . x , Ġthis . max . y , Ġthis . min . z ). apply Matrix 4 ( matrix ) Ġ// Ġ 0 1 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpoints [ 3 ]. set ( this . min . x , Ġthis . max . y , Ġthis . max . z ). apply Matrix 4 ( matrix ) Ġ// Ġ 0 1 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpoints [ 4 ]. set ( this . max . x , Ġthis . min . y , Ġthis . min . z ). apply Matrix 4 ( matrix ) Ġ// Ġ 1 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpoints [ 5 ]. set ( this . max . x , Ġthis . min . y , Ġthis . max . z ). apply Matrix 4 ( matrix ) Ġ// Ġ 1 0 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpoints [ 6 ]. set ( this . max . x , Ġthis . max . y , Ġthis . min . z ). apply Matrix 4 ( matrix ) Ġ// Ġ 1 1 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpoints [ 7 ]. set ( this . max . x , Ġthis . max . y , Ġthis . max . z ). apply Matrix 4 ( matrix ) Ġ// Ġ 1 1 1 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . set From Points ( points ); ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis ; ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtranslate ( offset : ĠVector 3 ): ĠBox 3 Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . min . add ( offset ) ĊĠĠĠĠĠĠĠ Ġthis . max . add ( offset ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclone (): ĠBox 3 Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠBox 3 (). copy ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcopy ( box : ĠBox 3 ): ĠBox 3 Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . min . copy ( box . min ) ĊĠĠĠĠĠĠĠ Ġthis . max . copy ( box . max ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( java Class Ġ!= Ġother ?. java Class ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġother Ġas ĠBox 3 ĊĊĠĠĠĠĠĠĠ Ġif Ġ( min Ġ!= Ġother . min ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( max Ġ!= Ġother . max ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġmin . hashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġmax . hashCode () ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" Box 3 ( min =$ min , Ġmax =$ max )" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġpoints Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠList ( 8 ) Ġ{ ĠVector 3 () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ Ċ } Ċ