transparency for textures

This commit is contained in:
Arkitu 2024-09-28 11:54:20 +02:00
parent e9f0dfde27
commit 49513bfbe9

View File

@ -2,9 +2,9 @@ use std::sync::Arc;
use bytemuck::{Pod, Zeroable};
use wgpu::{include_wgsl, util::DeviceExt, BindGroup, Buffer, Device, Queue, RenderPipeline, Surface, SurfaceConfiguration, VertexBufferLayout};
use winit::{event::{Event, WindowEvent}, window::Window};
use winit::{event::WindowEvent, window::Window};
use crate::{state::State, App};
use crate::state::State;
mod texture;
use texture::{Texture, TEXTURE_DIMENSIONS};
@ -14,14 +14,17 @@ use texture::{Texture, TEXTURE_DIMENSIONS};
pub struct Vertex {
pub pos: [f32; 2],
/// Rgba color by default but if texture flag is not set.
/// Else the first 2 f32 are texture coordinates and the 2 last are not important
/// Else the first 2 f32 are texture coordinates and the 2 last are not used
pub color: [f32; 4],
/// Each bit is used as a flag :
///
/// 1: Scaled and moved according to camera
///
/// 2: Grayscale
///
/// 4: Texture instead of color
///
/// For exemple 0b01 corresponds to Scaled and 0b11 to Scaled and Grayscale
/// For example 0b001 corresponds to Scaled and 0b011 to Scaled and Grayscale
pub effect: u32,
}
impl Vertex {
@ -205,7 +208,22 @@ impl<'a> Graphics<'a> {
module: &shader,
entry_point: "fs_main",
compilation_options: Default::default(),
targets: &[Some(swapchain_format.into())],
targets: &[Some(wgpu::ColorTargetState {
format: swapchain_format,
blend: Some(wgpu::BlendState {
color: wgpu::BlendComponent {
src_factor: wgpu::BlendFactor::SrcAlpha,
dst_factor: wgpu::BlendFactor::OneMinusSrcAlpha,
operation: wgpu::BlendOperation::Add
},
alpha: wgpu::BlendComponent {
src_factor: wgpu::BlendFactor::One,
dst_factor: wgpu::BlendFactor::One,
operation: wgpu::BlendOperation::Add
}
}),
write_mask: wgpu::ColorWrites::ALL,
})],
}),
primitive: wgpu::PrimitiveState::default(),
depth_stencil: None,
@ -265,27 +283,6 @@ impl<'a> Graphics<'a> {
_ => {}
}
}
pub fn event(&mut self, event: &Event<()>, window: &Window) {
match event {
Event::WindowEvent {
event: WindowEvent::Resized(new_size),
..
} => {
// Reconfigure the surface with the new size
self.surface_config.width = new_size.width;
self.surface_config.height = new_size.height;
self.surface.configure(&self.device, &self.surface_config);
// On macos the window needs to be redrawn manually after resizing
window.request_redraw();
},
Event::AboutToWait => {
// RedrawRequested will only trigger once unless we manually
// request it.
window.request_redraw();
},
_ => {}
}
}
pub fn render(&self, state: &State) {
let frame = self.surface
.get_current_texture()