From 4087989a5f0eb5dca25625ba1ba81c9b94df69f5 Mon Sep 17 00:00:00 2001 From: Caleb Yates Date: Fri, 6 Dec 2024 15:15:26 +1000 Subject: [PATCH 1/3] 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/3] 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/3] 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"