Skip to main content

wde_pbr/deferred/lights/
pbr_params.rs

1use bevy::prelude::*;
2use bytemuck::{Pod, Zeroable};
3
4#[derive(Resource, Clone, Copy, Debug, Reflect)]
5#[reflect(Resource)]
6pub struct PbrSettings {
7    pub direct_scale: f32,
8    pub ambient_scale: f32,
9    pub exposure: f32,
10    pub tone_map_white: f32,
11    pub metallic_scale: f32,
12    pub roughness_scale: f32,
13    pub min_roughness: f32
14}
15impl Default for PbrSettings {
16    fn default() -> Self {
17        Self {
18            direct_scale: 1.0,
19            ambient_scale: 0.2,
20            exposure: 1.0,
21            tone_map_white: 1.0,
22            metallic_scale: 1.0,
23            roughness_scale: 1.0,
24            min_roughness: 0.0
25        }
26    }
27}
28
29#[repr(C)]
30#[derive(Resource, Clone, Copy, Debug, Pod, Zeroable)]
31pub struct PbrParamsUniform {
32    /// x=direct_scale, y=ambient_scale, z=exposure, w=tone_map_white
33    pub lighting_params: [f32; 4],
34    /// x=metallic_scale, y=roughness_scale, z=min_roughness
35    pub material_params: [f32; 4]
36}
37impl Default for PbrParamsUniform {
38    fn default() -> Self {
39        Self::from_settings(&PbrSettings::default())
40    }
41}
42
43impl PbrParamsUniform {
44    #[inline]
45    pub fn from_settings(settings: &PbrSettings) -> Self {
46        Self {
47            lighting_params: [
48                settings.direct_scale,
49                settings.ambient_scale,
50                settings.exposure,
51                settings.tone_map_white.max(0.001)
52            ],
53            material_params: [
54                settings.metallic_scale,
55                settings.roughness_scale,
56                settings.min_roughness.clamp(0.001, 1.0),
57                0.0
58            ]
59        }
60    }
61}