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() {}
}
|