renderling/
material.rs

1//! Atlas images, used for materials. CPU and GPU.
2
3#[cfg(cpu)]
4mod cpu;
5#[cfg(cpu)]
6pub use cpu::*;
7
8pub mod shader {
9    //! Material shader types.
10
11    use crabslab::{Id, SlabItem};
12    use glam::{Vec3, Vec4};
13
14    use crate::atlas::shader::AtlasTextureDescriptor;
15
16    /// Represents a material on the GPU.
17    #[repr(C)]
18    #[derive(Clone, Copy, PartialEq, SlabItem, core::fmt::Debug)]
19    pub struct MaterialDescriptor {
20        pub emissive_factor: Vec3,
21        pub emissive_strength_multiplier: f32,
22        pub albedo_factor: Vec4,
23        pub metallic_factor: f32,
24        pub roughness_factor: f32,
25
26        pub albedo_texture_id: Id<AtlasTextureDescriptor>,
27        pub metallic_roughness_texture_id: Id<AtlasTextureDescriptor>,
28        pub normal_texture_id: Id<AtlasTextureDescriptor>,
29        pub ao_texture_id: Id<AtlasTextureDescriptor>,
30        pub emissive_texture_id: Id<AtlasTextureDescriptor>,
31
32        pub albedo_tex_coord: u32,
33        pub metallic_roughness_tex_coord: u32,
34        pub normal_tex_coord: u32,
35        pub ao_tex_coord: u32,
36        pub emissive_tex_coord: u32,
37
38        pub has_lighting: bool,
39        pub ao_strength: f32,
40    }
41
42    impl Default for MaterialDescriptor {
43        fn default() -> Self {
44            Self {
45                emissive_factor: Vec3::ZERO,
46                emissive_strength_multiplier: 1.0,
47                albedo_factor: Vec4::ONE,
48                metallic_factor: 1.0,
49                roughness_factor: 1.0,
50                albedo_texture_id: Id::NONE,
51                metallic_roughness_texture_id: Id::NONE,
52                normal_texture_id: Id::NONE,
53                ao_texture_id: Id::NONE,
54                albedo_tex_coord: 0,
55                metallic_roughness_tex_coord: 0,
56                normal_tex_coord: 0,
57                ao_tex_coord: 0,
58                has_lighting: true,
59                ao_strength: 0.0,
60                emissive_texture_id: Id::NONE,
61                emissive_tex_coord: 0,
62            }
63        }
64    }
65}