bevy_render/texture/
mod.rs1mod 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}