wde_pbr/deferred/lights/
pbr_params.rs1use 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 pub lighting_params: [f32; 4],
34 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}