package Ġme . anno . ecs . components . mesh . sdf . shapes Ċ Ċ import Ġme . anno . ecs . annotations . Range Ċ import Ġme . anno . ecs . components . mesh . Type Value Ċ import Ġme . anno . ecs . components . mesh . sdf . SD F Component Ċ import Ġme . anno . ecs . components . mesh . sdf . Variable Counter Ċ import Ġme . anno . ecs . pref ab . Prefab Save able Ċ import Ġme . anno . image . Image Writer Ċ import Ġme . anno . math s . Math s . clamp Ċ import Ġme . anno . math s . Math s . fract Ċ import Ġme . anno . math s . Math s . length Ċ import Ġme . anno . math s . Math s . mix Ċ import Ġme . anno . utils . pool ing . J om l Pools Ċ import Ġorg . j om l . Vector 2 f Ċ import Ġorg . j om l . Vector 4 f Ċ import Ġkotlin . math .* Ċ Ċ class ĠS DF Star Ġ: ĠS DF 2 D Shape () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġparams Ġ= ĠVector 2 f ( 5 f , Ġ 0 . 5 f ) ĊĊĠĠĠ Ġ@ Range ( 3 . 0 , Ġ 2 e 9 ) ĊĠĠĠ Ġvar Ġpoints ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġparams . x . toInt () ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv Ġ= Ġvalue . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( v Ġ!= Ġparams . x ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(!( dynamic Size Ġ|| Ġglobal Dynamic )) Ġinvalidate Shader () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . x Ġ= Ġv ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Range ( 0 . 0 , Ġ 1 . 0 ) ĊĠĠĠ Ġvar Ġindent ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġparams . y ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( params . y Ġ!= Ġvalue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(!( dynamic Size Ġ|| Ġglobal Dynamic )) Ġinvalidate Shader () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . y Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġbuild Shader ( ĊĠĠĠĠĠĠĠ Ġbuilder : ĠStringBuilder , ĊĠĠĠĠĠĠĠ Ġpos Index 0 : ĠInt , ĊĠĠĠĠĠĠĠ Ġnext Variable Id : ĠVariable Counter , ĊĠĠĠĠĠĠĠ Ġdst Index : ĠInt , ĊĠĠĠĠĠĠĠ Ġuniform s : ĠHashMap < String , ĠType Value >, ĊĠĠĠĠĠĠĠ Ġfunctions : ĠHashSet < String > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtrans Ġ= Ġbuild Transform ( builder , Ġpos Index 0 , Ġnext Variable Id , Ġuniform s , Ġfunctions ) ĊĠĠĠĠĠĠĠ Ġfunctions . add ( sd Star ) ĊĠĠĠĠĠĠĠ Ġsmart Min Begin ( builder , Ġdst Index ) ĊĠĠĠĠĠĠĠ Ġbuilder . append (" sd Star (" ) ĊĠĠĠĠĠĠĠ Ġwrite Func Input ( builder , Ġtrans . pos Index ) ĊĠĠĠĠĠĠĠ Ġbuilder . append (',') ĊĠĠĠĠĠĠĠ Ġval Ġdynamic Size Ġ= Ġdynamic Size Ġ|| Ġglobal Dynamic ĊĠĠĠĠĠĠĠ Ġif Ġ( dynamic Size ) Ġbuilder . append Uniform ( uniform s , Ġparams ) ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġpre compute Ġthe Ġparameters Ġfor Ġbetter Ġperformance ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġn Ġ= Ġparams . x ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm Ġ= Ġmix ( 2 f , Ġn , Ġparams . y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġan Ġ= Ġ( Math . PI Ġ/ Ġn ). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġen Ġ= Ġ( Math . PI Ġ/ Ġm ). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ( an ). append (',') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (" vec 2 (" ). append ( cos ( an )). append (',' ). append ( sin ( an )). append (" ), ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (" vec 2 (" ). append ( cos ( en )). append (',' ). append ( sin ( en )). append (' )') ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbuilder . append (' )') ĊĠĠĠĠĠĠĠ Ġsmart Min End ( builder , Ġdst Index , Ġnext Variable Id , Ġuniform s , Ġfunctions , Ġtrans ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcompute SD F Base ( pos : ĠVector 4 f ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġn Ġ= Ġparams . x ĊĠĠĠĠĠĠĠ Ġval Ġm Ġ= Ġmix ( 2 f , Ġn , Ġparams . y ) ĊĠĠĠĠĠĠĠ Ġval Ġan Ġ= Ġ( Math . PI Ġ/ Ġn ). toFloat () ĊĠĠĠĠĠĠĠ Ġval Ġen Ġ= Ġ( Math . PI Ġ/ Ġm ). toFloat () ĊĠĠĠĠĠĠĠ Ġval Ġcan Ġ= Ġcos ( an ) ĊĠĠĠĠĠĠĠ Ġval Ġsan Ġ= Ġsin ( an ) ĊĠĠĠĠĠĠĠ Ġval Ġc en Ġ= Ġcos ( en ) ĊĠĠĠĠĠĠĠ Ġval Ġsen Ġ= Ġsin ( en ) ĊĠĠĠĠĠĠĠ Ġvar Ġpx Ġ= Ġpos . x ĊĠĠĠĠĠĠĠ Ġvar Ġpy Ġ= Ġpos . y ĊĠĠĠĠĠĠĠ Ġ// Ġuntil Ġhere , Ġthe Ġvalues Ġcould Ġbe Ġcached Ġ:) ĊĠĠĠĠĠĠĠ Ġval Ġbn Ġ= Ġmod ( atan 2 ( px , Ġpy ), Ġ( 2 f Ġ* Ġan )) Ġ- Ġan ĊĠĠĠĠĠĠĠ Ġval Ġpl Ġ= Ġlength ( px , Ġpy ) ĊĠĠĠĠĠĠĠ Ġpx Ġ= Ġpl Ġ* Ġcos ( bn ) Ġ- Ġcan ĊĠĠĠĠĠĠĠ Ġpy Ġ= Ġpl Ġ* Ġabs ( sin ( bn )) Ġ- Ġsan ĊĠĠĠĠĠĠĠ Ġval Ġmax Ġ= Ġsan Ġ/ Ġsen ĊĠĠĠĠĠĠĠ Ġval Ġdot 2 Ġ= Ġclamp (- ( px Ġ* Ġc en Ġ+ Ġpy Ġ* Ġsen ), Ġ 0 f , Ġmax ) ĊĠĠĠĠĠĠĠ Ġpx Ġ+= Ġc en Ġ* Ġdot 2 ĊĠĠĠĠĠĠĠ Ġpy Ġ+= Ġsen Ġ* Ġdot 2 ĊĠĠĠĠĠĠĠ Ġreturn Ġlength ( px , Ġpy ) Ġ* Ġsign ( px ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclone (): ĠS DF Component Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclone Ġ= ĠS DF Star () ĊĠĠĠĠĠĠĠ Ġcopy ( clone ) ĊĠĠĠĠĠĠĠ Ġreturn Ġclone ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcopy ( clone : ĠPref ab Save able ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . copy ( clone ) ĊĠĠĠĠĠĠĠ Ġclone Ġas ĠS DF Star ĊĠĠĠĠĠĠĠ Ġclone . params . set ( params ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval ĠclassName Ġ= Ġ" SD FStar " ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval Ġsd Star Ġ= Ġ"" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsigned Ġdistance Ġto Ġa Ġn - star Ġpolygon ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" float Ġsd Star ( vec 2 Ġp , Ġfloat Ġan , Ġvec 2 Ġac s , Ġvec 2 Ġe cs ) Ġ{\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġreduce Ġto Ġfirst Ġsector ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠĠ Ġfloat Ġbn Ġ= Ġmod ( atan ( p . x , p . y ), 2 . 0 * an ) Ġ- Ġan ;\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠĠ Ġp Ġ= Ġlength ( p )* vec 2 ( cos ( bn ), abs ( sin ( bn ))); \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġline Ġsdf ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠĠ Ġp Ġ-= Ġac s ;\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠĠ Ġp Ġ+= Ġe cs * clamp (- dot ( p , ecs ), Ġ 0 . 0 , Ġac s . y / ecs . y );\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠĠ Ġreturn Ġlength ( p )* sign ( p . x );\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" }\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" float Ġsd Star ( vec 2 Ġp , Ġfloat Ġn , Ġfloat Ġinner ) Ġ{\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthese Ġ 4 Ġlines Ġcan Ġbe Ġpre computed Ġfor Ġa Ġgiven Ġshape ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠĠ Ġfloat Ġm Ġ= Ġmix ( 2 . 0 , Ġn , Ġinner );\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠĠ Ġfloat Ġan Ġ= ĠPI / n ;\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠĠ Ġfloat Ġen Ġ= ĠPI / m ;\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠĠ Ġvec 2 Ġ Ġac s Ġ= Ġvec 2 ( cos ( an ), sin ( an )); \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġe cs = vec 2 ( 0 , 1 ) Ġand Ġsimplify , Ġfor Ġregular Ġpolygon ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠĠ Ġvec 2 Ġ Ġe cs Ġ= Ġvec 2 ( cos ( en ), sin ( en )); \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġreduce Ġto Ġfirst Ġsector ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠĠ Ġreturn Ġsd Star ( p , an , acs , ecs );\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" }\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" float Ġsd Star ( vec 2 Ġp , Ġvec 2 Ġa ){ Ġreturn Ġsd Star ( p , a . x , a . y ); Ġ}\ n " ĊĊĠĠĠĠĠĠĠ Ġ/** Ġ 2 d Ġsdf Ġtest Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġmain ( args : ĠArray < String >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġ 5 1 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstar Ġ= ĠS DF Star () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstar . scale Ġ= Ġsize Ġ* Ġ 0 . 3 f ĊĠĠĠĠĠĠĠĠĠĠĠ ĠImage Writer . write Image Float ( size , Ġsize , Ġ" star . png ", Ġ 0 , Ġtrue ) Ġ{ Ġx , Ġy , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp Ġ= ĠJ om l Pools . vec 4 f . create () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdistance Ġ= Ġstar . compute SD F ( p . set ( x Ġ- Ġsize Ġ* Ġ 0 . 5 f , Ġy Ġ- Ġsize Ġ* Ġ 0 . 5 f , Ġ 0 f , Ġ 0 f )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJ om l Pools . vec 4 f . sub ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfr act ( distance Ġ* Ġ 0 . 0 1 f ) Ġ* Ġsign ( distance ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ Ċ }