diff --git a/studio/assets/shaders/procedural_grid.wgsl b/studio/assets/shaders/procedural_grid.wgsl index 952ffe5..03f2c91 100644 --- a/studio/assets/shaders/procedural_grid.wgsl +++ b/studio/assets/shaders/procedural_grid.wgsl @@ -40,5 +40,5 @@ fn fragment(in: MeshVertexOutput) -> @location(0) vec4 { let base = grid_lines(pos, depth, 1.0, 0.0001, 0.01); let sparse = grid_lines(pos, depth, 0.1, 0.00005, 0.005); - return vec4(0.5, 0.5, 0.5, 0.5) * min(0.5, saturate(dense + base + sparse)); + return vec4(1.0, 1.0, 1.0, 0.25) * saturate(dense + base + sparse); } diff --git a/studio/assets/skyboxes/gum_trees_4k.hdr b/studio/assets/skyboxes/gum_trees_4k.hdr new file mode 100644 index 0000000..12422c4 Binary files /dev/null and b/studio/assets/skyboxes/gum_trees_4k.hdr differ diff --git a/studio/assets/skyboxes/gum_trees_4k_diffuse.zstd.ktx2 b/studio/assets/skyboxes/gum_trees_4k_diffuse.zstd.ktx2 new file mode 100644 index 0000000..c16faf0 Binary files /dev/null and b/studio/assets/skyboxes/gum_trees_4k_diffuse.zstd.ktx2 differ diff --git a/studio/assets/skyboxes/gum_trees_4k_specular.zstd.ktx2 b/studio/assets/skyboxes/gum_trees_4k_specular.zstd.ktx2 new file mode 100644 index 0000000..8505585 Binary files /dev/null and b/studio/assets/skyboxes/gum_trees_4k_specular.zstd.ktx2 differ diff --git a/studio/assets/skyboxes/kloofendal_28d_misty_4k.hdr b/studio/assets/skyboxes/kloofendal_28d_misty_4k.hdr new file mode 100644 index 0000000..101c4fa Binary files /dev/null and b/studio/assets/skyboxes/kloofendal_28d_misty_4k.hdr differ diff --git a/studio/assets/skyboxes/kloofendal_28d_misty_4k_diffuse.zstd.ktx2 b/studio/assets/skyboxes/kloofendal_28d_misty_4k_diffuse.zstd.ktx2 new file mode 100644 index 0000000..5ec2dee Binary files /dev/null and b/studio/assets/skyboxes/kloofendal_28d_misty_4k_diffuse.zstd.ktx2 differ diff --git a/studio/assets/skyboxes/kloofendal_28d_misty_4k_specular.zstd.ktx2 b/studio/assets/skyboxes/kloofendal_28d_misty_4k_specular.zstd.ktx2 new file mode 100644 index 0000000..1d74730 Binary files /dev/null and b/studio/assets/skyboxes/kloofendal_28d_misty_4k_specular.zstd.ktx2 differ diff --git a/studio/assets/skyboxes/meadow_4k.hdr b/studio/assets/skyboxes/meadow_4k.hdr new file mode 100644 index 0000000..8dfbd0f Binary files /dev/null and b/studio/assets/skyboxes/meadow_4k.hdr differ diff --git a/studio/assets/skyboxes/meadow_4k_diffuse.zstd.ktx2 b/studio/assets/skyboxes/meadow_4k_diffuse.zstd.ktx2 new file mode 100644 index 0000000..914eb25 Binary files /dev/null and b/studio/assets/skyboxes/meadow_4k_diffuse.zstd.ktx2 differ diff --git a/studio/assets/skyboxes/meadow_4k_specular.zstd.ktx2 b/studio/assets/skyboxes/meadow_4k_specular.zstd.ktx2 new file mode 100644 index 0000000..ec154ef Binary files /dev/null and b/studio/assets/skyboxes/meadow_4k_specular.zstd.ktx2 differ diff --git a/studio/assets/skyboxes/promenade_de_vidy_4k.hdr b/studio/assets/skyboxes/promenade_de_vidy_4k.hdr new file mode 100644 index 0000000..dc726f8 Binary files /dev/null and b/studio/assets/skyboxes/promenade_de_vidy_4k.hdr differ diff --git a/studio/assets/skyboxes/promenade_de_vidy_4k_diffuse.zstd.ktx2 b/studio/assets/skyboxes/promenade_de_vidy_4k_diffuse.zstd.ktx2 new file mode 100644 index 0000000..fb8526e Binary files /dev/null and b/studio/assets/skyboxes/promenade_de_vidy_4k_diffuse.zstd.ktx2 differ diff --git a/studio/assets/skyboxes/promenade_de_vidy_4k_specular.zstd.ktx2 b/studio/assets/skyboxes/promenade_de_vidy_4k_specular.zstd.ktx2 new file mode 100644 index 0000000..dd67e70 Binary files /dev/null and b/studio/assets/skyboxes/promenade_de_vidy_4k_specular.zstd.ktx2 differ diff --git a/studio/assets/skyboxes/scythian_tombs_4k.hdr b/studio/assets/skyboxes/scythian_tombs_4k.hdr new file mode 100644 index 0000000..a9084ac Binary files /dev/null and b/studio/assets/skyboxes/scythian_tombs_4k.hdr differ diff --git a/studio/assets/skyboxes/scythian_tombs_4k_diffuse.zstd.ktx2 b/studio/assets/skyboxes/scythian_tombs_4k_diffuse.zstd.ktx2 new file mode 100644 index 0000000..0ce1826 Binary files /dev/null and b/studio/assets/skyboxes/scythian_tombs_4k_diffuse.zstd.ktx2 differ diff --git a/studio/assets/skyboxes/scythian_tombs_4k_specular.zstd.ktx2 b/studio/assets/skyboxes/scythian_tombs_4k_specular.zstd.ktx2 new file mode 100644 index 0000000..3acacec Binary files /dev/null and b/studio/assets/skyboxes/scythian_tombs_4k_specular.zstd.ktx2 differ diff --git a/studio/src/lib.rs b/studio/src/lib.rs index 6aafdbc..eb5cfa3 100644 --- a/studio/src/lib.rs +++ b/studio/src/lib.rs @@ -2,12 +2,14 @@ use bevy::prelude::*; use orbit_cam::{OrbitCam, OrbitCamPlugin}; +use skybox::SkyboxPlugin; use test_scene::TestScenePlugin; use ui::UiLayerPlugin; use viewport::ViewportSize; use wasm_bindgen::prelude::*; mod orbit_cam; +mod skybox; mod test_scene; mod ui; mod viewport; @@ -32,6 +34,7 @@ pub fn init(viewport_size: ViewportSize) { }), OrbitCamPlugin, TestScenePlugin, + SkyboxPlugin, UiLayerPlugin, )) .add_systems(Update, draw_world_axes.after(orbit_cam::pan_orbit_camera)) diff --git a/studio/src/skybox.rs b/studio/src/skybox.rs new file mode 100644 index 0000000..4ec86b5 --- /dev/null +++ b/studio/src/skybox.rs @@ -0,0 +1,89 @@ +use core::fmt; + +use bevy::{ + asset::LoadState, + core_pipeline::Skybox, + prelude::*, + render::render_resource::{TextureViewDescriptor, TextureViewDimension}, +}; + +pub struct SkyboxPlugin; + +impl Plugin for SkyboxPlugin { + fn build(&self, app: &mut App) { + app.add_systems(Startup, setup) + .add_systems(Update, asset_loaded); + } +} + +#[derive(Resource)] +pub struct Cubemap { + is_loaded: bool, + image_handle: Handle, + env_diffuse: Handle, + env_specular: Handle, +} + +impl Cubemap { + fn new(name: impl fmt::Display, assets: &Res) -> Self { + let paths = SkyboxPaths::new(name); + + Self { + is_loaded: false, + image_handle: assets.load(paths.main), + env_diffuse: assets.load(paths.env_diffuse), + env_specular: assets.load(paths.env_specular), + } + } +} + +pub struct SkyboxPaths { + pub main: String, + pub env_diffuse: String, + pub env_specular: String, +} + +impl SkyboxPaths { + fn new(name: impl fmt::Display) -> Self { + Self { + main: format!("skyboxes/{name}.hdr"), + env_diffuse: format!("skyboxes/{name}_diffuse.zstd.ktx2"), + env_specular: format!("skyboxes/{name}_specular.zstd.ktx2"), + } + } +} + +fn setup(mut cmd: Commands, assets: Res) { + cmd.insert_resource(Cubemap::new("promenade_de_vidy_4k", &assets)); +} + +fn asset_loaded( + assets: Res, + camera: Query>, + mut cmd: Commands, + mut images: ResMut>, + mut cubemap: ResMut, +) { + if !cubemap.is_loaded + && assets.get_load_state(cubemap.image_handle.clone_weak()) == LoadState::Loaded + { + let image = images.get_mut(&cubemap.image_handle).unwrap(); + if image.texture_descriptor.array_layer_count() == 1 { + image.reinterpret_stacked_2d_as_array(6); + image.texture_view_descriptor = Some(TextureViewDescriptor { + dimension: Some(TextureViewDimension::Cube), + ..default() + }); + } + + cmd.entity(camera.single()).insert(( + Skybox(cubemap.image_handle.clone()), + EnvironmentMapLight { + diffuse_map: cubemap.env_diffuse.clone(), + specular_map: cubemap.env_specular.clone(), + }, + )); + + cubemap.is_loaded = true; + } +} diff --git a/studio/src/test_scene.rs b/studio/src/test_scene.rs index 8cafe98..9235022 100644 --- a/studio/src/test_scene.rs +++ b/studio/src/test_scene.rs @@ -34,25 +34,11 @@ fn spawn_scene( mut std_mats: ResMut>, mut mat_proc_grid: ResMut>, ) { - let mut light_xform = Transform::IDENTITY; - light_xform.rotation = Quat::from_rotation_y(f32::to_radians(-70.0)) * light_xform.rotation; - light_xform.rotation *= Quat::from_rotation_x(f32::to_radians(-60.0)); - - cmd.spawn(DirectionalLightBundle { - directional_light: DirectionalLight { - illuminance: 25_000.0, - shadows_enabled: true, - ..default() - }, - transform: light_xform, - ..default() - }); - - // Cube + // Sphere cmd.spawn(PbrBundle { - mesh: meshes.add(Mesh::from(shape::Cube { size: 1.0 })), + mesh: meshes.add(Mesh::try_from(shape::Icosphere::default()).unwrap()), material: std_mats.add(StandardMaterial { - base_color: Color::SILVER, + base_color: Color::WHITE, ..default() }), transform: Transform::IDENTITY,