Skip to content

Commit b94830d

Browse files
feature gate bevy_render and bevy_text
1 parent e8fc279 commit b94830d

23 files changed

+317
-210
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;
@@ -282,6 +282,14 @@ impl ImageFormat {
282282
}
283283
}
284284

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

crates/bevy_render/src/texture/mod.rs

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,13 @@ 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+
use bevy_image::ExrTextureLoader;
911
#[cfg(feature = "hdr")]
1012
use bevy_image::HdrTextureLoader;
11-
use bevy_image::{CompressedImageFormats, Image, ImageLoader, ImageSamplerDescriptor};
13+
use bevy_image::{
14+
CompressedImageFormats, Image, ImageLoader, ImageSamplerDescriptor, TRANSPARENT_IMAGE_HANDLE,
15+
};
1216
pub use fallback_image::*;
1317
pub use gpu_image::*;
1418
pub use texture_attachment::*;
@@ -21,14 +25,6 @@ use bevy_app::{App, Plugin};
2125
use bevy_asset::{AssetApp, Assets, Handle};
2226
use bevy_ecs::prelude::*;
2327

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-
3228
// TODO: replace Texture names with Image names?
3329
/// Adds the [`Image`] as an asset and makes sure that they are extracted and prepared for the GPU.
3430
pub struct ImagePlugin {
@@ -62,7 +58,7 @@ impl Plugin for ImagePlugin {
6258
fn build(&self, app: &mut App) {
6359
#[cfg(feature = "exr")]
6460
{
65-
app.init_asset_loader::<bevy_image::ExrTextureLoader>();
61+
app.init_asset_loader::<ExrTextureLoader>();
6662
}
6763

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

crates/bevy_ui/Cargo.toml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +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 }
28+
bevy_animation = { path = "../bevy_animation", version = "0.15.0-dev" }
2829
bevy_sprite = { path = "../bevy_sprite", version = "0.15.0-dev" }
29-
bevy_text = { path = "../bevy_text", version = "0.15.0-dev" }
30+
bevy_text = { path = "../bevy_text", version = "0.15.0-dev", optional = true }
3031
bevy_picking = { path = "../bevy_picking", version = "0.15.0-dev", optional = true }
3132
bevy_transform = { path = "../bevy_transform", version = "0.15.0-dev" }
3233
bevy_window = { path = "../bevy_window", version = "0.15.0-dev" }
@@ -43,7 +44,7 @@ smallvec = "1.11"
4344
accesskit = "0.17"
4445

4546
[features]
46-
default = []
47+
default = ["bevy_ui_picking_backend", "bevy_render", "bevy_text"]
4748
serialize = ["serde", "smallvec/serde", "bevy_math/serialize"]
4849
bevy_ui_picking_backend = ["bevy_picking"]
4950
bevy_ui_debug = []

crates/bevy_ui/src/accessibility.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use bevy_app::{App, Plugin, PostUpdate};
99
use bevy_ecs::{
1010
prelude::{DetectChanges, Entity},
1111
query::{Changed, Without},
12-
schedule::IntoSystemConfigs,
12+
schedule::IntoSystemConfigs as _,
1313
system::{Commands, Query},
1414
world::Ref,
1515
};

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: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,24 @@
1-
use crate::{
2-
CalculatedClip, ComputedNode, DefaultUiCamera, ResolvedBorderRadius, TargetCamera, UiStack,
3-
};
4-
use bevy_ecs::{
5-
change_detection::DetectChangesMut,
6-
entity::{Entity, EntityBorrow},
7-
prelude::{Component, With},
8-
query::QueryData,
9-
reflect::ReflectComponent,
10-
system::{Local, Query, Res},
11-
};
12-
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};
133
use bevy_math::{Rect, Vec2};
144
use bevy_reflect::{std_traits::ReflectDefault, Reflect};
15-
use bevy_render::{camera::NormalizedRenderTarget, prelude::Camera, view::ViewVisibility};
165
use bevy_transform::components::GlobalTransform;
17-
use bevy_utils::HashMap;
18-
use bevy_window::{PrimaryWindow, Window};
196

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

2223
#[cfg(feature = "serialize")]
2324
use bevy_reflect::{ReflectDeserialize, ReflectSerialize};
@@ -126,6 +127,7 @@ impl Default for FocusPolicy {
126127

127128
/// Contains entities whose Interaction should be set to None
128129
#[derive(Default)]
130+
#[cfg(feature = "bevy_render")]
129131
pub struct State {
130132
entities_to_reset: SmallVec<[Entity; 1]>,
131133
}
@@ -141,14 +143,17 @@ pub struct NodeQuery {
141143
relative_cursor_position: Option<&'static mut RelativeCursorPosition>,
142144
focus_policy: Option<&'static FocusPolicy>,
143145
calculated_clip: Option<&'static CalculatedClip>,
146+
#[cfg(feature = "bevy_render")]
144147
view_visibility: Option<&'static ViewVisibility>,
148+
#[cfg(feature = "bevy_render")]
145149
target_camera: Option<&'static TargetCamera>,
146150
}
147151

148152
/// The system that sets Interaction for all UI elements based on the mouse cursor activity
149153
///
150154
/// Entities with a hidden [`ViewVisibility`] are always treated as released.
151155
#[allow(clippy::too_many_arguments)]
156+
#[cfg(feature = "bevy_render")]
152157
pub fn ui_focus_system(
153158
mut state: Local<State>,
154159
camera_query: Query<(Entity, &Camera)>,
@@ -349,6 +354,7 @@ pub fn ui_focus_system(
349354
// the given size and border radius.
350355
//
351356
// Matches the sdf function in `ui.wgsl` that is used by the UI renderer to draw rounded rectangles.
357+
#[cfg(feature = "bevy_render")]
352358
pub(crate) fn pick_rounded_rect(
353359
point: Vec2,
354360
size: Vec2,

crates/bevy_ui/src/layout/mod.rs

Lines changed: 39 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,8 @@ use bevy_window::{PrimaryWindow, Window, WindowScaleFactorChanged};
2222
use thiserror::Error;
2323
use ui_surface::UiSurface;
2424

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

2928
mod convert;
3029
pub mod debug;
@@ -126,8 +125,8 @@ pub fn ui_layout_system(
126125
Option<&ScrollPosition>,
127126
)>,
128127

129-
mut buffer_query: Query<&mut ComputedTextBlock>,
130-
mut font_system: ResMut<CosmicFontSystem>,
128+
#[cfg(feature = "bevy_text")] mut buffer_query: Query<&mut ComputedTextBlock>,
129+
#[cfg(feature = "bevy_text")] mut font_system: ResMut<CosmicFontSystem>,
131130
) {
132131
let UiLayoutSystemBuffers {
133132
interned_root_nodes,
@@ -270,6 +269,7 @@ with UI components as a child of an entity without UI components, your UI layout
270269
}
271270
});
272271

272+
#[cfg(feature = "bevy_text")]
273273
let text_buffers = &mut buffer_query;
274274
// clean up removed nodes after syncing children to avoid potential panic (invalid SlotMap key used)
275275
ui_surface.remove_entities(
@@ -289,8 +289,14 @@ with UI components as a child of an entity without UI components, your UI layout
289289
for (camera_id, mut camera) in camera_layout_info.drain() {
290290
let inverse_target_scale_factor = camera.scale_factor.recip();
291291

292-
ui_surface.compute_camera_layout(camera_id, camera.size, text_buffers, &mut font_system);
293-
292+
ui_surface.compute_camera_layout(
293+
camera_id,
294+
camera.size,
295+
#[cfg(feature = "bevy_text")]
296+
text_buffers,
297+
#[cfg(feature = "bevy_text")]
298+
&mut font_system,
299+
);
294300
for root in &camera.root_nodes {
295301
update_uinode_geometry_recursive(
296302
&mut commands,
@@ -489,9 +495,8 @@ mod tests {
489495
};
490496
use bevy_image::Image;
491497
use bevy_math::{Rect, UVec2, Vec2};
492-
use bevy_render::{
493-
camera::{ManualTextureViews, OrthographicProjection},
494-
prelude::Camera,
498+
use bevy_render::camera::{
499+
camera_system, Camera, ManualTextureViews, OrthographicProjection, Viewport,
495500
};
496501
use bevy_transform::{
497502
prelude::GlobalTransform,
@@ -508,6 +513,9 @@ mod tests {
508513
update::update_target_camera_system, ContentSize, LayoutContext,
509514
};
510515

516+
#[cfg(feature = "bevy_text")]
517+
use bevy_text::{ComputedTextBlock, CosmicFontSystem, SwashCache, TextPipeline};
518+
511519
// these window dimensions are easy to convert to and from percentage values
512520
const WINDOW_WIDTH: f32 = 1000.;
513521
const WINDOW_HEIGHT: f32 = 100.;
@@ -523,13 +531,12 @@ mod tests {
523531
world.init_resource::<Events<AssetEvent<Image>>>();
524532
world.init_resource::<Assets<Image>>();
525533
world.init_resource::<ManualTextureViews>();
526-
527-
world.init_resource::<bevy_text::TextPipeline>();
528-
529-
world.init_resource::<bevy_text::CosmicFontSystem>();
530-
531-
world.init_resource::<bevy_text::SwashCache>();
532-
534+
#[cfg(feature = "bevy_text")]
535+
{
536+
world.init_resource::<TextPipeline>();
537+
world.init_resource::<CosmicFontSystem>();
538+
world.init_resource::<SwashCache>();
539+
}
533540
// spawn a dummy primary window and camera
534541
world.spawn((
535542
Window {
@@ -544,7 +551,7 @@ mod tests {
544551
ui_schedule.add_systems(
545552
(
546553
// UI is driven by calculated camera target info, so we need to run the camera system first
547-
bevy_render::camera::camera_system::<OrthographicProjection>,
554+
camera_system::<OrthographicProjection>,
548555
update_target_camera_system,
549556
ApplyDeferred,
550557
ui_layout_system,
@@ -919,7 +926,7 @@ mod tests {
919926
let viewport_height = primary_window.resolution.physical_height();
920927
let physical_position = UVec2::new(viewport_width * camera_index as u32, 0);
921928
let physical_size = UVec2::new(viewport_width, viewport_height);
922-
camera.viewport = Some(bevy_render::camera::Viewport {
929+
camera.viewport = Some(Viewport {
923930
physical_position,
924931
physical_size,
925932
..default()
@@ -1168,13 +1175,12 @@ mod tests {
11681175
world.init_resource::<Events<AssetEvent<Image>>>();
11691176
world.init_resource::<Assets<Image>>();
11701177
world.init_resource::<ManualTextureViews>();
1171-
1172-
world.init_resource::<bevy_text::TextPipeline>();
1173-
1174-
world.init_resource::<bevy_text::CosmicFontSystem>();
1175-
1176-
world.init_resource::<bevy_text::SwashCache>();
1177-
1178+
#[cfg(feature = "bevy_text")]
1179+
{
1180+
world.init_resource::<TextPipeline>();
1181+
world.init_resource::<CosmicFontSystem>();
1182+
world.init_resource::<SwashCache>();
1183+
}
11781184
// spawn a dummy primary window and camera
11791185
world.spawn((
11801186
Window {
@@ -1188,7 +1194,7 @@ mod tests {
11881194
ui_schedule.add_systems(
11891195
(
11901196
// UI is driven by calculated camera target info, so we need to run the camera system first
1191-
bevy_render::camera::camera_system::<OrthographicProjection>,
1197+
camera_system::<OrthographicProjection>,
11921198
update_target_camera_system,
11931199
ApplyDeferred,
11941200
ui_layout_system,
@@ -1234,20 +1240,23 @@ mod tests {
12341240
fn test_system(
12351241
params: In<TestSystemParam>,
12361242
mut ui_surface: ResMut<UiSurface>,
1237-
mut computed_text_block_query: Query<&mut bevy_text::ComputedTextBlock>,
1238-
mut font_system: ResMut<bevy_text::CosmicFontSystem>,
1243+
#[cfg(feature = "bevy_text")] mut computed_text_block_query: Query<
1244+
&mut ComputedTextBlock,
1245+
>,
1246+
#[cfg(feature = "bevy_text")] mut font_system: ResMut<CosmicFontSystem>,
12391247
) {
12401248
ui_surface.upsert_node(
12411249
&LayoutContext::TEST_CONTEXT,
12421250
params.root_node_entity,
12431251
&Node::default(),
12441252
None,
12451253
);
1246-
12471254
ui_surface.compute_camera_layout(
12481255
params.camera_entity,
12491256
UVec2::new(800, 600),
1257+
#[cfg(feature = "bevy_text")]
12501258
&mut computed_text_block_query,
1259+
#[cfg(feature = "bevy_text")]
12511260
&mut font_system,
12521261
);
12531262
}

0 commit comments

Comments
 (0)