maplibre/raster/resource/
raster.rs1use 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
9pub 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 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}