package Ġst l utils . parser Ċ Ċ import Ġst l utils . common .* Ċ import Ġst l utils . util . toFloat Ċ import Ġst l utils . util . toInt Ċ import Ġjava . io . ByteArray InputStream Ċ import Ġjava . io . InputStream Reader Ċ import Ġjava . io . Stream Tokenizer Ċ import Ġjava . io . Stream Tokenizer .* Ċ import Ġjava . nio . Byte Order . LIT TLE _ ENDIAN Ċ import Ġjava . nio . charset . Charset Ċ Ċ internal Ġsealed Ġclass ĠSt l Parser ( private Ġval Ġnormal Policy : ĠNormal Policy ) Ġ{ ĊĠĠĠ Ġabstract Ġfun Ġparse ( bytes : ĠByteArray ): ĠList < Triangle > ĊĊĠĠĠ Ġfun Ġcompute Normal ( a : ĠVector 3 d , Ġb : ĠVector 3 d , Ġc : ĠVector 3 d , Ġnormal : ĠVector 3 d ): ĠVector 3 d Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( normal Policy ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNormal Policy . STRICT LY _ IN HER IT ED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire (! normal . is Zero ) Ġ{ Ġ" Normal Ġis Ġundefined Ġ$ normal Ġand Ġnot Ġcomputed " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnormal ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNormal Policy . IN HER IT ED Ġ-> Ġnormal ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNormal Policy . COMP UT ED Ġ-> Ġcompute Right Hand Normal ( a , Ġb , Ġc ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNormal Policy . MIX ED Ġ-> Ġif Ġ( normal . is Zero ) Ġcompute Right Hand Normal ( a , Ġb , Ġc ) Ġelse Ġnormal ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcompute Right Hand Normal ( a : ĠVector 3 d , Ġb : ĠVector 3 d , Ġc : ĠVector 3 d ): ĠVector 3 d Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ(( b Ġ- Ġa ) Ġcross Ġ( c Ġ- Ġa )). normalize () ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġclass ĠSt l Binary Parser ( normal Policy : ĠNormal Policy ) Ġ: ĠSt l Parser ( normal Policy ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġparse ( bytes : ĠByteArray ): ĠList < Triangle > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġheader Content Ġ= ĠString ( bytes . slice Array ( 0 .. 7 9 )) ĊĠĠĠĠĠĠĠ Ġrequire (! header Content . startsWith (" solid ")) Ġ{ Ġ" Ascii Ġst l Ġcannot Ġbe Ġparsed Ġas Ġbinary " Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġfaces Quantity Ġ= Ġbytes . slice Array ( 8 0 .. 8 3 ). toInt ( LIT TLE _ ENDIAN ) ĊĠĠĠĠĠĠĠ Ġrequire ( faces Quantity Ġ> Ġ 0 ) Ġ{ Ġ" Faces Ġquantity Ġmust Ġbe Ġmore Ġthat Ġ 0 Ġ($ faces Quantity )" Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ( 0 Ġuntil Ġfaces Quantity ). as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠCONTENT _ OFFSET Ġ+ Ġit Ġ* ĠS INGLE _ FACE _ BYTES _ QU ANT ITY Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa Ġ= Ġcollect Vector ( bytes , Ġit Ġ+ ĠS INGLE _ VECTOR _ BYTES _ QU ANT ITY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb Ġ= Ġcollect Vector ( bytes , Ġit Ġ+ ĠS INGLE _ VECTOR _ BYTES _ QU ANT ITY Ġ* Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġcollect Vector ( bytes , Ġit Ġ+ ĠS INGLE _ VECTOR _ BYTES _ QU ANT ITY Ġ* Ġ 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnormal Ġ= Ġcompute Normal ( a , Ġb , Ġc , Ġcollect Vector ( bytes , Ġit )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSimple Triangle ( normal , Ġa , Ġb , Ġc ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. to Collection ( ArrayList ( faces Quantity )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcollect Vector ( bytes : ĠByteArray , Ġfrom : ĠInt ): ĠVector 3 d Ġ= ĠSimple Vector 3 d ( ĊĠĠĠĠĠĠĠ Ġbytes . slice Array ( from .. from Ġ+ Ġ 3 ). toFloat ( LIT TLE _ ENDIAN ), ĊĠĠĠĠĠĠĠ Ġbytes . slice Array ( from Ġ+ Ġ 4 .. from Ġ+ Ġ 7 ). toFloat ( LIT TLE _ ENDIAN ), ĊĠĠĠĠĠĠĠ Ġbytes . slice Array ( from Ġ+ Ġ 8 .. from Ġ+ Ġ 1 1 ). toFloat ( LIT TLE _ ENDIAN ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠHEADER _ SIZE Ġ= Ġ 8 0 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠFACE _ QU ANT ITY _ FIELD _ SIZE Ġ= Ġ 4 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCONTENT _ OFFSET Ġ= ĠHEADER _ SIZE Ġ+ ĠFACE _ QU ANT ITY _ FIELD _ SIZE ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠS INGLE _ VECTOR _ BYTES _ QU ANT ITY Ġ= Ġ 1 2 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠATTRIBUT E _ BYTE _ SIZE Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠS INGLE _ FACE _ BYTES _ QU ANT ITY Ġ= ĠS INGLE _ VECTOR _ BYTES _ QU ANT ITY Ġ* Ġ 4 Ġ+ ĠATTRIBUT E _ BYTE _ SIZE ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġclass ĠSt l Ascii Parser ( normal Policy : ĠNormal Policy ) Ġ: ĠSt l Parser ( normal Policy ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġparse ( bytes : ĠByteArray ): ĠList < Triangle > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtriangles Ġ= Ġmutable ListOf < Triangle >() ĊĠĠĠĠĠĠĠ Ġval Ġtokenizer Ġ= ĠStream Tokenizer ( InputStream Reader ( ByteArray InputStream ( bytes ), ĠCharset . forName (" ASCII "))) ĊĊĠĠĠĠĠĠĠ Ġvar Ġparsing Step Ġ= ĠParsing Step . NORMAL ĊĠĠĠĠĠĠĠ Ġvar Ġtriangle Builder Ġ= ĠTriangle Builder () ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( tokenizer . nextToken ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTT _ EOF Ġ-> Ġreturn Ġtriangles ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTT _ NUMBER Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( parsing Step ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠParsing Step . NORMAL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġtokenizer . n val . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtokenizer . nextToken () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġtokenizer . n val . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtokenizer . nextToken () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġz Ġ= Ġtokenizer . n val . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtriangle Builder . normal Ġ= ĠSimple Vector 3 d ( x , Ġy , Ġz ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠParsing Step . V _ 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġtokenizer . n val . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtokenizer . nextToken () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġtokenizer . n val . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtokenizer . nextToken () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġz Ġ= Ġtokenizer . n val . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtriangle Builder . a Ġ= ĠSimple Vector 3 d ( x , Ġy , Ġz ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠParsing Step . V _ 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġtokenizer . n val . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtokenizer . nextToken () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġtokenizer . n val . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtokenizer . nextToken () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġz Ġ= Ġtokenizer . n val . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtriangle Builder . b Ġ= ĠSimple Vector 3 d ( x , Ġy , Ġz ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠParsing Step . V _ 2 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġtokenizer . n val . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtokenizer . nextToken () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġtokenizer . n val . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtokenizer . nextToken () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġz Ġ= Ġtokenizer . n val . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtriangle Builder . c Ġ= ĠSimple Vector 3 d ( x , Ġy , Ġz ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTT _ WORD Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( tokenizer . s val ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF AC ET _ PREFIX Ġ-> Ġtriangle Builder Ġ= ĠTriangle Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNORMAL _ PREFIX Ġ-> Ġparsing Step Ġ= ĠParsing Step . NORMAL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠV ERT EX _ PREFIX Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparsing Step Ġ= Ġwhen Ġ( parsing Step ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠParsing Step . V _ 0 Ġ-> ĠParsing Step . V _ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠParsing Step . V _ 1 Ġ-> ĠParsing Step . V _ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠParsing Step . V _ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEN DF AC ET _ PREFIX Ġ-> Ġtriangles . add ( triangle Builder . build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġenum Ġclass ĠParsing Step Ġ{ ĠNORMAL , ĠV _ 0 , ĠV _ 1 , ĠV _ 2 Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠTriangle Builder Ġ{ ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġnormal : ĠVector 3 d ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġa : ĠVector 3 d ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġb : ĠVector 3 d ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġc : ĠVector 3 d ĊĊĠĠĠĠĠĠĠ Ġfun Ġbuild (): ĠTriangle Ġ= ĠSimple Triangle ( compute Normal ( a , Ġb , Ġc , Ġnormal ), Ġa , Ġb , Ġc ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠF AC ET _ PREFIX Ġ= Ġ" facet " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEN DF AC ET _ PREFIX Ġ= Ġ" end facet " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠNORMAL _ PREFIX Ġ= Ġ" normal " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠV ERT EX _ PREFIX Ġ= Ġ" vertex " ĊĠĠĠ Ġ} Ċ }