slam-viewer 0.1.2

Simple wgpu based SLAM map viewer.
Documentation
use core::marker::PhantomData;

use super::builder::LinesBuilder;
use super::line::Line;
use super::source::LineSource;
use crate::pipes::{GpuVec, PipelineBuilder, PipelineRenderer, VertexFormat};

use nalgebra::Point3;
use slam_cv::Number;

pub struct LinesRendener<N, S>
where
    N: 'static + Number,
    Point3<N>: VertexFormat<N>,
    S: 'static + LineSource<N>,
{
    pub render_pipeline: wgpu::RenderPipeline,
    pub buffer: GpuVec<Line<N>>,

    pub number: PhantomData<N>,
    pub source: S,
}

impl<N, S> PipelineBuilder for LinesBuilder<N, S>
where
    N: 'static + Number,
    Point3<N>: VertexFormat<N>,
    S: 'static + LineSource<N>,
{
    fn build(
        self: Box<Self>,
        device: &wgpu::Device,
        texture_format: wgpu::TextureFormat,
        uniform_bind_group_layout: &wgpu::BindGroupLayout,
    ) -> Box<dyn PipelineRenderer> {
        Box::new((*self).build(device, texture_format, uniform_bind_group_layout))
    }
}

impl<N, S> PipelineRenderer for LinesRendener<N, S>
where
    N: 'static + Number,
    Point3<N>: VertexFormat<N>,
    S: LineSource<N>,
{
    fn render<'a>(&'a mut self, device: &wgpu::Device, render_pass: &mut wgpu::RenderPass<'a>) {
        render_pass.set_pipeline(&self.render_pipeline);

        let lines = self.source.collect_visual_lines();

        self.buffer.update(device, lines);
        self.buffer.set_buffer(render_pass);
    }
}