package Ġme . anno . utils Ċ Ċ import Ġorg . j om l . Matrix 4 f Ċ import Ġorg . j om l . Vector 4 f Ċ import Ġorg . j om l . Vector 4 fc Ċ import Ġkotlin . math . abs Ċ import Ġkotlin . math . max Ċ import Ġkotlin . math . min Ċ Ċ object ĠCli pping Ġ{ ĊĊĠĠĠ Ġfun Ġcheck ( v 0 : ĠVector 4 fc , Ġaxis 1 : ĠVector 4 fc , Ġaxis 2 : ĠVector 4 fc , ĠgetValue : Ġ( Vector 4 fc ) Ġ-> ĠFloat ): ĠVector 4 fc ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġval 0 Ġ= ĠgetValue ( v 0 ) ĊĠĠĠĠĠĠĠ Ġif Ġ( val 0 Ġin Ġ- 1 f .. 1 f ) Ġreturn Ġv 0 Ġ// Ġit 's Ġfine ĊĠĠĠĠĠĠĠ Ġval Ġval 1 p Ġ= ĠgetValue ( axis 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġval 2 p Ġ= ĠgetValue ( axis 2 ) ĊĠĠĠĠĠĠĠ Ġ// Ġdecide Ġwhich Ġone Ġis Ġbetter ... Ġis Ġthis Ġimportant ? Ġid k ... ĊĠĠĠĠĠĠĠ Ġif Ġ(( val 0 Ġ> Ġ 1 f Ġ&& Ġval 1 p Ġ> Ġ 1 f ) Ġ|| Ġ( val 0 Ġ< Ġ- 1 f Ġ&& Ġval 1 p Ġ< Ġ- 1 f )) Ġreturn Ġl erp Maybe ( v 0 , Ġaxis 2 , Ġval 0 , Ġval 2 p , ĠgetValue ) ĊĠĠĠĠĠĠĠ Ġif Ġ(( val 0 Ġ> Ġ 1 f Ġ&& Ġval 2 p Ġ> Ġ 1 f ) Ġ|| Ġ( val 0 Ġ< Ġ- 1 f Ġ&& Ġval 2 p Ġ< Ġ- 1 f )) Ġreturn Ġl erp Maybe ( v 0 , Ġaxis 1 , Ġval 0 , Ġval 1 p , ĠgetValue ) ĊĠĠĠĠĠĠĠ Ġval Ġv 1 Is Better Ġ= Ġabs ( val 1 p Ġ- Ġval 0 ) Ġ> Ġabs ( val 2 p Ġ- Ġval 0 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( v 1 Is Better ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġl erp Maybe ( v 0 , Ġaxis 1 , Ġval 0 , Ġval 1 p , ĠgetValue ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġl erp Maybe ( v 0 , Ġaxis 2 , Ġval 0 , Ġval 2 p , ĠgetValue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinline Ġfun Ġl erp Maybe ( v 0 : ĠVector 4 fc , Ġv 1 : ĠVector 4 fc , Ġval 0 : ĠFloat , Ġval 1 : ĠFloat , ĠgetValue : Ġ( Vector 4 f ) Ġ-> ĠFloat ): ĠVector 4 f ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(( val 0 Ġ> Ġ 1 f Ġ&& Ġval 1 Ġ> Ġ 1 f ) Ġ|| Ġ( val 0 Ġ< Ġ- 1 f Ġ&& Ġval 1 Ġ< Ġ- 1 f )) Ġreturn Ġnull Ġ// Ġimpossible ĊĠĠĠĠĠĠĠ Ġval Ġcut ting Point Ġ= Ġif Ġ( val 0 Ġ< Ġ 0 f ) Ġ- 1 f Ġelse Ġ 1 f ĊĠĠĠĠĠĠĠ Ġ// Ġlinear Ġcombination , Ġsuch Ġthat Ġthe Ġnew Ġvalue Ġis Ġcut ting Point ĊĠĠĠĠĠĠĠ Ġval Ġd 1 Ġ= Ġabs ( val 0 Ġ- Ġcut ting Point ) ĊĠĠĠĠĠĠĠ Ġval Ġd 2 Ġ= Ġabs ( val 1 Ġ- Ġcut ting Point ) ĊĠĠĠĠĠĠĠ Ġreturn ĠVector 4 f ( v 0 ). lerp ( v 1 , Ġd 1 Ġ/ Ġ( d 1 Ġ+ Ġd 2 )) ĊĠĠĠĠĠĠĠ Ġ// Ġ(" ${ v 0 . print ()} Ġ${ v 1 . print ()} Ġ-> Ġ${ result . print ()} Ġ($ val 0 Ġ$ val 1 Ġ-> Ġ${ getValue ( result )}) ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Point ( matrix : ĠMatrix 4 f , Ġx : ĠFloat , Ġy : ĠFloat , Ġz : ĠFloat Ġ= Ġ 0 f ): ĠVector 4 f ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvec Ġ= Ġmatrix . transform Project ( Vector 4 f ( x , Ġy , Ġz , Ġ 1 f )) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( vec . x Ġin Ġ- 1 f .. 1 f Ġ&& Ġvec . y Ġin Ġ- 1 f .. 1 f Ġ&& Ġvec . z Ġin Ġ- 1 f .. 1 f ) Ġnull ĊĠĠĠĠĠĠĠ Ġelse Ġvec ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Plane Visible ( matrix : ĠMatrix 4 f , Ġdx : ĠFloat , Ġdy : ĠFloat ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġv 0 0 0 Ġ= Ġget Point ( matrix , Ġ+ dx , Ġ+ dy ) Ġ?: Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġv 0 0 1 Ġ= Ġget Point ( matrix , Ġ+ dx , Ġ- dy ) Ġ?: Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġv 0 1 0 Ġ= Ġget Point ( matrix , Ġ- dx , Ġ+ dy ) Ġ?: Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġv 0 1 1 Ġ= Ġget Point ( matrix , Ġ- dx , Ġ- dy ) Ġ?: Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġreturn Ġis R ough ly Visible ( listOf ( v 0 0 0 , Ġv 0 0 1 , Ġv 0 1 0 , Ġv 0 1 1 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis R ough ly Visible ( points : ĠIterable < Vector 4 f >): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvar Ġall Negative Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġvar Ġall Positive Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġfor Ġ( v Ġin Ġpoints ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( v . x Ġ>= Ġ- 1 f ) Ġall Negative Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( v . x Ġ<= Ġ+ 1 f ) Ġall Positive Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( all Negative Ġ|| Ġall Positive ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġall Negative Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġall Positive Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġfor Ġ( v Ġin Ġpoints ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( v . y Ġ>= Ġ- 1 f ) Ġall Negative Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( v . y Ġ<= Ġ+ 1 f ) Ġall Positive Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( all Negative Ġ|| Ġall Positive ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġall Negative Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġall Positive Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġfor Ġ( v Ġin Ġpoints ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( v . z Ġ>= Ġ- 1 f ) Ġall Negative Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( v . z Ġ<= Ġ+ 1 f ) Ġall Positive Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( all Negative Ġ|| Ġall Positive ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Z ( p 0 0 : ĠVector 4 fc , Ġp 0 1 : ĠVector 4 fc , Ġp 1 0 : ĠVector 4 fc , Ġp 1 1 : ĠVector 4 fc ): ĠPair < Float , ĠFloat >? Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvar Ġv 0 0 Ġ= Ġp 0 0 ĊĠĠĠĠĠĠĠ Ġvar Ġv 0 1 Ġ= Ġp 0 1 ĊĠĠĠĠĠĠĠ Ġvar Ġv 1 0 Ġ= Ġp 1 0 ĊĠĠĠĠĠĠĠ Ġvar Ġv 1 1 Ġ= Ġp 1 1 ĊĊĠĠĠĠĠĠĠ Ġfun Ġcheck All ( getValue : Ġ( Vector 4 fc ) Ġ-> ĠFloat ): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsort Ġby Ġresol v ability Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthere Ġmust Ġbe Ġat Ġleast Ġone Ġintersection Ġwith Ġzero , Ġor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġa Ġpossible Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx 0 0 Ġ= ĠgetValue ( v 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx 0 1 Ġ= ĠgetValue ( v 0 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx 1 0 Ġ= ĠgetValue ( v 1 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx 1 1 Ġ= ĠgetValue ( v 1 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( x 0 0 Ġ< Ġ- 1 f Ġ&& Ġx 0 1 Ġ< Ġ- 1 f Ġ&& Ġx 1 0 Ġ< Ġ- 1 f Ġ&& Ġx 1 1 Ġ< Ġ- 1 f ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( x 0 0 Ġ> Ġ+ 1 f Ġ&& Ġx 0 1 Ġ> Ġ+ 1 f Ġ&& Ġx 1 0 Ġ> Ġ+ 1 f Ġ&& Ġx 1 1 Ġ> Ġ+ 1 f ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfind , Ġwhich Ġvalue Ġis Ġcross ing ... ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( x 0 0 Ġ< Ġ- 1 f Ġ&& Ġx 0 1 Ġ< Ġ- 1 f Ġ&& Ġx 1 0 Ġ< Ġ- 1 f ) Ġ|| Ġx 0 0 Ġ> Ġ+ 1 f Ġ&& Ġx 0 1 Ġ> Ġ+ 1 f Ġ&& Ġx 1 0 Ġ> Ġ+ 1 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġneed Ġto Ġuse Ġx 1 1 , Ġwith Ġany Ġof Ġthe Ġothers ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv 0 1 Ġ= Ġcheck ( v 0 1 , Ġv 0 0 , Ġv 1 1 , ĠgetValue ) Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv 1 0 Ġ= Ġcheck ( v 1 0 , Ġv 0 0 , Ġv 1 1 , ĠgetValue ) Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv 0 0 Ġ= Ġcheck ( v 0 0 , Ġv 0 1 , Ġv 1 0 , ĠgetValue ) Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv 1 1 Ġ= Ġcheck ( v 1 1 , Ġv 1 0 , Ġv 0 1 , ĠgetValue ) Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġhave Ġno Ġinfo Ġabout Ġx 1 1 , Ġjust Ġthat Ġcorrect ing Ġthe Ġtriple Ġshould Ġwork ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwhen Ġit 's Ġcorrected , Ġhopefully Ġthe Ġrest Ġwill Ġwork ... ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv 0 0 Ġ= Ġcheck ( v 0 0 , Ġv 0 1 , Ġv 1 0 , ĠgetValue ) Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv 0 1 Ġ= Ġcheck ( v 0 1 , Ġv 0 0 , Ġv 1 1 , ĠgetValue ) Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv 1 0 Ġ= Ġcheck ( v 1 0 , Ġv 0 0 , Ġv 1 1 , ĠgetValue ) Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv 1 1 Ġ= Ġcheck ( v 1 1 , Ġv 1 0 , Ġv 0 1 , ĠgetValue ) Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! check All Ġ{ Ġit . x () Ġ} Ġ|| Ġ! check All Ġ{ Ġit . y () Ġ} Ġ|| Ġ! check All Ġ{ Ġit . z () Ġ}) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġ// Ġ(" ${ v 0 0 . print ()} Ġ${ v 0 1 . print ()} Ġ${ v 1 0 . print ()} Ġ${ v 1 1 . print () }") ĊĊĠĠĠĠĠĠĠ Ġval Ġmin Z Ġ= Ġmin ( min ( v 0 0 . z (), Ġv 0 1 . z ()), Ġmin ( v 1 0 . z (), Ġv 1 1 . z ())) ĊĠĠĠĠĠĠĠ Ġval Ġmax Z Ġ= Ġmax ( min ( v 0 0 . z (), Ġv 0 1 . z ()), Ġmin ( v 1 0 . z (), Ġv 1 1 . z ())) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġmin Z Ġto Ġmax Z ĊĊĠĠĠ Ġ} ĊĊ Ċ }