From 6aea5ca354ed706721afcea8df0b230734991716 Mon Sep 17 00:00:00 2001 From: Nathan Jeffords Date: Tue, 8 Dec 2020 23:03:11 -0800 Subject: [PATCH 1/3] add ability to load `.dds`, `.tga`, and `.jpeg` texture formats controled by non-defaulted features of the same name --- Cargo.toml | 3 ++ crates/bevy_internal/Cargo.toml | 3 ++ crates/bevy_render/Cargo.toml | 3 ++ .../src/texture/image_texture_loader.rs | 39 +++++++++++++++---- 4 files changed, 41 insertions(+), 7 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 0805c2890aeae..2bf46c8a7f777 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -55,6 +55,9 @@ wgpu_trace = ["bevy_internal/wgpu_trace"] # Image format support for texture loading (PNG and HDR are enabled by default) hdr = ["bevy_internal/hdr"] png = ["bevy_internal/png"] +dds = ["bevy_internal/dds"] +tga = ["bevy_internal/tga"] +jpeg = ["bevy_internal/jpeg"] # Audio format support (MP3 is enabled by default) flac = ["bevy_internal/flac"] diff --git a/crates/bevy_internal/Cargo.toml b/crates/bevy_internal/Cargo.toml index 4475b06e80eff..49cd22cb7715d 100644 --- a/crates/bevy_internal/Cargo.toml +++ b/crates/bevy_internal/Cargo.toml @@ -21,6 +21,9 @@ trace_chrome = [ "bevy_log/tracing-chrome" ] # Image format support for texture loading (PNG and HDR are enabled by default) hdr = ["bevy_render/hdr"] png = ["bevy_render/png"] +dds = ["bevy_render/dds"] +tga = ["bevy_render/tga"] +jpeg = ["bevy_render/jpeg"] # Audio format support (MP3 is enabled by default) flac = ["bevy_audio/flac"] diff --git a/crates/bevy_render/Cargo.toml b/crates/bevy_render/Cargo.toml index 8528587e037ca..8732535ac271a 100644 --- a/crates/bevy_render/Cargo.toml +++ b/crates/bevy_render/Cargo.toml @@ -53,3 +53,6 @@ shaderc = "0.7.0" [features] png = ["image/png"] hdr = ["image/hdr"] +dds = ["image/dds"] +tga = ["image/tga"] +jpeg = ["image/jpeg"] diff --git a/crates/bevy_render/src/texture/image_texture_loader.rs b/crates/bevy_render/src/texture/image_texture_loader.rs index ef0ed28eb71ec..74b9e7b07763e 100644 --- a/crates/bevy_render/src/texture/image_texture_loader.rs +++ b/crates/bevy_render/src/texture/image_texture_loader.rs @@ -9,6 +9,32 @@ use bevy_utils::BoxedFuture; #[derive(Clone, Default)] pub struct ImageTextureLoader; +macro_rules! define_file_extensions { + ( $( $s:literal => $v:ident ),+ $(,)? ) => { + + const FILE_EXTENSIONS: &'static [&'static str] = &[ + $( $s ),+ + ]; + + fn match_file_extension (ext: &str) -> Option + { + if false { None } $( + + else if ext.eq_ignore_ascii_case ($s) { + Some(image::ImageFormat::$v) + } + + )+ else { None } + } + + }; +} + +define_file_extensions! { + "png" => Png, "dds" => Dds, + "tga" => Tga, "jpeg" => Jpeg, +} + impl AssetLoader for ImageTextureLoader { fn load<'a>( &'a self, @@ -23,16 +49,15 @@ impl AssetLoader for ImageTextureLoader { let ext = load_context.path().extension().unwrap().to_str().unwrap(); - // NOTE: If more formats are added they can be added here. - let img_format = if ext.eq_ignore_ascii_case("png") { - image::ImageFormat::Png - } else { - panic!( + let img_format = match_file_extension(ext) + .ok_or_else(|| { + format!( "Unexpected image format {:?} for file {}, this is an error in `bevy_render`.", ext, load_context.path().display() ) - }; + }) + .unwrap(); // Load the image in the expected format. // Some formats like PNG allow for R or RG textures too, so the texture @@ -159,6 +184,6 @@ impl AssetLoader for ImageTextureLoader { } fn extensions(&self) -> &[&str] { - &["png"] + FILE_EXTENSIONS } } From 4a777053ad173b837657dfe1a48cbae04232aa65 Mon Sep 17 00:00:00 2001 From: Nathan Jeffords Date: Tue, 8 Dec 2020 23:33:42 -0800 Subject: [PATCH 2/3] add `.jpg` to list of supported image file extensions --- crates/bevy_render/src/texture/image_texture_loader.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/crates/bevy_render/src/texture/image_texture_loader.rs b/crates/bevy_render/src/texture/image_texture_loader.rs index 74b9e7b07763e..7608fe485df11 100644 --- a/crates/bevy_render/src/texture/image_texture_loader.rs +++ b/crates/bevy_render/src/texture/image_texture_loader.rs @@ -32,7 +32,8 @@ macro_rules! define_file_extensions { define_file_extensions! { "png" => Png, "dds" => Dds, - "tga" => Tga, "jpeg" => Jpeg, + "tga" => Tga, "jpg" => Jpeg, + "jpeg" => Jpeg, } impl AssetLoader for ImageTextureLoader { From 58e2b16aa93413a9f1d7d319fae6794b8fb06baa Mon Sep 17 00:00:00 2001 From: Nathan Jeffords Date: Wed, 9 Dec 2020 17:51:10 -0800 Subject: [PATCH 3/3] update handling of image file type based on feedback from review --- .../src/texture/image_texture_loader.rs | 29 ++----------------- 1 file changed, 2 insertions(+), 27 deletions(-) diff --git a/crates/bevy_render/src/texture/image_texture_loader.rs b/crates/bevy_render/src/texture/image_texture_loader.rs index 7608fe485df11..f866a0751843b 100644 --- a/crates/bevy_render/src/texture/image_texture_loader.rs +++ b/crates/bevy_render/src/texture/image_texture_loader.rs @@ -9,32 +9,7 @@ use bevy_utils::BoxedFuture; #[derive(Clone, Default)] pub struct ImageTextureLoader; -macro_rules! define_file_extensions { - ( $( $s:literal => $v:ident ),+ $(,)? ) => { - - const FILE_EXTENSIONS: &'static [&'static str] = &[ - $( $s ),+ - ]; - - fn match_file_extension (ext: &str) -> Option - { - if false { None } $( - - else if ext.eq_ignore_ascii_case ($s) { - Some(image::ImageFormat::$v) - } - - )+ else { None } - } - - }; -} - -define_file_extensions! { - "png" => Png, "dds" => Dds, - "tga" => Tga, "jpg" => Jpeg, - "jpeg" => Jpeg, -} +const FILE_EXTENSIONS: &[&str] = &["png", "dds", "tga", "jpg", "jpeg"]; impl AssetLoader for ImageTextureLoader { fn load<'a>( @@ -50,7 +25,7 @@ impl AssetLoader for ImageTextureLoader { let ext = load_context.path().extension().unwrap().to_str().unwrap(); - let img_format = match_file_extension(ext) + let img_format = image::ImageFormat::from_extension(ext) .ok_or_else(|| { format!( "Unexpected image format {:?} for file {}, this is an error in `bevy_render`.",