Ts      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstu v w x y z { | } ~   ,The OpenGL library doesn'%t seem to provide a nice way convert ' a Float to a GLfloat, even though they're the same thing  under the covers. )Using realToFrac is too slow, as it doesn't get fused in at  least GHC 6.12.1 "Used for similar reasons to above )Render a circle with the given thickness :Decide how many line segments to use to render the circle Render a circle as a line. ;Render a circle with a given thickness as a triangle strip  Simulation state The iteration number we' re up to. 7Whether the animation is free-running (or single step) ASignals to callbackIdle to take a single step of the automation. ;Signals to callbackIdle to roll-back to the initial world. ?How many simulation setps to take for each second of real time 'How many seconds worth of simulation we've done so far Record how many steps we've been taking per frame Initial control state  .Dump internal state of the OpenGL framebuffer .Dump internal state of the fragment renderer.  Animation State "Whether the animation is running. 2Whether this is the first frame of the animation. 2Number of msec the animation has been running for EThe time when we entered the display callback for the current frame. >Clamp the minimum time between frames to this value (in msec) 5 Most LCD monitors refresh at around 50Hz so setting  this to < 20msec probably isn't worthwhile. CThe time when the last call to the users render function finished. KThe time when displayInWindow last finished (after sleeping to clamp fps). $How long it took to draw this frame  l  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNO%Arguments: (Width,Height) in pixels. No arguments. "Arguments: (PosX,PosY) in pixels. Arguments: KeyType, Key Up / Down, Ctrl / Alt /' Shift pressed, latest mouse location. #Display callback has no arguments. EThe functions every backend window managed backend needs to support. KThe Backend module interfaces with the window manager, and handles opening 8 and closing the window, and managing key events etc. It doesn'7t know anything about drawing lines or setting colors. J When we get a display callback, Gloss will perform OpenGL actions, and 7 the backend needs to have OpenGL in a state where it's able to accept them. 4Initialize the state used by the backend. If you don't use any state, = make a Unit-like type; see the GLUT backend for an example. HPerform any initialization that needs to happen before opening a window L The Boolean flag indicates if any debug information should be printed to  the terminal  4Perform any deinitialization and close the backend.  JOpen a window. Arguments: Name of the window, (sizeW, sizeH), (posX,posY)  4Dump information about the backend to the terminal.  Install the display callbacks.  #Install the window close callback. Install the reshape callbacks. &Install the keymouse press callbacks. $Install the mouse motion callbacks. Install the idle callbacks. The mainloop of the backend. 7A function that signals that screen has to be updated. >Function that returns (width,height) of the window in pixels. FFunction that reports the time elapsed since the application started.  (in seconds) 3Function that puts the current thread to sleep for n seconds. l  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNO     l<A@?>=<;:9876543210/.-,+*)('&%$#"!    !"#$%&'()*+,-./0123456789:;<=>?@ABDCCDEKJIHGFFGHIJKLONMMNO           We don'8t maintain any state information for the GLUT backend,  so this data type is empty.  !"#$%&'().Convert GLUTs key codes to our internal ones. */Convert GLUTs key states to our internal ones. +/Convert GLUTs key states to our internal ones. ,n  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNO     ,,-"Handles animation timing details. 0 Call this function at the start of each frame. ."Handles animation timing details. . Call this function at the end of each frame. /-.-. 0-The commands suported by the view controller 123456789:;0123456789:;<= 0 ;:987654321123456789:;>$State for controlling the viewport. 3 These are used by the viewport control component. ?@.The command list for the viewport controller. 9 These can be safely overwridden at any time by deleting / adding entries to the list. 3 Entries at the front of the list take precedence. AAHow much to scale the world by for each step of the mouse wheel. BDHow many degrees to rotate the world by for each pixel of x motion. CDuring viewport translation, , where the mouse was clicked on the window. DDuring viewport rotation, + where the mouse was clicked on the window EThe initial view state. >?@ABCDE>?@ABCD?@ABCDEF4Callback to handle keyboard and mouse button events  for controlling the viewport. GFFPQRGlobal translation. SGlobal rotation (in degrees). T.Global scaling (of both x and y coordinates). H#The initial state of the viewport. PQRSTHPQRSTQRSTHI8The graphics library calls back on this function when it's finished drawing  and it's time to do some computation. the simulation state the animation statea the viewport state the current world the initial world fn to advance the world #how much time to advance world by  in single step mode JKLMIIN;Perform a rendering action whilst using the given viewport The viewport to use. !The rendering action to perform. NN UAbstract bitmap data. OP7Generates the point path to display the bitmap centred Q2Destructively reverse the byte order in an array. J This is necessary as OpenGL reads pixel data as ABGR, rather than RGBA R3Destructively reverses the byte order in an array. SBFrees the allocated memory given to OpenGL to avoid a memory leak TBThese functions work as bit masks to isolate the Word8 components UVWUOPQSUOOPQSV'Represents a Quadrant in the 2D plane. W South East X South West Y North East Z North West [!A list of all quadrants. Same as  [NW .. SE]. VWXYZ[VZYXW[VZYXWWXYZ[\A point on the x-y plane. ! Points can also be treated as Vectors, so Graphics.Gloss.Data.Vector may also be useful. ]DTest whether a point lies within a rectangular box that is oriented F on the x-y plane. The points P1-P2 are opposing points of the box, * but need not be in a particular order.   P2 +-------+  | |  | + P0 |  | |  +-------+ P1 XPretend a point is a number.  Vectors aren'4t real numbes according to Haskell, because they don't F support the multiply and divide field operators. We can pretend they A are though, and use the (+) and (-) operators as component-wise  addition and subtraction. \]\]\]^Convert degrees to radians _Convert radians to degrees `4Normalise an angle to be between 0 and 2*pi radians ^_`^_`^_` a3A vector can be treated as a point, and vis-versa. bThe magnitude of a vector. c6The angle of this vector, relative to the +ve x-axis. d The dot product of two vectors. e The determinant of two vectors. fMultiply a vector by a scalar. gJRotate a vector by an angle (in radians). +ve angle is counter-clockwise. h:Compute the inner angle (in radians) between two vectors. i0Normalise a vector, so it has a magnitude of 1. jCProduce a unit vector at a given angle relative to the +ve x-axis. # The provided angle is in radians. abcdefghij abcdefghij abcdefghij kMCheck if line segment (P1-P2) clears a box (P3-P4) by being well outside it. P1 First point of segment. P2 Second point of segment. P3 Lower left point of box. P4 Upper right point of box. l(Given an infinite line which intersects P1 and P1, 2 return the point on that line that is closest to P3 P1 P2 P3 /the point on the line P1-P2 that is closest to P3 m3Given an infinite line which intersects P1 and P2, 8 let P4 be the point on the line that is closest to P3. GReturn an indication of where on the line P4 is relative to P1 and P2.    if P4 == P1 then 0  if P4 == P2 then 1 2 if P4 is halfway between P1 and P2 then 0.5    |  P1  |  P4 +---- P3  |  P2  | P1 P2 P3 nYGiven four points specifying two lines, get the point where the two lines cross, if any. W Note that the lines extend off to infinity, so the intersection point might not lie . between either of the two pairs of points.   \ /  P1 P4  \ /  +  / \  P3 P2  / \ P1 P2 P3 P4 oGet the point where a segment P1-P2 crosses an infinite line P3-P4 , if any. P1 P2 P3 P4 pAGet the point where a segment crosses a horizontal line, if any.   + P1  /  -------+---------  / y0  P2 + P1 First point of segment. P2 Second point of segment. y value of line. q?Get the point where a segment crosses a vertical line, if any.   |  | + P1  | /  +  / |  P2 + |  | x0 P1 First point of segment. P2 Second point of segment. x value of line. rGet the point where a segment P1-P2 crosses another segement P3-P4 , if any. P1 P2 P3 P4 s?Check if an arbitrary segment intersects a horizontal segment.   + P2  /  (xa, y3) +---+----+ (xb, y3)  /  P1 + P1 First point of segment. P2 Second point of segment. $(y3) y value of horizontal segment. -(xa) Leftmost x value of horizontal segment. .(xb) Rightmost x value of horizontal segment. %(x3, y3) Intersection point, if any. t=Check if an arbitrary segment intersects a vertical segment.   (x3, yb) +  | + P1  | /  +  / |  P2 + |  + (x3, ya) P1 First point of segment. P2 Second point of segment. !(x3) x value of vertical segment )(ya) Lowest y value of vertical segment. *(yb) Highest y value of vertical segment. %(x3, y3) Intersection point, if any. klmnopqrst klmnopqrst klmnopqrst uAn integral coordinate. v$A rectangular area of the 2D plane. S We keep the type abstract to ensure that invalid extents cannot be constructed. YwConstruct an extent. 8 The north value must be > south, and east > west, else Z. y max (north) y min (south)  x max (east)  x min (west) x'Take the NSEW components of an extent. y!A square extent of a given size. z'Get the width and height of an extent. {=Check if an extent is a square with a width and height of 1. |2Check whether a coordinate lies inside an extent. }-Check whether a point lies inside an extent. ~9Get the coordinate that lies at the center of an extent. #Cut one quadrant out of an extent. 7Get the quadrant that this coordinate lies in, if any. 9Constuct a path to a particular coordinate in an extent. fIf a line segment (P1-P2) intersects the outer edge of an extent then return the intersection point, B that is closest to P1, if any. If P1 is inside the extent then [.   P2  /  ----/-  | / |  + |  /------  /  P1 Check whether a line segment'Is endpoints are inside an extent, or if it intersects with the boundary. uvwxyz{|}~vuwxyz{|}~uvwxyz{|}~ The quad tree structure. A node with four children. A leaf containint some value. An empty node. A  tree.  A node with . for all its branches. Get a quadrant from a node. 0 If the tree does not have an outer node then [. *Apply a function to a quadrant of a node. J If the tree does not have an outer node then return the original tree. >Insert a value into the tree at the position given by a path. & If the path intersects an existing  then return the original tree. 9Insert a value into the node containing this coordinate. B The node is created at maximum depth, corresponding to an unit v. %Lookup a node based on a path to it. ,Lookup an element based given a path to it. >Lookup a node if a tree given a coordinate which it contains. #Extent that covers the whole tree. %Coordinate of the value of interest. JFlatten a QuadTree into a list of its contained values, with coordinates. #Extent that covers the whole tree. JFlatten a QuadTree into a list of its contained values, with coordinates. #Extent that covers the whole tree. !\4Callback to handle keyboard and mouse button events  for controlling the viewport. ref to ViewPort state ref to ViewPort Control state ]^_`a\\"b4Callback to handle keyboard and mouse button events  for controlling the viewport. ref to ViewPort state ref to ViewPort Control state cdefbb# ^_`klmnopqrst An abstract color value. A We keep the type abstract so we can be sure that the components 7 are in the required range. To make a custom color use . gCHolds the color components. All components lie in the range [0..1. CMake a custom color. All components are clamped to the range [0..1]. Red component. Green component. Blue component. Alpha component. DMake a custom color. All components are clamped to the range [0..255]. Red component. Green component. Blue component. Alpha component. %Take the RGBA components of a color. h5Clamp components of a color into the required range. i=Normalise a color to the value of its largest RGB component. &Mix two colors with the given ratios. Ratio of first color. Ratio of second color.  First color. Second color. Resulting color. =Add RGB components of a color component-wise, then normalise G them to the highest resulting one. The alpha components are averaged. 9Make a dimmer version of a color, scaling towards black. ;Make a brighter version of a color, scaling towards white. Lighten a color, adding white. Darken a color, adding black. !A greyness of a given magnitude. "Range is 0 = black, to 1 = white. $j#Convert one of our Colors to OpenGL's representation. jj%kFOpen a window and use the supplied callbacks to handle window events. Name of the window. 'Initial size of the window, in pixels. 6Initial position of the window, in pixels relative to $ the top left corner of the screen. Color to use when clearing. Callbacks to use kk& A 2D picture (A picture consisting of several others. /A picture scaled by the given x and y factors. 3A picture rotated by the given angle (in degrees). 7A picture translated by the given x and y coordinates. !A picture drawn with this color. VA bitmap image with a width, height and a Vector holding the 32 bit RGBA bitmap data. MThe boolean flag controls whether Gloss should cache the data between frames U for speed. If you are programatically generating the image for each frame then use  l.. If you have loaded it from a file then use m. &Some text to draw with a vector font. .A circle with the given thickness and radius. 4 If the thickness is 0 then this is equivalent to .  A circle with the given radius.  A line along an arbitrary path. ,A convex polygon filled with a solid color. %A blank picture, with nothing in it. A path through the x-y plane.  O(1). Use a n of RGBA data as a bitmap. O(size). Copy a o of RGBA data into a bitmap. O(size). Copy a pq file into a bitmap. <Load an uncompressed 24 or 32bit RGBA BMP file as a bitmap. A closed loop along this path. ;A path representing a rectangle centered about the origin, " with the given width and height. 1A wireframe rectangle centered about the origin, " with the given width and height. :A wireframe rectangle in the y > 0 half of the x-y plane, " with the given width and height. DA path representing a rectangle in the y > 0 half of the x-y plane, ! with the given width and height .A solid rectangle centered about the origin, " with the given width and height. 6A solid rectangle in the y > 0 half of the x-y plane, " with the given width and height. &A solid circle with the given radius. )U\a)\aU& <The quadtree contains cells of unit extent (NetHack style). A Given a line segement (P1-P2) through the tree, get the cell 6 closest to P1 that intersects the segment, if any. <TODO: This currently uses a naive algorithm. It just calls   and sorts the results ) to get the one closest to P1. It'd be better to do a @ proper walk over the tree in the direction of the ray. (P1) Starting point of seg. (P2) Final point of seg. !Extent convering the whole tree.  The tree. <Intersection point, extent of cell, value of cell (if any). rs<The quadtree contains cells of unit extent (NetHack style). L Given a line segment (P1-P2) through the tree, return the list of cells  that intersect the segment. (P1) Starting point of seg. (P2) Final point of seg.  Extent covering the whole tree.  The tree. 3Intersection point, extent of cell, value of cell. &tA texture that we've sent to OpenGL. uvStable name derived from the U that the user gives us. wWidth of the image, in pixels. x Height of the image, in pixels. y!Pointer to the Raw texture data. zThe OpenGL texture object. {GWhether we want to leave this in OpenGL texture memory between frames. |Render options settings }~Whether to use color %Whether to force wireframe mode only Whether to use alpha blending Whether to use line smoothing Cache of Textures that we've sent to OpenGL. Default render options tuvwxyz{|}~tuvwxyz{uvwxyz{|}~}~'>Render a picture using the given render options and viewport. The render state The current viewport. The picture to render. Load a texture.  If we'Ive seen it before then use the pre-installed one from the texture cache, " otherwise load it into OpenGL. Install a texture into OpenGL. "If this texture does not have its cacheMe flag set then delete it from  OpenGL and free the memory. Turn alpha blending on or off Turn line smoothing on or off (1Open a new window and display the given picture. 4Use the following commands once the window is open:  Quit - esc-key. . Move Viewport - left-click drag, arrow keys. E Rotate Viewport - right-click drag, control-left-click drag, or home/ end-keys. ( Zoom Viewport - mouse wheel, or page up/ down-keys. Name of the window. 'Initial size of the window, in pixels. +Initial position of the window, in pixels. Background color. The picture to draw. Initial state of the backend. Name of the window. 'Initial size of the window, in pixels. +Initial position of the window, in pixels. Background color. The picture to draw.  CU\a)3Open a new window and display the given animation. >Once the window is open you can use the same commands as with displayInWindow. Name of the window. 'Initial size of the window, in pixels. +Initial position of the window, in pixels. Background color. 2Function to produce the next frame of animation. = It is passed the time in seconds since the program started. Initial State of the backend Name of the window. 'Initial size of the window, in pixels. +Initial position of the window, in pixels. Background color. 1Function to produce the next frame of animation. = It is passed the time in seconds since the program started. CU\a*XRun a finite-time-step simulation in a window. You decide how the model is represented, ] how to convert the model to a picture, and how to advance the model for each unit of time.  This function does the rest. >Once the window is open you can use the same commands as with displayInWindow. Name of the window. 'Initial size of the window, in pixels. +Initial position of the window, in pixels. Background color. ANumber of simulation steps to take for each second of real time. The initial model. .A function to convert the model to a picture. >A function to step the model one iteration. It is passed the = current viewport and the amount of time for this simulation  step (in seconds).  Initial state of the backend Name of the window. 'Initial size of the window, in pixels. +Initial position of the window, in pixels. Background color. ANumber of simulation steps to take for each second of real time. The initial model. .A function to convert the model to a picture. =A function to step the model one iteration. It is passed the = current viewport and the amount of time for this simulation  step (in seconds). HPQRSTU\aPQRST+ Possible input events. Run a game in a window. Name of the window. 'Initial size of the window, in pixels. +Initial position of the window, in pixels. Background color. ANumber of simulation steps to take for each second of real time. The initial world. +A function to convert the world a picture. #A function to handle input events. ,A function to step the world one iteration. H It is passed the period of time (in seconds) needing to be advanced.  Initial state of the backend Name of the window. 'Initial size of the window, in pixels. +Initial position of the window, in pixels. Background color. ANumber of simulation steps to take for each second of real time. The initial world. +A function to convert the world a picture. #A function to handle input events. ,A function to step the world one iteration. H It is passed the period of time (in seconds) needing to be advanced. Callback for KeyMouse events. ref to world state fn to handle input events Callback for Motion events. ref to world state fn to handle input events   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOU\aTLONMA@?>=<;:9876543210/.-,+*)('&%$#"!  EKJIHGFBDC,FU\a--./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxq1yzz{|} ~         ()*++++         !"#$%&'()*+,-./0123456789:;<==>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`  abcdefghijklRm ~ n o p q r s t uv wxywz{!|!}!~!!!R"""""R   $%w  &&&&&&&&& & &&&&&&''''''''())R*++++++ gloss-1.5.0.2Graphics.Gloss.Interface.Game!Graphics.Gloss.Interface.SimulateGraphics.Gloss.Data.PictureGraphics.Gloss.Data.QuadGraphics.Gloss.Data.PointGraphics.Gloss.Geometry.AngleGraphics.Gloss.Data.VectorGraphics.Gloss.Geometry.LineGraphics.Gloss.Data.ExtentGraphics.Gloss.Data.QuadTreeGraphics.Gloss.Data.Color!Graphics.Gloss.Algorithms.RayCast Graphics.Gloss.Interface.Display Graphics.Gloss.Interface.Animate&Graphics.Gloss.Internals.Render.Common&Graphics.Gloss.Internals.Render.Circle1Graphics.Gloss.Internals.Interface.Simulate.State(Graphics.Gloss.Internals.Interface.Debug0Graphics.Gloss.Internals.Interface.Animate.State0Graphics.Gloss.Internals.Interface.Backend.Types+Graphics.Gloss.Internals.Interface.Callback.Graphics.Gloss.Internals.Interface.Common.Exit/Graphics.Gloss.Internals.Interface.Backend.GLUT*Graphics.Gloss.Internals.Interface.Backend1Graphics.Gloss.Internals.Interface.Animate.Timing3Graphics.Gloss.Internals.Interface.ViewPort.Command8Graphics.Gloss.Internals.Interface.ViewPort.ControlState3Graphics.Gloss.Internals.Interface.ViewPort.Reshape+Graphics.Gloss.Internals.Interface.ViewPort0Graphics.Gloss.Internals.Interface.Simulate.Idle(Graphics.Gloss.Internals.Render.ViewPort&Graphics.Gloss.Internals.Render.Bitmap4Graphics.Gloss.Internals.Interface.ViewPort.KeyMouse2Graphics.Gloss.Internals.Interface.ViewPort.MotionGraphics.Gloss.GeometryGraphics.Gloss.Internals.Color)Graphics.Gloss.Internals.Interface.Window%Graphics.Gloss.Internals.Render.State'Graphics.Gloss.Internals.Render.Picture*Graphics.Gloss.Internals.Interface.Display*Graphics.Gloss.Internals.Interface.Animate+Graphics.Gloss.Internals.Interface.Simulate'Graphics.Gloss.Internals.Interface.GameGraphics.Gloss Modifiersshiftctrlalt SpecialKey KeyPadEnter KeyPadEqual KeyPadDecimal KeyPadAddKeyPadSubtractKeyPadMultiply KeyPadDivideKeyPad9KeyPad8KeyPad7KeyPad6KeyPad5KeyPad4KeyPad3KeyPad2KeyPad1KeyPad0KeyEndKeyHome KeyPageDown KeyPageUp KeyDeleteKeyBegin KeyNumLock KeyInsert KeyBackspaceKeyEnterKeyTabKeyRightKeyLeftKeyDownKeyUpKeyF25KeyF24KeyF23KeyF22KeyF21KeyF20KeyF19KeyF18KeyF17KeyF16KeyF15KeyF14KeyF13KeyF12KeyF11KeyF10KeyF9KeyF8KeyF7KeyF6KeyF5KeyF4KeyF3KeyF2KeyF1KeyEscKeySpace KeyUnknownKeyStateUpDown MouseButtonAdditionalButton WheelDownWheelUp RightButton MiddleButton LeftButtonKeyCharViewPortviewPortTranslateviewPortRotate viewPortScale BitmapDataQuadSESWNENWallQuadsPoint pointInBoxdegToRadradToDegnormaliseAngleVectormagVargVdotVdetVmulSVrotateVangleVV normaliseVunitVectorAtAngle segClearsBoxclosestPointOnLineclosestPointOnLineParamintersectLineLineintersectSegLineintersectSegHorzLineintersectSegVertLineintersectSegSegintersectSegHorzSegintersectSegVertSegCoordExtent makeExtent takeExtent squareExtent sizeOfExtent isUnitExtent coordInExtent pointInExtentcenterCoordOfExtentcutQuadOfExtent quadOfCoord pathToCoordintersectSegExtenttouchesSegExtentQuadTreeTNodeTLeafTNil emptyTree emptyNodetakeQuadOfTree liftToQuad insertByPath insertByCoordlookupNodeByPath lookupByPath lookupByCoordflattenQuadTreeflattenQuadTreeWithExtentsColor makeColor makeColor8 rgbaOfColor mixColors addColorsdimbrightlightdarkgreyNblackwhiteredgreenblueyellowcyanmagentarosevioletazure aquamarine chartreuseorangePicturePicturesScaleRotate TranslateBitmapText ThickCircleCircleLinePolygonBlankPathblankpolygonlinecircle thickCircletextbitmapcolor translaterotatescalepicturesbitmapOfForeignPtrbitmapOfByteString bitmapOfBMPloadBMPlineLoop rectanglePath rectangleWirerectangleUpperWirerectangleUpperPathrectangleSolidrectangleUpperSolid circleSolidcastSegIntoCellularQuadTreetraceSegIntoCellularQuadTreedisplayInWindowanimateInWindowsimulateInWindowEvent EventMotionEventKey gameInWindowgfgsizei renderCircle circleStepsrenderCircleLine_steprenderCircleLinerenderCircleStriprenderCircleStrip_stepStatestateIterationstateRun stateStep stateResetstateResolution stateSimTimestateStepsPerFrame stateInitdumpFramebufferStatedumpFragmentState stateAnimatestateAnimateStartstateAnimateTimestateDisplayTimestateDisplayTimeLaststateDisplayTimeClampstateGateTimeStartstateGateTimeEndstateGateTimeElapsedCallbackReshapeMotionIdleKeyMouseDisplayReshapeCallback IdleCallbackMotionCallbackKeyboardMouseCallbackDisplayCallbackBackendinitBackendStateinitializeBackend exitBackend openWindowdumpBackendStateinstallDisplayCallbackinstallWindowCloseCallbackinstallReshapeCallbackinstallKeyMouseCallbackinstallMotionCallbackinstallIdleCallback runMainLoop postRedisplaygetWindowDimensions elapsedTimesleep callback_exit keyMouse_exit GLUTState glutStateInitinitializeGLUTopenWindowGLUT dumpStateGLUTinstallDisplayCallbackGLUTcallbackDisplayinstallReshapeCallbackGLUTcallbackReshapeinstallKeyMouseCallbackGLUTcallbackKeyMouseinstallMotionCallbackGLUTcallbackMotioninstallIdleCallbackGLUT callbackIdle glutKeyToKeyglutKeyStateToKeyStateglutModifiersToModifiersdefaultBackendState animateBegin animateEnd getsIORefCommandCBumpCClockwiseCBumpClockwise CBumpDownCBumpUp CBumpRight CBumpLeft CBumpZoomIn CBumpZoomOutCRotate CTranslateCRestoredefaultCommandConfig isCommand stateCommandsstateScaleStepstateRotateFactorstateTranslateMarkstateRotateMarkcallback_viewPort_reshapeviewPort_reshape viewPortInitcallback_simulate_idlesimulate_reset simulate_run simulate_step withViewPort bitmapPath reverseRGBAreverseRGBA_ptrfreeBitmapData isolateByte0 isolateByte1 isolateByte2 isolateByte3$fNum(,)baseGHC.Errerror Data.MaybeNothingcallback_viewPort_keyMouseviewPort_keyMouse controlZoomIncontrolZoomOut motionBumpcallback_viewPort_motionviewPort_motionmotionTranslate motionRotateRGBA clampColornormaliseColorglColor4OfColor createWindowghc-prim GHC.TypesFalseTrueGHC.ForeignPtr ForeignPtrbytestring-0.9.2.0Data.ByteString.Internal ByteString bmp-1.1.2.1Codec.BMP.BaseBMPcompareDistanceTodistanceTexturetexNametexWidth texHeighttexData texObject texCacheMe stateColorstateWireframestateBlendAlphastateLineSmooth stateTextures renderPicture drawPicture loadTextureinstallTexture freeTexture setBlendAlpha setLineSmooth vertexPFsdisplayInWindowWithBackendanimateInWindowWithBackendsimulateInWindowWithBackendgameInWindowWithBackendcallback_keyMousehandle_keyMousecallback_motion handle_motion convertPoint