structure InitGlfw = struct open CML fun init path () = let (* Set up GLFW. *) val _ = Glfw.init () val _ = Glfw.windowHint (Glfw.CONTEXT_VERSION_MAJOR (), 3) val _ = Glfw.windowHint (Glfw.DEPRECATED (), Glfw.FALSE ()) val _ = Glfw.windowHint (Glfw.SAMPLES (), 0) val window = Glfw.createWindow (Constants.windowWidth, Constants.windowHeight, "Dotscape") val _ = Glfw.makeContextCurrent window val _ = Gles3.loadGlad () val initialModel = AppInit.fromWindowWidthAndHeight ( Constants.windowWidth , Constants.windowHeight , Constants.initialWidthClickPoints , Constants.initialHeightClickPoints , path ) val graphLines = GraphLines.generate initialModel val graphDrawObject = AppDraw.initGraphLines () val _ = AppDraw.uploadGraphLines (graphDrawObject, graphLines) val dotDrawObject = AppDraw.initDot () val squareDrawObject = AppDraw.initSquares () val modalTextDrawObject = AppDraw.initModalText () val inputMailbox = Mailbox.mailbox () val drawMailbox = Mailbox.mailbox () val fileMailbox = Mailbox.mailbox () val _ = InputCallbacks.registerCallbacks (window, inputMailbox) val _ = CML.spawn (fn () => UpdateThread.run (inputMailbox, drawMailbox, fileMailbox, initialModel)) val _ = CML.spawn (fn () => DrawThread.run ( drawMailbox , window , graphDrawObject , Vector.length graphLines div 2 , dotDrawObject , 0 , squareDrawObject , 0 , modalTextDrawObject , 0 )) val _ = CML.spawn (fn () => FileThread.run (fileMailbox, inputMailbox)) in () end fun main path = (RunCML.doit (init path, NONE); ()) end