package Ġinfo . la ht . three kt . loaders Ċ Ċ import Ġinfo . la ht . three kt . Colors Ċ import Ġinfo . la ht . three kt . core . Buffer Geometry Ċ 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 . length Ċ import Ġinfo . la ht . three kt . materials .* Ċ import Ġinfo . la ht . three kt . objects . Group Ċ import Ġinfo . la ht . three kt . objects . Line Segments Ċ import Ġinfo . la ht . three kt . objects . Mesh Ċ import Ġinfo . la ht . three kt . objects . Points Ċ import Ġinfo . la ht . three kt . push Ċ import Ġinfo . la ht . three kt . splice Ċ import Ġjava . io . File Ċ import Ġjava . util .* Ċ Ċ class ĠOBJ Loader ( ĊĠĠĠ Ġprivate Ġval Ġtry Load M tl : ĠBoolean Ġ= Ġtrue Ċ ) Ġ{ ĊĊĠĠĠ Ġvar Ġmaterials : ĠMTL Loader . Material Creator ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġload ( path : ĠString ): ĠGroup Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( path ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNoSuch File Exception ( file ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( try Load M tl ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmtl File Ġ= ĠFile ( file . parent , Ġ"${ file . name Without Extension }. mt l ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mt l File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmaterials Ġ= ĠMTL Loader (). load ( mt l File . absolute Path ). preload () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġparse ( file . read Text ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġparse ( text : ĠString ): ĠGroup Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" NAME _ SH ADO WING ") ĊĠĠĠĠĠĠĠ Ġvar Ġtext Ġ= Ġtext ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= ĠParser State () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( text . indexOf ("\ r \ n ") Ġ!= Ġ- 1 ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġis Ġfaster Ġthan ĠString . split Ġwith Ġregex Ġthat Ġsplits Ġon Ġboth ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġtext . replace ("\ r \ n ". to Regex (), Ġ"\ n ") ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( text . indexOf ("\\ \ n ") Ġ!= Ġ- 1 ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġjoin Ġlines Ġseparated Ġby Ġa Ġline Ġcontinuation Ġcharacter Ġ(\ ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġtext . replace ("\\ \ n ". to Regex (), Ġ"") ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġlines Ġ= Ġtext . split ("\ n ") ĊĠĠĠĠĠĠĠ Ġvar Ġline : ĠString ĊĠĠĠĠĠĠĠ Ġvar Ġline First Char : ĠChar ĊĠĠĠĠĠĠĠ Ġvar Ġresult : ĠList < String > ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġlines . size ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġline Ġ= Ġlines [ i ]. trim Start () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Length Ġ= Ġline . length ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( line Length Ġ== Ġ 0 ) Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġline First Char Ġ= Ġline [ 0 ] ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( line First Char Ġ== Ġ'# ') Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( line First Char Ġ== Ġ' v ') Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġline . split ("\\ s +". to Regex ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( data [ 0 ]) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" v " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . vertices . push ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ 1 ]. toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ 2 ]. toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ 3 ]. toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data . length Ġ== Ġ 8 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . colors . push ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ 4 ]. toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ 5 ]. toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ 6 ]. toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" vn " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . normals . push ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ 1 ]. toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ 2 ]. toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ 3 ]. toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" vt " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . u vs . push ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ 1 ]. toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ 2 ]. toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( line First Char Ġ== Ġ' f ') Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Data Ġ= Ġline . substring ( 1 ). trim () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvertex Data Ġ= Ġline Data . split ("\\ s +". to Regex ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġface Vertices Ġ= Ġmutable ListOf < List < String >>() ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġ 0 Ġuntil Ġvertex Data . size ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvertex Ġ= Ġvertex Data [ j ] ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( vertex . isNotEmpty ()) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvertex Parts Ġ= Ġvertex . split ("/") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġface Vertices . push ( vertex Parts ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv 1 Ġ= Ġface Vertices [ 0 ] ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġ 1 Ġuntil Ġface Vertices . size Ġ- Ġ 1 ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv 2 Ġ= Ġface Vertices [ j ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv 3 Ġ= Ġface Vertices [ j Ġ+ Ġ 1 ] ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . add Face ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv 1 [ 0 ], Ġv 2 [ 0 ], Ġv 3 [ 0 ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv 1 [ 1 ], Ġv 2 [ 1 ], Ġv 3 [ 1 ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv 1 [ 2 ], Ġv 2 [ 2 ], Ġv 3 [ 2 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( line First Char Ġ== Ġ' l ') Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Parts Ġ= Ġline . substring ( 1 ). trim (). split (" Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġline Vertices Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline UV s Ġ= Ġmutable ListOf < String >() ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( line . indexOf ("/") Ġ== Ġ- 1 ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline Vertices Ġ= Ġline Parts . to Mutable List () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( li Ġin Ġ 0 Ġuntil Ġline Parts . size ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparts Ġ= Ġline Parts [ li ]. split ("/") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parts [ 0 ] Ġ!= Ġ"") Ġline Vertices . push ( parts [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parts [ 1 ] Ġ!= Ġ"") Ġline UV s . push ( parts [ 1 ]) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . add Line Geometry ( line Vertices , Ġline UV s ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( line First Char Ġ== Ġ' p ') Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Data Ġ= Ġline . substring ( 1 ). trim () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpoint Data Ġ= Ġline Data . split (" Ġ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . add Point Geometry ( point Data ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( OBJECT _ PATTERN . to Regex (). findAll ( line ). map NotNull Ġ{ Ġif Ġ( it . value . isNotEmpty ()) Ġit . value Ġelse Ġnull Ġ}. toList (). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . isNotEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġo Ġobject _ name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġg Ġgroup _ name ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġ(" Ġ" Ġ+ Ġresult [ 0 ]. substring ( 1 ). trim ()). substring ( 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . start Object ( name ) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( MAT ERIAL _ USE _ PATTERN . to Regex (). findAll ( line ). map NotNull Ġ{ Ġif Ġ( it . value . isNotEmpty ()) Ġit . value Ġelse Ġnull Ġ}. toList (). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . isNotEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmaterial ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate .` object ` !!. start Material ( line . substring ( 7 ). trim (), Ġstate . material Libraries ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( MAT ERIAL _ LIBRARY _ PATTERN . to Regex (). findAll ( line ). map NotNull Ġ{ Ġif Ġ( it . value . isNotEmpty ()) Ġit . value Ġelse Ġnull Ġ}. toList (). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . isNotEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmtl Ġfile ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . material Libraries . push ( line . substring ( 7 ). trim ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( line First Char Ġ== Ġ' s ') Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġline . split (" Ġ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsmooth Ġsh ading ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ@ todo ĠHandle Ġfiles Ġthat Ġhave Ġvarying Ġsmooth Ġvalues Ġfor Ġa Ġset Ġof Ġfaces Ġinside Ġone Ġgeometry , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbut Ġdoes Ġnot Ġdefine Ġa Ġuse mt l Ġfor Ġeach Ġface Ġset . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġshould Ġbe Ġdetected Ġand Ġa Ġdummy Ġmaterial Ġcreated Ġ( later ĠMulti Material Ġand Ġgeometry Ġgroups ). ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġrequires Ġsome Ġcare Ġto Ġnot Ġcreate Ġextra Ġmaterial Ġon Ġeach Ġsmooth Ġvalue Ġfor Ġ" normal " Ġobj Ġfiles . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwhere Ġexplicit Ġuse mt l Ġdefines Ġgeometry Ġgroups . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠExample Ġasset : Ġexamples / models / obj / cer ber us / C er ber us . obj ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġhttp :// paul b our ke . net / data formats / obj / ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġhttp :// www . cs . ut ah . edu /~ b ou los / cs 3 5 0 5 / obj _ spec . pdf ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠFrom Ġchapter Ġ" Grouping " ĠSyntax Ġexplanation Ġ" s Ġgroup _ number ": ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ" group _ number Ġis Ġthe Ġsmoothing Ġgroup Ġnumber . ĠTo Ġturn Ġoff Ġsmoothing Ġgroups , Ġuse Ġa Ġvalue Ġof Ġ 0 Ġor Ġoff . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠPolygon al Ġelements Ġuse Ġgroup Ġnumbers Ġto Ġput Ġelements Ġin Ġdifferent Ġsmoothing Ġgroups . ĠFor Ġfree - form ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġsurfaces , Ġsmoothing Ġgroups Ġare Ġeither Ġturned Ġon Ġor Ġoff ; Ġthere Ġis Ġno Ġdifference Ġbetween Ġvalues Ġgreater ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġthan Ġ 0 ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result . length Ġ> Ġ 1 ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġresult [ 1 ]. trim (). lowercase ( Locale . getDefault ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate .` object ` !!. smooth Ġ= Ġ( value Ġ!= Ġ" 0 " Ġ&& Ġvalue Ġ!= Ġ" off ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠZ Brush Ġcan Ġproduce Ġ" s " Ġlines Ġ# 1 1 7 0 7 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate .` object ` !!. smooth Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmaterial Ġ= Ġstate .` object ` !!. current Material ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( material Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmaterial . smooth Ġ= Ġstate .` object ` !!. smooth ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠHandle Ġnull Ġterminated Ġfiles Ġwithout Ġexception ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( line Ġ== Ġ"\\ 0 ") Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠError (" OBJ Loader : ĠUnexpected Ġline : Ġ'$ line '") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġstate . finalize () ĊĊĠĠĠĠĠĠĠ Ġval Ġcontainer Ġ= ĠGroup () ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġstate . objects . size ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ` object ` Ġ= Ġstate .` object ` !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgeometry Ġ= Ġ` object `. geometry ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmaterials Ġ= Ġ` object `. materials ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Line Ġ= Ġ( geometry . type Ġ== Ġ" Line ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Points Ġ= Ġ( geometry . type Ġ== Ġ" Points ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġhas Vertex Colors Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSkip Ġo / g Ġline Ġdeclarations Ġthat Ġdid Ġnot Ġfollow Ġwith Ġany Ġfaces ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( geometry . vertices . isEmpty ()) Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer geometry Ġ= ĠBuffer Geometry () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer geometry . addAttribute (" position ", ĠFloat Buffer Attribute ( geometry . vertices . toFloat Array (), Ġ 3 )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( geometry . normals . length Ġ> Ġ 0 ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer geometry . addAttribute (" normal ", ĠFloat Buffer Attribute ( geometry . normals . toFloat Array (), Ġ 3 )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer geometry . compute Vertex Normals () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( geometry . colors . length Ġ> Ġ 0 ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Vertex Colors Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer geometry . addAttribute (" color ", ĠFloat Buffer Attribute ( geometry . colors . toFloat Array (), Ġ 3 )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( geometry . u vs . length Ġ> Ġ 0 ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer geometry . addAttribute (" uv ", ĠFloat Buffer Attribute ( geometry . u vs . toFloat Array (), Ġ 2 )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġmaterials ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcreated Materials Ġ= Ġmutable ListOf < Material >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( mi Ġin Ġ 0 Ġuntil Ġmaterials . size ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource Material Ġ= Ġmaterials [ mi ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmaterial : ĠMaterial ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . materials ?. also Ġ{ Ġmaterial Creator Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmaterial Ġ= Ġmaterial Creator . create ( source Material . name !! ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmtl Ġetc . Ġload ers Ġprobably Ġcan 't Ġcreate Ġline Ġmaterials Ġcorrectly , Ġcopy Ġproperties Ġto Ġa Ġline Ġmaterial . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Line Ġ&& Ġmaterial Ġ!= Ġnull Ġ&& Ġmaterial Ġ! is ĠLine Basic Material ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmaterial Line Ġ= ĠLine Basic Material () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmaterial Line . copy ( material !! ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmaterial Line . color . copy (( material Ġas ĠMaterial With Color ). color ) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmaterial Line . lights Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmaterial Ġ= Ġmaterial Line ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( is Points Ġ&& Ġmaterial Ġ!= Ġnull Ġ&& Ġmaterial Ġ! is ĠPoints Material ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmaterial Points Ġ= ĠPoints Material (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ= Ġ 1 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize Att enuation Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmaterial Points . copy ( material !! ) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmaterial Points . color . copy (( material Ġas ĠMaterial With Color ). color ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmaterial Points . map Ġ= Ġmaterial !!. map ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmaterial Points . lights Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmaterial Ġ= Ġmaterial Points ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( material Ġ== Ġnull ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Line Ġ-> Ġmaterial Ġ= ĠLine Basic Material () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Points Ġ-> Ġmaterial Ġ= ĠPoints Material (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize Att enuation Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġmaterial Ġ= ĠMesh Ph ong Material () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmaterial !!. name Ġ= Ġsource Material . name !! ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmaterial !!. flat Shading Ġ= Ġ! source Material . smooth ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmaterial !!. vertex Colors Ġ= Ġif Ġ( has Vertex Colors ) ĠColors . Vertex Ġelse ĠColors . None ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreated Materials . push ( material !! ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġmesh ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmesh : ĠObject 3 D ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( created Materials . length Ġ> Ġ 1 ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( mi Ġin Ġ 0 Ġuntil Ġmaterials . length ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource Material Ġ= Ġmaterials [ mi ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer geometry . addGroup ( source Material . group Start , Ġsource Material . group Count , Ġmi ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Line Ġ-> Ġmesh Ġ= ĠLine Segments ( buffer geometry , Ġcreated Materials [ 0 ] Ġas ĠLine Basic Material ) Ġ// TODO Ġsupport Ġmultiple Ġmaterials ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Points Ġ-> Ġmesh Ġ= ĠPoints ( buffer geometry , Ġcreated Materials [ 0 ]) Ġ Ġ// TODO Ġsupport Ġmultiple Ġmaterials ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġmesh Ġ= ĠMesh ( buffer geometry , Ġcreated Materials ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Line Ġ-> Ġmesh Ġ= ĠLine Segments ( buffer geometry , Ġcreated Materials [ 0 ] Ġas ĠLine Basic Material ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Points Ġ-> Ġmesh Ġ= ĠPoints ( buffer geometry , Ġcreated Materials [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġmesh Ġ= ĠMesh ( buffer geometry , Ġcreated Materials [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmesh . name Ġ= Ġ` object `. name ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer . add ( mesh ) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcontainer ĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Ġo Ġobject _ name Ġ| Ġg Ġgroup _ name ĊĠĠĠĠĠĠĠ Ġval ĠOBJECT _ PATTERN Ġ= Ġ"^ [ og ]\\ s *( .+ )? " ĊĊĠĠĠĠĠĠĠ Ġ// Ġmtl lib Ġfile _ reference ĊĠĠĠĠĠĠĠ Ġval ĠM ATER IAL _ LIBRARY _ PATTERN Ġ= Ġ"^ mt l lib Ġ" ĊĊĠĠĠĠĠĠĠ Ġ// Ġuse mt l Ġmaterial _ name ĊĠĠĠĠĠĠĠ Ġvar ĠM ATER IAL _ USE _ PATTERN Ġ= Ġ"^ use mt l Ġ" ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠParser State Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvar Ġ` object `: ĠOBJ Object ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġobjects Ġ= Ġmutable ListOf < OBJ Object >() ĊĊĠĠĠĠĠĠĠ Ġval Ġvertices Ġ= Ġmutable ListOf < Float >() ĊĠĠĠĠĠĠĠ Ġval Ġnormals Ġ= Ġmutable ListOf < Float >() ĊĠĠĠĠĠĠĠ Ġval Ġcolors Ġ= Ġmutable ListOf < Float >() ĊĠĠĠĠĠĠĠ Ġval Ġu vs Ġ= Ġmutable ListOf < Float >() ĊĊĠĠĠĠĠĠĠ Ġval Ġmaterial Libraries Ġ= Ġmutable ListOf < String >() ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Object ("", Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġstart Object ( name : ĠString , Ġfrom Declaration : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġcurrent Ġobject Ġ( initial Ġfrom Ġreset ) Ġis Ġnot Ġfrom Ġa Ġg / o Ġdeclaration Ġin Ġthe Ġparsed ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfile . ĠWe Ġneed Ġto Ġuse Ġit Ġfor Ġthe Ġfirst Ġparsed Ġg / o Ġto Ġkeep Ġthings Ġin Ġsync . ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis .` object ` ?. also Ġ{ Ġ` object ` Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! ` object `. from Declaration ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ` object `. name Ġ= Ġname ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ` object `. from Declaration Ġ= Ġfrom Declaration Ġ!= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprevious Material Ġ= Ġthis .` object ` ?. current Material ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis .` object `? ._ finalize ( true ) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis .` object ` Ġ= ĠOBJ Object ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Declaration Ġ= Ġfrom Declaration , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsmooth Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( previous Material ?. name Ġ!= Ġnull ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeclared Ġ= Ġprevious Material . copy ( index Ġ= Ġ 0 , Ġinherited Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmaterials . add ( declared ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobjects . add ( this ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġfinalize () Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis .` object `? ._ finalize ( true ) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġparse Vertex Index ( value : ĠString , Ġlen : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġvalue . toInt ( 1 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( if Ġ( index Ġ> Ġ 0 ) Ġindex Ġ- Ġ 1 Ġelse Ġindex Ġ+ Ġlen Ġ/ Ġ 3 ) Ġ* Ġ 3 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġparse Normal Index ( value : ĠString , Ġlen : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġvalue . toInt ( 1 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( if Ġ( index Ġ> Ġ 0 ) Ġindex Ġ- Ġ 1 Ġelse Ġindex Ġ+ Ġlen Ġ/ Ġ 3 ) Ġ* Ġ 3 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġparse UV Index ( value : ĠString , Ġlen : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġvalue . toInt ( 1 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( if Ġ( index Ġ> Ġ 0 ) Ġindex Ġ- Ġ 1 Ġelse Ġindex Ġ+ Ġlen Ġ/ Ġ 2 ) Ġ* Ġ 2 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd Vertex ( a : ĠInt , Ġb : ĠInt , Ġc : ĠInt ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsrc Ġ= Ġthis . vertices ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdst Ġ= Ġthis .` object ` !!. geometry . vertices ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdst . push ( src [ a Ġ+ Ġ 0 ], Ġsrc [ a Ġ+ Ġ 1 ], Ġsrc [ a Ġ+ Ġ 2 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdst . push ( src [ b Ġ+ Ġ 0 ], Ġsrc [ b Ġ+ Ġ 1 ], Ġsrc [ b Ġ+ Ġ 2 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdst . push ( src [ c Ġ+ Ġ 0 ], Ġsrc [ c Ġ+ Ġ 1 ], Ġsrc [ c Ġ+ Ġ 2 ]) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd Vertex Point ( a : ĠInt ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsrc Ġ= Ġthis . vertices ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdst Ġ= Ġthis .` object ` !!. geometry . vertices ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdst . push ( src [ a Ġ+ Ġ 0 ], Ġsrc [ a Ġ+ Ġ 1 ], Ġsrc [ a Ġ+ Ġ 2 ]) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd Vertex Line ( a : ĠInt ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsrc Ġ= Ġthis . vertices ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdst Ġ= Ġthis .` object ` !!. geometry . vertices ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdst . push ( src [ a Ġ+ Ġ 0 ], Ġsrc [ a Ġ+ Ġ 1 ], Ġsrc [ a Ġ+ Ġ 2 ]) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd Normal ( a : ĠInt , Ġb : ĠInt , Ġc : ĠInt ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsrc Ġ= Ġthis . normals ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdst Ġ= Ġthis .` object ` !!. geometry . normals ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdst . push ( src [ a Ġ+ Ġ 0 ], Ġsrc [ a Ġ+ Ġ 1 ], Ġsrc [ a Ġ+ Ġ 2 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdst . push ( src [ b Ġ+ Ġ 0 ], Ġsrc [ b Ġ+ Ġ 1 ], Ġsrc [ b Ġ+ Ġ 2 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdst . push ( src [ c Ġ+ Ġ 0 ], Ġsrc [ c Ġ+ Ġ 1 ], Ġsrc [ c Ġ+ Ġ 2 ]) ĊĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd Color ( a : ĠInt , Ġb : ĠInt , Ġc : ĠInt ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsrc Ġ= Ġthis . colors ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdst Ġ= Ġthis .` object ` !!. geometry . colors ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdst . push ( src [ a Ġ+ Ġ 0 ], Ġsrc [ a Ġ+ Ġ 1 ], Ġsrc [ a Ġ+ Ġ 2 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdst . push ( src [ b Ġ+ Ġ 0 ], Ġsrc [ b Ġ+ Ġ 1 ], Ġsrc [ b Ġ+ Ġ 2 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdst . push ( src [ c Ġ+ Ġ 0 ], Ġsrc [ c Ġ+ Ġ 1 ], Ġsrc [ c Ġ+ Ġ 2 ]) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd UV ( a : ĠInt , Ġb : ĠInt , Ġc : ĠInt ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsrc Ġ= Ġthis . u vs ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdst Ġ= Ġthis .` object ` !!. geometry . u vs ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdst . push ( src [ a Ġ+ Ġ 0 ], Ġsrc [ a Ġ+ Ġ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdst . push ( src [ b Ġ+ Ġ 0 ], Ġsrc [ b Ġ+ Ġ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdst . push ( src [ c Ġ+ Ġ 0 ], Ġsrc [ c Ġ+ Ġ 1 ]) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd UV Line ( a : ĠInt ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsrc Ġ= Ġthis . u vs ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdst Ġ= Ġthis .` object ` !!. geometry . u vs ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdst . push ( src [ a Ġ+ Ġ 0 ], Ġsrc [ a Ġ+ Ġ 1 ]) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd Face ( a : ĠString , Ġb : ĠString , Ġc : ĠString , Ġua : ĠString , Ġub : ĠString , Ġuc : ĠString , Ġna : ĠString , Ġnb : ĠString , Ġnc : ĠString ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv Len Ġ= Ġthis . vertices . size ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġia Ġ= Ġthis . parse Vertex Index ( a , Ġv Len ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġib Ġ= Ġthis . parse Vertex Index ( b , Ġv Len ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġic Ġ= Ġthis . parse Vertex Index ( c , Ġv Len ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . add Vertex ( ia , Ġib , Ġic ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ua Ġ!= Ġ"") Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuv Len Ġ= Ġthis . u vs . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġia Ġ= Ġthis . parse UV Index ( ua , Ġuv Len ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġib Ġ= Ġthis . parse UV Index ( ub , Ġuv Len ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġic Ġ= Ġthis . parse UV Index ( uc , Ġuv Len ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . add UV ( ia , Ġib , Ġic ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( na Ġ!= Ġ"") Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNormal s Ġare Ġmany Ġtimes Ġthe Ġsame . ĠIf Ġso , Ġskip Ġfunction Ġcall Ġand ĠparseInt . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġn Len Ġ= Ġthis . normals . length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġia Ġ= Ġthis . parse Normal Index ( na , Ġn Len ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġib Ġ= Ġif Ġ( na Ġ== Ġnb ) Ġia Ġelse Ġthis . parse Normal Index ( nb , Ġn Len ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġic Ġ= Ġif Ġ( na Ġ== Ġnc ) Ġia Ġelse Ġthis . parse Normal Index ( nc , Ġn Len ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . add Normal ( ia , Ġib , Ġic ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . colors . length Ġ> Ġ 0 ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . add Color ( ia , Ġib , Ġic ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd Point Geometry ( vertices : ĠList < String >) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis .` object ` !!. geometry . type Ġ= Ġ" Points " ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv Len Ġ= Ġthis . vertices . length ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvertices . forEach Ġ{ Ġv Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . add Vertex Point ( this . parse Vertex Index ( v , Ġv Len )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd Line Geometry ( vertices : ĠList < String >, Ġu vs : ĠList < String >) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis .` object ` !!. geometry . type Ġ= Ġ" Line " ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv Len Ġ= Ġthis . vertices . length ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuv Len Ġ= Ġthis . u vs . length ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvertices . forEach Ġ{ Ġv Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . add Vertex Line ( this . parse Vertex Index ( v , Ġv Len )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġu vs . forEach Ġ{ Ġv Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . add UV Line ( this . parse UV Index ( v , Ġuv Len )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠOBJ Object ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġname : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfrom Declaration : ĠBoolean , ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsmooth : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġgeometry Ġ= ĠOBJ Geometry () ĊĠĠĠĠĠĠĠ Ġval Ġmaterials Ġ= Ġmutable ListOf < OBJ Material >() ĊĊĠĠĠĠĠĠĠ Ġval Ġcurrent Material : ĠOBJ Material ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġmaterials . get OrNull ( materials . size Ġ- Ġ 1 ) ĊĊĊĠĠĠĠĠĠĠ Ġfun Ġstart Material ( name : ĠString , Ġlibraries : ĠList < String >): ĠOBJ Material Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprevious Ġ= Ġ_ finalize ( false ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprevious ?. also Ġ{ Ġprev Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( prev . inherited Ġ|| Ġprev . group Count Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmaterials . splice ( prev . index !! , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmaterial Ġ= ĠOBJ Material ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ= Ġmaterials . size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmt lib Ġ= Ġif Ġ( libraries . isNotEmpty ()) Ġlibraries . last () Ġelse Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsmooth Ġ= Ġprevious ?. smooth Ġ?: Ġsmooth , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup Start Ġ= Ġprevious ?. group End Ġ?: Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup End Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup Count Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinherited Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmaterials . add ( material ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmaterial ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġfun Ġ_ finalize ( end : ĠBoolean ): ĠOBJ Material ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Multi Material Ġ= Ġthis . current Material ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Multi Material Ġ!= Ġnull Ġ&& Ġlast Multi Material . group End Ġ== Ġ- 1 ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Multi Material . group End Ġ= Ġthis . geometry . vertices . size Ġ/ Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Multi Material . group Count Ġ= Ġlast Multi Material . group End Ġ- Ġlast Multi Material . group Start ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Multi Material . inherited Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIgnore Ġobjects Ġtail Ġmaterials Ġif Ġno Ġface Ġdeclarations Ġfollowed Ġthem Ġbefore Ġa Ġnew Ġo / g Ġstarted . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( end Ġ&& Ġthis . materials . size Ġ> Ġ 1 ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( mi Ġin Ġmaterials . size Ġ- Ġ 1 Ġdown To Ġ 0 ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . materials [ mi ]. group Count Ġ<= Ġ 0 ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . materials . splice ( mi , Ġ 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGu arante e Ġat Ġleast Ġone Ġempty Ġmaterial , Ġthis Ġmakes Ġthe Ġcreation Ġlater Ġmore Ġstraight Ġforward . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( end Ġ&& Ġthis . materials . isEmpty ()) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . materials . add ( OBJ Material ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsmooth Ġ= Ġthis . smooth ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlast Multi Material ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠOBJ Geometry Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvar Ġtype : ĠString Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġval Ġvertices Ġ= Ġmutable ListOf < Float >() ĊĠĠĠĠĠĠĠ Ġval Ġnormals Ġ= Ġmutable ListOf < Float >() ĊĠĠĠĠĠĠĠ Ġval Ġcolors Ġ= Ġmutable ListOf < Float >() ĊĠĠĠĠĠĠĠ Ġval Ġu vs Ġ= Ġmutable ListOf < Float >() ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠOBJ Material ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġindex : ĠInt ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġname : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmt lib : ĠString Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsmooth : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġgroup Start : ĠInt Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġgroup End : ĠInt Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġgroup Count : ĠInt Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġinherited : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġ) Ċ Ċ } Ċ