Skip to main content

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, init_gpu_resource, render_asset::RenderAssetPlugin,
17    render_resource::DefaultImageSamplerDescriptor, GpuResourceAppExt, Render, RenderApp,
18    RenderStartup, RenderSystems,
19};
20use bevy_app::{App, Plugin};
21use bevy_asset::AssetApp;
22use bevy_ecs::prelude::*;
23use bevy_log::warn;
24
25#[derive(Default)]
26pub struct TexturePlugin;
27
28impl Plugin for TexturePlugin {
29    fn build(&self, app: &mut App) {
30        app.add_plugins((
31            RenderAssetPlugin::<GpuImage>::default(),
32            ExtractResourcePlugin::<ManualTextureViews>::default(),
33        ))
34        .init_resource::<ManualTextureViews>();
35        if let Some(render_app) = app.get_sub_app_mut(RenderApp) {
36            render_app
37                .init_resource::<ManualTextureViews>()
38                .init_gpu_resource::<TextureCache>()
39                .allow_ambiguous_resource::<TextureCache>()
40                .add_systems(
41                    Render,
42                    update_texture_cache_system.in_set(RenderSystems::Cleanup),
43                );
44        }
45    }
46
47    fn finish(&self, app: &mut App) {
48        if !ImageLoader::SUPPORTED_FORMATS.is_empty() {
49            let supported_compressed_formats = if let Some(resource) =
50                app.world().get_resource::<CompressedImageFormatSupport>()
51            {
52                resource.0
53            } else {
54                warn!("CompressedImageFormatSupport resource not found. It should either be initialized in finish() of \
55                       RenderPlugin, or manually if not using the RenderPlugin or the WGPU backend.");
56                CompressedImageFormats::NONE
57            };
58
59            app.register_asset_loader(ImageLoader::new(supported_compressed_formats));
60        }
61        let default_sampler = app.get_added_plugins::<ImagePlugin>()[0]
62            .default_sampler
63            .clone();
64
65        if let Some(render_app) = app.get_sub_app_mut(RenderApp) {
66            render_app.insert_resource(DefaultImageSamplerDescriptor(default_sampler.clone()));
67            render_app.add_systems(
68                RenderStartup,
69                (
70                    init_gpu_resource::<DefaultImageSampler>,
71                    init_gpu_resource::<FallbackImage>,
72                    init_gpu_resource::<FallbackImageZero>,
73                    init_gpu_resource::<FallbackImageCubemap>,
74                    init_gpu_resource::<FallbackImageFormatMsaaCache>,
75                )
76                    .chain()
77                    .ambiguous_with_all(),
78            );
79        }
80    }
81}