aboutsummaryrefslogtreecommitdiff
path: root/client/src/renderer.rs
blob: c8f7f0b224133157ec28c4f6ad8ba3714da9bc79 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
use std::sync::Arc;

use anyhow::{Result, anyhow};
use pollster::FutureExt;
use twgpu::{
    Camera, GpuCamera,
    map::{GpuMapData, GpuMapStatic},
    shared::Rng,
    sprites::{ParticleData, SpriteTextures, SpritesData, SpritesStatic},
    textures::Samplers,
};
use wgpu::{
    Backends, DeviceDescriptor, Features, Instance, InstanceDescriptor, Limits, MemoryHints,
    PowerPreference, RequestAdapterOptions, TextureFormat,
};
use winit::window::Window;

pub struct Renderer<'a> {
    window: &'a Window,
}

impl<'a> Renderer<'a> {
    pub fn new(window: &'a Window) -> Result<Self> {
        let texture_format = TextureFormat::Bgra8UnormSrgb;

        let instance = Instance::new(InstanceDescriptor {
            backends: Backends::all(),
            ..Default::default()
        });

        let surface = instance.create_surface(window)?;

        let adapter = instance
            .request_adapter(&RequestAdapterOptions {
                power_preference: PowerPreference::HighPerformance,
                compatible_surface: Some(&surface),
                force_fallback_adapter: false,
            })
            .block_on()
            .ok_or(anyhow!("no adapter found"))?;

        eprintln!("Adapter {:#?}", adapter.limits());
        let (device, queue) = adapter
            .request_device(
                &DeviceDescriptor {
                    label: None,
                    required_features: Features::default(),
                    required_limits: Limits::default(),
                    memory_hints: MemoryHints::Performance,
                },
                None,
            )
            .block_on()?;

        let samplers = Arc::new(Samplers::new(&device));
        let mut camera = Camera::new(1.);
        let gpu_camera = Arc::new(GpuCamera::upload(&camera, &device));

        let map_static = GpuMapStatic::new(texture_format, &device);
        let map_data = GpuMapData::upload(&twmap, &device, &queue);
        let map_render =
            map_static.prepare_render(&twmap, &map_data, &gpu_camera, &samplers, &device);

        let sprites_static = SpritesStatic::new(texture_format, &device);
        let mut sprites_data = SpritesData::new(&device);
        let mut particle_data = ParticleData::new(demo.current_time(), &device);
        let mut textures = SpriteTextures::new(&device, &queue, &gpu_camera, &samplers);
        let mut rng = Rng::new(0);
        init_sprite_textures(&mut textures, twmap.version, &device, &queue)?;
        let blit = Arc::new(Blit::new(&device));
        let mut skin_manager = SkinManager::new(blit, &mut textures, device.clone(), queue.clone());

        Self { window }
    }
    pub fn redraw() {}
}