From 4087989a5f0eb5dca25625ba1ba81c9b94df69f5 Mon Sep 17 00:00:00 2001 From: Caleb Yates Date: Fri, 6 Dec 2024 15:15:26 +1000 Subject: [PATCH 1/5] mark: mostly compiling --- Cargo.toml | 46 ++++++++-------- crates/transform-gizmo-bevy/Cargo.toml | 8 +-- .../examples/bevy_minimal.rs | 7 ++- crates/transform-gizmo-bevy/src/lib.rs | 4 +- crates/transform-gizmo-bevy/src/render.rs | 54 ++++++++++++++----- examples/bevy/Cargo.toml | 2 +- rust-toolchain => rust-toolchain.toml | 2 +- 7 files changed, 77 insertions(+), 46 deletions(-) rename rust-toolchain => rust-toolchain.toml (81%) diff --git a/Cargo.toml b/Cargo.toml index 45efa40..c89b3da 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,8 +3,8 @@ resolver = "2" members = ["crates/*", "examples/*"] [workspace.package] -version = "0.4.0" -rust-version = "1.78.0" +version = "0.5.0" +rust-version = "1.82.0" edition = "2021" license = "MIT OR Apache-2.0" homepage = "https://github.com/urholaukkarinen/transform-gizmo" @@ -12,9 +12,9 @@ repository = "https://github.com/urholaukkarinen/transform-gizmo" authors = ["Urho Laukkarinen "] [workspace.dependencies] -transform-gizmo = { version = "0.4.0", path = "crates/transform-gizmo" } -transform-gizmo-egui = { version = "0.4.0", path = "crates/transform-gizmo-egui" } -transform-gizmo-bevy = { version = "0.4.0", path = "crates/transform-gizmo-bevy" } +transform-gizmo = { version = "0.5.0", path = "crates/transform-gizmo" } +transform-gizmo-egui = { version = "0.5.0", path = "crates/transform-gizmo-egui" } +transform-gizmo-bevy = { version = "0.5.0", path = "crates/transform-gizmo-bevy" } egui = "0.29" eframe = "0.29" @@ -28,22 +28,24 @@ ahash = "0.8.7" enumset = "1.1.3" bytemuck = "1.5" uuid = "1.1" -bevy = "0.14" +bevy = "0.15" -bevy_app = { version = "0.14", default-features = false } -bevy_core = { version = "0.14", default-features = false } -bevy_core_pipeline = { version = "0.14", default-features = false } -bevy_reflect = { version = "0.14", default-features = false } -bevy_math = { version = "0.14", features = ["mint"], default-features = false } -bevy_render = { version = "0.14", default-features = false } -bevy_input = { version = "0.14", default-features = false } -bevy_asset = { version = "0.14", default-features = false } -bevy_utils = { version = "0.14", default-features = false } -bevy_pbr = { version = "0.14", default-features = false } -bevy_ecs = { version = "0.14", default-features = false } -bevy_log = { version = "0.14", default-features = false } -bevy_window = { version = "0.14", default-features = false } -bevy_transform = { version = "0.14", default-features = false } +bevy_app = { version = "0.15", default-features = false } +bevy_core = { version = "0.15", default-features = false } +bevy_core_pipeline = { version = "0.15", default-features = false } +bevy_reflect = { version = "0.15", default-features = false } +bevy_math = { version = "0.15", features = ["mint"], default-features = false } +bevy_render = { version = "0.15", default-features = false } +bevy_input = { version = "0.15", default-features = false } +bevy_asset = { version = "0.15", default-features = false } +bevy_utils = { version = "0.15", default-features = false } +bevy_pbr = { version = "0.15", default-features = false } +bevy_ecs = { version = "0.15", default-features = false } +bevy_log = { version = "0.15", default-features = false } +bevy_window = { version = "0.15", default-features = false } +bevy_transform = { version = "0.15", default-features = false } +bevy_derive = { version = "0.15", default-features = false } +bevy_image = { version = "0.15", default-features = false } [profile.release] opt-level = "s" @@ -51,9 +53,6 @@ panic = "abort" [workspace.lints.rust] elided_lifetimes_in_paths = "allow" -future_incompatible = "deny" -nonstandard_style = "deny" -rust_2018_idioms = "warn" rust_2021_prelude_collisions = "deny" semicolon_in_expressions_from_macros = "deny" trivial_numeric_casts = "deny" @@ -64,7 +63,6 @@ unused_lifetimes = "deny" unsafe_code = "deny" [workspace.lints.clippy] -all = "deny" as_ptr_cast_mut = "deny" await_holding_lock = "deny" bool_to_int_with_if = "deny" diff --git a/crates/transform-gizmo-bevy/Cargo.toml b/crates/transform-gizmo-bevy/Cargo.toml index 221bbfe..d9e1321 100644 --- a/crates/transform-gizmo-bevy/Cargo.toml +++ b/crates/transform-gizmo-bevy/Cargo.toml @@ -2,7 +2,7 @@ name = "transform-gizmo-bevy" description = "bevy integration for transform-gizmo" version.workspace = true -rust-version = "1.79.0" +rust-version = "1.82.0" edition.workspace = true license.workspace = true homepage.workspace = true @@ -36,11 +36,13 @@ bevy_ecs.workspace = true bevy_log.workspace = true bevy_window.workspace = true bevy_transform.workspace = true +bevy_derive.workspace = true +bevy_image.workspace = true bytemuck.workspace = true uuid.workspace = true [dev-dependencies] -bevy = "0.14" +bevy = "0.15" [lints] -workspace = true \ No newline at end of file +workspace = true diff --git a/crates/transform-gizmo-bevy/examples/bevy_minimal.rs b/crates/transform-gizmo-bevy/examples/bevy_minimal.rs index c31893e..2535a2b 100644 --- a/crates/transform-gizmo-bevy/examples/bevy_minimal.rs +++ b/crates/transform-gizmo-bevy/examples/bevy_minimal.rs @@ -19,11 +19,10 @@ fn setup( ) { // camera commands.spawn(( - Camera3dBundle { - transform: Transform::from_translation(Vec3::new(1.0, 3.0, -5.0)) + Camera3d::default(), + Transform::from_translation(Vec3::new(1.0, 3.0, -5.0)) .looking_at(Vec3::ZERO, Vec3::Y), - ..default() - }, + Msaa::Sample2, GizmoCamera, )); diff --git a/crates/transform-gizmo-bevy/src/lib.rs b/crates/transform-gizmo-bevy/src/lib.rs index 68a4fdb..0833dfc 100644 --- a/crates/transform-gizmo-bevy/src/lib.rs +++ b/crates/transform-gizmo-bevy/src/lib.rs @@ -592,7 +592,9 @@ fn draw_gizmos( if is_new_asset { let asset = draw_data_assets.add(bevy_draw_data); - draw_data_handles.handles.insert(*gizmo_uuid, asset.clone()); + draw_data_handles + .handles + .insert(*gizmo_uuid, asset.clone().into()); } } } diff --git a/crates/transform-gizmo-bevy/src/render.rs b/crates/transform-gizmo-bevy/src/render.rs index 52efb16..c88c658 100644 --- a/crates/transform-gizmo-bevy/src/render.rs +++ b/crates/transform-gizmo-bevy/src/render.rs @@ -1,15 +1,18 @@ use bevy_app::{App, Plugin}; -use bevy_asset::{load_internal_asset, Asset, Handle}; +use bevy_asset::{load_internal_asset, Asset, AssetId, Handle}; use bevy_core_pipeline::core_3d::{Transparent3d, CORE_3D_DEPTH_FORMAT}; use bevy_core_pipeline::prepass::{ DeferredPrepass, DepthPrepass, MotionVectorPrepass, NormalPrepass, }; +use bevy_derive::{Deref, DerefMut}; use bevy_ecs::prelude::*; use bevy_ecs::query::ROQueryItem; use bevy_ecs::system::lifetimeless::{Read, SRes}; use bevy_ecs::system::SystemParamItem; +use bevy_image::BevyDefault as _; use bevy_pbr::{MeshPipeline, MeshPipelineKey, SetMeshViewBindGroup}; -use bevy_reflect::TypePath; +use bevy_reflect::{Reflect, TypePath}; +use bevy_render::extract_component::ExtractComponent; use bevy_render::mesh::PrimitiveTopology; use bevy_render::prelude::*; use bevy_render::render_asset::{ @@ -28,13 +31,14 @@ use bevy_render::render_resource::{ VertexAttribute, VertexBufferLayout, VertexFormat, VertexState, VertexStepMode, }; use bevy_render::renderer::RenderDevice; -use bevy_render::texture::BevyDefault; use bevy_render::view::{ExtractedView, RenderLayers, ViewTarget}; use bevy_render::{Extract, Render, RenderApp, RenderSet}; use bevy_utils::{HashMap, HashSet}; use bytemuck::cast_slice; use uuid::Uuid; +use crate::GizmoCamera; + const GIZMO_SHADER_HANDLE: Handle = Handle::weak_from_u128(7414812681337026784); pub(crate) struct TransformGizmoRenderPlugin; @@ -74,7 +78,30 @@ impl Plugin for TransformGizmoRenderPlugin { #[derive(Resource, Default)] pub(crate) struct DrawDataHandles { - pub(crate) handles: HashMap>, + pub(crate) handles: HashMap, +} + +#[derive( + Component, Default, Clone, Debug, Deref, DerefMut, Reflect, PartialEq, Eq, ExtractComponent, +)] +#[reflect(Component)] +pub(crate) struct GizmoDrawDataHandle(pub(crate) Handle); + +impl From> for GizmoDrawDataHandle { + fn from(handle: Handle) -> Self { + Self(handle) + } +} + +impl From for AssetId { + fn from(handle: GizmoDrawDataHandle) -> Self { + handle.0.id() + } +} +impl From<&GizmoDrawDataHandle> for AssetId { + fn from(handle: &GizmoDrawDataHandle) -> Self { + handle.0.id() + } } fn extract_gizmo_data(mut commands: Commands, handles: Extract>) { @@ -85,7 +112,7 @@ fn extract_gizmo_data(mut commands: Commands, handles: Extract>(); for handle in handle_weak_refs { - commands.spawn((handle,)); + commands.spawn(GizmoDrawDataHandle(handle)); } } @@ -146,7 +173,7 @@ struct DrawTransformGizmo; impl RenderCommand

for DrawTransformGizmo { type ViewQuery = (); - type ItemQuery = Read>; + type ItemQuery = Read; type Param = SRes>; #[inline] @@ -158,11 +185,11 @@ impl RenderCommand

for DrawTransformGizmo { pass: &mut TrackedRenderPass<'w>, ) -> RenderCommandResult { let Some(handle) = handle else { - return RenderCommandResult::Failure; + return RenderCommandResult::Failure("No GizmoDrawDataHandle component found"); }; let Some(gizmo) = gizmos.into_inner().get(handle) else { - return RenderCommandResult::Failure; + return RenderCommandResult::Failure("No GizmoDrawDataHandle inner found"); }; pass.set_index_buffer(gizmo.index_buffer.slice(..), 0, IndexFormat::Uint32); @@ -220,6 +247,7 @@ impl SpecializedRenderPipeline for TransformGizmoPipeline { RenderPipelineDescriptor { label: Some("TransformGizmo Pipeline".into()), + zero_initialize_workgroup_memory: true, // ? vertex: VertexState { shader: GIZMO_SHADER_HANDLE, entry_point: "vertex".into(), @@ -286,12 +314,13 @@ fn queue_transform_gizmos( pipeline: Res, mut pipelines: ResMut>, pipeline_cache: Res, - msaa: Res, - transform_gizmos: Query<(Entity, &Handle)>, + msaa_q: Query<&Msaa, With>, + transform_gizmos: Query<(Entity, &GizmoDrawDataHandle)>, transform_gizmo_assets: Res>, mut views: Query<( Entity, &ExtractedView, + /* Include Msaa here? */ Option<&RenderLayers>, ( Has, @@ -303,6 +332,7 @@ fn queue_transform_gizmos( mut transparent_render_phases: ResMut>, ) { let draw_function = draw_functions.read().get_id::().unwrap(); + let msaa = msaa_q.single(); for ( view_entity, @@ -335,7 +365,7 @@ fn queue_transform_gizmos( } for (entity, handle) in &transform_gizmos { - let Some(_) = transform_gizmo_assets.get(handle.id()) else { + let Some(_) = transform_gizmo_assets.get(handle.0.id()) else { continue; }; @@ -349,7 +379,7 @@ fn queue_transform_gizmos( ); transparent_phase.add(Transparent3d { - entity, + entity: (entity, view_entity.into()), // TODO: ??? draw_function, pipeline, distance: 0., diff --git a/examples/bevy/Cargo.toml b/examples/bevy/Cargo.toml index d90d55d..66a3537 100644 --- a/examples/bevy/Cargo.toml +++ b/examples/bevy/Cargo.toml @@ -18,7 +18,7 @@ bevy_mod_picking = "0.20.0" bevy_mod_outline = { git = "https://github.com/komadori/bevy_mod_outline.git", rev = "d24b2eaec26b02f91ef99ebf0d86b982ea05a0ed" } [dependencies.bevy_egui] -version = "0.28" +version = "0.29" features = ["open_url", "default_fonts", "render"] default-features = false diff --git a/rust-toolchain b/rust-toolchain.toml similarity index 81% rename from rust-toolchain rename to rust-toolchain.toml index 756e027..8a909eb 100644 --- a/rust-toolchain +++ b/rust-toolchain.toml @@ -1,4 +1,4 @@ [toolchain] -channel = "1.79.0" +channel = "1.82.0" components = ["rustfmt", "clippy"] targets = ["wasm32-unknown-unknown"] From 2f8b26a20fc06420e96573be0156416125db509d Mon Sep 17 00:00:00 2001 From: Caleb Yates Date: Fri, 6 Dec 2024 15:52:33 +1000 Subject: [PATCH 2/5] mark: transform-gizmo-bevy crate compiles --- .../examples/bevy_minimal.rs | 21 +++++++------------ crates/transform-gizmo-bevy/src/render.rs | 21 ++++++++++++------- 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/crates/transform-gizmo-bevy/examples/bevy_minimal.rs b/crates/transform-gizmo-bevy/examples/bevy_minimal.rs index 2535a2b..d988963 100644 --- a/crates/transform-gizmo-bevy/examples/bevy_minimal.rs +++ b/crates/transform-gizmo-bevy/examples/bevy_minimal.rs @@ -20,30 +20,25 @@ fn setup( // camera commands.spawn(( Camera3d::default(), - Transform::from_translation(Vec3::new(1.0, 3.0, -5.0)) - .looking_at(Vec3::ZERO, Vec3::Y), + Transform::from_translation(Vec3::new(1.0, 3.0, -5.0)).looking_at(Vec3::ZERO, Vec3::Y), Msaa::Sample2, GizmoCamera, )); // cube commands.spawn(( - PbrBundle { - mesh: meshes.add(Cuboid::new(1.0, 1.0, 1.0)), - material: materials.add(Color::from(LIME)), - transform: Transform::from_translation(Vec3::new(0.0, 0.0, 0.0)), - ..default() - }, + Mesh3d(meshes.add(Cuboid::new(1.0, 1.0, 1.0))), + MeshMaterial3d(materials.add(Color::from(LIME))), + Transform::from_translation(Vec3::new(0.0, 0.0, 0.0)), GizmoTarget::default(), )); // light - commands.spawn(PointLightBundle { - point_light: PointLight { + commands.spawn(( + PointLight { shadows_enabled: true, ..default() }, - transform: Transform::from_xyz(4.0, 8.0, 4.0), - ..default() - }); + Transform::from_xyz(4.0, 8.0, 4.0), + )); } diff --git a/crates/transform-gizmo-bevy/src/render.rs b/crates/transform-gizmo-bevy/src/render.rs index c88c658..04702b9 100644 --- a/crates/transform-gizmo-bevy/src/render.rs +++ b/crates/transform-gizmo-bevy/src/render.rs @@ -226,8 +226,9 @@ impl SpecializedRenderPipeline for TransformGizmoPipeline { fn specialize(&self, key: Self::Key) -> RenderPipelineDescriptor { let mut shader_defs = vec![ - #[cfg(feature = "webgl")] - "SIXTEEN_BYTE_ALIGNMENT".into(), + // TODO: When is this flag actually used? + // #[cfg(feature = "webgl")] + // "SIXTEEN_BYTE_ALIGNMENT".into(), ]; if key.perspective { @@ -314,13 +315,13 @@ fn queue_transform_gizmos( pipeline: Res, mut pipelines: ResMut>, pipeline_cache: Res, - msaa_q: Query<&Msaa, With>, + msaa_q: Query, With>, transform_gizmos: Query<(Entity, &GizmoDrawDataHandle)>, transform_gizmo_assets: Res>, mut views: Query<( Entity, &ExtractedView, - /* Include Msaa here? */ + Option<&Msaa>, Option<&RenderLayers>, ( Has, @@ -332,11 +333,11 @@ fn queue_transform_gizmos( mut transparent_render_phases: ResMut>, ) { let draw_function = draw_functions.read().get_id::().unwrap(); - let msaa = msaa_q.single(); - + let camera_msaa = msaa_q.get_single().ok().flatten(); for ( view_entity, view, + entity_msaa, _render_layers, (normal_prepass, depth_prepass, motion_vector_prepass, deferred_prepass), ) in &mut views @@ -345,7 +346,13 @@ fn queue_transform_gizmos( continue; }; - let mut view_key = MeshPipelineKey::from_msaa_samples(msaa.samples()) + // entity_msaa > camera_msaa > default + let msaa_sample_count = entity_msaa.map_or( + camera_msaa.unwrap_or(&Msaa::default()).samples(), + Msaa::samples, + ); + + let mut view_key = MeshPipelineKey::from_msaa_samples(msaa_sample_count) | MeshPipelineKey::from_hdr(view.hdr); if normal_prepass { From 0f6beb350e17a18e3ae008f0d17d665d612bff7e Mon Sep 17 00:00:00 2001 From: Caleb Yates Date: Fri, 6 Dec 2024 15:57:20 +1000 Subject: [PATCH 3/5] feat: bevy example compiles and runs properly --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index c89b3da..d437a05 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -131,7 +131,7 @@ match_same_arms = "deny" match_wild_err_arm = "deny" match_wildcard_for_single_variants = "deny" mem_forget = "deny" -mismatched_target_os = "deny" +unexpected_cfgs = "deny" mismatching_type_param_order = "deny" missing_enforced_import_renames = "deny" missing_safety_doc = "deny" From 1a0060f23c2d4b5a4e6948107c0a7cbea961ddb7 Mon Sep 17 00:00:00 2001 From: rydb Date: Thu, 2 Jan 2025 18:44:58 -0600 Subject: [PATCH 4/5] upgraded to 0.15, purged bevy_mod_picking, updated toolchain, added windows fix --- .github/workflows/rust.yml | 2 +- Cargo.toml | 1 + crates/transform-gizmo-bevy/Cargo.toml | 1 + crates/transform-gizmo-bevy/src/render.rs | 4 + crates/transform-gizmo/src/config.rs | 2 +- crates/transform-gizmo/src/gizmo.rs | 1 + examples/bevy/Cargo.toml | 8 +- examples/bevy/src/gui.rs | 4 +- examples/bevy/src/main.rs | 4 +- examples/bevy/src/picking.rs | 91 +++++++++++++++++------ examples/bevy/src/scene.rs | 58 ++++++--------- rust-toolchain.toml | 2 +- 12 files changed, 108 insertions(+), 70 deletions(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index de01341..139c7d6 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -11,7 +11,7 @@ jobs: - uses: dtolnay/rust-toolchain@master with: - toolchain: 1.72.0 + toolchain: 1.83.0 - name: install dependencies run: sudo apt-get update; sudo apt-get install --no-install-recommends libasound2-dev libudev-dev diff --git a/Cargo.toml b/Cargo.toml index d437a05..1cea600 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -46,6 +46,7 @@ bevy_window = { version = "0.15", default-features = false } bevy_transform = { version = "0.15", default-features = false } bevy_derive = { version = "0.15", default-features = false } bevy_image = { version = "0.15", default-features = false } +bevy_picking = {version = "0.15", default-features = false} [profile.release] opt-level = "s" diff --git a/crates/transform-gizmo-bevy/Cargo.toml b/crates/transform-gizmo-bevy/Cargo.toml index d9e1321..7509144 100644 --- a/crates/transform-gizmo-bevy/Cargo.toml +++ b/crates/transform-gizmo-bevy/Cargo.toml @@ -27,6 +27,7 @@ bevy_core.workspace = true bevy_core_pipeline.workspace = true bevy_reflect.workspace = true bevy_math.workspace = true +bevy_picking.workspace = true bevy_render.workspace = true bevy_input.workspace = true bevy_asset.workspace = true diff --git a/crates/transform-gizmo-bevy/src/render.rs b/crates/transform-gizmo-bevy/src/render.rs index 04702b9..4a922e3 100644 --- a/crates/transform-gizmo-bevy/src/render.rs +++ b/crates/transform-gizmo-bevy/src/render.rs @@ -192,6 +192,10 @@ impl RenderCommand

for DrawTransformGizmo { return RenderCommandResult::Failure("No GizmoDrawDataHandle inner found"); }; + if gizmo.index_buffer.size() == 0 { + return RenderCommandResult::Failure("gizmo.index_buffer is empty"); + } + pass.set_index_buffer(gizmo.index_buffer.slice(..), 0, IndexFormat::Uint32); pass.set_vertex_buffer(0, gizmo.position_buffer.slice(..)); pass.set_vertex_buffer(1, gizmo.color_buffer.slice(..)); diff --git a/crates/transform-gizmo/src/config.rs b/crates/transform-gizmo/src/config.rs index 16f1578..6f6072b 100644 --- a/crates/transform-gizmo/src/config.rs +++ b/crates/transform-gizmo/src/config.rs @@ -459,7 +459,7 @@ impl Default for GizmoVisuals { z_color: Color32::from_rgb(0, 125, 255), s_color: Color32::from_rgb(255, 255, 255), inactive_alpha: 0.7, - highlight_alpha: 1.0, + highlight_alpha: 0.1, highlight_color: None, stroke_width: 4.0, gizmo_size: 75.0, diff --git a/crates/transform-gizmo/src/gizmo.rs b/crates/transform-gizmo/src/gizmo.rs index c15b578..5f5c4b2 100644 --- a/crates/transform-gizmo/src/gizmo.rs +++ b/crates/transform-gizmo/src/gizmo.rs @@ -325,6 +325,7 @@ impl Gizmo { } /// Picks the subgizmo that is closest to the given world space ray. + #[allow(clippy::manual_inspect)] fn pick_subgizmo(&mut self, ray: Ray) -> Option<&mut SubGizmo> { // If mode is overridden, assume we only have that mode, and choose it. if self.config.mode_override.is_some() { diff --git a/examples/bevy/Cargo.toml b/examples/bevy/Cargo.toml index 66a3537..b8aaf13 100644 --- a/examples/bevy/Cargo.toml +++ b/examples/bevy/Cargo.toml @@ -13,12 +13,12 @@ publish = false transform-gizmo-bevy.workspace = true bevy.workspace = true -bevy_infinite_grid = { git = "https://github.com/tychedelia/bevy_infinite_grid.git", rev = "4044e3219868d82a7db4326a48af58f829c109aa" } -bevy_mod_picking = "0.20.0" -bevy_mod_outline = { git = "https://github.com/komadori/bevy_mod_outline.git", rev = "d24b2eaec26b02f91ef99ebf0d86b982ea05a0ed" } +bevy_infinite_grid = "0.14" +# When bevy_mod_outline is updated to 0.10. Replace this with that. This rev is to use update with jump_flood unwrap panic fix. +bevy_mod_outline = { git = "https://github.com/komadori/bevy_mod_outline.git", rev = "3bd8357c656f6100c3fe13a2d6bab50f6de72a6f" } [dependencies.bevy_egui] -version = "0.29" +version = "0.31" features = ["open_url", "default_fonts", "render"] default-features = false diff --git a/examples/bevy/src/gui.rs b/examples/bevy/src/gui.rs index 54dc21f..76bb3d2 100644 --- a/examples/bevy/src/gui.rs +++ b/examples/bevy/src/gui.rs @@ -152,7 +152,7 @@ fn draw_options(ui: &mut egui::Ui, gizmo_options: &mut GizmoOptions) { .num_columns(2) .show(ui, |ui| { ui.label("Orientation"); - egui::ComboBox::from_id_source("orientation_cb") + egui::ComboBox::from_id_salt("orientation_cb") .selected_text(format!("{:?}", gizmo_options.gizmo_orientation)) .show_ui(ui, |ui| { for orientation in [GizmoOrientation::Global, GizmoOrientation::Local] { @@ -166,7 +166,7 @@ fn draw_options(ui: &mut egui::Ui, gizmo_options: &mut GizmoOptions) { ui.end_row(); ui.label("Pivot point"); - egui::ComboBox::from_id_source("pivot_cb") + egui::ComboBox::from_id_salt("pivot_cb") .selected_text(format!("{:?}", gizmo_options.pivot_point)) .show_ui(ui, |ui| { for pivot_point in [ diff --git a/examples/bevy/src/main.rs b/examples/bevy/src/main.rs index 2a26d7a..e34c7f8 100644 --- a/examples/bevy/src/main.rs +++ b/examples/bevy/src/main.rs @@ -1,7 +1,7 @@ use bevy::prelude::*; use camera::PanOrbitCameraPlugin; use gui::GuiPlugin; -use picking::PickingPlugin; +use picking::GizmoPickingPlugin; use scene::ScenePlugin; use transform_gizmo_bevy::GizmoHotkeys; @@ -27,7 +27,7 @@ fn main() { .add_plugins(PanOrbitCameraPlugin) .add_plugins(ScenePlugin) .add_plugins(TransformGizmoPlugin) - .add_plugins(PickingPlugin) + .add_plugins(GizmoPickingPlugin) .insert_resource(GizmoOptions { hotkeys: Some(GizmoHotkeys::default()), ..default() diff --git a/examples/bevy/src/picking.rs b/examples/bevy/src/picking.rs index 4d8f285..6d602a9 100644 --- a/examples/bevy/src/picking.rs +++ b/examples/bevy/src/picking.rs @@ -1,29 +1,31 @@ -use bevy::prelude::*; -use bevy_mod_outline::*; -use bevy_mod_picking::{ - picking_core::PickingPluginsSettings, prelude::*, selection::SelectionPluginSettings, +use bevy::{ + picking::pointer::{PointerInteraction, PointerPress}, + prelude::*, }; +use bevy_mod_outline::*; use transform_gizmo_bevy::GizmoTarget; +#[derive(Component, Clone, Copy)] +pub struct PickSelection { + pub is_selected: bool, +} + /// Integrates picking with gizmo and highlighting. -pub struct PickingPlugin; +pub struct GizmoPickingPlugin; -impl Plugin for PickingPlugin { +impl Plugin for GizmoPickingPlugin { fn build(&self, app: &mut bevy::prelude::App) { - app.add_plugins(DefaultPickingPlugins.build()) - .add_plugins(OutlinePlugin) - .insert_resource(SelectionPluginSettings { - click_nothing_deselect_all: false, - ..default() - }) + app.add_plugins(OutlinePlugin) + .add_plugins(MeshPickingPlugin) .add_systems(PreUpdate, toggle_picking_enabled) - .add_systems(Update, update_picking); + .add_systems(Update, update_picking) + .add_systems(Update, manage_selection); } } fn toggle_picking_enabled( gizmo_targets: Query<&GizmoTarget>, - mut picking_settings: ResMut, + mut picking_settings: ResMut, ) { // Picking is disabled when any of the gizmos is focused or active. @@ -32,17 +34,18 @@ fn toggle_picking_enabled( .all(|target| !target.is_focused() && !target.is_active()); } -fn update_picking( +pub fn update_picking( + mut targets: Query< + ( + Entity, + &PickSelection, + &mut OutlineVolume, + Option<&GizmoTarget>, + ), + Changed, + >, mut commands: Commands, - mut targets: Query<( - Entity, - &PickSelection, - &mut OutlineVolume, - Option<&GizmoTarget>, - )>, ) { - // Continuously update entities based on their picking state - for (entity, pick_interaction, mut outline, gizmo_target) in &mut targets { let mut entity_cmd = commands.entity(entity); @@ -59,3 +62,45 @@ fn update_picking( } } } + +pub fn manage_selection( + pointers: Query<&PointerInteraction, Changed>, + mouse: Res>, + keys: Res>, + mut pick_selection: Query<&mut PickSelection>, +) { + // don't continue if the pointer was just pressed. + if !mouse.just_released(MouseButton::Left) { + return; + }; + let pointer = match pointers.get_single() { + Ok(pointer) => pointer, + Err(err) => match err { + bevy::ecs::query::QuerySingleError::NoEntities(_) => { + // warn!(err); + return; + } + bevy::ecs::query::QuerySingleError::MultipleEntities(_) => { + warn!("demo only works with one pointer. delete extra pointer sources!"); + return; + } + }, + }; + if let Some((e, _)) = pointer.first() { + let Ok(root) = pick_selection.get(*e).map(|n| n.is_selected) else { + return; + }; + + if !keys.pressed(KeyCode::ShiftLeft) { + for mut pick in &mut pick_selection { + pick.is_selected = false; + } + } + + let Ok(mut pick) = pick_selection.get_mut(*e) else { + return; + }; + pick.is_selected = root; + pick.is_selected ^= true; + } +} diff --git a/examples/bevy/src/scene.rs b/examples/bevy/src/scene.rs index 54ec037..deb0c58 100644 --- a/examples/bevy/src/scene.rs +++ b/examples/bevy/src/scene.rs @@ -1,11 +1,11 @@ use bevy::color::palettes::css::{BLUE, LIME, RED}; use bevy::prelude::*; use bevy_mod_outline::*; -use bevy_mod_picking::prelude::*; use transform_gizmo_bevy::GizmoCamera; use crate::camera::PanOrbitCamera; +use crate::picking::PickSelection; pub struct ScenePlugin; @@ -27,10 +27,8 @@ fn setup_scene( radius: camera_transform.translation.length(), ..Default::default() }, - Camera3dBundle { - transform: camera_transform.looking_at(Vec3::ZERO, Vec3::Y), - ..default() - }, + Camera3d::default(), + camera_transform.looking_at(Vec3::ZERO, Vec3::Y), GizmoCamera, )); @@ -41,39 +39,27 @@ fn setup_scene( let colors: [Color; 3] = [RED.into(), LIME.into(), BLUE.into()]; for i in 0..cube_count { - commands - .spawn(( - PbrBundle { - mesh: cube_mesh.clone(), - material: materials.add(colors[i as usize % colors.len()]), - transform: Transform::from_xyz( - -(cube_count / 2) as f32 * 1.5 + (i as f32 * 1.5), - 0.0, - 0.0, - ), - ..default() - }, - PickableBundle { - selection: PickSelection { is_selected: true }, - ..default() - }, - )) - .insert(OutlineBundle { - outline: OutlineVolume { - visible: false, - colour: Color::WHITE, - width: 2.0, - }, - ..default() - }); + commands.spawn(( + Mesh3d(cube_mesh.clone()), + MeshMaterial3d(materials.add(colors[i as usize % colors.len()])), + Transform::from_xyz(-(cube_count / 2) as f32 * 1.5 + (i as f32 * 1.5), 0.0, 0.0), + // Pick, + OutlineVolume { + visible: false, + colour: Color::WHITE, + width: 2.0, + }, + PickSelection { is_selected: true }, + OutlineStencil::default(), + OutlineMode::default(), + ComputedOutline::default(), + )); } - - commands.spawn(PointLightBundle { - point_light: PointLight { + commands.spawn(( + PointLight { shadows_enabled: true, ..default() }, - transform: Transform::from_xyz(4.0, 8.0, 4.0), - ..default() - }); + Transform::from_xyz(4.0, 8.0, 4.0), + )); } diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 8a909eb..0af9708 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,4 +1,4 @@ [toolchain] -channel = "1.82.0" +channel = "1.83.0" components = ["rustfmt", "clippy"] targets = ["wasm32-unknown-unknown"] From 9ecf433fb4643a635653240c037dc1c1701dc152 Mon Sep 17 00:00:00 2001 From: GameboyColor Date: Fri, 10 Jan 2025 13:33:13 +0100 Subject: [PATCH 5/5] update to egui 30 --- Cargo.toml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 1cea600..d1d4211 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,11 +16,11 @@ transform-gizmo = { version = "0.5.0", path = "crates/transform-gizmo" } transform-gizmo-egui = { version = "0.5.0", path = "crates/transform-gizmo-egui" } transform-gizmo-bevy = { version = "0.5.0", path = "crates/transform-gizmo-bevy" } -egui = "0.29" -eframe = "0.29" -emath = "0.29" -epaint = "0.29" -ecolor = "0.29" +egui = "0.30" +eframe = "0.30" +emath = "0.30" +epaint = "0.30" +ecolor = "0.30" glam = { version = "0.29.1", features = ["mint"] } mint = "0.5" enum_dispatch = "0.3.12"