/* ENSnano, a 3d graphical application for DNA nanostructures. Copyright (C) 2021 Nicolas Levy and Nicolas Schabanel This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ use crate::utils::create_buffer_with_data; use iced_wgpu::wgpu; use ultraviolet::Vec3; use wgpu::{BindGroup, BindGroupLayout, Device}; #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct Light { position: Vec3, // Due to uniforms requiring 16 byte (4 float) spacing, we need to use a padding field here _padding: u32, color: Vec3, } impl Light { #[allow(dead_code)] pub fn new(position: [f32; 3], color: [f32; 3]) -> Self { Self { position: position.into(), _padding: 0, color: color.into(), } } } #[allow(dead_code)] pub fn create_light(device: &Device) -> (BindGroup, BindGroupLayout) { let light = Light::new([0.0, 0.0, 1000.0], [1.0, 1.0, 1.0]); let light_buffer = create_buffer_with_data( device, bytemuck::cast_slice(&[light]), wgpu::BufferUsage::UNIFORM | wgpu::BufferUsage::COPY_DST, ); let light_bind_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { entries: &[wgpu::BindGroupLayoutEntry { binding: 0, visibility: wgpu::ShaderStage::VERTEX | wgpu::ShaderStage::FRAGMENT, ty: wgpu::BindingType::Buffer { ty: wgpu::BufferBindingType::Uniform, has_dynamic_offset: false, min_binding_size: None, }, count: None, }], label: Some("light_bind_group_layout"), }); let light_bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { layout: &light_bind_group_layout, entries: &[wgpu::BindGroupEntry { binding: 0, resource: wgpu::BindingResource::Buffer { buffer: &light_buffer, offset: 0, size: None, }, }], label: Some("light bind group"), }); (light_bind_group, light_bind_group_layout) } unsafe impl bytemuck::Zeroable for Light {} unsafe impl bytemuck::Pod for Light {}