úÎA!;ë%      !"#$ (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 == * , then that )3 doesn t have texture coordinates associated with.+,-).+,-).+,-).(C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableSafeA face gathers several /' to build up faces, arranged in either 0, 1 or an arbritatry 2./&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 * means no information. That is, if vni == * , then that /( doesn t have a normal associated with. 012/3 012/3012/3 (C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableSafe4 A stream of 5. 456789:;<=>?@ABCDEFGHIJKLMNOPQRS 456789:;<=>?@ABCDEFGHIJKLMNOPQRS45 6789:;<=>?@ABCDEFGHIJKLMNOPQRS (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.TTT (C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone UNThe lexer context. The result of lexing a stream of tokens is this exact type.V Locations.WTexture coordinates.XNormals.YPoints.ZLines.[Faces.\Current object.]Current groups.^Current material._Material libraries.` The empty Ud. Such a context exists at the beginning of the token stream and gets altered as we consume tokens.a4The lexer function, consuming tokens and yielding a U.UbVWXYZ[\]^_`acUbVWXYZ[\]^_`acU bVWXYZ[\]^_`ac (C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone Locations.Texture coordinates.Normals. Points.!Lines."Faces.#Material libraries.  !"#de  !"#de !"#de(C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone$ Extract a % from a Wavefront OBJ formatted file.$$$$(C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone%  !"#$3     !"#f  !" # $ % & ' ( ( ) * + , - . /0 1234561789:7 ; < = > ? @ 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 i jkwavef_FexpYMrRis3DkSQ8aDwtqYCodec.WavefrontCodec.Wavefront.IOCodec.Wavefront.TexCoordCodec.Wavefront.PointCodec.Wavefront.NormalCodec.Wavefront.LocationCodec.Wavefront.LineCodec.Wavefront.FaceCodec.Wavefront.TokenCodec.Wavefront.ElementCodec.Wavefront.LexerCodec.Wavefront.ObjectTexCoord texcoordR texcoordS texcoordTPoint pointLocIndexNormalnorXnorYnorZLocationlocXlocYlocZlocWLine lineLocIndexlineTexCoordIndexFace faceLocIndexfaceTexCoordIndex faceNorIndexElementelObjectelGroupselMtlelValue WavefrontOBJ objLocations objTexCoords objNormals objPointsobjLinesobjFaces objMtlLibsfromFile LineIndexbaseGHC.BaseNothing lineIndexA lineIndexB FaceIndexTriangleQuadPolygon TokenStreamTokenTknVTknVNTknVTTknPTknLTknFTknGTknO TknMtlLib TknUseMtltokenize analyseResult cleanupTokenslocationnormaltexCoordpointslinesfacegroupsobjectmtllibusemtlcomment slashThenElseeolname skipHSpacefloatuntilEndCtxt ctxtLocations ctxtTexCoords ctxtNormals ctxtPoints ctxtLines ctxtFacesctxtCurrentObjectctxtCurrentGroupsctxtCurrentMtl ctxtMtlLibs emptyCtxtlexerprepareElementctxtToWavefrontOBJ fromDList