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]
73pub fn set_fog(world: &mut World, fog: Option<Fog>) {
74 world.resources.render_settings.fog = fog;
75}
76
77#[inline]
79pub fn set_bloom(world: &mut World, enabled: bool) {
80 world.resources.render_settings.bloom_enabled = enabled;
81}
82
83#[inline]
86pub fn set_bloom_intensity(world: &mut World, intensity: f32) {
87 world.resources.render_settings.bloom_intensity = intensity;
88}
89
90pub fn set_time_of_day(world: &mut World, hour: f32) {
95 if world
96 .resources
97 .renderer_state
98 .day_night
99 .sun_entity
100 .is_none()
101 {
102 world.resources.renderer_state.day_night.sun_entity = lookup_named(world, SUN_NAME);
103 }
104 world.resources.render_settings.atmosphere = Atmosphere::DayNight;
105 world.resources.renderer_state.day_night.auto_cycle = true;
106 world.resources.renderer_state.day_night.speed = 0.0;
107 world.resources.renderer_state.day_night.hour = hour;
108}
109
110#[inline]
113pub fn set_exposure(world: &mut World, exposure: f32) {
114 world.resources.render_settings.color_grading.exposure = exposure;
115}
116
117#[inline]
121pub fn set_depth_of_field(world: &mut World, depth_of_field: DepthOfField) {
122 world.resources.render_settings.depth_of_field = depth_of_field;
123}
124
125#[inline]
128pub fn set_ssao(world: &mut World, enabled: bool) {
129 world.resources.render_settings.ssao_enabled = enabled;
130}
131
132#[inline]
134pub fn set_ssr(world: &mut World, enabled: bool) {
135 world.resources.render_settings.ssr_enabled = enabled;
136}
137
138#[inline]
141pub fn set_ssgi(world: &mut World, enabled: bool) {
142 world.resources.render_settings.ssgi_enabled = enabled;
143}
144
145#[inline]
147pub fn set_taa(world: &mut World, enabled: bool) {
148 world.resources.render_settings.taa_enabled = enabled;
149}
150
151#[inline]
153pub fn set_tonemap(world: &mut World, tonemap: Tonemap) {
154 world
155 .resources
156 .render_settings
157 .color_grading
158 .tonemap_algorithm = tonemap;
159}
160
161#[inline]
164pub fn set_color_grading(world: &mut World, saturation: f32, contrast: f32, brightness: f32) {
165 let grading = &mut world.resources.render_settings.color_grading;
166 grading.saturation = saturation;
167 grading.contrast = contrast;
168 grading.brightness = brightness;
169}
170
171#[inline]
173pub fn set_title(world: &mut World, title: &str) {
174 world.resources.window.title = title.to_string();
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}