From d39a7d62e7bdc63b2055ad93bf511cdd1e40e69d Mon Sep 17 00:00:00 2001 From: metamuffin Date: Sun, 19 Jan 2025 11:28:12 +0100 Subject: a --- client/src/renderer.rs | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 client/src/renderer.rs (limited to 'client/src/renderer.rs') diff --git a/client/src/renderer.rs b/client/src/renderer.rs new file mode 100644 index 0000000..c8f7f0b --- /dev/null +++ b/client/src/renderer.rs @@ -0,0 +1,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 { + 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() {} +} -- cgit v1.2.3-70-g09d2