úÎB¼=†6      !"#$%&'()*+,-./012345 (C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableSafelA texture coordinate is a 3D-floating vector. You can access to its components by pattern matching on them: , let TexCoord r s t = TexCoord 0.1 0.2 0.3  That type is strcit and unboxed.(C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableSafexA point is a single index that references the locations. It s a canonical type that truly represents a polygonal point.(C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableSafe^A normal is a 3-floating vector. You can access to its components by pattern matching on them: + let Normal nx ny nz = Normal 0.1 0.2 0.3  That type is strict and unboxed.    (C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableSafe `A location is a 4-floating vector. You can access to its components by pattern matching on them: * let Location x y z w = Location 1 2 3 4  That type is strict and unboxed.    (C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableSafe#A line index is a pair of indices.  vi vti. vi references the locations and vti& indexes the texture coordinates. If vti == 6 , then that 3 doesn t have texture coordinates associated with.(C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableSafeZA face gathers several 1 to build up faces. It has a least three vertices&A face index is a triplet of indices.  vi vti vni, is a face that indexes the locations with vi, the texture coordinates with vti and the normals with vni. An index set to 6 means no information. That is, if vni == 6 , then that ( doesn t have a normal associated with.  !"#  !"#  !"# !"# (C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableSafe7 A stream of 8. 789:;<=>?@ABCDEFGHIJKLMNOPQRSTUV 789:;<=>?@ABCDEFGHIJKLMNOPQRSTUV78 9:;<=>?@ABCDEFGHIJKLMNOPQRSTUV(C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableSafe$ÙAn element holds a value along with the user-defined object s name (if exists), the associated groups and the used material. Those values can be used to sort the data per object or per group and to lookup materials.$%&'()$%&'()$%&'()$%&'() (C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone WNThe lexer context. The result of lexing a stream of tokens is this exact type.X Locations.YTexture coordinates.ZNormals.[Points.\Lines.]Faces.^Current object._Current groups.`Current material.aMaterial libraries.b The empty Wd. Such a context exists at the beginning of the token stream and gets altered as we consume tokens.c4The lexer function, consuming tokens and yielding a W.WdXYZ[\]^_`abceWdXYZ[\]^_`abceW dXYZ[\]^_`abce(C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone, Locations.-Texture coordinates..Normals./Points.0Lines.1Faces.2Material libraries. *+,-./01234 *+,-./01234 *+,-./01234*+,-./01234 (C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone5 Extract a *% from a Wavefront OBJ formatted file.5555 (C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNoneZ4  !"#$%&'()*+,-./01253   !"#$%&'()*+,-./012f   !""##$%&'())*+,-../01234567 89:; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h \ ijwavef_Jr4eeABU1IFDHpG5FxkZ5uCodec.Wavefront.TexCoordCodec.Wavefront.PointCodec.Wavefront.NormalCodec.Wavefront.LocationCodec.Wavefront.LineCodec.Wavefront.FaceCodec.Wavefront.ElementCodec.Wavefront.ObjectCodec.Wavefront.IOCodec.Wavefront.TokenCodec.Wavefront.LexerCodec.WavefrontTexCoord texcoordR texcoordS texcoordTPoint pointLocIndexNormalnorXnorYnorZLocationlocXlocYlocZlocWLine lineIndexA lineIndexB LineIndex lineLocIndexlineTexCoordIndexFace FaceIndex faceLocIndexfaceTexCoordIndex faceNorIndexTriangleQuadElementelObjectelGroupselMtlelValue WavefrontOBJ objLocations objTexCoords objNormals objPointsobjLinesobjFaces objMtlLibsctxtToWavefrontOBJ fromDListfromFilebaseGHC.BaseNothing TokenStreamTokenTknVTknVNTknVTTknPTknLTknFTknGTknO TknMtlLib TknUseMtltokenize analyseResult cleanupTokenslocationnormaltexCoordpointslinesfacegroupsobjectmtllibusemtlcomment slashThenElseeolname skipHSpacefloatuntilEndCtxt ctxtLocations ctxtTexCoords ctxtNormals ctxtPoints ctxtLines ctxtFacesctxtCurrentObjectctxtCurrentGroupsctxtCurrentMtl ctxtMtlLibs emptyCtxtlexerprepareElement