Skip to content

Commit 87ccfca

Browse files
feature gate bevy_render
1 parent 9f04fc0 commit 87ccfca

22 files changed

+368
-275
lines changed

crates/bevy_image/src/image.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use super::dds::*;
55
#[cfg(feature = "ktx2")]
66
use super::ktx2::*;
77

8-
use bevy_asset::{Asset, RenderAssetUsages};
8+
use bevy_asset::{Asset, Handle, RenderAssetUsages};
99
use bevy_color::{Color, ColorToComponents, Gray, LinearRgba, Srgba, Xyza};
1010
use bevy_math::{AspectRatio, UVec2, UVec3, Vec2};
1111
use bevy_reflect::std_traits::ReflectDefault;
@@ -278,6 +278,14 @@ impl ImageFormat {
278278
}
279279
}
280280

281+
/// A handle to a 1 x 1 transparent white image.
282+
///
283+
/// Like [`Handle<Image>::default`], this is a handle to a fallback image asset.
284+
/// While that handle points to an opaque white 1 x 1 image, this handle points to a transparent 1 x 1 white image.
285+
// Number randomly selected by fair WolframAlpha query. Totally arbitrary.
286+
pub const TRANSPARENT_IMAGE_HANDLE: Handle<Image> =
287+
Handle::weak_from_u128(154728948001857810431816125397303024160);
288+
281289
#[derive(Asset, Reflect, Debug, Clone)]
282290
#[reflect(opaque)]
283291
#[reflect(Default, Debug)]

crates/bevy_render/src/texture/mod.rs

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,16 @@ mod texture_cache;
66
pub use crate::render_resource::DefaultImageSampler;
77
#[cfg(feature = "basis-universal")]
88
use bevy_image::CompressedImageSaver;
9+
#[cfg(feature = "exr")]
10+
pub use bevy_image::ExrTextureLoader;
911
#[cfg(feature = "hdr")]
10-
use bevy_image::HdrTextureLoader;
11-
use bevy_image::{CompressedImageFormats, Image, ImageLoader, ImageSamplerDescriptor};
12+
pub use bevy_image::HdrTextureLoader;
13+
pub use bevy_image::{
14+
BevyDefault, CompressedImageFormats, FileTextureError, Image, ImageAddressMode,
15+
ImageFilterMode, ImageFormat, ImageFormatSetting, ImageLoader, ImageLoaderError,
16+
ImageLoaderSettings, ImageSampler, ImageSamplerDescriptor, ImageType, IntoDynamicImageError,
17+
TextureError, TextureFormatPixelInfo, TRANSPARENT_IMAGE_HANDLE,
18+
};
1219
pub use fallback_image::*;
1320
pub use gpu_image::*;
1421
pub use texture_attachment::*;
@@ -21,14 +28,6 @@ use bevy_app::{App, Plugin};
2128
use bevy_asset::{AssetApp, Assets, Handle};
2229
use bevy_ecs::prelude::*;
2330

