structure DrawThread = struct open CML open DrawMessage fun run ( drawMailbox , window , graphDrawObject , drawGraphLength , dotDrawObject , dotDrawLength , squareDrawObject , squareDrawLength , modalTextDrawObject , modalTextDrawLength ) = if not (Glfw.windowShouldClose window) then case Mailbox.recvPoll drawMailbox of NONE => let val _ = Gles3.clearColor (1.0, 1.0, 1.0, 1.0) val _ = Gles3.clear () val _ = AppDraw.drawGraphLines (graphDrawObject, drawGraphLength) val _ = AppDraw.drawSquares (squareDrawObject, squareDrawLength) val _ = AppDraw.drawDot (dotDrawObject, dotDrawLength) val _ = AppDraw.drawModalText (modalTextDrawObject, modalTextDrawLength) val _ = Glfw.swapBuffers window val _ = Glfw.pollEvents () in run ( drawMailbox , window , graphDrawObject , drawGraphLength , dotDrawObject , dotDrawLength , squareDrawObject , squareDrawLength , modalTextDrawObject , modalTextDrawLength ) end | SOME drawMsg => (case drawMsg of DRAW_DOT vec => let val _ = AppDraw.uploadDotVector (dotDrawObject, vec) val dotDrawLength = Vector.length vec div 5 in run ( drawMailbox , window , graphDrawObject , drawGraphLength , dotDrawObject , dotDrawLength , squareDrawObject , squareDrawLength , modalTextDrawObject , modalTextDrawLength ) end | DRAW_SQUARES_AND_RESET_DOTS squareVec => let val _ = AppDraw.uploadSquaresVector (squareDrawObject, squareVec) val squareDrawLength = Vector.length squareVec div 5 (* dots are reset by setting dotDrawLength to 0 *) in run ( drawMailbox , window , graphDrawObject , drawGraphLength , dotDrawObject , 0 , squareDrawObject , squareDrawLength , modalTextDrawObject , modalTextDrawLength ) end | DRAW_SQUARES_AND_DOTS {squares = squareVec, dots = dotsVec} => let val _ = AppDraw.uploadSquaresVector (squareDrawObject, squareVec) val squareDrawLength = Vector.length squareVec div 5 val _ = AppDraw.uploadDotVector (dotDrawObject, dotsVec) val dotDrawLength = Vector.length dotsVec div 5 in run ( drawMailbox , window , graphDrawObject , drawGraphLength , dotDrawObject , dotDrawLength , squareDrawObject , squareDrawLength , modalTextDrawObject , modalTextDrawLength ) end | CLEAR_DOTS => let val dotDrawLength = 0 in run ( drawMailbox , window , graphDrawObject , drawGraphLength , dotDrawObject , dotDrawLength , squareDrawObject , squareDrawLength , modalTextDrawObject , modalTextDrawLength ) end | RESIZE_SQUARES_DOTS_AND_GRAPH {squares, graphLines, dots} => let val _ = AppDraw.uploadSquaresVector (squareDrawObject, squares) val squareDrawLength = Vector.length squares div 5 val _ = AppDraw.uploadGraphLines (graphDrawObject, graphLines) val drawGraphLength = Vector.length graphLines div 2 val _ = AppDraw.uploadDotVector (dotDrawObject, dots) val dotDrawLength = Vector.length dots div 5 in run ( drawMailbox , window , graphDrawObject , drawGraphLength , dotDrawObject , dotDrawLength , squareDrawObject , squareDrawLength , modalTextDrawObject , modalTextDrawLength ) end | DRAW_GRAPH graphLines => let val _ = AppDraw.uploadGraphLines (graphDrawObject, graphLines) val drawGraphLength = Vector.length graphLines div 2 in run ( drawMailbox , window , graphDrawObject , drawGraphLength , dotDrawObject , dotDrawLength , squareDrawObject , squareDrawLength , modalTextDrawObject , modalTextDrawLength ) end | DRAW_MODAL_TEXT vec => let val _ = AppDraw.uploadModalText (modalTextDrawObject, vec) val modalTextDrawLength = Vector.length vec div 5 in run ( drawMailbox , window , graphDrawObject , drawGraphLength , dotDrawObject , dotDrawLength , squareDrawObject , squareDrawLength , modalTextDrawObject , modalTextDrawLength ) end) else Glfw.terminate () end