Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bevy 0.10 #159

Merged
merged 22 commits into from
Mar 8, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
9fbeb10
update to use bevy main
DGriffin91 Feb 7, 2023
5646a58
make example initially work
DGriffin91 Feb 21, 2023
3ae15f9
Fix build error from missing add_systems_to_schedule
johanhelsing Mar 5, 2023
6e97876
Merge pull request #4 from johanhelsing/bevy_main
DGriffin91 Mar 5, 2023
a581f0a
depend on bevy 0.10
DGriffin91 Mar 6, 2023
b5c9b3e
Merge the main branch
mvlabat Mar 6, 2023
0d074fe
Merge branch 'main' into bevy-0.10
mvlabat Mar 6, 2023
f5ca09d
Merge pull request #5 from mvlabat/bevy-0.10
DGriffin91 Mar 6, 2023
6dad888
make egui::Context a component
DGriffin91 Mar 7, 2023
7d4ca12
remove unnecessary node edge to ui_pass_driver
DGriffin91 Mar 7, 2023
e4ee7be
fix issue with nodes being added every frame
DGriffin91 Mar 7, 2023
2f50730
make EguiRenderOutputContainer a component
DGriffin91 Mar 7, 2023
fa85aa4
make EguiInput a component
DGriffin91 Mar 7, 2023
9ff94ed
make EguiOutput a component
DGriffin91 Mar 7, 2023
71c22a0
make EguiRenderOutput a component directly
DGriffin91 Mar 7, 2023
8ae0bdd
make WindowSize a component
DGriffin91 Mar 7, 2023
48b84ed
Refine egui context access
mvlabat Mar 7, 2023
5eabb99
Update the documentation, fix Windows, refactor
mvlabat Mar 7, 2023
7151c40
Tesselate shapes outside render systems
mvlabat Mar 7, 2023
1a54046
Remove the redundant cleaning of paint jobs
mvlabat Mar 7, 2023
f361f0c
Introduce EguiContexts system param to cut boilerplate, fix docs
mvlabat Mar 8, 2023
6cdad22
Update the simple example in README and lib.rs docs
mvlabat Mar 8, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ default_fonts = ["egui/default_fonts"]
serde = ["egui/serde"]

[dependencies]
bevy = { version = "0.9.0", default-features = false, features = ["bevy_render", "bevy_core_pipeline", "bevy_asset"] }
bevy = { version = "0.10", default-features = false, features = ["bevy_render", "bevy_core_pipeline", "bevy_asset"] }
egui = { version = "0.21.0", default-features = false, features = ["bytemuck"] }
webbrowser = { version = "0.8.2", optional = true }

