maplibre/raster/resource/
raster.rs

1use std::collections::HashMap;
2
3use crate::{
4    coords::WorldTileCoords,
5    render::{resource::Texture, settings::Msaa, tile_view_pattern::HasTile},
6    tcs::world::World,
7};
8
9/// Holds the resources necessary for the raster tiles such as the
10/// * sampler
11/// * texture
12/// * pipeline
13/// * bindgroups
14pub struct RasterResources {
15    sampler: wgpu::Sampler,
16    msaa: Msaa,
17    pipeline: wgpu::RenderPipeline,
18    bound_textures: HashMap<WorldTileCoords, wgpu::BindGroup>,
19}
20
21impl RasterResources {
22    pub fn new(msaa: Msaa, device: &wgpu::Device, pipeline: wgpu::RenderPipeline) -> Self {
23        let sampler = device.create_sampler(&wgpu::SamplerDescriptor {
24            address_mode_u: wgpu::AddressMode::ClampToEdge,
25            address_mode_v: wgpu::AddressMode::ClampToEdge,
26            address_mode_w: wgpu::AddressMode::ClampToEdge,
27            mag_filter: wgpu::FilterMode::Linear,
28            min_filter: wgpu::FilterMode::Linear,
29            mipmap_filter: wgpu::FilterMode::Linear,
30            ..Default::default()
31        });
32        Self {
33            sampler,
34            msaa,
35            pipeline,
36            bound_textures: Default::default(),
37        }
38    }
39
40    pub fn create_texture(
41        &mut self,
42        label: wgpu::Label,
43        device: &wgpu::Device,
44        format: wgpu::TextureFormat,
45        width: u32,
46        height: u32,
47        usage: wgpu::TextureUsages,
48    ) -> Texture {
49        Texture::new(label, device, format, width, height, self.msaa, usage)
50    }
51
52    pub fn get_bound_texture(&self, coords: &WorldTileCoords) -> Option<&wgpu::BindGroup> {
53        self.bound_textures.get(coords)
54    }
55
56    /// Creates a bind group for each fetched raster tile and store it inside a hashmap.
57    pub fn bind_texture(
58        &mut self,
59        device: &wgpu::Device,
60        coords: &WorldTileCoords,
61        texture: Texture,
62    ) {
63        self.bound_textures.insert(
64            *coords,
65            device.create_bind_group(&wgpu::BindGroupDescriptor {
66                layout: &self.pipeline.get_bind_group_layout(0),
67                entries: &[
68                    wgpu::BindGroupEntry {
69                        binding: 0,
70                        resource: wgpu::BindingResource::TextureView(&texture.view),
71                    },
72                    wgpu::BindGroupEntry {
73                        binding: 1,
74                        resource: wgpu::BindingResource::Sampler(&self.sampler),
75                    },
76                ],
77                label: None,
78            }),
79        );
80    }
81
82    pub fn pipeline(&self) -> &wgpu::RenderPipeline {
83        &self.pipeline
84    }
85}
86
87impl HasTile for RasterResources {
88    fn has_tile(&self, coords: WorldTileCoords, _world: &World) -> bool {
89        self.bound_textures.contains_key(&coords)
90    }
91}