Files
sml-projects/dotscape/imperative-shell/draw-thread.sml
Humza Shahid f3a4e15ed5 Add 'dotscape/' from commit 'f306501a68a51b634e895c5fdac70788ae899d75'
git-subtree-dir: dotscape
git-subtree-mainline: 6b91d64fc3
git-subtree-split: f306501a68
2026-04-24 00:30:08 +01:00

189 lines
6.2 KiB
Standard ML

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