nightshade_api/
environment.rs1use crate::runner::{SUN_NAME, lookup_named};
4use nightshade::ecs::graphics::resources::DepthOfField;
5use nightshade::prelude::*;
6use serde::{Deserialize, Serialize};
7
8pub use nightshade::ecs::graphics::resources::TonemapAlgorithm as Tonemap;
12
13#[derive(Clone, Debug, Serialize, Deserialize, enum2schema::Schema)]
15pub enum Background {
16 Sky,
18 CloudySky,
20 Space,
22 Nebula,
24 Sunset,
26 Color([f32; 4]),
28 Hdr(Vec<u8>),
30}
31
32pub fn set_background(world: &mut World, background: Background) {
37 match background {
38 Background::Sky => set_atmosphere(world, Atmosphere::Sky),
39 Background::CloudySky => set_atmosphere(world, Atmosphere::CloudySky),
40 Background::Space => set_atmosphere(world, Atmosphere::Space),
41 Background::Nebula => set_atmosphere(world, Atmosphere::Nebula),
42 Background::Sunset => set_atmosphere(world, Atmosphere::Sunset),
43 Background::Color(color) => {
44 world.resources.render_settings.atmosphere = Atmosphere::None;
45 world.resources.render_settings.clear_color = color;
46 }
47 Background::Hdr(bytes) => {
48 load_hdr_skybox(world, bytes);
49 }
50 }
51}
52
53fn set_atmosphere(world: &mut World, atmosphere: Atmosphere) {
54 world.resources.render_settings.atmosphere = atmosphere;
55 capture_procedural_atmosphere_ibl(world, atmosphere, 0.0);
56}
57
58#[inline]
60pub fn show_grid(world: &mut World, enabled: bool) {
61 world.resources.debug_draw.show_grid = enabled;
62}
63
64#[inline]
66pub fn set_ambient(world: &mut World, color: [f32; 4]) {
67 world.resources.render_settings.ambient_light = color;
68}
69
70#[inline]
72pub fn set_clear_color(world: &mut World, color: [f32; 4]) {
73 world.resources.render_settings.clear_color = color;
74}
75
76#[inline]
79pub fn set_fog(world: &mut World, fog: Option<Fog>) {
80 world.resources.render_settings.fog = fog;
81}
82
83#[inline]
85pub fn set_bloom(world: &mut World, enabled: bool) {
86 world.resources.render_settings.bloom_enabled = enabled;
87}
88
89#[inline]
92pub fn set_bloom_intensity(world: &mut World, intensity: f32) {
93 world.resources.render_settings.bloom_intensity = intensity;
94}
95
96pub fn set_time_of_day(world: &mut World, hour: f32) {
101 if world
102 .resources
103 .renderer_state
104 .day_night
105 .sun_entity
106 .is_none()
107 {
108 world.resources.renderer_state.day_night.sun_entity = lookup_named(world, SUN_NAME);
109 }
110 world.resources.render_settings.atmosphere = Atmosphere::DayNight;
111 world.resources.renderer_state.day_night.auto_cycle = true;
112 world.resources.renderer_state.day_night.speed = 0.0;
113 world.resources.renderer_state.day_night.hour = hour;
114}
115
116#[inline]
119pub fn set_exposure(world: &mut World, exposure: f32) {
120 world.resources.render_settings.color_grading.exposure = exposure;
121}
122
123#[inline]
127pub fn set_depth_of_field(world: &mut World, depth_of_field: DepthOfField) {
128 world.resources.render_settings.depth_of_field = depth_of_field;
129}
130
131#[inline]
134pub fn set_ssao(world: &mut World, enabled: bool) {
135 world.resources.render_settings.ssao_enabled = enabled;
136}
137
138#[inline]
140pub fn set_ssr(world: &mut World, enabled: bool) {
141 world.resources.render_settings.ssr_enabled = enabled;
142}
143
144#[inline]
147pub fn set_ssgi(world: &mut World, enabled: bool) {
148 world.resources.render_settings.ssgi_enabled = enabled;
149}
150
151#[inline]
153pub fn set_taa(world: &mut World, enabled: bool) {
154 world.resources.render_settings.taa_enabled = enabled;
155}
156
157#[inline]
159pub fn set_tonemap(world: &mut World, tonemap: Tonemap) {
160 world
161 .resources
162 .render_settings
163 .color_grading
164 .tonemap_algorithm = tonemap;
165}
166
167#[inline]
170pub fn set_color_grading(world: &mut World, saturation: f32, contrast: f32, brightness: f32) {
171 let grading = &mut world.resources.render_settings.color_grading;
172 grading.saturation = saturation;
173 grading.contrast = contrast;
174 grading.brightness = brightness;
175}
176
177pub fn screenshot(world: &mut World, path: std::path::PathBuf) {
179 queue_render_command(
180 world,
181 RenderCommand::CaptureScreenshot {
182 path: Some(path),
183 max_dimension: None,
184 },
185 );
186}