2024-07-31 10:03:30 +01:00
|
|
|
structure EventLoop =
|
|
|
|
|
struct
|
|
|
|
|
open CML
|
2024-07-31 13:32:22 +01:00
|
|
|
open DrawMessage
|
2024-07-31 10:03:30 +01:00
|
|
|
|
2024-07-31 12:00:07 +01:00
|
|
|
local
|
2024-07-31 12:30:12 +01:00
|
|
|
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
|
2024-08-03 06:05:26 +01:00
|
|
|
fun update (inputMailbox, drawMailbox, initial) =
|
2024-08-01 21:39:09 +01:00
|
|
|
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
|
|
|
|
2024-07-31 12:30:12 +01:00
|
|
|
fun draw
|
2024-07-31 22:25:15 +01:00
|
|
|
( drawMailbox
|
|
|
|
|
, window
|
|
|
|
|
, graphDrawObject
|
2024-08-03 04:40:53 +01:00
|
|
|
, 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
|
2024-07-31 13:32:22 +01:00
|
|
|
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
|
|
|
|
2024-08-03 04:40:53 +01:00
|
|
|
val _ = AppDraw.drawGraphLines (graphDrawObject, drawGraphLength)
|
2024-08-01 21:39:09 +01:00
|
|
|
val _ =
|
|
|
|
|
AppDraw.drawTriangles (triangleDrawObject, triangleDrawLength)
|
2024-07-31 13:32:22 +01:00
|
|
|
val _ = AppDraw.drawButton (buttonDrawObject, buttonDrawLength)
|
2024-07-31 10:03:30 +01:00
|
|
|
|
2024-07-31 13:32:22 +01:00
|
|
|
val _ = Glfw.pollEvents ()
|
|
|
|
|
val _ = Glfw.swapBuffers window
|
|
|
|
|
in
|
|
|
|
|
draw
|
|
|
|
|
( drawMailbox
|
|
|
|
|
, window
|
|
|
|
|
, graphDrawObject
|
2024-08-03 04:40:53 +01:00
|
|
|
, drawGraphLength
|
2024-07-31 13:32:22 +01:00
|
|
|
, buttonDrawObject
|
|
|
|
|
, buttonDrawLength
|
2024-07-31 22:25:15 +01:00
|
|
|
, triangleDrawObject
|
|
|
|
|
, triangleDrawLength
|
2024-07-31 13:32:22 +01:00
|
|
|
)
|
|
|
|
|
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
|
2024-08-03 04:40:53 +01:00
|
|
|
, drawGraphLength
|
2024-07-31 13:32:22 +01:00
|
|
|
, buttonDrawObject
|
|
|
|
|
, buttonDrawLength
|
2024-07-31 22:25:15 +01:00
|
|
|
, triangleDrawObject
|
|
|
|
|
, triangleDrawLength
|
|
|
|
|
)
|
|
|
|
|
end
|
|
|
|
|
| DRAW_TRIANGLES_AND_RESET_BUTTONS triangleVec =>
|
|
|
|
|
let
|
2024-08-01 21:39:09 +01:00
|
|
|
val _ =
|
|
|
|
|
AppDraw.uploadTrianglesVector
|
|
|
|
|
(triangleDrawObject, triangleVec)
|
2024-07-31 22:25:15 +01:00
|
|
|
val triangleDrawLength = Vector.length triangleVec div 2
|
2024-08-01 21:39:09 +01:00
|
|
|
(* buttons are reset by setting buttonDrawLength to 0 *)
|
2024-07-31 22:25:15 +01:00
|
|
|
in
|
|
|
|
|
draw
|
|
|
|
|
( drawMailbox
|
|
|
|
|
, window
|
|
|
|
|
, graphDrawObject
|
2024-08-03 04:40:53 +01:00
|
|
|
, 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
|
2024-07-31 13:32:22 +01:00
|
|
|
)
|
2024-07-31 14:52:12 +01:00
|
|
|
end
|
|
|
|
|
| NO_DRAW =>
|
|
|
|
|
draw
|
|
|
|
|
( drawMailbox
|
|
|
|
|
, window
|
|
|
|
|
, graphDrawObject
|
2024-08-03 04:40:53 +01:00
|
|
|
, drawGraphLength
|
2024-07-31 14:52:12 +01:00
|
|
|
, buttonDrawObject
|
|
|
|
|
, buttonDrawLength
|
2024-07-31 22:25:15 +01:00
|
|
|
, triangleDrawObject
|
|
|
|
|
, triangleDrawLength
|
2024-07-31 14:52:12 +01:00
|
|
|
))
|
2024-07-31 10:03:30 +01:00
|
|
|
else
|
|
|
|
|
Glfw.terminate ()
|
|
|
|
|
end
|