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

wasm clipboard continued #3

Open
wants to merge 7 commits into
base: 113-clipboard
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
5 changes: 2 additions & 3 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,7 @@ name = "ui"
required-features = ["render"]

[dependencies]
bevy = { version = "0.12", default-features = false, features = [
"bevy_render",
bevy = { git = "https://github.com/bevyengine/bevy", default-features = false, features = [
"bevy_asset",
] }
egui = { version = "0.24.0", default-features = false, features = ["bytemuck"] }
Expand All @@ -53,7 +52,7 @@ thread_local = { version = "1.1.0", optional = true }
[dev-dependencies]
once_cell = "1.16.0"
version-sync = "0.9.4"
bevy = { version = "0.12", default-features = false, features = [
bevy = { git = "https://github.com/bevyengine/bevy", default-features = false, features = [
"x11",
"png",
"bevy_pbr",
Expand Down
13 changes: 4 additions & 9 deletions examples/render_to_image_widget.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
use bevy::{
core_pipeline::clear_color::ClearColorConfig,
prelude::*,
render::{
camera::RenderTarget,
camera::{ClearColorConfig, RenderTarget},
render_resource::{
Extent3d, TextureDescriptor, TextureDimension, TextureFormat, TextureUsages,
},
Expand Down Expand Up @@ -102,14 +101,11 @@ fn setup(

commands
.spawn(Camera3dBundle {
camera_3d: Camera3d {
clear_color: ClearColorConfig::Custom(Color::rgba(1.0, 1.0, 1.0, 0.0)),
..default()
},
camera: Camera {
// render before the "main pass" camera
order: -1,
target: RenderTarget::Image(image_handle),
clear_color: ClearColorConfig::Custom(Color::rgba(1.0, 1.0, 1.0, 0.0)),
..default()
},
transform: Transform::from_translation(Vec3::new(0.0, 0.0, 15.0))
Expand Down Expand Up @@ -210,13 +206,12 @@ fn color_picker_widget(ui: &mut egui::Ui, color: &mut Color) -> egui::Response {
egui::color_picker::Alpha::Opaque,
);
let [r, g, b, a] = egui_color.to_srgba_unmultiplied();
*color = [
*color = Color::rgba(
r as f32 / 255.0,
g as f32 / 255.0,
b as f32 / 255.0,
a as f32 / 255.0,
]
.into();
);
res
}

Expand Down
4 changes: 2 additions & 2 deletions examples/side_panel.rs
Original file line number Diff line number Diff line change
Expand Up @@ -79,12 +79,12 @@ fn setup_system(
size: 5.0,
subdivisions: 0,
})),
material: materials.add(Color::rgb(0.3, 0.5, 0.3).into()),
material: materials.add(Color::rgb(0.3, 0.5, 0.3)),
..Default::default()
});
commands.spawn(PbrBundle {
mesh: meshes.add(Mesh::from(shape::Cube { size: 1.0 })),
material: materials.add(Color::rgb(0.8, 0.7, 0.6).into()),
material: materials.add(Color::rgb(0.8, 0.7, 0.6)),
transform: Transform::from_xyz(0.0, 0.5, 0.0),
..Default::default()
});
Expand Down
2 changes: 1 addition & 1 deletion examples/ui.rs
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ fn configure_ui_state_system(mut ui_state: ResMut<UiState>) {
}

fn update_ui_scale_factor_system(
keyboard_input: Res<Input<KeyCode>>,
keyboard_input: Res<ButtonInput<KeyCode>>,
mut toggle_scale_factor: Local<Option<bool>>,
mut egui_settings: ResMut<EguiSettings>,
windows: Query<&Window, With<PrimaryWindow>>,
Expand Down
90 changes: 46 additions & 44 deletions src/egui_node.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,17 @@ use bevy::{
ecs::world::{FromWorld, World},
prelude::{Entity, Handle, Resource},
render::{
render_asset::RenderAssetUsages,
render_graph::{Node, NodeRunError, RenderGraphContext},
render_resource::{
BindGroupLayout, BindGroupLayoutDescriptor, BindGroupLayoutEntry, BindingType,
BlendComponent, BlendFactor, BlendOperation, BlendState, Buffer, BufferAddress,
BufferBindingType, BufferDescriptor, BufferUsages, ColorTargetState, ColorWrites,
Extent3d, FragmentState, FrontFace, IndexFormat, LoadOp, MultisampleState, Operations,
PipelineCache, PrimitiveState, RenderPassColorAttachment, RenderPassDescriptor,
RenderPipelineDescriptor, SamplerBindingType, Shader, ShaderStages, ShaderType,
SpecializedRenderPipeline, TextureDimension, TextureFormat, TextureSampleType,
TextureViewDimension, VertexBufferLayout, VertexFormat, VertexState, VertexStepMode,
BindGroupLayout, BindGroupLayoutEntry, BindingType, BlendComponent, BlendFactor,
BlendOperation, BlendState, Buffer, BufferAddress, BufferBindingType, BufferDescriptor,
BufferUsages, ColorTargetState, ColorWrites, Extent3d, FragmentState, FrontFace,
IndexFormat, LoadOp, MultisampleState, Operations, PipelineCache, PrimitiveState,
RenderPassColorAttachment, RenderPassDescriptor, RenderPipelineDescriptor,
SamplerBindingType, Shader, ShaderStages, ShaderType, SpecializedRenderPipeline,
StoreOp, TextureDimension, TextureFormat, TextureSampleType, TextureViewDimension,
VertexBufferLayout, VertexFormat, VertexState, VertexStepMode,
},
renderer::{RenderContext, RenderDevice, RenderQueue},
texture::{Image, ImageSampler},
Expand All @@ -42,43 +43,41 @@ impl FromWorld for EguiPipeline {
fn from_world(render_world: &mut World) -> Self {
let render_device = render_world.get_resource::<RenderDevice>().unwrap();

let transform_bind_group_layout =
render_device.create_bind_group_layout(&BindGroupLayoutDescriptor {
label: Some("egui transform bind group layout"),
entries: &[BindGroupLayoutEntry {
let transform_bind_group_layout = render_device.create_bind_group_layout(
"egui transform bind group layout",
&[BindGroupLayoutEntry {
binding: 0,
visibility: ShaderStages::VERTEX,
ty: BindingType::Buffer {
ty: BufferBindingType::Uniform,
has_dynamic_offset: true,
min_binding_size: Some(EguiTransform::min_size()),
},
count: None,
}],
);

let texture_bind_group_layout = render_device.create_bind_group_layout(
"egui texture bind group layout",
&[
BindGroupLayoutEntry {
binding: 0,
visibility: ShaderStages::VERTEX,
ty: BindingType::Buffer {
ty: BufferBindingType::Uniform,
has_dynamic_offset: true,
min_binding_size: Some(EguiTransform::min_size()),
visibility: ShaderStages::FRAGMENT,
ty: BindingType::Texture {
sample_type: TextureSampleType::Float { filterable: true },
view_dimension: TextureViewDimension::D2,
multisampled: false,
},
count: None,
}],
});

let texture_bind_group_layout =
render_device.create_bind_group_layout(&BindGroupLayoutDescriptor {
label: Some("egui texture bind group layout"),
entries: &[
BindGroupLayoutEntry {
binding: 0,
visibility: ShaderStages::FRAGMENT,
ty: BindingType::Texture {
sample_type: TextureSampleType::Float { filterable: true },
view_dimension: TextureViewDimension::D2,
multisampled: false,
},
count: None,
},
BindGroupLayoutEntry {
binding: 1,
visibility: ShaderStages::FRAGMENT,
ty: BindingType::Sampler(SamplerBindingType::Filtering),
count: None,
},
],
});
},
BindGroupLayoutEntry {
binding: 1,
visibility: ShaderStages::FRAGMENT,
ty: BindingType::Sampler(SamplerBindingType::Filtering),
count: None,
},
],
);

EguiPipeline {
transform_bind_group_layout,
Expand Down Expand Up @@ -200,7 +199,7 @@ impl Node for EguiNode {

let render_device = world.get_resource::<RenderDevice>().unwrap();

let scale_factor = window_size.scale_factor * egui_settings.scale_factor as f32;
let scale_factor = window_size.scale_factor * egui_settings.scale_factor;
if window_size.physical_width == 0.0 || window_size.physical_height == 0.0 {
return;
}
Expand Down Expand Up @@ -345,10 +344,12 @@ impl Node for EguiNode {
resolve_target: None,
ops: Operations {
load: LoadOp::Load,
store: true,
store: StoreOp::Store,
},
})],
depth_stencil_attachment: None,
timestamp_writes: None,
occlusion_query_set: None,
});

let Some(pipeline_id) = egui_pipelines.get(&extracted_window.entity) else {
Expand Down Expand Up @@ -450,6 +451,7 @@ pub(crate) fn color_image_as_bevy_image(
TextureDimension::D2,
pixels,
TextureFormat::Rgba8UnormSrgb,
RenderAssetUsages::MAIN_WORLD | RenderAssetUsages::RENDER_WORLD,
)
}
}
8 changes: 4 additions & 4 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ use bevy::{
use bevy::{
app::{App, Plugin, PostUpdate, PreStartup, PreUpdate},
ecs::{
query::{QueryEntityError, WorldQuery},
query::{QueryData, QueryEntityError},
schedule::apply_deferred,
system::SystemParam,
},
Expand Down Expand Up @@ -146,7 +146,7 @@ pub struct EguiSettings {
/// }
/// }
/// ```
pub scale_factor: f64,
pub scale_factor: f32,
/// Will be used as a default value for hyperlink [target](https://www.w3schools.com/tags/att_a_target.asp) hints.
/// If not specified, `_self` will be used. Only matters in a web browser.
#[cfg(feature = "open_url")]
Expand Down Expand Up @@ -754,8 +754,8 @@ impl Plugin for EguiPlugin {
}

/// Queries all the Egui related components.
#[derive(WorldQuery)]
#[world_query(mutable)]
#[derive(QueryData)]
#[query_data(mutable)]
pub struct EguiContextQuery {
/// Window entity.
pub window_entity: Entity,
Expand Down
29 changes: 21 additions & 8 deletions src/render_systems.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ use bevy::{
render::{
extract_resource::ExtractResource,
render_asset::RenderAssets,
render_graph::RenderGraph,
render_graph::{RenderGraph, RenderLabel},
render_resource::{
BindGroup, BindGroupEntry, BindingResource, BufferId, CachedRenderPipelineId,
DynamicUniformBuffer, PipelineCache, ShaderType, SpecializedRenderPipelines,
Expand Down Expand Up @@ -54,6 +54,14 @@ pub struct ExtractedEguiTextures<'w> {
pub user_textures: Res<'w, EguiUserTextures>,
}

/// RenderLabel type for the egui pass
#[derive(Debug, Hash, PartialEq, Eq, Clone, RenderLabel)]
pub struct EguiPass {
window_index: u32,
window_generation: u32,
}


impl ExtractedEguiTextures<'_> {
/// Returns an iterator over all textures (both Egui and Bevy managed).
pub fn handles(&self) -> impl Iterator<Item = (EguiTextureId, AssetId<Image>)> + '_ {
Expand All @@ -78,15 +86,18 @@ pub fn setup_new_windows_render_system(
mut render_graph: ResMut<RenderGraph>,
) {
for window in windows.iter() {
let egui_pass = format!("egui-{}-{}", window.index(), window.generation());
let egui_pass = EguiPass{
window_index: window.index(),
window_generation: window.generation()
};

let new_node = EguiNode::new(window);

render_graph.add_node(egui_pass.clone(), new_node);

render_graph.add_node_edge(
bevy::render::main_graph::node::CAMERA_DRIVER,
egui_pass.to_string(),
bevy::render::graph::CameraDriverLabel,
egui_pass,
);
}
}
Expand Down Expand Up @@ -140,10 +151,12 @@ pub fn prepare_egui_transforms_system(
egui_transforms.offsets.clear();

for (window, size) in window_sizes.iter() {
let offset = egui_transforms.buffer.push(EguiTransform::from_window_size(
*size,
egui_settings.scale_factor as f32,
));
let offset = egui_transforms
.buffer
.push(&EguiTransform::from_window_size(
*size,
egui_settings.scale_factor,
));
egui_transforms.offsets.insert(window, offset);
}

Expand Down
Loading