Files
sml-projects/imperative-shell/event-loop.sml

137 lines
4.2 KiB
Standard ML
Raw Normal View History

2024-07-31 10:03:30 +01:00
structure EventLoop =
struct
open CML
open DrawMessage
2024-07-31 10:03:30 +01:00
2024-07-31 12:00:07 +01:00
local
fun loop (inputMailbox, drawMailbox, mouseX, mouseY, model) =
let
val inputMsg = Mailbox.recv inputMailbox
val (model, drawMsg, mouseX, mouseY) =
AppUpdate.update (model, mouseX, mouseY, inputMsg)
val _ = Mailbox.send (drawMailbox, drawMsg)
in
loop (inputMailbox, drawMailbox, mouseX, mouseY, model)
end
2024-07-31 12:00:07 +01:00
in
fun update (inputMailbox, drawMailbox, initial) =
loop
( inputMailbox
, drawMailbox
, 0.0
, 0.0
, AppType.getInitial (Constants.windowWidth, Constants.windowHeight)
)
2024-07-31 12:00:07 +01:00
end
2024-07-31 10:03:30 +01:00
fun draw
2024-07-31 22:25:15 +01:00
( drawMailbox
, window
, graphDrawObject
, drawGraphLength
2024-07-31 22:25:15 +01:00
, buttonDrawObject
, buttonDrawLength
, triangleDrawObject
, triangleDrawLength
) =
2024-07-31 10:03:30 +01:00
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 ()
2024-07-31 10:03:30 +01:00
val _ = AppDraw.drawGraphLines (graphDrawObject, drawGraphLength)
val _ =
AppDraw.drawTriangles (triangleDrawObject, triangleDrawLength)
val _ = AppDraw.drawButton (buttonDrawObject, buttonDrawLength)
2024-07-31 10:03:30 +01:00
val _ = Glfw.pollEvents ()
val _ = Glfw.swapBuffers window
in
draw
( drawMailbox
, window
, graphDrawObject
, drawGraphLength
, buttonDrawObject
, buttonDrawLength
2024-07-31 22:25:15 +01:00
, triangleDrawObject
, triangleDrawLength
)
end
| SOME drawMsg =>
(case drawMsg of
DRAW_BUTTON vec =>
let
val _ = AppDraw.uploadButtonVector (buttonDrawObject, vec)
val buttonDrawLength = Vector.length vec div 5
in
draw
( drawMailbox
, window
, graphDrawObject
, drawGraphLength
, buttonDrawObject
, buttonDrawLength
2024-07-31 22:25:15 +01:00
, triangleDrawObject
, triangleDrawLength
)
end
| DRAW_TRIANGLES_AND_RESET_BUTTONS triangleVec =>
let
val _ =
AppDraw.uploadTrianglesVector
(triangleDrawObject, triangleVec)
2024-07-31 22:25:15 +01:00
val triangleDrawLength = Vector.length triangleVec div 2
(* buttons are reset by setting buttonDrawLength to 0 *)
2024-07-31 22:25:15 +01:00
in
draw
( drawMailbox
, window
, graphDrawObject
, drawGraphLength
, buttonDrawObject
, 0
, triangleDrawObject
, triangleDrawLength
)
end
| RESIZE_TRIANGLES_BUTTONS_AND_GRAPH {triangles, graphLines} =>
let
val _ =
AppDraw.uploadTrianglesVector
(triangleDrawObject, triangles)
val triangleDrawLength = Vector.length triangles div 2
(* buttons are reset by setting buttonDrawLength to 0 *)
val _ =
AppDraw.uploadGraphLines
(graphDrawObject, graphLines)
val drawGraphLength = Vector.length graphLines div 2
in
draw
( drawMailbox
, window
, graphDrawObject
, drawGraphLength
2024-07-31 22:25:15 +01:00
, buttonDrawObject
, 0
, triangleDrawObject
, triangleDrawLength
)
end
| NO_DRAW =>
draw
( drawMailbox
, window
, graphDrawObject
, drawGraphLength
, buttonDrawObject
, buttonDrawLength
2024-07-31 22:25:15 +01:00
, triangleDrawObject
, triangleDrawLength
))
2024-07-31 10:03:30 +01:00
else
Glfw.terminate ()
end