Rendering

  • Multi frame rendering: 1 Canvas, each frame creates Canvas

  • trait Renderable implementors: Grid, Cartesian2D, Cartesian3D

    • fn encode(&self, ctx: &mut Canvas)

    • fn layout(&self, solver: &mut Solver, theme: &Theme)

    • fn size(&self) -> &WidgetSizeVars

  • struct Canvas<'a>

    • &Easel

    • &TextureView

    • area: Box2

    • layout: &Solver

    • BindGroupLayout

    • renderers

      • MarkerRenderer

      • VanillaRenderer

      • TextRenderer

    • layout_cache: HashMap<*const dyn Renderable, Box2>

  • struct Easel

    • wgpu::Instance

    • wgpu::Adapter

    • wgpu::Device

    • wgpu::Queue

    • RenderStateDetail

    • size

    • wgpu::CommandBuffer

    • wgpu::SurfaceTexture

    • layout_cache

  • Each Plot has its own PrimitiveRenderer, CommandEncoder, RenderPass instance to produce the CommandBuffer.

  • CommandBuffer from each plot is collected and submitted to the queue at once.

  • FontSystem is a global resource behind mutex. This is because the font loading is expensive.

  • Easel consists of several sub renderers, where each has its own shader responsible for a specific type of primitives.

Grid::render_to_buffer (new Easel, new Canvas) ->Grid::render_root ->Grid::layout() ->Child1::layout() ->Child2::layout() -> put Solver in ctx ->Child1::render(ctx) ->create Easel (takes one viewport, holds primitives + transform) ->RenderPass::new() ->pass.set_scissor_rect() ->encoder.finish() ->render_context.push(CommandBuffer) ->Child2::render() ->RenderPass::new() ->pass.set_scissor_rect() ->encoder.finish() ->return CommandBuffer ->Queue::submit(&[cmd_buf1, cmd_buf2]) ->Easel.present()

Grid::render_svg ->Grid::render_root ->Grid::layout() .. ->Child1::render(SVGRenderContext) ->render_context.push(a tree of SVG elements) ->Child2::render() ->return a tree of SVG elements ->aggregate all SVG elements

Easel (1 per app)

  • wgpu::Device, wgpu::Surface, ..

Canvas (1 per frame, create view on the root, states mutated down the tree)

  • link to Easel

  • &view

  • transform

  • mouse cursor

  • theme (theme = node.theme or theme)

  • layout: &Solver

PrimtiveRenderer (1 per node, 3D, scissor)

  • new(view)

  • LineRenderer - 1 encoder + 1 render pass -> CommandBuffer -> ctx.submit(cmd_buf)

  • TextRenderer - 1 encoder + 1 render pass -> CommandBuffer -> ctx.submit(cmd_buf)

  • finish() -> CommandBuffer

  • theme

Renderable

  • save() (provided)

    • create Easel, Canvas

  • render_root(ctx) (provided)

  • layout

  • render(ctx)

    • fn render(&self, ctx: &Canvas)

    • create PrimitiveRenderer

    • ctx.submit(CommandBuffer)

Cartesian2D::render()

  • for geom in geometries:

    • geom.render(&mut PrimitiveRenderer)

Cartesian2D::scatter() -> Cartesian2D::push(Geometry::Scatter{..}) -> Vec Cartesian2D::line() -> Cartesian2D::push(Geometry::Line{..}) -> Path

have 2 primtiive renderers: Primitives in data coordinates - uniform - zoom, pan, .. Primitives in pixel coordinates

Last updated