From 27eea41398945be4e323a659431c4cff6a36e8e7 Mon Sep 17 00:00:00 2001 From: hut Date: Sat, 16 Mar 2024 16:22:44 +0100 Subject: [PATCH] load a skybox with stars --- assets/textures/stars_cubemap.png | Bin 0 -> 34841 bytes src/main.rs | 106 +++++++++++++++++++++++++++++- 2 files changed, 104 insertions(+), 2 deletions(-) create mode 100644 assets/textures/stars_cubemap.png diff --git a/assets/textures/stars_cubemap.png b/assets/textures/stars_cubemap.png new file mode 100644 index 0000000000000000000000000000000000000000..a6420aaf5cd84ed17f318fc15a15f619ed5e8381 GIT binary patch literal 34841 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, +} + +const CUBEMAPS: &[(&str, CompressedImageFormats)] = &[ + ( + "textures/stars_cubemap.png", + CompressedImageFormats::NONE, + ), +]; + +fn setup(mut commands: Commands, asset_server: Res) { + let skybox_handle = asset_server.load(CUBEMAPS[0].0); + // camera + commands.spawn(( + Camera3dBundle { + transform: Transform::from_xyz(0.0, 0.0, 8.0).looking_at(Vec3::ZERO, Vec3::Y), + ..default() + }, + Skybox { + image: skybox_handle.clone(), + brightness: 150.0, + }, + )); + commands.insert_resource(Cubemap { + is_loaded: false, + index: 0, + image_handle: skybox_handle, + }); +} + +fn load_cubemap_asset( + mut cubemap: ResMut, + asset_server: Res, + render_device: Res, +) { + let supported_compressed_formats = + CompressedImageFormats::from_features(render_device.features()); + + let mut new_index = cubemap.index; + for _ in 0..CUBEMAPS.len() { + new_index = (new_index + 1) % CUBEMAPS.len(); + if supported_compressed_formats.contains(CUBEMAPS[new_index].1) { + break; + } + info!("Skipping unsupported format: {:?}", CUBEMAPS[new_index]); + } + + // Skip swapping to the same texture. Useful for when ktx2, zstd, or compressed texture support + // is missing + if new_index == cubemap.index { + return; + } + + cubemap.index = new_index; + cubemap.image_handle = asset_server.load(CUBEMAPS[cubemap.index].0); + cubemap.is_loaded = false; +} + +fn asset_loaded( + asset_server: Res, + mut images: ResMut>, + mut cubemap: ResMut, + mut skyboxes: Query<&mut Skybox>, +) { + if !cubemap.is_loaded && asset_server.load_state(&cubemap.image_handle) == LoadState::Loaded { + info!("Swapping to {}...", CUBEMAPS[cubemap.index].0); + let image = images.get_mut(&cubemap.image_handle).unwrap(); + // NOTE: PNGs do not have any metadata that could indicate they contain a cubemap texture, + // so they appear as one texture. The following code reconfigures the texture as necessary. + if image.texture_descriptor.array_layer_count() == 1 { + image.reinterpret_stacked_2d_as_array(image.height() / image.width()); + image.texture_view_descriptor = Some(TextureViewDescriptor { + dimension: Some(TextureViewDimension::Cube), + ..default() + }); + } + + for mut skybox in &mut skyboxes { + skybox.image = cubemap.image_handle.clone(); + } + + cubemap.is_loaded = true; + } +} + fn handle_input( keyboard_input: Res>, mut app_exit_events: ResMut>