bevy_render/texture/
mod.rs

1mod fallback_image;
2mod gpu_image;
3mod manual_texture_view;
4mod texture_attachment;
5mod texture_cache;
6
7pub use crate::render_resource::DefaultImageSampler;
8use bevy_image::{CompressedImageFormatSupport, CompressedImageFormats, ImageLoader, ImagePlugin};
9pub use fallback_image::*;
10pub use gpu_image::*;
11pub use manual_texture_view::*;
12pub use texture_attachment::*;
13pub use texture_cache::*;
14
15use crate::{
16    extract_resource::ExtractResourcePlugin, render_asset::RenderAssetPlugin,
17    renderer::RenderDevice, Render, RenderApp, RenderSystems,
18};
19use bevy_app::{App, Plugin};
20use bevy_asset::AssetApp;
21use bevy_ecs::prelude::*;
22use tracing::warn;
23
24#[derive(Default)]
25pub struct TexturePlugin;
26
27impl Plugin for TexturePlugin {
28    fn build(&self, app: &mut App) {
29        app.add_plugins((
30            RenderAssetPlugin::<GpuImage>::default(),
31            ExtractResourcePlugin::<ManualTextureViews>::default(),
32        ))
33        .init_resource::<ManualTextureViews>();
34        if let Some(render_app) = app.get_sub_app_mut(RenderApp) {
35            render_app.init_resource::<TextureCache>().add_systems(
36                Render,
37                update_texture_cache_system.in_set(RenderSystems::Cleanup),
38            );
39        }
40    }
41
42    fn finish(&self, app: &mut App) {
43        if !ImageLoader::SUPPORTED_FORMATS.is_empty() {
44            let supported_compressed_formats = if let Some(resource) =
45                app.world().get_resource::<CompressedImageFormatSupport>()
46            {
47                resource.0
48            } else {
49                warn!("CompressedImageFormatSupport resource not found. It should either be initialized in finish() of \
50                       RenderPlugin, or manually if not using the RenderPlugin or the WGPU backend.");
51                CompressedImageFormats::NONE
52            };
53
54            app.register_asset_loader(ImageLoader::new(supported_compressed_formats));
55        }
56        let default_sampler = app.get_added_plugins::<ImagePlugin>()[0]
57            .default_sampler
58            .clone();
59
60        if let Some(render_app) = app.get_sub_app_mut(RenderApp) {
61            let default_sampler = {
62                let device = render_app.world().resource::<RenderDevice>();
63                device.create_sampler(&default_sampler.as_wgpu())
64            };
65            render_app
66                .insert_resource(DefaultImageSampler(default_sampler))
67                .init_resource::<FallbackImage>()
68                .init_resource::<FallbackImageZero>()
69                .init_resource::<FallbackImageCubemap>()
70                .init_resource::<FallbackImageFormatMsaaCache>();
71        }
72    }
73}