(opts: BakeOptions<'_>)
| 55 | } |
| 56 | |
| 57 | async fn bake_async(opts: BakeOptions<'_>) -> Result<BakedAtlas, String> { |
| 58 | let instance = wgpu::Instance::new(wgpu::InstanceDescriptor { |
| 59 | backends: wgpu::Backends::all(), |
| 60 | ..wgpu::InstanceDescriptor::new_without_display_handle() |
| 61 | }); |
| 62 | let adapter = instance |
| 63 | .request_adapter(&wgpu::RequestAdapterOptions { |
| 64 | power_preference: wgpu::PowerPreference::HighPerformance, |
| 65 | compatible_surface: None, |
| 66 | force_fallback_adapter: false, |
| 67 | }) |
| 68 | .await |
| 69 | .map_err(|e| format!("no adapter: {e}"))?; |
| 70 | |
| 71 | let (device, queue) = adapter |
| 72 | .request_device(&wgpu::DeviceDescriptor { |
| 73 | label: Some("imposter-baker"), |
| 74 | required_features: wgpu::Features::empty(), |
| 75 | required_limits: wgpu::Limits::downlevel_defaults(), |
| 76 | ..Default::default() |
| 77 | }) |
| 78 | .await |
| 79 | .map_err(|e| format!("device: {e}"))?; |
| 80 | |
| 81 | let n = opts.grid; |
| 82 | let cell = opts.cell_px; |
| 83 | let atlas_w = n * cell; |
| 84 | let atlas_h = n * cell; |
| 85 | |
| 86 | // ── Geometry buffers ──────────────────────────────────────────── |
| 87 | let verts: Vec<Vertex> = opts |
| 88 | .mesh |
| 89 | .positions |
| 90 | .iter() |
| 91 | .zip(opts.mesh.normals.iter()) |
| 92 | .map(|(p, n)| Vertex { pos: *p, _pad0: 0.0, nrm: *n, _pad1: 0.0 }) |
| 93 | .collect(); |
| 94 | let vbuf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { |
| 95 | label: Some("imposter-vb"), |
| 96 | contents: bytemuck::cast_slice(&verts), |
| 97 | usage: wgpu::BufferUsages::VERTEX, |
| 98 | }); |
| 99 | let ibuf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { |
| 100 | label: Some("imposter-ib"), |
| 101 | contents: bytemuck::cast_slice(&opts.mesh.indices), |
| 102 | usage: wgpu::BufferUsages::INDEX, |
| 103 | }); |
| 104 | let index_count = opts.mesh.indices.len() as u32; |
| 105 | |
| 106 | // ── Uniform buffer (re-uploaded per view) ─────────────────────── |
| 107 | let ubuf = device.create_buffer(&wgpu::BufferDescriptor { |
| 108 | label: Some("imposter-ubo"), |
| 109 | size: std::mem::size_of::<Uniforms>() as u64, |
| 110 | usage: wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST, |
| 111 | mapped_at_creation: false, |
| 112 | }); |
| 113 | |
| 114 | let bgl = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { |
no test coverage detected