24-
/// A handle to a 1 x 1 transparent white image.
25-
///
26-
/// Like [`Handle<Image>::default`], this is a handle to a fallback image asset.
27-
/// While that handle points to an opaque white 1 x 1 image, this handle points to a transparent 1 x 1 white image.
28-
// Number randomly selected by fair WolframAlpha query. Totally arbitrary.
29-
pub const TRANSPARENT_IMAGE_HANDLE: Handle<Image> =
30-
Handle::weak_from_u128(154728948001857810431816125397303024160);
31-
3231
// TODO: replace Texture names with Image names?
3332
/// Adds the [`Image`] as an asset and makes sure that they are extracted and prepared for the GPU.
3433
pub struct ImagePlugin {
@@ -62,7 +61,7 @@ impl Plugin for ImagePlugin {
6261
fn build(&self, app: &mut App) {
6362
#[cfg(feature = "exr")]
6463
{
65-
app.init_asset_loader::<bevy_image::ExrTextureLoader>();
64+
app.init_asset_loader::<ExrTextureLoader>();
6665
}
6766

6867
#[cfg(feature = "hdr")]

crates/bevy_ui/Cargo.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,10 @@ bevy_math = { path = "../bevy_math", version = "0.15.0-dev" }
2424
bevy_reflect = { path = "../bevy_reflect", version = "0.15.0-dev", features = [
2525
"bevy",
2626
] }
27-
bevy_render = { path = "../bevy_render", version = "0.15.0-dev" }
27+
bevy_render = { path = "../bevy_render", version = "0.15.0-dev", optional = true }
2828
bevy_animation = { path = "../bevy_animation", version = "0.15.0-dev" }
2929
bevy_sprite = { path = "../bevy_sprite", version = "0.15.0-dev" }
30-
bevy_text = { path = "../bevy_text", version = "0.15.0-dev" }
30+
bevy_text = { path = "../bevy_text", version = "0.15.0-dev", optional = true }
3131
bevy_picking = { path = "../bevy_picking", version = "0.15.0-dev", optional = true }
3232
bevy_transform = { path = "../bevy_transform", version = "0.15.0-dev" }
3333
bevy_window = { path = "../bevy_window", version = "0.15.0-dev" }
@@ -47,7 +47,7 @@ smallvec = "1.11"
4747
accesskit = "0.17"
4848

4949
[features]
50-
default = ["bevy_ui_picking_backend"]
50+
default = ["bevy_ui_picking_backend", "bevy_render"]
5151
serialize = ["serde", "smallvec/serde", "bevy_math/serialize"]
5252
bevy_ui_picking_backend = ["bevy_picking"]
5353

crates/bevy_ui/src/accessibility.rs

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,18 @@
1-
use crate::{
2-
experimental::UiChildren,
3-
prelude::{Button, Label},
4-
widget::{ImageNode, TextUiReader},
5-
ComputedNode,
6-
};
1+
use crate::TextUiReader;
2+
use crate::{experimental::UiChildren, prelude::Button, widget::ImageNode};
3+
use crate::{prelude::Label, ComputedNode};
74
use bevy_a11y::AccessibilityNode;
8-
use bevy_app::{App, Plugin, PostUpdate};
5+
use bevy_app::{App, Plugin};
96
use bevy_ecs::{
10-
prelude::{DetectChanges, Entity},
7+
prelude::Entity,
118
query::{Changed, Without},
12-
schedule::IntoSystemConfigs,
139
system::{Commands, Query},
14-
world::Ref,
1510
};
1611
use bevy_render::{camera::CameraUpdateSystem, prelude::Camera};
1712
use bevy_transform::prelude::GlobalTransform;
1813

19-
use accesskit::{Node, Rect, Role};
14+
use accesskit::Rect;
15+
use accesskit::{Node, Role};
2016

2117
fn calc_label(
2218
text_reader: &mut TextUiReader,
@@ -39,10 +35,11 @@ fn calc_bounds(
3935
camera: Query<(&Camera, &GlobalTransform)>,
4036
mut nodes: Query<(
4137
&mut AccessibilityNode,
42-
Ref<ComputedNode>,
43-
Ref<GlobalTransform>,
38+
bevy_ecs::world::Ref<ComputedNode>,
39+
bevy_ecs::world::Ref<GlobalTransform>,
4440
)>,
4541
) {
42+
use bevy_ecs::change_detection::DetectChanges as _;
4643
if let Ok((camera, camera_transform)) = camera.get_single() {
4744
for (mut accessible, node, transform) in &mut nodes {
4845
if node.is_changed() || transform.is_changed() {
@@ -154,8 +151,9 @@ pub(crate) struct AccessibilityPlugin;
154151

155152
impl Plugin for AccessibilityPlugin {
156153
fn build(&self, app: &mut App) {
154+
use bevy_ecs::schedule::IntoSystemConfigs as _;
157155
app.add_systems(
158-
PostUpdate,
156+
bevy_app::PostUpdate,
159157
(
160158
calc_bounds
161159
.after(bevy_transform::TransformSystem::TransformPropagate)

crates/bevy_ui/src/experimental/ghost_hierarchy.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
use bevy_ecs::{prelude::*, system::SystemParam};
44
use bevy_hierarchy::{Children, HierarchyQueryExt, Parent};
55
use bevy_reflect::prelude::*;
6+
#[cfg(feature = "bevy_render")]
67
use bevy_render::view::Visibility;
78
use bevy_transform::prelude::Transform;
89
use core::marker::PhantomData;
@@ -20,7 +21,8 @@ use crate::Node;
2021
#[derive(Component, Debug, Copy, Clone, Reflect)]
2122
#[cfg_attr(feature = "ghost_nodes", derive(Default))]
2223
#[reflect(Component, Debug)]
23-
#[require(Visibility, Transform)]
24+
#[cfg_attr(feature = "bevy_render", require(Visibility))]
25+
#[require(Transform)]
2426
pub struct GhostNode {
2527
// This is a workaround to ensure that GhostNode is only constructable when the appropriate feature flag is enabled
2628
#[reflect(ignore)]

crates/bevy_ui/src/focus.rs

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,22 @@
1-
use crate::{
2-
CalculatedClip, ComputedNode, DefaultUiCamera, ResolvedBorderRadius, TargetCamera, UiScale,
3-
UiStack,
4-
};
5-
use bevy_ecs::{
6-
change_detection::DetectChangesMut,
7-
entity::Entity,
8-
prelude::{Component, With},
9-
query::QueryData,
10-
reflect::ReflectComponent,
11-
system::{Local, Query, Res},
12-
};
13-
use bevy_input::{mouse::MouseButton, touch::Touches, ButtonInput};
1+
use crate::{CalculatedClip, ComputedNode};
2+
use bevy_ecs::{entity::Entity, prelude::Component, query::QueryData, reflect::ReflectComponent};
143
use bevy_math::{Rect, Vec2};
154
use bevy_reflect::{std_traits::ReflectDefault, Reflect};
16-
use bevy_render::{camera::NormalizedRenderTarget, prelude::Camera, view::ViewVisibility};
175
use bevy_transform::components::GlobalTransform;
18-
use bevy_utils::HashMap;
19-
use bevy_window::{PrimaryWindow, Window};
206

21-
use smallvec::SmallVec;
7+
#[cfg(feature = "bevy_render")]
8+
use {
9+
crate::{DefaultUiCamera, ResolvedBorderRadius, TargetCamera, UiScale, UiStack},
10+
bevy_ecs::{
11+
change_detection::DetectChangesMut as _,
12+
prelude::With,
13+
system::{Local, Query, Res},
14+
},
15+
bevy_input::{mouse::MouseButton, touch::Touches, ButtonInput},
16+
bevy_render::{camera::NormalizedRenderTarget, prelude::Camera, view::ViewVisibility},
17+
bevy_window::{PrimaryWindow, Window},
18+
smallvec::SmallVec,
19+
};
2220

2321
#[cfg(feature = "serialize")]
2422
use bevy_reflect::{ReflectDeserialize, ReflectSerialize};
@@ -127,6 +125,7 @@ impl Default for FocusPolicy {
127125

128126
/// Contains entities whose Interaction should be set to None
129127
#[derive(Default)]
128+
#[cfg(feature = "bevy_render")]
130129
pub struct State {
131130
entities_to_reset: SmallVec<[Entity; 1]>,
132131
}
@@ -142,14 +141,17 @@ pub struct NodeQuery {
142141
relative_cursor_position: Option<&'static mut RelativeCursorPosition>,
143142
focus_policy: Option<&'static FocusPolicy>,
144143
calculated_clip: Option<&'static CalculatedClip>,
144+
#[cfg(feature = "bevy_render")]
145145
view_visibility: Option<&'static ViewVisibility>,
146+
#[cfg(feature = "bevy_render")]
146147
target_camera: Option<&'static TargetCamera>,
147148
}
148149

149150
/// The system that sets Interaction for all UI elements based on the mouse cursor activity
150151
///
151152
/// Entities with a hidden [`ViewVisibility`] are always treated as released.
152153
#[allow(clippy::too_many_arguments)]
154+
#[cfg(feature = "bevy_render")]
153155
pub fn ui_focus_system(
154156
mut state: Local<State>,
155157
camera_query: Query<(Entity, &Camera)>,
@@ -190,7 +192,7 @@ pub fn ui_focus_system(
190192
let mouse_clicked =
191193
mouse_button_input.just_pressed(MouseButton::Left) || touches_input.any_just_pressed();
192194

193-
let camera_cursor_positions: HashMap<Entity, Vec2> = camera_query
195+
let camera_cursor_positions: bevy_utils::HashMap<Entity, Vec2> = camera_query
194196
.iter()
195197
.filter_map(|(entity, camera)| {
196198
// Interactions are only supported for cameras rendering to a window.
@@ -351,6 +353,7 @@ pub fn ui_focus_system(
351353
// the given size and border radius.
352354
//
353355
// Matches the sdf function in `ui.wgsl` that is used by the UI renderer to draw rounded rectangles.
356+
#[cfg(feature = "bevy_render")]
354357
pub(crate) fn pick_rounded_rect(
355358
point: Vec2,
356359
size: Vec2,

crates/bevy_ui/src/layout/mod.rs

Lines changed: 28 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
use crate::{
22
experimental::{UiChildren, UiRootNodes},
3-
BorderRadius, ComputedNode, ContentSize, DefaultUiCamera, Display, Node, Outline, OverflowAxis,
4-
ScrollPosition, TargetCamera, UiScale,
3+
BorderRadius, ComputedNode, ContentSize, Display, Node, Outline, OverflowAxis, ScrollPosition,
4+
UiScale,
55
};
6+
use crate::{DefaultUiCamera, TargetCamera};
67
use bevy_ecs::{
78
change_detection::{DetectChanges, DetectChangesMut},
89
entity::{Entity, EntityHashMap, EntityHashSet},
@@ -22,9 +23,8 @@ use bevy_window::{PrimaryWindow, Window, WindowScaleFactorChanged};
2223
use derive_more::derive::{Display, Error, From};
2324
use ui_surface::UiSurface;
2425

25-
use bevy_text::ComputedTextBlock;
26-
27-
use bevy_text::CosmicFontSystem;
26+
#[cfg(feature = "bevy_text")]
27+
use bevy_text::{ComputedTextBlock, CosmicFontSystem};
2828

2929
mod convert;
3030
pub mod debug;
@@ -132,8 +132,8 @@ pub fn ui_layout_system(
132132
Option<&Outline>,
133133
Option<&ScrollPosition>,
134134
)>,
135-
mut buffer_query: Query<&mut ComputedTextBlock>,
136-
mut font_system: ResMut<CosmicFontSystem>,
135+
#[cfg(feature = "bevy_text")] mut buffer_query: Query<&mut ComputedTextBlock>,
136+
#[cfg(feature = "bevy_text")] mut font_system: ResMut<CosmicFontSystem>,
137137
) {
138138
let UiLayoutSystemBuffers {
139139
interned_root_nodes,
@@ -276,6 +276,7 @@ with UI components as a child of an entity without UI components, your UI layout
276276
}
277277
});
278278

279+
#[cfg(feature = "bevy_text")]
279280
let text_buffers = &mut buffer_query;
280281
// clean up removed nodes after syncing children to avoid potential panic (invalid SlotMap key used)
281282
ui_surface.remove_entities(
@@ -292,10 +293,11 @@ with UI components as a child of an entity without UI components, your UI layout
292293
}
293294
});
294295

295-
for (camera_id, mut camera) in camera_layout_info.drain() {
296+
for (_camera_id, mut camera) in camera_layout_info.drain() {
296297
let inverse_target_scale_factor = camera.scale_factor.recip();
297298

298-
ui_surface.compute_camera_layout(camera_id, camera.size, text_buffers, &mut font_system);
299+
#[cfg(feature = "bevy_text")]
300+
ui_surface.compute_camera_layout(_camera_id, camera.size, text_buffers, &mut font_system);
299301

300302
for root in &camera.root_nodes {
301303
update_uinode_geometry_recursive(
@@ -504,13 +506,12 @@ mod tests {
504506
world.init_resource::<Events<AssetEvent<Image>>>();
505507
world.init_resource::<Assets<Image>>();
506508
world.init_resource::<ManualTextureViews>();
507-
508-
world.init_resource::<bevy_text::TextPipeline>();
509-
510-
world.init_resource::<bevy_text::CosmicFontSystem>();
511-
512-
world.init_resource::<bevy_text::SwashCache>();
513-
509+
#[cfg(feature = "bevy_text")]
510+
{
511+
world.init_resource::<bevy_text::TextPipeline>();
512+
world.init_resource::<bevy_text::CosmicFontSystem>();
513+
world.init_resource::<bevy_text::SwashCache>();
514+
}
514515
// spawn a dummy primary window and camera
515516
world.spawn((
516517
Window {
@@ -1149,13 +1150,12 @@ mod tests {
11491150
world.init_resource::<Events<AssetEvent<Image>>>();
11501151
world.init_resource::<Assets<Image>>();
11511152
world.init_resource::<ManualTextureViews>();
1152-
1153-
world.init_resource::<bevy_text::TextPipeline>();
1154-
1155-
world.init_resource::<bevy_text::CosmicFontSystem>();
1156-
1157-
world.init_resource::<bevy_text::SwashCache>();
1158-
1153+
#[cfg(feature = "bevy_text")]
1154+
{
1155+
world.init_resource::<bevy_text::TextPipeline>();
1156+
world.init_resource::<bevy_text::CosmicFontSystem>();
1157+
world.init_resource::<bevy_text::SwashCache>();
1158+
}
11591159
// spawn a dummy primary window and camera
11601160
world.spawn((
11611161
Window {
@@ -1215,16 +1215,18 @@ mod tests {
12151215
fn test_system(
12161216
params: In<TestSystemParam>,
12171217
mut ui_surface: ResMut<UiSurface>,
1218-
mut computed_text_block_query: Query<&mut bevy_text::ComputedTextBlock>,
1219-
mut font_system: ResMut<bevy_text::CosmicFontSystem>,
1218+
#[cfg(feature = "bevy_text")] mut computed_text_block_query: Query<
1219+
&mut bevy_text::ComputedTextBlock,
1220+
>,
1221+
#[cfg(feature = "bevy_text")] mut font_system: ResMut<bevy_text::CosmicFontSystem>,
12201222
) {
12211223
ui_surface.upsert_node(
12221224
&LayoutContext::TEST_CONTEXT,
12231225
params.root_node_entity,
12241226
&Node::default(),
12251227
None,
12261228
);
1227-
1229+
#[cfg(feature = "bevy_text")]
12281230
ui_surface.compute_camera_layout(
12291231
params.camera_entity,
12301232
UVec2::new(800, 600),

0 commit comments

Comments
 (0)