Expand All @@ -33,7 +33,7 @@ thread_local = { version = "1.1.0", optional = true }
[dev-dependencies]
once_cell = "1.16.0"
version-sync = "0.9.4"
bevy = { version = "0.9.0", default-features = false, features = [
bevy = { version = "0.10", default-features = false, features = [
"x11",
"png",
"bevy_pbr",
Expand Down
11 changes: 6 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,23 +45,24 @@ bevy_egui = "0.19"

```rust
use bevy::prelude::*;
use bevy_egui::{egui, EguiContext, EguiPlugin};
use bevy_egui::{egui, EguiContexts, EguiPlugin};

fn main() {
App::new()
.add_plugins(DefaultPlugins)
.add_plugin(EguiPlugin)
// Systems that create Egui widgets should be run during the `CoreStage::Update` stage,
// or after the `EguiSystem::BeginFrame` system (which belongs to the `CoreStage::PreUpdate` stage).
// Systems that create Egui widgets should be run during the `CoreSet::Update` set,
// or after the `EguiSet::BeginFrame` system (which belongs to the `CoreSet::PreUpdate` set).
.add_system(ui_example_system)
.run();
}

fn ui_example_system(mut egui_context: ResMut<EguiContext>) {
egui::Window::new("Hello").show(egui_context.ctx_mut(), |ui| {
fn ui_example_system(mut contexts: EguiContexts) {
egui::Window::new("Hello").show(contexts.ctx_mut(), |ui| {
ui.label("world");
});
}

```

For a more advanced example, see [examples/ui.rs](https://github.com/mvlabat/bevy_egui/blob/v0.15.0/examples/ui.rs).
Expand Down
15 changes: 8 additions & 7 deletions examples/render_to_image_widget.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ use bevy::{
view::RenderLayers,
},
};
use bevy_egui::{egui, EguiContext, EguiPlugin};
use bevy_egui::{egui, EguiContexts, EguiPlugin, EguiUserTextures};
use egui::Widget;

fn main() {
Expand All @@ -34,7 +34,7 @@ struct MainPassCube;
struct CubePreviewImage(Handle<Image>);

fn setup(
mut egui_ctx: ResMut<EguiContext>,
mut egui_user_textures: ResMut<EguiUserTextures>,
mut commands: Commands,
mut meshes: ResMut<Assets<Mesh>>,
mut materials: ResMut<Assets<StandardMaterial>>,
Expand All @@ -58,6 +58,7 @@ fn setup(
usage: TextureUsages::TEXTURE_BINDING
| TextureUsages::COPY_DST
| TextureUsages::RENDER_ATTACHMENT,
view_formats: &[],
},
..default()
};
Expand All @@ -66,7 +67,7 @@ fn setup(
image.resize(size);

let image_handle = images.add(image);
egui_ctx.add_image(image_handle.clone());
egui_user_textures.add_image(image_handle.clone());
commands.insert_resource(CubePreviewImage(image_handle.clone()));

let cube_handle = meshes.add(Mesh::from(shape::Cube { size: 4.0 }));
Expand Down Expand Up @@ -107,7 +108,7 @@ fn setup(
},
camera: Camera {
// render before the "main pass" camera
priority: -1,
order: -1,
target: RenderTarget::Image(image_handle),
..default()
},
Expand Down Expand Up @@ -145,17 +146,17 @@ fn setup(
}

fn render_to_image_example_system(
mut egui_ctx: ResMut<EguiContext>,
cube_preview_image: Res<CubePreviewImage>,
preview_cube_query: Query<&Handle<StandardMaterial>, With<PreviewPassCube>>,
main_cube_query: Query<&Handle<StandardMaterial>, With<MainPassCube>>,
mut materials: ResMut<Assets<StandardMaterial>>,
mut contexts: EguiContexts,
) {
let cube_preview_texture_id = egui_ctx.image_id(&cube_preview_image).unwrap();
let cube_preview_texture_id = contexts.image_id(&cube_preview_image).unwrap();
let preview_material_handle = preview_cube_query.single();
let preview_material = materials.get_mut(preview_material_handle).unwrap();

let ctx = egui_ctx.ctx_mut();
let ctx = contexts.ctx_mut();
let mut apply = false;
egui::Window::new("Cube material preview").show(ctx, |ui| {
ui.image(cube_preview_texture_id, [300.0, 300.0]);
Expand Down
25 changes: 15 additions & 10 deletions examples/side_panel.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use bevy::{prelude::*, render::camera::Projection};
use bevy_egui::{egui, EguiContext, EguiPlugin};
use bevy::{prelude::*, render::camera::Projection, window::PrimaryWindow};
use bevy_egui::{egui, EguiContexts, EguiPlugin};

#[derive(Default, Resource)]
struct OccupiedScreenSpace {
Expand All @@ -26,36 +26,38 @@ fn main() {
}

fn ui_example_system(
mut egui_context: ResMut<EguiContext>,
mut contexts: EguiContexts,
mut occupied_screen_space: ResMut<OccupiedScreenSpace>,
) {
let ctx = contexts.ctx_mut();

occupied_screen_space.left = egui::SidePanel::left("left_panel")
.resizable(true)
.show(egui_context.ctx_mut(), |ui| {
.show(ctx, |ui| {
ui.allocate_rect(ui.available_rect_before_wrap(), egui::Sense::hover());
})
.response
.rect
.width();
occupied_screen_space.right = egui::SidePanel::right("right_panel")
.resizable(true)
.show(egui_context.ctx_mut(), |ui| {
.show(ctx, |ui| {
ui.allocate_rect(ui.available_rect_before_wrap(), egui::Sense::hover());
})
.response
.rect
.width();
occupied_screen_space.top = egui::TopBottomPanel::top("top_panel")
.resizable(true)
.show(egui_context.ctx_mut(), |ui| {
.show(ctx, |ui| {
ui.allocate_rect(ui.available_rect_before_wrap(), egui::Sense::hover());
})
.response
.rect
.height();
occupied_screen_space.bottom = egui::TopBottomPanel::bottom("bottom_panel")
.resizable(true)
.show(egui_context.ctx_mut(), |ui| {
.show(ctx, |ui| {
ui.allocate_rect(ui.available_rect_before_wrap(), egui::Sense::hover());
})
.response
Expand All @@ -69,7 +71,10 @@ fn setup_system(
mut materials: ResMut<Assets<StandardMaterial>>,
) {
commands.spawn(PbrBundle {
mesh: meshes.add(Mesh::from(shape::Plane { size: 5.0 })),
mesh: meshes.add(Mesh::from(shape::Plane {
size: 5.0,
subdivisions: 0,
})),
material: materials.add(Color::rgb(0.3, 0.5, 0.3).into()),
..Default::default()
});
Expand Down Expand Up @@ -103,7 +108,7 @@ fn setup_system(
fn update_camera_transform_system(
occupied_screen_space: Res<OccupiedScreenSpace>,
original_camera_transform: Res<OriginalCameraTransform>,
windows: Res<Windows>,
windows: Query<&Window, With<PrimaryWindow>>,
mut camera_query: Query<(&Projection, &mut Transform)>,
) {
let (camera_projection, mut transform) = match camera_query.get_single_mut() {
Expand All @@ -115,7 +120,7 @@ fn update_camera_transform_system(
let frustum_height = 2.0 * distance_to_target * (camera_projection.fov * 0.5).tan();
let frustum_width = frustum_height * camera_projection.aspect_ratio;

let window = windows.get_primary().unwrap();
let window = windows.single();

let left_taken = occupied_screen_space.left / window.width();
let right_taken = occupied_screen_space.right / window.width();
Expand Down
10 changes: 5 additions & 5 deletions examples/simple.rs
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
use bevy::prelude::*;
use bevy_egui::{egui, EguiContext, EguiPlugin};
use bevy_egui::{egui, EguiContexts, EguiPlugin};

fn main() {
App::new()
.add_plugins(DefaultPlugins)
.add_plugin(EguiPlugin)
// Systems that create Egui widgets should be run during the `CoreStage::Update` stage,
// or after the `EguiSystem::BeginFrame` system (which belongs to the `CoreStage::PreUpdate` stage).
// Systems that create Egui widgets should be run during the `CoreSet::Update` set,
// or after the `EguiSet::BeginFrame` system (which belongs to the `CoreSet::PreUpdate` set).
.add_system(ui_example_system)
.run();
}

fn ui_example_system(mut egui_context: ResMut<EguiContext>) {
egui::Window::new("Hello").show(egui_context.ctx_mut(), |ui| {
fn ui_example_system(mut contexts: EguiContexts) {
egui::Window::new("Hello").show(contexts.ctx_mut(), |ui| {
ui.label("world");
});
}
51 changes: 24 additions & 27 deletions examples/two_windows.rs
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
use bevy::{
prelude::*,
render::camera::RenderTarget,
window::{CreateWindow, PresentMode, WindowId},
window::{PresentMode, PrimaryWindow, WindowRef, WindowResolution},
};
use bevy_egui::{EguiContext, EguiPlugin};
use once_cell::sync::Lazy;

static SECOND_WINDOW_ID: Lazy<WindowId> = Lazy::new(WindowId::new);
use bevy_egui::{EguiContext, EguiPlugin, EguiUserTextures};

#[derive(Resource)]
struct Images {
Expand All @@ -26,25 +23,21 @@ fn main() {
app.run();
}

fn create_new_window_system(
mut create_window_events: EventWriter<CreateWindow>,
mut commands: Commands,
) {
// sends out a "CreateWindow" event, which will be received by the windowing backend
create_window_events.send(CreateWindow {
id: *SECOND_WINDOW_ID,
descriptor: WindowDescriptor {
width: 800.,
height: 600.,
fn create_new_window_system(mut commands: Commands) {
// Spawn a second window
let second_window_id = commands
.spawn(Window {
title: "Second window".to_owned(),
resolution: WindowResolution::new(800.0, 600.0),
present_mode: PresentMode::AutoVsync,
title: "Second window".to_string(),
..Default::default()
},
});
})
.id();

// second window camera
commands.spawn(Camera3dBundle {
camera: Camera {
target: RenderTarget::Window(*SECOND_WINDOW_ID),
target: RenderTarget::Window(WindowRef::Entity(second_window_id)),
..Default::default()
},
transform: Transform::from_xyz(6.0, 0.0, 0.0).looking_at(Vec3::ZERO, Vec3::Y),
Expand All @@ -69,15 +62,16 @@ struct SharedUiState {
}

fn ui_first_window_system(
mut egui_context: ResMut<EguiContext>,
mut egui_user_textures: ResMut<EguiUserTextures>,
mut ui_state: Local<UiState>,
mut shared_ui_state: ResMut<SharedUiState>,
images: Res<Images>,
mut egui_ctx: Query<&mut EguiContext, With<PrimaryWindow>>,
) {
let bevy_texture_id = egui_context.add_image(images.bevy_icon.clone_weak());
let bevy_texture_id = egui_user_textures.add_image(images.bevy_icon.clone_weak());
egui::Window::new("First Window")
.vscroll(true)
.show(egui_context.ctx_mut(), |ui| {
.show(egui_ctx.single_mut().get_mut(), |ui| {
ui.horizontal(|ui| {
ui.label("Write something: ");
ui.text_edit_singleline(&mut ui_state.input);
Expand All @@ -92,19 +86,22 @@ fn ui_first_window_system(
}

fn ui_second_window_system(
mut egui_context: ResMut<EguiContext>,
mut egui_user_textures: ResMut<EguiUserTextures>,
mut ui_state: Local<UiState>,
mut shared_ui_state: ResMut<SharedUiState>,
images: Res<Images>,
mut egui_ctx: Query<&mut EguiContext, Without<PrimaryWindow>>,
) {
let bevy_texture_id = egui_context.add_image(images.bevy_icon.clone_weak());
let ctx = match egui_context.try_ctx_for_window_mut(*SECOND_WINDOW_ID) {
let bevy_texture_id = egui_user_textures.add_image(images.bevy_icon.clone_weak());
let mut ctx = match egui_ctx.get_single_mut().ok() {
Some(ctx) => ctx,
None => return,
None => {
return;
}
};
egui::Window::new("Second Window")
.vscroll(true)
.show(ctx, |ui| {
.show(ctx.get_mut(), |ui| {
ui.horizontal(|ui| {
ui.label("Write something else: ");
ui.text_edit_singleline(&mut ui_state.input);
Expand Down
Loading