src/RenderQueue.elm (82 lines of code) (raw):

module RenderQueue exposing ( make , apply ) import Model.Core exposing (Model, Msg(..)) import Model.Layer.Layer as Layer import Model.Layer.Def as Layer exposing (Index) import Model.Layer.Layers exposing (Layers) import Model.SizeRule exposing (..) import Viewport exposing (Viewport) import Viewport import Array exposing (Array) import Array import Html exposing (..) import WebGL as WebGL -- type alias LayerToEntities = Layer.Model -> Viewport {} -> Int -> Layer.Def -> List WebGL.Entity -- type alias LayerToHtml = Layer.Model -> Viewport {} -> Int -> Layer.Def -> Html Msg type QueueItem = HtmlGroup (Array (Layer.Index, Layer.ZOrder, Html Layer.Msg)) | WebGLGroup (Array (Layer.Index, Layer.ZOrder, WebGL.Entity)) type alias RenderQueue = Array QueueItem make : List ( Layer.Index, Layer.ZOrder, Layer.View ) -> RenderQueue make renderedLayers = let addToQueue ( index, zOrder, layerView ) renderQueue = let indexOfThelastInQueue = Array.length renderQueue - 1 lastInQueue = renderQueue |> Array.get indexOfThelastInQueue in case layerView of Layer.ToWebGL entity -> case lastInQueue of Just (WebGLGroup existingEntities) -> renderQueue |> Array.set indexOfThelastInQueue (existingEntities |> Array.push (index, zOrder, entity) |> WebGLGroup) _ -> renderQueue |> Array.push (Array.empty |> Array.push (index, zOrder, entity) |> WebGLGroup) Layer.ToHtml html -> case lastInQueue of Just (HtmlGroup existingHtml) -> renderQueue |> Array.set indexOfThelastInQueue (existingHtml |> Array.push (index, zOrder, html) |> HtmlGroup) _ -> renderQueue |> Array.push (Array.empty |> Array.push (index, zOrder, html) |> HtmlGroup) in renderedLayers |> List.reverse |> List.foldl addToQueue Array.empty apply : (List (Layer.Index, Layer.ZOrder, Html Layer.Msg) -> Html Msg) -> (List (Layer.Index, Layer.ZOrder, WebGL.Entity) -> Html Msg) -> RenderQueue -> Html Msg apply wrapHtml wrapEntities queue = Array.toList queue |> List.map (\queueItem -> case queueItem of WebGLGroup entities -> wrapEntities <| Array.toList entities HtmlGroup htmls -> wrapHtml <| Array.toList htmls ) |> div [] getViewportState : Model -> Viewport.State getViewportState { paused, size, origin, theta } = { paused = paused , size = getRuleSizeOrZeroes size , origin = origin , theta = theta }