From 8bc5bcc8c788543865514ef431bda119671930f8 Mon Sep 17 00:00:00 2001 From: mosure Date: Wed, 20 Nov 2024 19:22:39 -0600 Subject: [PATCH 1/7] feat: hypersim semantic cuboid labels --- README.md | 1 + .../bevy_zeroverse_dataloader/__init__.py | 6 +- objaverse/download.py | 37 ++ src/app.rs | 11 +- src/primitive.rs | 6 +- src/render/mod.rs | 11 +- src/render/semantic.rs | 208 +++++++ src/render/semantic.wgsl | 18 + src/scene/mod.rs | 3 + src/scene/room.rs | 8 + src/scene/semantic_room.rs | 529 ++++++++++++++++++ 11 files changed, 831 insertions(+), 7 deletions(-) create mode 100644 objaverse/download.py create mode 100644 src/render/semantic.rs create mode 100644 src/render/semantic.wgsl create mode 100644 src/scene/semantic_room.rs diff --git a/README.md b/README.md index ee7573a..fca16bc 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,7 @@ bevy zeroverse synthetic reconstruction dataset generator. view the [live demo]( - [x] procedural zeroverse composite environments - [x] online torch dataloader - [x] safetensor chunking +- [x] hypersim semantic labels - [ ] primitive boolean operations - [ ] primitive pbr wireframe - [ ] primitive 4d augmentation diff --git a/ffi/python/bevy_zeroverse_dataloader/__init__.py b/ffi/python/bevy_zeroverse_dataloader/__init__.py index 5a6eb20..fa10704 100644 --- a/ffi/python/bevy_zeroverse_dataloader/__init__.py +++ b/ffi/python/bevy_zeroverse_dataloader/__init__.py @@ -61,7 +61,11 @@ def reshape_data(data, dtype): print("empty color buffer") color = reshape_data(rust_view.color, np.float32) - depth = reshape_data(rust_view.depth, np.float32) + + if len(rust_view.depth) != 0: + depth = reshape_data(rust_view.depth, np.float32) + else: + depth = np.zeros(color.shape, dtype=np.float32) world_from_view = np.array(rust_view.world_from_view) fovy = rust_view.fovy diff --git a/objaverse/download.py b/objaverse/download.py new file mode 100644 index 0000000..9c5b1e1 --- /dev/null +++ b/objaverse/download.py @@ -0,0 +1,37 @@ +import objaverse + + +annotations = objaverse.load_annotations() +print('total number of annotations:', len(annotations)) + +cc_by_uids = [uid for uid, annotation in annotations.items() if annotation["license"] == "by"] +print('number of CC-BY annotations:', len(cc_by_uids)) + +to_download = [] +filter_tags = ['chair', 'table', 'sofa'] +for uid in cc_by_uids: + annotation = annotations[uid] + + if any(tag['name'] in filter_tags for tag in annotation["tags"]): + to_download.append(uid) + +print('number of CC-BY annotations with tags:', len(to_download)) + +locations = objaverse.load_objects( + uids=to_download, + download_processes=1, +) + +import shutil +import os + +os.makedirs('./assets/models', exist_ok=True) + +for uid, location in locations.items(): + extension = location.split('.')[-1] + + if extension != 'glb': + continue + + print('moving from location:', location) + shutil.move(location, f'./assets/models/{uid}.glb') diff --git a/src/app.rs b/src/app.rs index bc1e685..f97625e 100644 --- a/src/app.rs +++ b/src/app.rs @@ -295,7 +295,7 @@ impl Default for BevyZeroverseConfig { yaw_speed: 0.0, render_mode: Default::default(), scene_type: Default::default(), - rotation_augmentation: true, + rotation_augmentation: false, max_camera_radius: 0.0, } } @@ -402,7 +402,7 @@ pub fn viewer_app( app.add_plugins(BevyZeroversePlugin); - app.insert_resource(args.render_mode); + app.insert_resource(args.render_mode); // TODO: replicate on args changed app.insert_resource(DefaultZeroverseCamera { resolution: UVec2::new(args.width as u32, args.height as u32).into(), @@ -462,6 +462,13 @@ fn setup_camera( let camera_offset = Vec3::new(0.0, 0.0, 3.5); let camera_offset = match args.scene_type { + ZeroverseSceneType::SemanticRoom => { + let max_room_size = match room_settings.room_size { + ScaleSampler::Bounded(_min, max) => max * Vec3::new(1.0, 2.0, 1.0), + ScaleSampler::Exact(size) => size, + }; + max_room_size + camera_offset + }, ZeroverseSceneType::CornellCube => camera_offset, ZeroverseSceneType::Object => camera_offset, ZeroverseSceneType::Room => { diff --git a/src/primitive.rs b/src/primitive.rs index 0df28c1..bfc900c 100644 --- a/src/primitive.rs +++ b/src/primitive.rs @@ -167,9 +167,9 @@ impl RotationSampler { Quat::IDENTITY } else { Quat::from_scaled_axis(Vec3::new( - rng.gen_range(min.x..max.x), - rng.gen_range(min.y..max.y), - rng.gen_range(min.z..max.z), + if min.x != max.x { rng.gen_range(min.x..max.x) } else { 0.0 }, + if min.y != max.y { rng.gen_range(min.y..max.y) } else { 0.0 }, + if min.z != max.z { rng.gen_range(min.z..max.z) } else { 0.0 }, )) } }, diff --git a/src/render/mod.rs b/src/render/mod.rs index 99f65a3..7a4aa96 100644 --- a/src/render/mod.rs +++ b/src/render/mod.rs @@ -15,6 +15,7 @@ use crate::primitive::process_primitives; pub mod depth; pub mod normal; +pub mod semantic; #[derive( @@ -35,6 +36,7 @@ pub enum RenderMode { Color, Depth, Normal, + Semantic, } @@ -48,6 +50,7 @@ impl Plugin for RenderPlugin { app.add_plugins(depth::DepthPlugin); app.add_plugins(normal::NormalPlugin); + app.add_plugins(semantic::SemanticPlugin); // TODO: add wireframe depth, pbr disable, normals app.add_systems( @@ -59,6 +62,7 @@ impl Plugin for RenderPlugin { ( auto_disable_pbr_material::, auto_disable_pbr_material::, + auto_disable_pbr_material::, enable_pbr_material, ) .after(apply_render_modes) @@ -148,6 +152,10 @@ fn apply_render_modes( commands.entity(entity) .insert(normal::Normal); } + RenderMode::Semantic => { + commands.entity(entity) + .insert(semantic::Semantic); + } } }; @@ -155,7 +163,8 @@ fn apply_render_modes( for entity in meshes.iter() { commands.entity(entity) .remove::() - .remove::(); + .remove::() + .remove::(); insert_render_mode_flag(&mut commands, entity); } diff --git a/src/render/semantic.rs b/src/render/semantic.rs new file mode 100644 index 0000000..2682f51 --- /dev/null +++ b/src/render/semantic.rs @@ -0,0 +1,208 @@ +use bevy::{ + prelude::*, + asset::load_internal_asset, + pbr::{ + ExtendedMaterial, + MaterialExtension, + }, + render::render_resource::*, +}; + +use crate::render::DisabledPbrMaterial; + + +pub const SEMANTIC_SHADER_HANDLE: Handle = Handle::weak_from_u128(5639572395); + +#[derive(Component, Debug, Clone, Default, Reflect, Eq, PartialEq)] +#[reflect(Component)] +pub enum SemanticLabel { + #[default] + Wall, + Floor, + Cabinet, + Bed, + Chair, + Sofa, + Table, + Door, + Window, + Bookshelf, + Picture, + Counter, + Blinds, + Desk, + Shelves, + Curtain, + Dresser, + Pillow, + Mirror, + Floormat, + Clothes, + Ceiling, + Books, + Refrigerator, + Television, + Paper, + Towel, + ShowerCurtain, + Box, + Whiteboard, + Person, + Nightstand, + Toilet, + Sink, + Lamp, + Bathtub, + Bag, + OtherStructure, + OtherFurniture, + OtherProp, +} + +impl SemanticLabel { + pub fn color(&self) -> Color { + // https://github.com/apple/ml-hypersim/blob/main/code/cpp/tools/scene_annotation_tool/semantic_label_descs.csv + match self { + SemanticLabel::Wall => Color::srgb_u8(174, 199, 232), + SemanticLabel::Floor => Color::srgb_u8(152, 223, 138), + SemanticLabel::Cabinet => Color::srgb_u8(31, 119, 180), + SemanticLabel::Bed => Color::srgb_u8(255, 187, 120), + SemanticLabel::Chair => Color::srgb_u8(188, 189, 34), + SemanticLabel::Sofa => Color::srgb_u8(140, 86, 75), + SemanticLabel::Table => Color::srgb_u8(255, 152, 150), + SemanticLabel::Door => Color::srgb_u8(214, 39, 40), + SemanticLabel::Window => Color::srgb_u8(197, 176, 213), + SemanticLabel::Bookshelf => Color::srgb_u8(148, 103, 189), + SemanticLabel::Picture => Color::srgb_u8(196, 156, 148), + SemanticLabel::Counter => Color::srgb_u8(23, 190, 207), + SemanticLabel::Blinds => Color::srgb_u8(178, 76, 76), + SemanticLabel::Desk => Color::srgb_u8(247, 182, 210), + SemanticLabel::Shelves => Color::srgb_u8(66, 188, 102), + SemanticLabel::Curtain => Color::srgb_u8(219, 219, 141), + SemanticLabel::Dresser => Color::srgb_u8(140, 57, 197), + SemanticLabel::Pillow => Color::srgb_u8(202, 185, 52), + SemanticLabel::Mirror => Color::srgb_u8(51, 176, 203), + SemanticLabel::Floormat => Color::srgb_u8(200, 54, 131), + SemanticLabel::Clothes => Color::srgb_u8(92, 193, 61), + SemanticLabel::Ceiling => Color::srgb_u8(78, 71, 183), + SemanticLabel::Books => Color::srgb_u8(172, 114, 82), + SemanticLabel::Refrigerator => Color::srgb_u8(255, 127, 14), + SemanticLabel::Television => Color::srgb_u8(91, 163, 138), + SemanticLabel::Paper => Color::srgb_u8(153, 98, 156), + SemanticLabel::Towel => Color::srgb_u8(140, 153, 101), + SemanticLabel::ShowerCurtain => Color::srgb_u8(158, 218, 229), + SemanticLabel::Box => Color::srgb_u8(100, 125, 154), + SemanticLabel::Whiteboard => Color::srgb_u8(178, 127, 135), + SemanticLabel::Person => Color::srgb_u8(120, 185, 128), + SemanticLabel::Nightstand => Color::srgb_u8(146, 111, 194), + SemanticLabel::Toilet => Color::srgb_u8(44, 160, 44), + SemanticLabel::Sink => Color::srgb_u8(112, 128, 144), + SemanticLabel::Lamp => Color::srgb_u8(96, 207, 209), + SemanticLabel::Bathtub => Color::srgb_u8(227, 119, 194), + SemanticLabel::Bag => Color::srgb_u8(213, 92, 176), + SemanticLabel::OtherStructure => Color::srgb_u8(94, 106, 211), + SemanticLabel::OtherFurniture => Color::srgb_u8(82, 84, 163), + SemanticLabel::OtherProp => Color::srgb_u8(100, 85, 144), + } + } +} + + +#[derive(Component, Debug, Clone, Default, Reflect, Eq, PartialEq)] +#[reflect(Component, Default)] +pub struct Semantic; + + +#[derive(Debug, Default)] +pub struct SemanticPlugin; +impl Plugin for SemanticPlugin { + fn build(&self, app: &mut App) { + load_internal_asset!( + app, + SEMANTIC_SHADER_HANDLE, + "semantic.wgsl", + Shader::from_wgsl + ); + + app.register_type::(); + app.register_type::(); + + app.add_plugins(MaterialPlugin::::default()); + + app.add_systems(Update, propagate_semantic_labels); + app.add_systems(Update, apply_semantic_material); + + // TODO: add system for bounding box render toggle + } +} + + +fn propagate_semantic_labels( + mut commands: Commands, + semantic_parents: Query<( + &SemanticLabel, + &Children, + )>, +) { + // TODO: capture frame delay based on hierarchy propagation, determine delay from hierarchy depth or apply full-tree update + for (label, children) in semantic_parents.iter() { + for &child in children.iter() { + commands.entity(child).insert(label.clone()); + } + } +} + + +#[allow(clippy::type_complexity)] +fn apply_semantic_material( + mut commands: Commands, + semantic: Query< + ( + Entity, + &DisabledPbrMaterial, + &SemanticLabel, + ), + (With, Without>), + >, + mut removed_semantics: RemovedComponents, + mut materials: ResMut>, +) { + for e in removed_semantics.read() { + if let Some(mut commands) = commands.get_entity(e) { + commands.remove::>(); + } + } + + for (e, pbr_material, label) in &semantic { + let color = label.color().to_linear(); + let semantic_material = materials.add( + ExtendedMaterial { + base: StandardMaterial { + double_sided: pbr_material.double_sided, + cull_mode: pbr_material.cull_mode, + ..default() + }, + extension: SemanticExtension { + color, + }, + }, + ); + + commands.entity(e).insert(semantic_material); + } +} + + +pub type SemanticMaterial = ExtendedMaterial; + +#[derive(Default, AsBindGroup, TypePath, Debug, Clone, Asset)] +pub struct SemanticExtension { + #[uniform(100)] + pub color: LinearRgba, +} + +impl MaterialExtension for SemanticExtension { + fn fragment_shader() -> ShaderRef { + SEMANTIC_SHADER_HANDLE.into() + } +} diff --git a/src/render/semantic.wgsl b/src/render/semantic.wgsl new file mode 100644 index 0000000..d98d545 --- /dev/null +++ b/src/render/semantic.wgsl @@ -0,0 +1,18 @@ +#import bevy_pbr::{ + forward_io::VertexOutput, + mesh_view_bindings::view, +} + + +@group(2) @binding(100) +var color: vec4; + + +@fragment +fn fragment(in: VertexOutput) -> @location(0) vec4 { + // let view_normal = normalize((view.view_from_world * vec4(in.world_normal, 0.0)).xyz); + // let normal_color = (view_normal * 0.5) + vec3(0.5, 0.5, 0.5); + // return vec4(normal_color, 1.0); + + return vec4(color.rgb, 1.0); +} diff --git a/src/scene/mod.rs b/src/scene/mod.rs index 7228cf8..6ef8ff1 100644 --- a/src/scene/mod.rs +++ b/src/scene/mod.rs @@ -18,6 +18,7 @@ use crate::{ }; // TODO: cornell box room scene +pub mod semantic_room; pub mod cornell_cube; pub mod lighting; pub mod object; @@ -40,6 +41,7 @@ impl Plugin for ZeroverseScenePlugin { app.register_type::(); app.add_plugins(( + semantic_room::ZeroverseSemanticRoomPlugin, cornell_cube::ZeroverseCornellCubePlugin, lighting::ZeroverseLightingPlugin, object::ZeroverseObjectPlugin, @@ -81,6 +83,7 @@ pub enum ZeroverseSceneType { CornellCube, #[default] Object, + SemanticRoom, Room, } diff --git a/src/scene/room.rs b/src/scene/room.rs index 8ab3a05..346750b 100644 --- a/src/scene/room.rs +++ b/src/scene/room.rs @@ -32,6 +32,7 @@ use crate::{ ZeroversePrimitives, ZeroversePrimitiveSettings, }, + render::semantic::SemanticLabel, }; @@ -92,6 +93,7 @@ impl Default for ZeroverseRoomSettings { } +// TODO: abstract base room (walls, floor, ceiling) fn setup_scene( mut commands: Commands, mut load_event: EventWriter, @@ -193,6 +195,7 @@ fn setup_scene( ..default() }, Name::new("room_top_plane"), + SemanticLabel::Ceiling, )); commands.spawn(( @@ -201,6 +204,7 @@ fn setup_scene( ..default() }, Name::new("room_bottom_plane"), + SemanticLabel::Floor, )); commands.spawn(( @@ -209,6 +213,7 @@ fn setup_scene( ..default() }, Name::new("room_front_plane"), + SemanticLabel::Wall, )); commands.spawn(( @@ -217,6 +222,7 @@ fn setup_scene( ..default() }, Name::new("room_back_plane"), + SemanticLabel::Wall, )); commands.spawn(( @@ -225,6 +231,7 @@ fn setup_scene( ..default() }, Name::new("room_left_plane"), + SemanticLabel::Wall, )); commands.spawn(( @@ -233,6 +240,7 @@ fn setup_scene( ..default() }, Name::new("room_right_plane"), + SemanticLabel::Wall, )); } diff --git a/src/scene/semantic_room.rs b/src/scene/semantic_room.rs new file mode 100644 index 0000000..b2399ea --- /dev/null +++ b/src/scene/semantic_room.rs @@ -0,0 +1,529 @@ +use bevy::{ + prelude::*, + render::render_resource::Face, +}; + +use crate::{ + camera::{ + CameraPositionSampler, + CameraPositionSamplerType, + LookingAtSampler, + ZeroverseCamera, + }, + scene::{ + lighting::{ + setup_lighting, + ZeroverseLightingSettings, + }, + RegenerateSceneEvent, + RotationAugment, + SceneLoadedEvent, + ZeroverseScene, + ZeroverseSceneRoot, + ZeroverseSceneSettings, + ZeroverseSceneType, + }, + primitive::{ + CountSampler, + PositionSampler, + PrimitiveBundle, + RotationSampler, + ScaleSampler, + ZeroversePrimitives, + ZeroversePrimitiveSettings, + }, + render::semantic::SemanticLabel, +}; + + +pub struct ZeroverseSemanticRoomPlugin; +impl Plugin for ZeroverseSemanticRoomPlugin { + fn build(&self, app: &mut App) { + app.init_resource::(); + app.register_type::(); + + app.add_systems( + PreUpdate, + regenerate_scene, + ); + } +} + + +#[derive(Clone, Debug, Reflect, Resource)] +#[reflect(Resource)] +pub struct ZeroverseSemanticRoomSettings { + pub camera_floor_padding: f32, + pub camera_wall_padding: f32, + pub chair_wall_padding: f32, + pub table_wall_padding: f32, + pub looking_at_sampler: LookingAtSampler, + pub room_size: ScaleSampler, + pub chair_count: CountSampler, + pub chair_settings: ZeroversePrimitiveSettings, + pub table_settings: ZeroversePrimitiveSettings, // TODO: table scale relative to room scale +} + +impl Default for ZeroverseSemanticRoomSettings { + fn default() -> Self { + Self { + camera_floor_padding: 3.0, + camera_wall_padding: 1.0, + chair_wall_padding: 0.5, + table_wall_padding: 2.0, + looking_at_sampler: LookingAtSampler::Sphere { + geometry: Sphere::new(4.0), + transform: Transform::from_translation(Vec3::new(0.0, 3.0, 0.0)), + }, + room_size: ScaleSampler::Bounded( + Vec3::new(12.0, 8.0, 12.0), + Vec3::new(25.0, 15.0, 25.0), + ), + chair_count: CountSampler::Bounded(3, 8), + chair_settings: ZeroversePrimitiveSettings { + cull_mode: Some(Face::Back), + available_types: vec![ZeroversePrimitives::Cuboid], + components: CountSampler::Exact(1), + wireframe_probability: 0.0, + noise_probability: 0.0, + cast_shadows: false, + rotation_sampler: RotationSampler::Bounded { + min: Vec3::new(0.0, 0.0, 0.0), + max: Vec3::new(0.0, std::f32::consts::PI, 0.0), + }, + scale_sampler: ScaleSampler::Bounded( + Vec3::new(2.0, 3.0, 2.0), + Vec3::new(3.0, 5.0, 3.0), + ), + // scale_sampler: ScaleSampler::Exact(Vec3::new(1.0, 4.0, 1.0)), + smooth_normals_probability: 0.0, + ..default() + }, + table_settings: ZeroversePrimitiveSettings { + cull_mode: Some(Face::Back), + available_types: vec![ZeroversePrimitives::Cuboid], + components: CountSampler::Exact(1), + wireframe_probability: 0.0, + noise_probability: 0.0, + cast_shadows: false, + rotation_sampler: RotationSampler::Identity, + scale_sampler: ScaleSampler::Bounded( + Vec3::new(4.0, 2.0, 4.0), + Vec3::new(12.0, 4.0, 12.0), + ), + smooth_normals_probability: 0.0, + ..default() + }, + } + } +} + + +fn check_aabb_collision( + center: Vec3, + scale: Vec3, + aabb_colliders: &Vec<(Vec3, Vec3)>, +) -> bool { + let half_scale: Vec3 = scale * 0.3; + let min_a = center - half_scale; + let max_a = center + half_scale; + + for (other_center, other_scale) in aabb_colliders.iter() { + let half_other_scale = *other_scale * 0.25; + let min_b = *other_center - half_other_scale; + let max_b = *other_center + half_other_scale; + + if max_a.x < min_b.x || min_a.x > max_b.x { + continue; + } + + if max_a.y < min_b.y || min_a.y > max_b.y { + continue; + } + + if max_a.z < min_b.z || min_a.z > max_b.z { + continue; + } + + return true; + } + + false +} + + +fn setup_scene( + mut commands: Commands, + mut load_event: EventWriter, + room_settings: Res, + scene_settings: Res, +) { + let room_scale = room_settings.room_size.sample(); + + // TODO: set global Y rotation to prevent wall aligned plucker embeddings + + commands.spawn((ZeroverseSceneRoot, ZeroverseScene)) + .insert(Name::new("room")) + .insert(RotationAugment) + .insert(SpatialBundle::default()) + .with_children(|commands| { + {// outer walls + let base_plane_settings = ZeroversePrimitiveSettings { + cull_mode: Some(Face::Front), + available_types: vec![ZeroversePrimitives::Plane], + components: CountSampler::Exact(1), + wireframe_probability: 0.0, + noise_probability: 0.0, + cast_shadows: false, + position_sampler: PositionSampler::Exact { + position: Vec3::ZERO, + }, + rotation_sampler: RotationSampler::Identity, + scale_sampler: ScaleSampler::Exact(Vec3::ONE), + ..default() + }; + + // top plane + let top_plane_settings = ZeroversePrimitiveSettings { + invert_normals: true, + position_sampler: PositionSampler::Exact { + position: Vec3::new(0.0, room_scale.y, 0.0), + }, + scale_sampler: ScaleSampler::Exact(Vec3::new(room_scale.x / 2.0, 1.0, room_scale.z / 2.0)), + ..base_plane_settings.clone() + }; + + // bottom plane + let bottom_plane_settings = ZeroversePrimitiveSettings { + cull_mode: Some(Face::Back), + position_sampler: PositionSampler::Exact { + position: Vec3::new(0.0, 0.0, 0.0), + }, + scale_sampler: ScaleSampler::Exact(Vec3::new(room_scale.x / 2.0, 1.0, room_scale.z / 2.0)), + ..base_plane_settings.clone() + }; + + // front plane + let front_plane_settings = ZeroversePrimitiveSettings { + invert_normals: true, + position_sampler: PositionSampler::Exact { + position: Vec3::new(0.0, room_scale.y / 2.0, room_scale.z / 2.0), + }, + rotation_sampler: RotationSampler::Exact(Quat::from_rotation_x(90.0_f32.to_radians())), + scale_sampler: ScaleSampler::Exact(Vec3::new(room_scale.x / 2.0, 1.0, room_scale.y / 2.0)), + ..base_plane_settings.clone() + }; + + // back plane + let back_plane_settings = ZeroversePrimitiveSettings { + cull_mode: Some(Face::Back), + position_sampler: PositionSampler::Exact { + position: Vec3::new(0.0, room_scale.y / 2.0, -room_scale.z / 2.0), + }, + rotation_sampler: RotationSampler::Exact(Quat::from_rotation_x(90.0_f32.to_radians())), + scale_sampler: ScaleSampler::Exact(Vec3::new(room_scale.x / 2.0, 1.0, room_scale.y / 2.0)), + ..base_plane_settings.clone() + }; + + // left plane + let left_plane_settings = ZeroversePrimitiveSettings { + invert_normals: true, + position_sampler: PositionSampler::Exact { + position: Vec3::new(-room_scale.x / 2.0, room_scale.y / 2.0, 0.0), + }, + rotation_sampler: RotationSampler::Exact(Quat::from_rotation_z(90.0_f32.to_radians())), + scale_sampler: ScaleSampler::Exact(Vec3::new(room_scale.y / 2.0, 1.0, room_scale.z / 2.0)), + ..base_plane_settings.clone() + }; + + // right plane + let right_plane_settings = ZeroversePrimitiveSettings { + cull_mode: Some(Face::Back), + position_sampler: PositionSampler::Exact { + position: Vec3::new(room_scale.x / 2.0, room_scale.y / 2.0, 0.0), + }, + rotation_sampler: RotationSampler::Exact(Quat::from_rotation_z(90.0_f32.to_radians())), + scale_sampler: ScaleSampler::Exact(Vec3::new(room_scale.y / 2.0, 1.0, room_scale.z / 2.0)), + ..base_plane_settings.clone() + }; + + commands.spawn(( + PrimitiveBundle { + settings: top_plane_settings, + ..default() + }, + Name::new("room_top_plane"), + SemanticLabel::Ceiling, + )); + + commands.spawn(( + PrimitiveBundle { + settings: bottom_plane_settings, + ..default() + }, + Name::new("room_bottom_plane"), + SemanticLabel::Floor, + )); + + commands.spawn(( + PrimitiveBundle { + settings: front_plane_settings, + ..default() + }, + Name::new("room_front_plane"), + SemanticLabel::Wall, + )); + + commands.spawn(( + PrimitiveBundle { + settings: back_plane_settings, + ..default() + }, + Name::new("room_back_plane"), + SemanticLabel::Wall, + )); + + commands.spawn(( + PrimitiveBundle { + settings: left_plane_settings, + ..default() + }, + Name::new("room_left_plane"), + SemanticLabel::Wall, + )); + + commands.spawn(( + PrimitiveBundle { + settings: right_plane_settings, + ..default() + }, + Name::new("room_right_plane"), + SemanticLabel::Wall, + )); + } + + let mut aabb_colliders: Vec<(Vec3, Vec3)> = Vec::new(); + + { // table + let mut table_scale = room_settings.table_settings.scale_sampler.sample(); + + let room_half_x = room_scale.x / 2.0; + let room_half_z = room_scale.z / 2.0; + + let max_half_table_scale_x = room_half_x - room_settings.table_wall_padding; + let max_half_table_scale_z = room_half_z - room_settings.table_wall_padding; + + let max_half_table_scale_x = if max_half_table_scale_x > 0.0 { + max_half_table_scale_x + } else { + 0.1 + }; + + let max_half_table_scale_z = if max_half_table_scale_z > 0.0 { + max_half_table_scale_z + } else { + 0.1 + }; + + table_scale.x = table_scale.x.min(max_half_table_scale_x * 2.0); + table_scale.z = table_scale.z.min(max_half_table_scale_z * 2.0); + + let half_table_scale = table_scale * 0.5; + let height_offset = Vec3::new( + 0.0, + table_scale.y / 4.0, + 0.0, + ); + + let center_sampler = PositionSampler::Cube { + extents: Vec3::new( + room_half_x - room_settings.table_wall_padding - half_table_scale.x, + 0.00001, + room_half_z - room_settings.table_wall_padding - half_table_scale.z, + ), + }; + let position = center_sampler.sample() + height_offset; + + aabb_colliders.push((position, table_scale)); + + commands.spawn(( + PrimitiveBundle { + settings: ZeroversePrimitiveSettings { + position_sampler: PositionSampler::Exact { + position, + }, + scale_sampler: ScaleSampler::Exact(table_scale), + rotation_sampler: RotationSampler::Identity, + ..room_settings.table_settings.clone() + }, + spatial: SpatialBundle { + transform: Transform::from_translation(position), + ..default() + }, + }, + Name::new("table"), + SemanticLabel::Table, + )); + } + + { // chairs + let chair_scale = room_settings.chair_settings.scale_sampler.sample(); + let chair_scale = Vec3::new(chair_scale.x, chair_scale.y, chair_scale.x); + let center_sampler = PositionSampler::Cube { + extents: Vec3::new( + room_scale.x / 2.0 - room_settings.chair_wall_padding - chair_scale.x / 2.0, + 0.00001, + room_scale.z / 2.0 - room_settings.chair_wall_padding - chair_scale.z / 2.0, + ), + }; + let chair_scale_sampler = ScaleSampler::Exact(chair_scale); + + let height_offset = Vec3::new( + 0.0, + chair_scale.y / 4.0, + 0.0, + ); + + for _ in 0..room_settings.chair_count.sample() { + let mut position = center_sampler.sample() + height_offset; + + let mut max_attempts = 100; + while check_aabb_collision(position, chair_scale, &aabb_colliders) && max_attempts > 0 { + position = center_sampler.sample() + height_offset; + max_attempts -= 1; + } + + if max_attempts == 0 { + continue; + } + + aabb_colliders.push((position, chair_scale)); + + commands.spawn(( + PrimitiveBundle { + settings: ZeroversePrimitiveSettings { + position_sampler: PositionSampler::Exact { + position, + }, + scale_sampler: chair_scale_sampler.clone(), + // rotation_sampler: RotationSampler::Identity, + ..room_settings.chair_settings.clone() + }, + spatial: SpatialBundle { + transform: Transform::from_translation(position), + ..default() + }, + }, + Name::new("chair"), + SemanticLabel::Chair, + )); + } + } + + { // flat objects + // TODO: tv, whiteboard, door, rug + } + + { // cameras + let size: Vec3 = Vec3::new( + room_scale.x - (room_settings.camera_wall_padding + scene_settings.max_camera_radius) * 2.0, + room_scale.y - (room_settings.camera_floor_padding + scene_settings.max_camera_radius), + room_scale.z - (room_settings.camera_wall_padding + scene_settings.max_camera_radius) * 2.0, + ); + let origin_camera_sampler = CameraPositionSampler { + sampler_type: CameraPositionSamplerType::Band { + size, + rotation: Quat::IDENTITY, + translate: Vec3::new( + 0.0, + room_settings.camera_floor_padding + size.y / 2.0, + 0.0, + ), + }, + looking_at: room_settings.looking_at_sampler.clone(), + }; + let origin_camera_center = origin_camera_sampler.sample(); + let mut rng = rand::thread_rng(); + + for _ in 0..scene_settings.num_cameras { + if scene_settings.max_camera_radius <= 0.0 { + let size: Vec3 = Vec3::new( + room_scale.x - room_settings.camera_wall_padding * 2.0, + room_scale.y - room_settings.camera_floor_padding, + room_scale.z - room_settings.camera_wall_padding * 2.0, + ); + + let camera_sampler = CameraPositionSampler { + sampler_type: CameraPositionSamplerType::Band { + size, + rotation: Quat::IDENTITY, + translate: Vec3::new( + 0.0, + room_settings.camera_floor_padding + size.y / 2.0, + 0.0, + ), + }, + looking_at: room_settings.looking_at_sampler.clone(), + }; + + commands.spawn(ZeroverseCamera { + sampler: camera_sampler, + ..default() + }); + } else { + let circular_sampler = CameraPositionSampler { + sampler_type: CameraPositionSamplerType::Circle { + radius: scene_settings.max_camera_radius, + rotation: Quat::from_rng(&mut rng), + translate: origin_camera_center.translation, + }, + looking_at: room_settings.looking_at_sampler.clone(), + }; + + commands.spawn(ZeroverseCamera { + sampler: circular_sampler, + ..default() + }); + } + } + } + }); + + load_event.send(SceneLoadedEvent); +} + + +fn regenerate_scene( + mut commands: Commands, + room_settings: Res, + clear_zeroverse_scenes: Query>, + mut regenerate_events: EventReader, + scene_settings: Res, + load_event: EventWriter, + lighting_settings: Res, +) { + if scene_settings.scene_type != ZeroverseSceneType::SemanticRoom { + return; + } + + if regenerate_events.is_empty() { + return; + } + regenerate_events.clear(); + + for entity in clear_zeroverse_scenes.iter() { + commands.entity(entity).despawn_recursive(); + } + + setup_lighting( + commands.reborrow(), + lighting_settings, + ); + + setup_scene( + commands, + load_event, + room_settings, + scene_settings, + ); +} From cca6be7ae6ba11e00f4a6ed93c68d7e07d470743 Mon Sep 17 00:00:00 2001 From: mosure Date: Wed, 20 Nov 2024 22:15:26 -0600 Subject: [PATCH 2/7] feat: cuboid door --- src/primitive.rs | 17 +++++++++ src/scene/semantic_room.rs | 76 +++++++++++++++++++++++++++++++++++++- 2 files changed, 91 insertions(+), 2 deletions(-) diff --git a/src/primitive.rs b/src/primitive.rs index bfc900c..3b357b7 100644 --- a/src/primitive.rs +++ b/src/primitive.rs @@ -205,6 +205,9 @@ impl ScaleSampler { #[derive(Clone, Debug, Reflect)] pub enum PositionSampler { + Band { + size: Vec3, + }, Capsule { radius: f32, length: f32, @@ -236,6 +239,20 @@ impl PositionSampler { let rng = &mut rand::thread_rng(); match *self { + PositionSampler::Band { size } => { + let face = rng.gen_range(0..4); + + let (x, z) = match face { + 0 => (-size.x / 2.0, rng.gen_range(-size.z / 2.0..size.z / 2.0)), + 1 => (size.x / 2.0, rng.gen_range(-size.z / 2.0..size.z / 2.0)), + 2 => (rng.gen_range(-size.x / 2.0..size.x / 2.0), -size.z / 2.0), + 3 => (rng.gen_range(-size.x / 2.0..size.x / 2.0), size.z / 2.0), + _ => unreachable!(), + }; + + let y = rng.gen_range(-size.y / 2.0..size.y / 2.0); + Vec3::new(x, y, z) + }, PositionSampler::Capsule { radius, length } => Capsule3d::new(radius, length).sample_interior(rng), PositionSampler::Cube { extents } => Cuboid::from_size(extents).sample_interior(rng), PositionSampler::Cylinder { radius, height } => Cylinder::new(radius, height).sample_interior(rng), diff --git a/src/scene/semantic_room.rs b/src/scene/semantic_room.rs index b2399ea..6ef77d0 100644 --- a/src/scene/semantic_room.rs +++ b/src/scene/semantic_room.rs @@ -2,6 +2,7 @@ use bevy::{ prelude::*, render::render_resource::Face, }; +use rand::Rng; use crate::{ camera::{ @@ -62,6 +63,7 @@ pub struct ZeroverseSemanticRoomSettings { pub chair_count: CountSampler, pub chair_settings: ZeroversePrimitiveSettings, pub table_settings: ZeroversePrimitiveSettings, // TODO: table scale relative to room scale + pub door_settings: ZeroversePrimitiveSettings, } impl Default for ZeroverseSemanticRoomSettings { @@ -114,6 +116,21 @@ impl Default for ZeroverseSemanticRoomSettings { smooth_normals_probability: 0.0, ..default() }, + door_settings: ZeroversePrimitiveSettings { + cull_mode: Some(Face::Back), + available_types: vec![ZeroversePrimitives::Cuboid], // TODO: use plane + components: CountSampler::Exact(1), + wireframe_probability: 0.0, + noise_probability: 0.0, + cast_shadows: false, + rotation_sampler: RotationSampler::Identity, + scale_sampler: ScaleSampler::Bounded( + Vec3::new(3.5, 7.0, 0.0001), + Vec3::new(4.5, 12.0, 0.001), + ), + smooth_normals_probability: 0.0, + ..default() + }, } } } @@ -158,6 +175,8 @@ fn setup_scene( room_settings: Res, scene_settings: Res, ) { + let mut rng = rand::thread_rng(); + let room_scale = room_settings.room_size.sample(); // TODO: set global Y rotation to prevent wall aligned plucker embeddings @@ -420,8 +439,61 @@ fn setup_scene( } } - { // flat objects - // TODO: tv, whiteboard, door, rug + // TODO: tv, whiteboard, door, rug + { // door + let face = rng.gen_range(0..4); + let mut door_scale = room_settings.door_settings.scale_sampler.sample(); + + let hw = door_scale.x / 2.0; + let (x_offset, z_offset) = match face { + 0 => (0.0, hw), + 1 => (0.0, hw), + 2 => (hw, 0.0), + 3 => (hw, 0.0), + _ => unreachable!(), + }; + + let perimeter = Vec3::new( + room_scale.x / 2.0 - 0.001 - x_offset, + 0.0, + room_scale.z / 2.0 - 0.001 - z_offset, + ); + + let (x, z) = match face { + 0 => (-perimeter.x / 2.0, rng.gen_range(-perimeter.z / 2.0..perimeter.z / 2.0)), + 1 => (perimeter.x / 2.0, rng.gen_range(-perimeter.z / 2.0..perimeter.z / 2.0)), + 2 => (rng.gen_range(-perimeter.x / 2.0..perimeter.x / 2.0), -perimeter.z / 2.0), + 3 => (rng.gen_range(-perimeter.x / 2.0..perimeter.x / 2.0), perimeter.z / 2.0), + _ => unreachable!(), + }; + door_scale.y = door_scale.y.min(room_scale.y); + let door_position = Vec3::new(x, door_scale.y / 4.0, z); + let door_rotation = match face { + 0 => Quat::from_rotation_y(90.0_f32.to_radians()), + 1 => Quat::from_rotation_y(-90.0_f32.to_radians()), + 2 => Quat::from_rotation_y(180.0_f32.to_radians()), + 3 => Quat::IDENTITY, + _ => unreachable!(), + }; + + commands.spawn(( + PrimitiveBundle { + settings: ZeroversePrimitiveSettings { + position_sampler: PositionSampler::Exact { + position: door_position, + }, + scale_sampler: ScaleSampler::Exact(door_scale), + rotation_sampler: RotationSampler::Exact(door_rotation), + ..room_settings.door_settings.clone() + }, + spatial: SpatialBundle { + transform: Transform::from_translation(door_position), + ..default() + }, + }, + Name::new("door"), + SemanticLabel::Door, + )); } { // cameras From 2e5094728a650e27be4c0ab597c6f35c8c994e58 Mon Sep 17 00:00:00 2001 From: mosure Date: Tue, 28 Jan 2025 14:20:58 -0600 Subject: [PATCH 3/7] feat: bevy 0.15 support --- Cargo.toml | 18 +- README.md | 1 + ffi/Cargo.toml | 16 +- ffi/src/lib.rs | 9 +- src/app.rs | 72 ++-- src/camera.rs | 92 +++-- src/plucker/mod.rs | 117 ++++--- src/primitive.rs | 17 +- src/render/depth.rs | 9 +- src/render/mod.rs | 14 +- src/render/normal.rs | 9 +- src/render/semantic.rs | 9 +- src/scene/cornell_cube.rs | 209 ++++++------ src/scene/lighting.rs | 22 +- src/scene/mod.rs | 1 + src/scene/object.rs | 21 +- src/scene/room.rs | 432 ++++++++++++------------ src/scene/semantic_room.rs | 668 ++++++++++++++++++------------------- 18 files changed, 837 insertions(+), 899 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index a997e6d..9208746 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "bevy_zeroverse" description = "bevy zeroverse synthetic dataset generator" -version = "0.5.1" +version = "0.6.0" edition = "2021" authors = ["mosure "] license = "MIT" @@ -43,7 +43,6 @@ default = [ "development", "extension-module", "multi_threaded", - "plucker", "viewer", ] @@ -73,27 +72,26 @@ web = [ webgl2 = ["bevy/webgl2"] webgpu = [ "bevy/webgpu", - "plucker", ] [dependencies] bevy_args = "1.6" -bevy-inspector-egui = { version = "0.27", optional = true } -bevy_panorbit_camera = { version = "0.20", optional = true, features = ["bevy_egui"] } +bevy-inspector-egui = { version = "0.29", optional = true } +bevy_panorbit_camera = { version = "0.22", optional = true, features = ["bevy_egui"] } clap = { version = "4.5", features = ["derive"] } futures-intrusive = "0.5" glob = "0.3" -itertools = "0.13" +itertools = "0.14" noise = { version = "0.9" } pollster = "0.4" -pyo3 = { version = "0.22", features = ["macros"], optional = true } +pyo3 = { version = "0.23", features = ["macros"], optional = true } rand = "0.8" rayon = { version = "1.10", optional = true } serde = "1.0" strum = "0.26" strum_macros = "0.26" -wgpu = "0.20.0" +wgpu = "23.0.1" [target.'cfg(target_arch = "wasm32")'.dependencies] @@ -102,7 +100,7 @@ wasm-bindgen = "0.2" [dependencies.bevy] -version = "0.14" +version = "0.15" default-features = false features = [ "bevy_asset", @@ -132,7 +130,7 @@ features = [ [dev-dependencies] criterion = { version = "0.5", features = ["html_reports"] } futures-intrusive = { version = "0.5.0" } -pollster = { version = "0.3.0" } +pollster = { version = "0.4" } [profile.dev.package."*"] opt-level = 3 diff --git a/README.md b/README.md index fca16bc..24e9e5e 100644 --- a/README.md +++ b/README.md @@ -61,6 +61,7 @@ for batch in dataloader: | `bevy_zeroverse` | `bevy` | | :-- | :-- | +| `0.6` | `0.15` | | `0.2` | `0.14` | | `0.1` | `0.13` | diff --git a/ffi/Cargo.toml b/ffi/Cargo.toml index c22e0ed..ab0875b 100644 --- a/ffi/Cargo.toml +++ b/ffi/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "bevy_zeroverse_ffi" description = "bevy zeroverse ffi library" -version = "0.9.0" +version = "0.10.0" edition = "2021" license = "MIT" default-run = "generate" @@ -18,21 +18,21 @@ extension-module = [ [dependencies] bevy_args = "1.6" -# bevy_zeroverse = { path = "../", default-features = false, features = ["python"] } -bevy_zeroverse = { version = "0.5", default-features = false, features = ["python"] } +bevy_zeroverse = { path = "../", default-features = false, features = ["python"] } +# bevy_zeroverse = { version = "0.6", default-features = false, features = ["python"] } bytemuck = "1.17" clap = { version = "4.4", features = ["derive"] } image = "0.25" -ndarray = { version = "0.15", features = ["blas"] } +ndarray = { version = "0.16", features = ["blas"] } once_cell = "1.19" -pyo3 = { version = "0.22", features = ["macros"] } -pyo3-log = "0.11" -safetensors = "0.4" +pyo3 = { version = "0.23", features = ["macros"] } +pyo3-log = "0.12" +safetensors = "0.5" serde = "1.0" [dependencies.bevy] -version = "0.14" +version = "0.15" default-features = false features = [ "bevy_asset", diff --git a/ffi/src/lib.rs b/ffi/src/lib.rs index 2e0af65..78a79bf 100644 --- a/ffi/src/lib.rs +++ b/ffi/src/lib.rs @@ -70,17 +70,17 @@ pub struct View { impl View { #[getter] fn color<'py>(&self, py: Python<'py>) -> Bound<'py, PyBytes> { - PyBytes::new_bound(py, &self.color) + PyBytes::new(py, &self.color) } #[getter] fn depth<'py>(&self, py: Python<'py>) -> Bound<'py, PyBytes> { - PyBytes::new_bound(py, &self.depth) + PyBytes::new(py, &self.depth) } #[getter] fn normal<'py>(&self, py: Python<'py>) -> Bound<'py, PyBytes> { - PyBytes::new_bound(py, &self.normal) + PyBytes::new(py, &self.normal) } fn __str__(&self) -> PyResult { @@ -107,7 +107,7 @@ impl Sample { #[getter] fn views<'py>(&self, py: Python<'py>) -> Bound<'py, PyList> { let views_list: Vec<_> = self.views.iter().map(|v| v.clone().into_py(py)).collect(); - PyList::new_bound(py, views_list) + PyList::new(py, views_list).unwrap() } fn __str__(&self) -> PyResult { @@ -334,6 +334,7 @@ fn sample_stream( RenderMode::Color => view.color = image_data, RenderMode::Depth => view.depth = image_data, RenderMode::Normal => view.normal = image_data, + RenderMode::Semantic => panic!("semantic rendering not supported"), } } diff --git a/src/app.rs b/src/app.rs index f97625e..c489705 100644 --- a/src/app.rs +++ b/src/app.rs @@ -57,7 +57,7 @@ use crate::{ ShuffleMaterialsEvent, ZeroverseMaterials, }, - plucker::ZeroversePluckerSettings, + // plucker::ZeroversePluckerSettings, primitive::ScaleSampler, render::RenderMode, scene::{ @@ -167,7 +167,7 @@ pub struct BevyZeroverseConfig { pub scene_type: ZeroverseSceneType, #[pyo3(get, set)] - #[arg(long, default_value = "true")] + #[arg(long, default_value = "false")] pub rotation_augmentation: bool, #[pyo3(get, set)] @@ -295,7 +295,7 @@ impl Default for BevyZeroverseConfig { yaw_speed: 0.0, render_mode: Default::default(), scene_type: Default::default(), - rotation_augmentation: false, + rotation_augmentation: true, max_camera_radius: 0.0, } } @@ -388,8 +388,6 @@ pub fn viewer_app( #[cfg(feature = "viewer")] app.add_plugins(PanOrbitCameraPlugin); - app.insert_resource(Msaa::Sample4); - #[cfg(feature = "viewer")] if args.editor { app.register_type::(); @@ -455,7 +453,7 @@ fn setup_camera( // TODO: add a check for dataloader/headless mode if args.camera_grid { - commands.spawn(Camera2dBundle::default()) + commands.spawn(Camera2d) .insert(MaterialGridCameraMarker); return; } @@ -528,8 +526,10 @@ fn setup_camera_grid( let rows = (camera_count as f32).sqrt().ceil() as u16; let cols = (camera_count as f32 / rows as f32).ceil() as u16; - commands.spawn(NodeBundle { - style: Style { + commands.spawn(( + CameraGrid, + Name::new("camera_grid"), + Node { display: Display::Grid, width: Val::Percent(100.0), height: Val::Percent(100.0), @@ -537,32 +537,20 @@ fn setup_camera_grid( grid_template_rows: RepeatedGridTrack::flex(rows, 1.0), ..default() }, - background_color: BackgroundColor(Color::BLACK), - ..default() - }) - .with_children(|builder| { + BackgroundColor(Color::BLACK), + )).with_children(|builder| { for (_, camera) in zeroverse_cameras.iter() { let texture = match camera.target.clone() { RenderTarget::Image(texture) => texture, _ => continue, }; - builder.spawn(ImageBundle { - style: Style { - width: Val::Percent(100.0), - height: Val::Percent(100.0), - ..default() - }, - image: UiImage { - texture, - ..default() - }, + builder.spawn(ImageNode { + image: texture, ..default() }); } - }) - .insert(CameraGrid) - .insert(Name::new("camera_grid")); + }); } } @@ -592,18 +580,18 @@ fn setup_material_grid( let rows = (material_count as f32).sqrt().ceil() as u16; let cols = (material_count as f32 / rows as f32).ceil() as u16; - commands.spawn(NodeBundle { - style: Style { + commands.spawn(( + MaterialGrid, + Name::new("material_grid"), + Node { display: Display::Grid, width: Val::Percent(100.0), height: Val::Percent(100.0), grid_template_columns: RepeatedGridTrack::flex(cols, 1.0), grid_template_rows: RepeatedGridTrack::flex(rows, 1.0), ..default() - }, - background_color: BackgroundColor(Color::BLACK), - ..default() - }) + } + )) .with_children(|builder| { for material in &zeroverse_materials.materials { let base_color_texture = standard_materials @@ -613,22 +601,12 @@ fn setup_material_grid( .clone() .unwrap(); - builder.spawn(ImageBundle { - style: Style { - width: Val::Percent(100.0), - height: Val::Percent(100.0), - ..default() - }, - image: UiImage { - texture: base_color_texture, - ..default() - }, + builder.spawn(ImageNode { + image: base_color_texture, ..default() }); } - }) - .insert(MaterialGrid) - .insert(Name::new("material_grid")); + }); } } @@ -667,7 +645,7 @@ fn rotate_scene( mut scene_roots: Query<&mut Transform, With>, ) { for mut transform in scene_roots.iter_mut() { - let delta_rot = args.yaw_speed * time.delta_seconds(); + let delta_rot = args.yaw_speed * time.delta_secs(); transform.rotate(Quat::from_rotation_y(delta_rot)); } } @@ -675,11 +653,11 @@ fn rotate_scene( fn propagate_cli_settings( args: Res, - mut plucker_settings: ResMut, + // mut plucker_settings: ResMut, mut scene_settings: ResMut, ) { if args.is_changed() { - plucker_settings.enabled = args.plucker_visualization; + // plucker_settings.enabled = args.plucker_visualization; scene_settings.num_cameras = args.num_cameras; scene_settings.rotation_augmentation = args.rotation_augmentation; diff --git a/src/camera.rs b/src/camera.rs index 31b28e2..d753699 100644 --- a/src/camera.rs +++ b/src/camera.rs @@ -1,7 +1,7 @@ use bevy::{ prelude::*, core_pipeline::{ - bloom::BloomSettings, + bloom::Bloom, core_3d::ScreenSpaceTransmissionQuality, tonemapping::Tonemapping, }, @@ -183,10 +183,39 @@ impl CameraPositionSampler { } +#[derive(Component, Debug, Reflect)] +pub struct PerspectiveSampler { + pub min_fov_deg: f32, + pub max_fov_deg: f32, +} + +impl Default for PerspectiveSampler { + fn default() -> Self { + Self { + min_fov_deg: 20.0, + max_fov_deg: 90.0, + } + } +} + +impl PerspectiveSampler { + pub fn sample(&self) -> PerspectiveProjection { + let rng = &mut rand::thread_rng(); + let fov_deg = rng.gen_range(self.min_fov_deg..self.max_fov_deg); + let fov = fov_deg * std::f32::consts::PI / 180.0; + PerspectiveProjection { + fov, + ..default() + } + } +} + + #[derive(Component, Debug, Default, Reflect)] pub struct ZeroverseCamera { pub looking_at: LookingAtSampler, - pub sampler: CameraPositionSampler, + pub perspective_sampler: PerspectiveSampler, + pub position_sampler: CameraPositionSampler, pub resolution: Option, pub override_transform: Option, } @@ -241,32 +270,25 @@ fn insert_cameras( let render_target = images.add(render_target); let target = RenderTarget::Image(render_target.clone()); + // TODO: modulate fov let mut camera = commands.entity(entity); camera .insert(( - Camera3dBundle { - camera: Camera { - hdr: true, - target, - ..default() - }, - camera_3d: Camera3d { - screen_space_specular_transmission_quality: ScreenSpaceTransmissionQuality::High, - ..default() - }, - exposure: Exposure::INDOOR, - projection: Projection::Perspective( - PerspectiveProjection { - fov: 60.0 * std::f32::consts::PI / 180.0, - ..default() - }, - ), - transform: zeroverse_camera.override_transform.unwrap_or(zeroverse_camera.sampler.sample()), - tonemapping: Tonemapping::TonyMcMapface, + Camera3d { + screen_space_specular_transmission_quality: ScreenSpaceTransmissionQuality::High, ..default() }, + Camera { + hdr: true, + target, + ..default() + }, + Exposure::INDOOR, + Projection::Perspective(zeroverse_camera.perspective_sampler.sample()), + zeroverse_camera.override_transform.unwrap_or(zeroverse_camera.position_sampler.sample()), + Tonemapping::TonyMcMapface, PluckerCamera, - BloomSettings::default(), + Bloom::default(), Name::new("zeroverse_camera"), )); @@ -324,21 +346,18 @@ fn setup_editor_camera( let render_layer = RenderLayers::default().union(&EDITOR_CAMERA_RENDER_LAYER); commands.entity(entity) .insert(( - Camera3dBundle { - camera: Camera { - hdr: true, - ..default() - }, - camera_3d: Camera3d { - screen_space_specular_transmission_quality: ScreenSpaceTransmissionQuality::High, - ..default() - }, - exposure: Exposure::INDOOR, - transform: marker.transform.unwrap_or_default(), - tonemapping: Tonemapping::TonyMcMapface, + Camera3d { + screen_space_specular_transmission_quality: ScreenSpaceTransmissionQuality::High, + ..default() + }, + Camera { + hdr: true, ..default() }, - BloomSettings::default(), + Exposure::INDOOR, + marker.transform.unwrap_or_default(), + Tonemapping::TonyMcMapface, + Bloom::default(), PluckerCamera, )) .insert(render_layer) @@ -412,8 +431,7 @@ pub fn draw_camera_gizmo( let rect_transform = Transform::from_translation(transform.translation + forward); let rect_transform = rect_transform.mul_transform(Transform::from_rotation(transform.rotation)); gizmos.rect( - rect_transform.translation, - rect_transform.rotation, + rect_transform.to_isometry(), Vec2::new(tan_half_fov_x * 2.0 * scale, tan_half_fov_y * 2.0 * scale), color, ); diff --git a/src/plucker/mod.rs b/src/plucker/mod.rs index fbc4fc3..2fa4feb 100644 --- a/src/plucker/mod.rs +++ b/src/plucker/mod.rs @@ -11,7 +11,7 @@ use bevy::{ ExtractComponent, ExtractComponentPlugin, }, - render_asset::RenderAssets, + // render_asset::RenderAssets, render_graph::{ Node, RenderGraphApp, @@ -43,20 +43,22 @@ use bevy::{ RenderContext, RenderDevice, }, - texture::{ - FallbackImage, - GpuImage, - }, + // storage::GpuShaderStorageBuffer, + // texture::{ + // FallbackImage, + // GpuImage, + // }, view::{ ExtractedView, ViewUniformOffset, ViewUniform, ViewUniforms, }, - Render, + // Render, RenderApp, - RenderSet, - } + // RenderSet, + }, + ui::Node as UiNode, }; @@ -121,11 +123,11 @@ impl Plugin for PluckerPlugin { Node3d::EndMainPass, ); - render_app - .add_systems( - Render, - prepare_plucker_bind_groups.in_set(RenderSet::PrepareBindGroups), - ); + // render_app + // .add_systems( + // Render, + // prepare_plucker_bind_groups.in_set(RenderSet::PrepareBindGroups), + // ); } } @@ -254,25 +256,23 @@ fn create_plucker_output( let visualization = images.add(visualization); let visualization_entity = commands.spawn(( - ImageBundle { - style: Style { - position_type: PositionType::Absolute, - bottom: Val::Px(0.0), - right: Val::Px(0.0), - width: Val::Px(256.0), - height: Val::Px(256.0), - ..default() - }, - image: UiImage { - texture: visualization.clone(), - ..default() - }, + UiNode { + position_type: PositionType::Absolute, + bottom: Val::Px(0.0), + right: Val::Px(0.0), + width: Val::Px(256.0), + height: Val::Px(256.0), ..default() }, PluckerVisualization, TargetCamera(entity), Name::new("plucker_visualization"), - )).id(); + )).with_children(|builder| { + builder.spawn(ImageNode { + image: visualization.clone(), + ..default() + }); + }).id(); commands .entity(entity) @@ -328,6 +328,7 @@ impl FromWorld for PluckerPipeline { shader: PLUCKER_SHADER_HANDLE.clone(), shader_defs: vec![], entry_point: "plucker_kernel".into(), + zero_initialize_workgroup_memory: true, }); Self { @@ -344,34 +345,40 @@ struct PluckerBindGroup { } -fn prepare_plucker_bind_groups( - mut commands: Commands, - images: Res>, - fallback: Res, - plucker_output: Query<( - Entity, - &PluckerOutput, - )>, - render_device: Res, -) { - for (entity, plucker_output) in plucker_output.iter() { - let output = plucker_output - .as_bind_group( - &PluckerOutput::bind_group_layout(&render_device), - &render_device, - &images, - &fallback, - ) - .map(|bg| bg.bind_group) - .unwrap(); - - commands - .entity(entity) - .insert(PluckerBindGroup { - output, - }); - } -} +// TODO: figure this out +// fn prepare_plucker_bind_groups( +// mut commands: Commands, +// gpu_images: Res>, +// fallback_image: Res, +// storage_buffer: Res>, +// param: &mut SystemParamItem<'_, '_, ( +// , +// SRes, +// SRes>, +// )>, +// plucker_output: Query<( +// Entity, +// &PluckerOutput, +// )>, +// render_device: Res, +// ) { +// for (entity, plucker_output) in plucker_output.iter() { +// let output = plucker_output +// .as_bind_group( +// &PluckerOutput::bind_group_layout(&render_device), +// &render_device, +// SystemParamItem::from, +// ) +// .map(|bg| bg.bind_group) +// .unwrap(); + +// commands +// .entity(entity) +// .insert(PluckerBindGroup { +// output, +// }); +// } +// } struct PluckerNode { diff --git a/src/primitive.rs b/src/primitive.rs index 3b357b7..9c2d648 100644 --- a/src/primitive.rs +++ b/src/primitive.rs @@ -71,6 +71,7 @@ pub enum ZeroversePrimitives { // TODO: support scale and rotation pdfs via https://github.com/villor/bevy_lookup_curve #[derive(Clone, Component, Debug, Reflect, Resource)] #[reflect(Resource)] +#[require(Transform, Visibility)] pub struct ZeroversePrimitiveSettings { pub components: CountSampler, pub available_materials: Option>>, @@ -264,13 +265,6 @@ impl PositionSampler { } -#[derive(Bundle, Default, Debug)] -pub struct PrimitiveBundle { - pub settings: ZeroversePrimitiveSettings, - pub spatial: SpatialBundle, -} - - #[derive(Clone, Component, Debug, Reflect)] pub struct ZeroversePrimitive; @@ -418,11 +412,8 @@ fn build_primitive( } let mut primitive = commands.spawn(( - PbrBundle { - mesh: meshes.add(mesh), - material, - ..Default::default() - }, + Mesh3d(meshes.add(mesh)), + MeshMaterial3d(material), TransmittedShadowReceiver, )); @@ -435,7 +426,7 @@ fn build_primitive( } if rng.gen_bool(settings.wireframe_probability as f64) { - primitive.remove::>(); + primitive.remove::>(); // TODO: support textured wireframes primitive.insert(( diff --git a/src/render/depth.rs b/src/render/depth.rs index c03cfe9..ac17bfb 100644 --- a/src/render/depth.rs +++ b/src/render/depth.rs @@ -46,14 +46,14 @@ fn apply_depth_material( Entity, &DisabledPbrMaterial, ), - (With, Without>), + (With, Without), >, mut removed_depths: RemovedComponents, mut materials: ResMut>, ) { for e in removed_depths.read() { if let Some(mut commands) = commands.get_entity(e) { - commands.remove::>(); + commands.remove::(); } } @@ -70,13 +70,16 @@ fn apply_depth_material( ); - commands.entity(e).insert(depth_material); + commands.entity(e).insert(DepthMaterialHandle(depth_material)); } } pub type DepthMaterial = ExtendedMaterial; +#[derive(Component, Debug, Default, Clone, Reflect)] +pub struct DepthMaterialHandle(pub Handle); + #[derive(Default, AsBindGroup, TypePath, Debug, Clone, Asset)] pub struct DepthExtension { } diff --git a/src/render/mod.rs b/src/render/mod.rs index 7a4aa96..0a22378 100644 --- a/src/render/mod.rs +++ b/src/render/mod.rs @@ -90,7 +90,7 @@ pub fn auto_disable_pbr_material( mut disabled_materials: Query< ( Entity, - &Handle, + &MeshMaterial3d, ), (With, Without), >, @@ -100,16 +100,16 @@ pub fn auto_disable_pbr_material( entity, disabled_material_handle, ) in disabled_materials.iter_mut() { - let disabled_material = standard_materials.get(disabled_material_handle).unwrap(); + let disabled_material = standard_materials.get(&disabled_material_handle.0).unwrap(); commands.entity(entity) .insert(DisabledPbrMaterial { cull_mode: disabled_material.cull_mode, double_sided: disabled_material.double_sided, - material: disabled_material_handle.clone(), + material: disabled_material_handle.0.clone(), }) .remove::() - .remove::>(); + .remove::>(); } } @@ -125,7 +125,7 @@ fn enable_pbr_material( ) { for (entity, disabled_material) in enabled_materials.iter_mut() { commands.entity(entity) - .insert(disabled_material.material.clone()) + .insert(MeshMaterial3d(disabled_material.material.clone())) .remove::() .remove::(); } @@ -135,8 +135,8 @@ fn enable_pbr_material( fn apply_render_modes( mut commands: Commands, render_mode: Res, - meshes: Query>>, - new_meshes: Query>>, + meshes: Query>, + new_meshes: Query>, ) { let insert_render_mode_flag = |commands: &mut Commands, entity: Entity| { match *render_mode { diff --git a/src/render/normal.rs b/src/render/normal.rs index e864a7c..52fc768 100644 --- a/src/render/normal.rs +++ b/src/render/normal.rs @@ -46,14 +46,14 @@ fn apply_normal_material( Entity, &DisabledPbrMaterial, ), - (With, Without>), + (With, Without), >, mut removed_normals: RemovedComponents, mut materials: ResMut>, ) { for e in removed_normals.read() { if let Some(mut commands) = commands.get_entity(e) { - commands.remove::>(); + commands.remove::(); } } @@ -69,13 +69,16 @@ fn apply_normal_material( }, ); - commands.entity(e).insert(normal_material); + commands.entity(e).insert(NormalMaterialHandle(normal_material)); } } pub type NormalMaterial = ExtendedMaterial; +#[derive(Component, Debug, Default, Clone, Reflect)] +pub struct NormalMaterialHandle(pub Handle); + #[derive(Default, AsBindGroup, TypePath, Debug, Clone, Asset)] pub struct NormalExtension { } diff --git a/src/render/semantic.rs b/src/render/semantic.rs index 2682f51..1709817 100644 --- a/src/render/semantic.rs +++ b/src/render/semantic.rs @@ -162,14 +162,14 @@ fn apply_semantic_material( &DisabledPbrMaterial, &SemanticLabel, ), - (With, Without>), + (With, Without), >, mut removed_semantics: RemovedComponents, mut materials: ResMut>, ) { for e in removed_semantics.read() { if let Some(mut commands) = commands.get_entity(e) { - commands.remove::>(); + commands.remove::(); } } @@ -188,13 +188,16 @@ fn apply_semantic_material( }, ); - commands.entity(e).insert(semantic_material); + commands.entity(e).insert(SemanticMaterialHandle(semantic_material)); } } pub type SemanticMaterial = ExtendedMaterial; +#[derive(Component, Debug, Default, Clone, Reflect)] +pub struct SemanticMaterialHandle(pub Handle); + #[derive(Default, AsBindGroup, TypePath, Debug, Clone, Asset)] pub struct SemanticExtension { #[uniform(100)] diff --git a/src/scene/cornell_cube.rs b/src/scene/cornell_cube.rs index 036ab75..cc5c789 100644 --- a/src/scene/cornell_cube.rs +++ b/src/scene/cornell_cube.rs @@ -136,132 +136,127 @@ fn setup_scene( ) { ambient_lighting.brightness = 120.0; - commands.spawn((ZeroverseSceneRoot, ZeroverseScene)) - .insert(Name::new("cornell_cube")) - .insert(RotationAugment) - .insert(SpatialBundle::default()) - .with_children(|commands| { - {//cornell cube walls - let walls = [ - Dir3::X, - Dir3::NEG_X, - Dir3::Y, - Dir3::NEG_Y, - Dir3::Z, - Dir3::NEG_Z, - ]; - - for wall in walls { - let color = wall_color(wall); - let mesh = Plane3d::new(Vec3::Y, Vec2::ONE) - .mesh() - .build(); - - let invert_normals = wall_invert_normal(wall); - let cull_mode = wall_cull_mode(wall); - let transform = wall_transform(wall, Vec3::ONE); - - let material = if wall == Dir3::Z { - let mut rng = rand::thread_rng(); - let base_material = zeroverse_materials.materials - .choose(&mut rng) - .unwrap() - .clone(); - - let mut new_material = standard_materials.get(&base_material).unwrap().clone(); - - new_material.double_sided = false; - new_material.cull_mode = cull_mode.into(); - - standard_materials.add(new_material) - } else { - standard_materials.add(StandardMaterial { - base_color: color, - double_sided: false, - cull_mode: Some(cull_mode), - ..Default::default() - }) - }; - - let mut mesh = mesh.transformed_by(transform); - - mesh.duplicate_vertices(); - mesh.compute_flat_normals(); - - if invert_normals { - if let Some(VertexAttributeValues::Float32x3(ref mut normals)) = - mesh.attribute_mut(Mesh::ATTRIBUTE_NORMAL) - { - normals - .iter_mut() - .for_each(|normal| { - normal[0] = -normal[0]; - normal[1] = -normal[1]; - normal[2] = -normal[2]; - }); - } - } - - commands.spawn(( - PbrBundle { - mesh: meshes.add(mesh), - material, - ..Default::default() - }, - NotShadowCaster, - TransmittedShadowReceiver, - )); - } - } - - {// sphere on left - let mut mesh = Sphere::new(0.25) + commands.spawn(( + Name::new("cornell_cube"), + RotationAugment, + Transform::default(), + Visibility::default(), + ZeroverseSceneRoot, + ZeroverseScene, + )) + .with_children(|commands| { + {//cornell cube walls + let walls = [ + Dir3::X, + Dir3::NEG_X, + Dir3::Y, + Dir3::NEG_Y, + Dir3::Z, + Dir3::NEG_Z, + ]; + + for wall in walls { + let color = wall_color(wall); + let mesh = Plane3d::new(Vec3::Y, Vec2::ONE) .mesh() .build(); - mesh.compute_smooth_normals(); + let invert_normals = wall_invert_normal(wall); + let cull_mode = wall_cull_mode(wall); + let transform = wall_transform(wall, Vec3::ONE); - let material = standard_materials.add(StandardMaterial { - base_color: Color::srgb(0.8, 0.6, 0.2), - ..Default::default() - }); + let material = if wall == Dir3::Z { + let mut rng = rand::thread_rng(); + let base_material = zeroverse_materials.materials + .choose(&mut rng) + .unwrap() + .clone(); - commands.spawn(( - PbrBundle { - mesh: meshes.add(mesh), - material, - transform: Transform::from_translation(Vec3::new(-0.8, 0.5, 0.0)), + let mut new_material = standard_materials.get(&base_material).unwrap().clone(); + + new_material.double_sided = false; + new_material.cull_mode = cull_mode.into(); + + standard_materials.add(new_material) + } else { + standard_materials.add(StandardMaterial { + base_color: color, + double_sided: false, + cull_mode: Some(cull_mode), ..Default::default() - }, + }) + }; + + let mut mesh = mesh.transformed_by(transform); + + mesh.duplicate_vertices(); + mesh.compute_flat_normals(); + + if invert_normals { + if let Some(VertexAttributeValues::Float32x3(ref mut normals)) = + mesh.attribute_mut(Mesh::ATTRIBUTE_NORMAL) + { + normals + .iter_mut() + .for_each(|normal| { + normal[0] = -normal[0]; + normal[1] = -normal[1]; + normal[2] = -normal[2]; + }); + } + } + + commands.spawn(( + Mesh3d(meshes.add(mesh)), + MeshMaterial3d(material), + NotShadowCaster, TransmittedShadowReceiver, )); } - }); + } + + {// sphere on left + let mut mesh = Sphere::new(0.25) + .mesh() + .build(); + + mesh.compute_smooth_normals(); + + let material = standard_materials.add(StandardMaterial { + base_color: Color::srgb(0.8, 0.6, 0.2), + ..Default::default() + }); + + commands.spawn(( + Mesh3d(meshes.add(mesh)), + MeshMaterial3d(material), + NotShadowCaster, + Transform::from_translation(Vec3::new(-0.8, 0.5, 0.0)), + TransmittedShadowReceiver, + )); + } + }); commands.spawn(( - DirectionalLightBundle { - transform: Transform::from_xyz(1.0, -3.0, 2.0) - .looking_at(Vec3::ZERO, Vec3::Y), - directional_light: DirectionalLight { - illuminance: 800.0, - shadows_enabled: true, - ..default() - }, - cascade_shadow_config: CascadeShadowConfigBuilder { - first_cascade_far_bound: 4.0, - maximum_distance: 10.0, - ..default() - } - .into(), + DirectionalLight { + illuminance: 800.0, + shadows_enabled: true, ..default() }, + Transform::from_xyz(1.0, -3.0, 2.0) + .looking_at(Vec3::ZERO, Vec3::Y), + CascadeShadowConfigBuilder { + first_cascade_far_bound: 4.0, + maximum_distance: 10.0, + ..default() + }.build(), ZeroverseScene, Name::new("directional_light"), )); for _ in 0..scene_settings.num_cameras { commands.spawn(ZeroverseCamera { - sampler: CameraPositionSampler { + position_sampler: CameraPositionSampler { sampler_type: CameraPositionSamplerType::Sphere { radius: 3.25, }, diff --git a/src/scene/lighting.rs b/src/scene/lighting.rs index 60f20dd..d89c5dd 100644 --- a/src/scene/lighting.rs +++ b/src/scene/lighting.rs @@ -58,21 +58,17 @@ pub fn setup_lighting( let illuminance = rng.gen_range(lighting_settings.illuminance_range.0..lighting_settings.illuminance_range.1); commands.spawn(( - DirectionalLightBundle { - transform: Transform::from_xyz(x, y, z).looking_at(Vec3::ZERO, Vec3::Y), - directional_light: DirectionalLight { - illuminance, - shadows_enabled: true, - ..default() - }, - cascade_shadow_config: CascadeShadowConfigBuilder { - first_cascade_far_bound: 4.0, - maximum_distance: 10.0, - ..default() - } - .into(), + CascadeShadowConfigBuilder { + first_cascade_far_bound: 4.0, + maximum_distance: 10.0, + ..default() + }.build(), + DirectionalLight { + illuminance, + shadows_enabled: true, ..default() }, + Transform::from_xyz(x, y, z).looking_at(Vec3::ZERO, Vec3::Y), RotationAugment, ZeroverseScene, Name::new("directional_light"), diff --git a/src/scene/mod.rs b/src/scene/mod.rs index 6ef8ff1..ddfddf9 100644 --- a/src/scene/mod.rs +++ b/src/scene/mod.rs @@ -65,6 +65,7 @@ impl Plugin for ZeroverseScenePlugin { pub struct ZeroverseScene; #[derive(Component, Debug, Reflect)] +#[require(Transform, Visibility)] pub struct ZeroverseSceneRoot; diff --git a/src/scene/object.rs b/src/scene/object.rs index 8dea58a..3f6e3fa 100644 --- a/src/scene/object.rs +++ b/src/scene/object.rs @@ -19,10 +19,7 @@ use crate::{ ZeroverseSceneSettings, ZeroverseSceneType, }, - primitive::{ - PrimitiveBundle, - ZeroversePrimitiveSettings, - }, + primitive::ZeroversePrimitiveSettings, }; @@ -44,17 +41,17 @@ fn setup_scene( scene_settings: Res, ) { commands - .spawn(PrimitiveBundle { - settings: primitive_settings.clone(), - ..default() - }) - .insert(RotationAugment) - .insert((ZeroverseScene, ZeroverseSceneRoot)) - .insert(Name::new("zeroverse_object")) + .spawn(( + Name::new("zeroverse_object"), + primitive_settings.clone(), + RotationAugment, + ZeroverseScene, + ZeroverseSceneRoot, + )) .with_children(|commands| { for _ in 0..scene_settings.num_cameras { commands.spawn(ZeroverseCamera { - sampler: CameraPositionSampler { + position_sampler: CameraPositionSampler { sampler_type: CameraPositionSamplerType::Sphere { radius: 3.25, }, diff --git a/src/scene/room.rs b/src/scene/room.rs index 346750b..7110817 100644 --- a/src/scene/room.rs +++ b/src/scene/room.rs @@ -26,7 +26,6 @@ use crate::{ primitive::{ CountSampler, PositionSampler, - PrimitiveBundle, RotationSampler, ScaleSampler, ZeroversePrimitives, @@ -104,247 +103,226 @@ fn setup_scene( // TODO: set global Y rotation to prevent wall aligned plucker embeddings - commands.spawn((ZeroverseSceneRoot, ZeroverseScene)) - .insert(Name::new("room")) - .insert(RotationAugment) - .insert(SpatialBundle::default()) - .with_children(|commands| { - {// outer walls - let base_plane_settings = ZeroversePrimitiveSettings { - cull_mode: Some(Face::Front), - available_types: vec![ZeroversePrimitives::Plane], - components: CountSampler::Exact(1), - wireframe_probability: 0.0, - noise_probability: 0.0, - cast_shadows: false, - position_sampler: PositionSampler::Exact { - position: Vec3::ZERO, - }, - rotation_sampler: RotationSampler::Identity, - scale_sampler: ScaleSampler::Exact(Vec3::ONE), - ..default() - }; - - // top plane - let top_plane_settings = ZeroversePrimitiveSettings { - invert_normals: true, - position_sampler: PositionSampler::Exact { - position: Vec3::new(0.0, scale.y, 0.0), - }, - scale_sampler: ScaleSampler::Exact(Vec3::new(scale.x / 2.0, 1.0, scale.z / 2.0)), - ..base_plane_settings.clone() - }; - - // bottom plane - let bottom_plane_settings = ZeroversePrimitiveSettings { - cull_mode: Some(Face::Back), - position_sampler: PositionSampler::Exact { - position: Vec3::new(0.0, 0.0, 0.0), - }, - scale_sampler: ScaleSampler::Exact(Vec3::new(scale.x / 2.0, 1.0, scale.z / 2.0)), - ..base_plane_settings.clone() - }; - - // front plane - let front_plane_settings = ZeroversePrimitiveSettings { - invert_normals: true, - position_sampler: PositionSampler::Exact { - position: Vec3::new(0.0, scale.y / 2.0, scale.z / 2.0), - }, - rotation_sampler: RotationSampler::Exact(Quat::from_rotation_x(90.0_f32.to_radians())), - scale_sampler: ScaleSampler::Exact(Vec3::new(scale.x / 2.0, 1.0, scale.y / 2.0)), - ..base_plane_settings.clone() - }; - - // back plane - let back_plane_settings = ZeroversePrimitiveSettings { - cull_mode: Some(Face::Back), - position_sampler: PositionSampler::Exact { - position: Vec3::new(0.0, scale.y / 2.0, -scale.z / 2.0), - }, - rotation_sampler: RotationSampler::Exact(Quat::from_rotation_x(90.0_f32.to_radians())), - scale_sampler: ScaleSampler::Exact(Vec3::new(scale.x / 2.0, 1.0, scale.y / 2.0)), - ..base_plane_settings.clone() - }; - - // left plane - let left_plane_settings = ZeroversePrimitiveSettings { - invert_normals: true, - position_sampler: PositionSampler::Exact { - position: Vec3::new(-scale.x / 2.0, scale.y / 2.0, 0.0), - }, - rotation_sampler: RotationSampler::Exact(Quat::from_rotation_z(90.0_f32.to_radians())), - scale_sampler: ScaleSampler::Exact(Vec3::new(scale.y / 2.0, 1.0, scale.z / 2.0)), - ..base_plane_settings.clone() - }; - - // right plane - let right_plane_settings = ZeroversePrimitiveSettings { - cull_mode: Some(Face::Back), - position_sampler: PositionSampler::Exact { - position: Vec3::new(scale.x / 2.0, scale.y / 2.0, 0.0), - }, - rotation_sampler: RotationSampler::Exact(Quat::from_rotation_z(90.0_f32.to_radians())), - scale_sampler: ScaleSampler::Exact(Vec3::new(scale.y / 2.0, 1.0, scale.z / 2.0)), - ..base_plane_settings.clone() - }; - - commands.spawn(( - PrimitiveBundle { - settings: top_plane_settings, - ..default() - }, - Name::new("room_top_plane"), - SemanticLabel::Ceiling, - )); - - commands.spawn(( - PrimitiveBundle { - settings: bottom_plane_settings, - ..default() - }, - Name::new("room_bottom_plane"), - SemanticLabel::Floor, - )); - - commands.spawn(( - PrimitiveBundle { - settings: front_plane_settings, - ..default() - }, - Name::new("room_front_plane"), - SemanticLabel::Wall, - )); - - commands.spawn(( - PrimitiveBundle { - settings: back_plane_settings, - ..default() - }, - Name::new("room_back_plane"), - SemanticLabel::Wall, - )); + commands.spawn(( + Name::new("room"), + RotationAugment, + ZeroverseSceneRoot, + ZeroverseScene, + )) + .with_children(|commands| { + {// outer walls + let base_plane_settings = ZeroversePrimitiveSettings { + cull_mode: Some(Face::Front), + available_types: vec![ZeroversePrimitives::Plane], + components: CountSampler::Exact(1), + wireframe_probability: 0.0, + noise_probability: 0.0, + cast_shadows: false, + position_sampler: PositionSampler::Exact { + position: Vec3::ZERO, + }, + rotation_sampler: RotationSampler::Identity, + scale_sampler: ScaleSampler::Exact(Vec3::ONE), + ..default() + }; + + // top plane + let top_plane_settings = ZeroversePrimitiveSettings { + invert_normals: true, + position_sampler: PositionSampler::Exact { + position: Vec3::new(0.0, scale.y, 0.0), + }, + scale_sampler: ScaleSampler::Exact(Vec3::new(scale.x / 2.0, 1.0, scale.z / 2.0)), + ..base_plane_settings.clone() + }; + + // bottom plane + let bottom_plane_settings = ZeroversePrimitiveSettings { + cull_mode: Some(Face::Back), + position_sampler: PositionSampler::Exact { + position: Vec3::new(0.0, 0.0, 0.0), + }, + scale_sampler: ScaleSampler::Exact(Vec3::new(scale.x / 2.0, 1.0, scale.z / 2.0)), + ..base_plane_settings.clone() + }; + + // front plane + let front_plane_settings = ZeroversePrimitiveSettings { + invert_normals: true, + position_sampler: PositionSampler::Exact { + position: Vec3::new(0.0, scale.y / 2.0, scale.z / 2.0), + }, + rotation_sampler: RotationSampler::Exact(Quat::from_rotation_x(90.0_f32.to_radians())), + scale_sampler: ScaleSampler::Exact(Vec3::new(scale.x / 2.0, 1.0, scale.y / 2.0)), + ..base_plane_settings.clone() + }; + + // back plane + let back_plane_settings = ZeroversePrimitiveSettings { + cull_mode: Some(Face::Back), + position_sampler: PositionSampler::Exact { + position: Vec3::new(0.0, scale.y / 2.0, -scale.z / 2.0), + }, + rotation_sampler: RotationSampler::Exact(Quat::from_rotation_x(90.0_f32.to_radians())), + scale_sampler: ScaleSampler::Exact(Vec3::new(scale.x / 2.0, 1.0, scale.y / 2.0)), + ..base_plane_settings.clone() + }; + + // left plane + let left_plane_settings = ZeroversePrimitiveSettings { + invert_normals: true, + position_sampler: PositionSampler::Exact { + position: Vec3::new(-scale.x / 2.0, scale.y / 2.0, 0.0), + }, + rotation_sampler: RotationSampler::Exact(Quat::from_rotation_z(90.0_f32.to_radians())), + scale_sampler: ScaleSampler::Exact(Vec3::new(scale.y / 2.0, 1.0, scale.z / 2.0)), + ..base_plane_settings.clone() + }; + + // right plane + let right_plane_settings = ZeroversePrimitiveSettings { + cull_mode: Some(Face::Back), + position_sampler: PositionSampler::Exact { + position: Vec3::new(scale.x / 2.0, scale.y / 2.0, 0.0), + }, + rotation_sampler: RotationSampler::Exact(Quat::from_rotation_z(90.0_f32.to_radians())), + scale_sampler: ScaleSampler::Exact(Vec3::new(scale.y / 2.0, 1.0, scale.z / 2.0)), + ..base_plane_settings.clone() + }; + + commands.spawn(( + top_plane_settings, + Name::new("room_top_plane"), + SemanticLabel::Ceiling, + )); + + commands.spawn(( + bottom_plane_settings, + Name::new("room_bottom_plane"), + SemanticLabel::Floor, + )); + + commands.spawn(( + front_plane_settings, + Name::new("room_front_plane"), + SemanticLabel::Wall, + )); + + commands.spawn(( + back_plane_settings, + Name::new("room_back_plane"), + SemanticLabel::Wall, + )); + + commands.spawn(( + left_plane_settings, + Name::new("room_left_plane"), + SemanticLabel::Wall, + )); + + commands.spawn(( + right_plane_settings, + Name::new("room_right_plane"), + SemanticLabel::Wall, + )); + } - commands.spawn(( - PrimitiveBundle { - settings: left_plane_settings, - ..default() - }, - Name::new("room_left_plane"), - SemanticLabel::Wall, - )); + // TODO: add abstraction for furniture, walls, doors... + { // center objects + let center_object_height = 8.0; + let center_object_sampler = PositionSampler::Cube { + extents: Vec3::new( + scale.x / 1.5, + center_object_height / 2.0, + scale.z / 1.5, + ), + }; + + for _ in 0..room_settings.center_primitive_count.sample() { + let height_offset = Vec3::new( + 0.0, + center_object_height / 4.0, + 0.0, + ); + let position = center_object_sampler.sample() + height_offset; + let scale = room_settings.center_primitive_scale_sampler.sample(); commands.spawn(( - PrimitiveBundle { - settings: right_plane_settings, - ..default() - }, - Name::new("room_right_plane"), - SemanticLabel::Wall, + room_settings.center_primitive_settings.clone(), + Transform::from_translation(position).with_scale(scale), + Name::new("center_object"), )); } + } - // TODO: add abstraction for furniture, walls, doors... - { // center objects - let center_object_height = 8.0; - let center_object_sampler = PositionSampler::Cube { - extents: Vec3::new( - scale.x / 1.5, - center_object_height / 2.0, - scale.z / 1.5, - ), - }; + { // wall objects - for _ in 0..room_settings.center_primitive_count.sample() { - let height_offset = Vec3::new( + } + + { // cameras + let size: Vec3 = Vec3::new( + scale.x - (room_settings.camera_wall_padding + scene_settings.max_camera_radius) * 2.0, + scale.y - (room_settings.camera_floor_padding + scene_settings.max_camera_radius), + scale.z - (room_settings.camera_wall_padding + scene_settings.max_camera_radius) * 2.0, + ); + let origin_camera_sampler = CameraPositionSampler { + sampler_type: CameraPositionSamplerType::Band { + size, + rotation: Quat::IDENTITY, + translate: Vec3::new( 0.0, - center_object_height / 4.0, + room_settings.camera_floor_padding + size.y / 2.0, 0.0, + ), + }, + looking_at: room_settings.looking_at_sampler.clone(), + }; + let origin_camera_center = origin_camera_sampler.sample(); + let mut rng = rand::thread_rng(); + + for _ in 0..scene_settings.num_cameras { + if scene_settings.max_camera_radius <= 0.0 { + let size: Vec3 = Vec3::new( + scale.x - room_settings.camera_wall_padding * 2.0, + scale.y - room_settings.camera_floor_padding, + scale.z - room_settings.camera_wall_padding * 2.0, ); - let position = center_object_sampler.sample() + height_offset; - let scale = room_settings.center_primitive_scale_sampler.sample(); - - commands.spawn(( - PrimitiveBundle { - settings: room_settings.center_primitive_settings.clone(), - spatial: SpatialBundle { - transform: Transform::from_translation(position).with_scale(scale), - ..default() - }, - }, - Name::new("center_object"), - )); - } - } - { // wall objects + let camera_sampler = CameraPositionSampler { + sampler_type: CameraPositionSamplerType::Band { + size, + rotation: Quat::IDENTITY, + translate: Vec3::new( + 0.0, + room_settings.camera_floor_padding + size.y / 2.0, + 0.0, + ), + }, + looking_at: room_settings.looking_at_sampler.clone(), + }; - } + commands.spawn(ZeroverseCamera { + position_sampler: camera_sampler, + ..default() + }); + } else { + let circular_sampler = CameraPositionSampler { + sampler_type: CameraPositionSamplerType::Circle { + radius: scene_settings.max_camera_radius, + rotation: Quat::from_rng(&mut rng), + translate: origin_camera_center.translation, + }, + looking_at: room_settings.looking_at_sampler.clone(), + }; - { // cameras - let size: Vec3 = Vec3::new( - scale.x - (room_settings.camera_wall_padding + scene_settings.max_camera_radius) * 2.0, - scale.y - (room_settings.camera_floor_padding + scene_settings.max_camera_radius), - scale.z - (room_settings.camera_wall_padding + scene_settings.max_camera_radius) * 2.0, - ); - let origin_camera_sampler = CameraPositionSampler { - sampler_type: CameraPositionSamplerType::Band { - size, - rotation: Quat::IDENTITY, - translate: Vec3::new( - 0.0, - room_settings.camera_floor_padding + size.y / 2.0, - 0.0, - ), - }, - looking_at: room_settings.looking_at_sampler.clone(), - }; - let origin_camera_center = origin_camera_sampler.sample(); - let mut rng = rand::thread_rng(); - - for _ in 0..scene_settings.num_cameras { - if scene_settings.max_camera_radius <= 0.0 { - let size: Vec3 = Vec3::new( - scale.x - room_settings.camera_wall_padding * 2.0, - scale.y - room_settings.camera_floor_padding, - scale.z - room_settings.camera_wall_padding * 2.0, - ); - - let camera_sampler = CameraPositionSampler { - sampler_type: CameraPositionSamplerType::Band { - size, - rotation: Quat::IDENTITY, - translate: Vec3::new( - 0.0, - room_settings.camera_floor_padding + size.y / 2.0, - 0.0, - ), - }, - looking_at: room_settings.looking_at_sampler.clone(), - }; - - commands.spawn(ZeroverseCamera { - sampler: camera_sampler, - ..default() - }); - } else { - let circular_sampler = CameraPositionSampler { - sampler_type: CameraPositionSamplerType::Circle { - radius: scene_settings.max_camera_radius, - rotation: Quat::from_rng(&mut rng), - translate: origin_camera_center.translation, - }, - looking_at: room_settings.looking_at_sampler.clone(), - }; - - commands.spawn(ZeroverseCamera { - sampler: circular_sampler, - ..default() - }); - } + commands.spawn(ZeroverseCamera { + position_sampler: circular_sampler, + ..default() + }); } } - }); + } + }); load_event.send(SceneLoadedEvent); } diff --git a/src/scene/semantic_room.rs b/src/scene/semantic_room.rs index 6ef77d0..04a4b16 100644 --- a/src/scene/semantic_room.rs +++ b/src/scene/semantic_room.rs @@ -27,7 +27,6 @@ use crate::{ primitive::{ CountSampler, PositionSampler, - PrimitiveBundle, RotationSampler, ScaleSampler, ZeroversePrimitives, @@ -181,385 +180,354 @@ fn setup_scene( // TODO: set global Y rotation to prevent wall aligned plucker embeddings - commands.spawn((ZeroverseSceneRoot, ZeroverseScene)) - .insert(Name::new("room")) - .insert(RotationAugment) - .insert(SpatialBundle::default()) - .with_children(|commands| { - {// outer walls - let base_plane_settings = ZeroversePrimitiveSettings { - cull_mode: Some(Face::Front), - available_types: vec![ZeroversePrimitives::Plane], - components: CountSampler::Exact(1), - wireframe_probability: 0.0, - noise_probability: 0.0, - cast_shadows: false, - position_sampler: PositionSampler::Exact { - position: Vec3::ZERO, - }, - rotation_sampler: RotationSampler::Identity, - scale_sampler: ScaleSampler::Exact(Vec3::ONE), - ..default() - }; + commands.spawn(( + Name::new("room"), + RotationAugment, + ZeroverseSceneRoot, + ZeroverseScene, + )) + .with_children(|commands| { + {// outer walls + let base_plane_settings = ZeroversePrimitiveSettings { + cull_mode: Some(Face::Front), + available_types: vec![ZeroversePrimitives::Plane], + components: CountSampler::Exact(1), + wireframe_probability: 0.0, + noise_probability: 0.0, + cast_shadows: false, + position_sampler: PositionSampler::Exact { + position: Vec3::ZERO, + }, + rotation_sampler: RotationSampler::Identity, + scale_sampler: ScaleSampler::Exact(Vec3::ONE), + ..default() + }; - // top plane - let top_plane_settings = ZeroversePrimitiveSettings { - invert_normals: true, - position_sampler: PositionSampler::Exact { - position: Vec3::new(0.0, room_scale.y, 0.0), - }, - scale_sampler: ScaleSampler::Exact(Vec3::new(room_scale.x / 2.0, 1.0, room_scale.z / 2.0)), - ..base_plane_settings.clone() - }; + // top plane + let top_plane_settings = ZeroversePrimitiveSettings { + invert_normals: true, + position_sampler: PositionSampler::Exact { + position: Vec3::new(0.0, room_scale.y, 0.0), + }, + scale_sampler: ScaleSampler::Exact(Vec3::new(room_scale.x / 2.0, 1.0, room_scale.z / 2.0)), + ..base_plane_settings.clone() + }; - // bottom plane - let bottom_plane_settings = ZeroversePrimitiveSettings { - cull_mode: Some(Face::Back), - position_sampler: PositionSampler::Exact { - position: Vec3::new(0.0, 0.0, 0.0), - }, - scale_sampler: ScaleSampler::Exact(Vec3::new(room_scale.x / 2.0, 1.0, room_scale.z / 2.0)), - ..base_plane_settings.clone() - }; + // bottom plane + let bottom_plane_settings = ZeroversePrimitiveSettings { + cull_mode: Some(Face::Back), + position_sampler: PositionSampler::Exact { + position: Vec3::new(0.0, 0.0, 0.0), + }, + scale_sampler: ScaleSampler::Exact(Vec3::new(room_scale.x / 2.0, 1.0, room_scale.z / 2.0)), + ..base_plane_settings.clone() + }; + + // front plane + let front_plane_settings = ZeroversePrimitiveSettings { + invert_normals: true, + position_sampler: PositionSampler::Exact { + position: Vec3::new(0.0, room_scale.y / 2.0, room_scale.z / 2.0), + }, + rotation_sampler: RotationSampler::Exact(Quat::from_rotation_x(90.0_f32.to_radians())), + scale_sampler: ScaleSampler::Exact(Vec3::new(room_scale.x / 2.0, 1.0, room_scale.y / 2.0)), + ..base_plane_settings.clone() + }; - // front plane - let front_plane_settings = ZeroversePrimitiveSettings { - invert_normals: true, - position_sampler: PositionSampler::Exact { - position: Vec3::new(0.0, room_scale.y / 2.0, room_scale.z / 2.0), - }, - rotation_sampler: RotationSampler::Exact(Quat::from_rotation_x(90.0_f32.to_radians())), - scale_sampler: ScaleSampler::Exact(Vec3::new(room_scale.x / 2.0, 1.0, room_scale.y / 2.0)), - ..base_plane_settings.clone() - }; - - // back plane - let back_plane_settings = ZeroversePrimitiveSettings { - cull_mode: Some(Face::Back), - position_sampler: PositionSampler::Exact { - position: Vec3::new(0.0, room_scale.y / 2.0, -room_scale.z / 2.0), - }, - rotation_sampler: RotationSampler::Exact(Quat::from_rotation_x(90.0_f32.to_radians())), - scale_sampler: ScaleSampler::Exact(Vec3::new(room_scale.x / 2.0, 1.0, room_scale.y / 2.0)), - ..base_plane_settings.clone() - }; - - // left plane - let left_plane_settings = ZeroversePrimitiveSettings { - invert_normals: true, - position_sampler: PositionSampler::Exact { - position: Vec3::new(-room_scale.x / 2.0, room_scale.y / 2.0, 0.0), - }, - rotation_sampler: RotationSampler::Exact(Quat::from_rotation_z(90.0_f32.to_radians())), - scale_sampler: ScaleSampler::Exact(Vec3::new(room_scale.y / 2.0, 1.0, room_scale.z / 2.0)), - ..base_plane_settings.clone() - }; - - // right plane - let right_plane_settings = ZeroversePrimitiveSettings { - cull_mode: Some(Face::Back), - position_sampler: PositionSampler::Exact { - position: Vec3::new(room_scale.x / 2.0, room_scale.y / 2.0, 0.0), - }, - rotation_sampler: RotationSampler::Exact(Quat::from_rotation_z(90.0_f32.to_radians())), - scale_sampler: ScaleSampler::Exact(Vec3::new(room_scale.y / 2.0, 1.0, room_scale.z / 2.0)), - ..base_plane_settings.clone() - }; + // back plane + let back_plane_settings = ZeroversePrimitiveSettings { + cull_mode: Some(Face::Back), + position_sampler: PositionSampler::Exact { + position: Vec3::new(0.0, room_scale.y / 2.0, -room_scale.z / 2.0), + }, + rotation_sampler: RotationSampler::Exact(Quat::from_rotation_x(90.0_f32.to_radians())), + scale_sampler: ScaleSampler::Exact(Vec3::new(room_scale.x / 2.0, 1.0, room_scale.y / 2.0)), + ..base_plane_settings.clone() + }; + + // left plane + let left_plane_settings = ZeroversePrimitiveSettings { + invert_normals: true, + position_sampler: PositionSampler::Exact { + position: Vec3::new(-room_scale.x / 2.0, room_scale.y / 2.0, 0.0), + }, + rotation_sampler: RotationSampler::Exact(Quat::from_rotation_z(90.0_f32.to_radians())), + scale_sampler: ScaleSampler::Exact(Vec3::new(room_scale.y / 2.0, 1.0, room_scale.z / 2.0)), + ..base_plane_settings.clone() + }; - commands.spawn(( - PrimitiveBundle { - settings: top_plane_settings, - ..default() - }, - Name::new("room_top_plane"), - SemanticLabel::Ceiling, - )); + // right plane + let right_plane_settings = ZeroversePrimitiveSettings { + cull_mode: Some(Face::Back), + position_sampler: PositionSampler::Exact { + position: Vec3::new(room_scale.x / 2.0, room_scale.y / 2.0, 0.0), + }, + rotation_sampler: RotationSampler::Exact(Quat::from_rotation_z(90.0_f32.to_radians())), + scale_sampler: ScaleSampler::Exact(Vec3::new(room_scale.y / 2.0, 1.0, room_scale.z / 2.0)), + ..base_plane_settings.clone() + }; + + commands.spawn(( + top_plane_settings, + Name::new("room_top_plane"), + SemanticLabel::Ceiling, + )); + + commands.spawn(( + bottom_plane_settings, + Name::new("room_bottom_plane"), + SemanticLabel::Floor, + )); + + commands.spawn(( + front_plane_settings, + Name::new("room_front_plane"), + SemanticLabel::Wall, + )); + + commands.spawn(( + back_plane_settings, + Name::new("room_back_plane"), + SemanticLabel::Wall, + )); + + commands.spawn(( + left_plane_settings, + Name::new("room_left_plane"), + SemanticLabel::Wall, + )); + + commands.spawn(( + right_plane_settings, + Name::new("room_right_plane"), + SemanticLabel::Wall, + )); + } - commands.spawn(( - PrimitiveBundle { - settings: bottom_plane_settings, - ..default() - }, - Name::new("room_bottom_plane"), - SemanticLabel::Floor, - )); + let mut aabb_colliders: Vec<(Vec3, Vec3)> = Vec::new(); - commands.spawn(( - PrimitiveBundle { - settings: front_plane_settings, - ..default() - }, - Name::new("room_front_plane"), - SemanticLabel::Wall, - )); + { // table + let mut table_scale = room_settings.table_settings.scale_sampler.sample(); - commands.spawn(( - PrimitiveBundle { - settings: back_plane_settings, - ..default() - }, - Name::new("room_back_plane"), - SemanticLabel::Wall, - )); + let room_half_x = room_scale.x / 2.0; + let room_half_z = room_scale.z / 2.0; - commands.spawn(( - PrimitiveBundle { - settings: left_plane_settings, - ..default() - }, - Name::new("room_left_plane"), - SemanticLabel::Wall, - )); + let max_half_table_scale_x = room_half_x - room_settings.table_wall_padding; + let max_half_table_scale_z = room_half_z - room_settings.table_wall_padding; - commands.spawn(( - PrimitiveBundle { - settings: right_plane_settings, - ..default() - }, - Name::new("room_right_plane"), - SemanticLabel::Wall, - )); - } + let max_half_table_scale_x = if max_half_table_scale_x > 0.0 { + max_half_table_scale_x + } else { + 0.1 + }; - let mut aabb_colliders: Vec<(Vec3, Vec3)> = Vec::new(); + let max_half_table_scale_z = if max_half_table_scale_z > 0.0 { + max_half_table_scale_z + } else { + 0.1 + }; - { // table - let mut table_scale = room_settings.table_settings.scale_sampler.sample(); + table_scale.x = table_scale.x.min(max_half_table_scale_x * 2.0); + table_scale.z = table_scale.z.min(max_half_table_scale_z * 2.0); - let room_half_x = room_scale.x / 2.0; - let room_half_z = room_scale.z / 2.0; + let half_table_scale = table_scale * 0.5; + let height_offset = Vec3::new( + 0.0, + table_scale.y / 4.0, + 0.0, + ); - let max_half_table_scale_x = room_half_x - room_settings.table_wall_padding; - let max_half_table_scale_z = room_half_z - room_settings.table_wall_padding; + let center_sampler = PositionSampler::Cube { + extents: Vec3::new( + room_half_x - room_settings.table_wall_padding - half_table_scale.x, + 0.00001, + room_half_z - room_settings.table_wall_padding - half_table_scale.z, + ), + }; + let position = center_sampler.sample() + height_offset; - let max_half_table_scale_x = if max_half_table_scale_x > 0.0 { - max_half_table_scale_x - } else { - 0.1 - }; + aabb_colliders.push((position, table_scale)); - let max_half_table_scale_z = if max_half_table_scale_z > 0.0 { - max_half_table_scale_z - } else { - 0.1 - }; - - table_scale.x = table_scale.x.min(max_half_table_scale_x * 2.0); - table_scale.z = table_scale.z.min(max_half_table_scale_z * 2.0); - - let half_table_scale = table_scale * 0.5; - let height_offset = Vec3::new( - 0.0, - table_scale.y / 4.0, - 0.0, - ); - - let center_sampler = PositionSampler::Cube { - extents: Vec3::new( - room_half_x - room_settings.table_wall_padding - half_table_scale.x, - 0.00001, - room_half_z - room_settings.table_wall_padding - half_table_scale.z, - ), - }; - let position = center_sampler.sample() + height_offset; + commands.spawn(( + ZeroversePrimitiveSettings { + position_sampler: PositionSampler::Exact { + position, + }, + scale_sampler: ScaleSampler::Exact(table_scale), + rotation_sampler: RotationSampler::Identity, + ..room_settings.table_settings.clone() + }, + Transform::from_translation(position), + Name::new("table"), + SemanticLabel::Table, + )); + } - aabb_colliders.push((position, table_scale)); + { // chairs + let chair_scale = room_settings.chair_settings.scale_sampler.sample(); + let chair_scale = Vec3::new(chair_scale.x, chair_scale.y, chair_scale.x); + let center_sampler = PositionSampler::Cube { + extents: Vec3::new( + room_scale.x / 2.0 - room_settings.chair_wall_padding - chair_scale.x / 2.0, + 0.00001, + room_scale.z / 2.0 - room_settings.chair_wall_padding - chair_scale.z / 2.0, + ), + }; + let chair_scale_sampler = ScaleSampler::Exact(chair_scale); + + let height_offset = Vec3::new( + 0.0, + chair_scale.y / 4.0, + 0.0, + ); + + for _ in 0..room_settings.chair_count.sample() { + let mut position = center_sampler.sample() + height_offset; + + let mut max_attempts = 100; + while check_aabb_collision(position, chair_scale, &aabb_colliders) && max_attempts > 0 { + position = center_sampler.sample() + height_offset; + max_attempts -= 1; + } + + if max_attempts == 0 { + continue; + } + + aabb_colliders.push((position, chair_scale)); commands.spawn(( - PrimitiveBundle { - settings: ZeroversePrimitiveSettings { - position_sampler: PositionSampler::Exact { - position, - }, - scale_sampler: ScaleSampler::Exact(table_scale), - rotation_sampler: RotationSampler::Identity, - ..room_settings.table_settings.clone() - }, - spatial: SpatialBundle { - transform: Transform::from_translation(position), - ..default() + ZeroversePrimitiveSettings { + position_sampler: PositionSampler::Exact { + position, }, + scale_sampler: chair_scale_sampler.clone(), + // rotation_sampler: RotationSampler::Identity, + ..room_settings.chair_settings.clone() }, - Name::new("table"), - SemanticLabel::Table, + Transform::from_translation(position), + Name::new("chair"), + SemanticLabel::Chair, )); } + } + + // TODO: tv, whiteboard, door, rug + { // door + let face = rng.gen_range(0..4); + let mut door_scale = room_settings.door_settings.scale_sampler.sample(); + + let hw = door_scale.x / 2.0; + let (x_offset, z_offset) = match face { + 0 => (0.0, hw), + 1 => (0.0, hw), + 2 => (hw, 0.0), + 3 => (hw, 0.0), + _ => unreachable!(), + }; + + let perimeter = Vec3::new( + room_scale.x / 2.0 - 0.001 - x_offset, + 0.0, + room_scale.z / 2.0 - 0.001 - z_offset, + ); + + let (x, z) = match face { + 0 => (-perimeter.x / 2.0, rng.gen_range(-perimeter.z / 2.0..perimeter.z / 2.0)), + 1 => (perimeter.x / 2.0, rng.gen_range(-perimeter.z / 2.0..perimeter.z / 2.0)), + 2 => (rng.gen_range(-perimeter.x / 2.0..perimeter.x / 2.0), -perimeter.z / 2.0), + 3 => (rng.gen_range(-perimeter.x / 2.0..perimeter.x / 2.0), perimeter.z / 2.0), + _ => unreachable!(), + }; + door_scale.y = door_scale.y.min(room_scale.y); + let door_position = Vec3::new(x, door_scale.y / 4.0, z); + let door_rotation = match face { + 0 => Quat::from_rotation_y(90.0_f32.to_radians()), + 1 => Quat::from_rotation_y(-90.0_f32.to_radians()), + 2 => Quat::from_rotation_y(180.0_f32.to_radians()), + 3 => Quat::IDENTITY, + _ => unreachable!(), + }; + + commands.spawn(( + ZeroversePrimitiveSettings { + position_sampler: PositionSampler::Exact { + position: door_position, + }, + scale_sampler: ScaleSampler::Exact(door_scale), + rotation_sampler: RotationSampler::Exact(door_rotation), + ..room_settings.door_settings.clone() + }, + Transform::from_translation(door_position), + Name::new("door"), + SemanticLabel::Door, + )); + } - { // chairs - let chair_scale = room_settings.chair_settings.scale_sampler.sample(); - let chair_scale = Vec3::new(chair_scale.x, chair_scale.y, chair_scale.x); - let center_sampler = PositionSampler::Cube { - extents: Vec3::new( - room_scale.x / 2.0 - room_settings.chair_wall_padding - chair_scale.x / 2.0, - 0.00001, - room_scale.z / 2.0 - room_settings.chair_wall_padding - chair_scale.z / 2.0, + { // cameras + let size: Vec3 = Vec3::new( + room_scale.x - (room_settings.camera_wall_padding + scene_settings.max_camera_radius) * 2.0, + room_scale.y - (room_settings.camera_floor_padding + scene_settings.max_camera_radius), + room_scale.z - (room_settings.camera_wall_padding + scene_settings.max_camera_radius) * 2.0, + ); + let origin_camera_sampler = CameraPositionSampler { + sampler_type: CameraPositionSamplerType::Band { + size, + rotation: Quat::IDENTITY, + translate: Vec3::new( + 0.0, + room_settings.camera_floor_padding + size.y / 2.0, + 0.0, ), - }; - let chair_scale_sampler = ScaleSampler::Exact(chair_scale); - - let height_offset = Vec3::new( - 0.0, - chair_scale.y / 4.0, - 0.0, - ); - - for _ in 0..room_settings.chair_count.sample() { - let mut position = center_sampler.sample() + height_offset; - - let mut max_attempts = 100; - while check_aabb_collision(position, chair_scale, &aabb_colliders) && max_attempts > 0 { - position = center_sampler.sample() + height_offset; - max_attempts -= 1; - } - - if max_attempts == 0 { - continue; - } - - aabb_colliders.push((position, chair_scale)); - - commands.spawn(( - PrimitiveBundle { - settings: ZeroversePrimitiveSettings { - position_sampler: PositionSampler::Exact { - position, - }, - scale_sampler: chair_scale_sampler.clone(), - // rotation_sampler: RotationSampler::Identity, - ..room_settings.chair_settings.clone() - }, - spatial: SpatialBundle { - transform: Transform::from_translation(position), - ..default() - }, + }, + looking_at: room_settings.looking_at_sampler.clone(), + }; + let origin_camera_center = origin_camera_sampler.sample(); + let mut rng = rand::thread_rng(); + + for _ in 0..scene_settings.num_cameras { + if scene_settings.max_camera_radius <= 0.0 { + let size: Vec3 = Vec3::new( + room_scale.x - room_settings.camera_wall_padding * 2.0, + room_scale.y - room_settings.camera_floor_padding, + room_scale.z - room_settings.camera_wall_padding * 2.0, + ); + + let camera_sampler = CameraPositionSampler { + sampler_type: CameraPositionSamplerType::Band { + size, + rotation: Quat::IDENTITY, + translate: Vec3::new( + 0.0, + room_settings.camera_floor_padding + size.y / 2.0, + 0.0, + ), }, - Name::new("chair"), - SemanticLabel::Chair, - )); - } - } + looking_at: room_settings.looking_at_sampler.clone(), + }; - // TODO: tv, whiteboard, door, rug - { // door - let face = rng.gen_range(0..4); - let mut door_scale = room_settings.door_settings.scale_sampler.sample(); - - let hw = door_scale.x / 2.0; - let (x_offset, z_offset) = match face { - 0 => (0.0, hw), - 1 => (0.0, hw), - 2 => (hw, 0.0), - 3 => (hw, 0.0), - _ => unreachable!(), - }; - - let perimeter = Vec3::new( - room_scale.x / 2.0 - 0.001 - x_offset, - 0.0, - room_scale.z / 2.0 - 0.001 - z_offset, - ); - - let (x, z) = match face { - 0 => (-perimeter.x / 2.0, rng.gen_range(-perimeter.z / 2.0..perimeter.z / 2.0)), - 1 => (perimeter.x / 2.0, rng.gen_range(-perimeter.z / 2.0..perimeter.z / 2.0)), - 2 => (rng.gen_range(-perimeter.x / 2.0..perimeter.x / 2.0), -perimeter.z / 2.0), - 3 => (rng.gen_range(-perimeter.x / 2.0..perimeter.x / 2.0), perimeter.z / 2.0), - _ => unreachable!(), - }; - door_scale.y = door_scale.y.min(room_scale.y); - let door_position = Vec3::new(x, door_scale.y / 4.0, z); - let door_rotation = match face { - 0 => Quat::from_rotation_y(90.0_f32.to_radians()), - 1 => Quat::from_rotation_y(-90.0_f32.to_radians()), - 2 => Quat::from_rotation_y(180.0_f32.to_radians()), - 3 => Quat::IDENTITY, - _ => unreachable!(), - }; - - commands.spawn(( - PrimitiveBundle { - settings: ZeroversePrimitiveSettings { - position_sampler: PositionSampler::Exact { - position: door_position, - }, - scale_sampler: ScaleSampler::Exact(door_scale), - rotation_sampler: RotationSampler::Exact(door_rotation), - ..room_settings.door_settings.clone() - }, - spatial: SpatialBundle { - transform: Transform::from_translation(door_position), - ..default() + commands.spawn(ZeroverseCamera { + position_sampler: camera_sampler, + ..default() + }); + } else { + let circular_sampler = CameraPositionSampler { + sampler_type: CameraPositionSamplerType::Circle { + radius: scene_settings.max_camera_radius, + rotation: Quat::from_rng(&mut rng), + translate: origin_camera_center.translation, }, - }, - Name::new("door"), - SemanticLabel::Door, - )); - } + looking_at: room_settings.looking_at_sampler.clone(), + }; - { // cameras - let size: Vec3 = Vec3::new( - room_scale.x - (room_settings.camera_wall_padding + scene_settings.max_camera_radius) * 2.0, - room_scale.y - (room_settings.camera_floor_padding + scene_settings.max_camera_radius), - room_scale.z - (room_settings.camera_wall_padding + scene_settings.max_camera_radius) * 2.0, - ); - let origin_camera_sampler = CameraPositionSampler { - sampler_type: CameraPositionSamplerType::Band { - size, - rotation: Quat::IDENTITY, - translate: Vec3::new( - 0.0, - room_settings.camera_floor_padding + size.y / 2.0, - 0.0, - ), - }, - looking_at: room_settings.looking_at_sampler.clone(), - }; - let origin_camera_center = origin_camera_sampler.sample(); - let mut rng = rand::thread_rng(); - - for _ in 0..scene_settings.num_cameras { - if scene_settings.max_camera_radius <= 0.0 { - let size: Vec3 = Vec3::new( - room_scale.x - room_settings.camera_wall_padding * 2.0, - room_scale.y - room_settings.camera_floor_padding, - room_scale.z - room_settings.camera_wall_padding * 2.0, - ); - - let camera_sampler = CameraPositionSampler { - sampler_type: CameraPositionSamplerType::Band { - size, - rotation: Quat::IDENTITY, - translate: Vec3::new( - 0.0, - room_settings.camera_floor_padding + size.y / 2.0, - 0.0, - ), - }, - looking_at: room_settings.looking_at_sampler.clone(), - }; - - commands.spawn(ZeroverseCamera { - sampler: camera_sampler, - ..default() - }); - } else { - let circular_sampler = CameraPositionSampler { - sampler_type: CameraPositionSamplerType::Circle { - radius: scene_settings.max_camera_radius, - rotation: Quat::from_rng(&mut rng), - translate: origin_camera_center.translation, - }, - looking_at: room_settings.looking_at_sampler.clone(), - }; - - commands.spawn(ZeroverseCamera { - sampler: circular_sampler, - ..default() - }); - } + commands.spawn(ZeroverseCamera { + position_sampler: circular_sampler, + ..default() + }); } } - }); + } + }); load_event.send(SceneLoadedEvent); } From 6d893bbe7c92dacab6686e0a7ad85a440edfc7a0 Mon Sep 17 00:00:00 2001 From: mosure Date: Mon, 17 Feb 2025 02:12:49 -0600 Subject: [PATCH 4/7] chore: commit cargo.lock --- .gitignore | 1 - Cargo.lock | 5703 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 5703 insertions(+), 1 deletion(-) create mode 100644 Cargo.lock diff --git a/.gitignore b/.gitignore index 1d754e7..8e54de6 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,6 @@ debug/ target/ vendor/ out/ -Cargo.lock **/*.rs.bk *.pdb diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..5835c76 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,5703 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "ab_glyph" +version = "0.2.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec3672c180e71eeaaac3a541fbbc5f5ad4def8b747c595ad30d674e43049f7b0" +dependencies = [ + "ab_glyph_rasterizer", + "owned_ttf_parser", +] + +[[package]] +name = "ab_glyph_rasterizer" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046" + +[[package]] +name = "accesskit" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3d3b8f9bae46a948369bc4a03e815d4ed6d616bd00de4051133a5019dc31c5a" + +[[package]] +name = "accesskit_consumer" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f47983a1084940ba9a39c077a8c63e55c619388be5476ac04c804cfbd1e63459" +dependencies = [ + "accesskit", + "hashbrown 0.15.2", + "immutable-chunkmap", +] + +[[package]] +name = "accesskit_macos" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7329821f3bd1101e03a7d2e03bd339e3ac0dc64c70b4c9f9ae1949e3ba8dece1" +dependencies = [ + "accesskit", + "accesskit_consumer", + "hashbrown 0.15.2", + "objc2", + "objc2-app-kit", + "objc2-foundation", +] + +[[package]] +name = "accesskit_windows" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24fcd5d23d70670992b823e735e859374d694a3d12bfd8dd32bd3bd8bedb5d81" +dependencies = [ + "accesskit", + "accesskit_consumer", + "hashbrown 0.15.2", + "paste", + "static_assertions", + "windows", + "windows-core", +] + +[[package]] +name = "accesskit_winit" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6a48dad5530b6deb9fc7a52cc6c3bf72cdd9eb8157ac9d32d69f2427a5e879" +dependencies = [ + "accesskit", + "accesskit_macos", + "accesskit_windows", + "raw-window-handle", + "winit", +] + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "const-random", + "getrandom", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "aligned-vec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1" + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "android-activity" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef6978589202a00cd7e118380c448a08b6ed394c3a8df3a430d0898e3a42d046" +dependencies = [ + "android-properties", + "bitflags 2.8.0", + "cc", + "cesu8", + "jni", + "jni-sys", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys 0.6.0+11769913", + "num_enum", + "thiserror", +] + +[[package]] +name = "android-properties" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" + +[[package]] +name = "android_log-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ecc8056bf6ab9892dcd53216c83d1597487d7dacac16c8df6b877d127df9937" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anes" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" + +[[package]] +name = "anstream" +version = "0.6.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" + +[[package]] +name = "anstyle-parse" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" +dependencies = [ + "anstyle", + "once_cell", + "windows-sys 0.59.0", +] + +[[package]] +name = "anyhow" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" + +[[package]] +name = "approx" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" +dependencies = [ + "num-traits", +] + +[[package]] +name = "arbitrary" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" + +[[package]] +name = "arboard" +version = "3.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df099ccb16cd014ff054ac1bf392c67feeef57164b05c42f037cd40f5d4357f4" +dependencies = [ + "clipboard-win", + "core-graphics", + "image", + "log", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "parking_lot", + "windows-sys 0.48.0", + "x11rb", +] + +[[package]] +name = "arc-swap" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" + +[[package]] +name = "arg_enum_proc_macro" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "as-raw-xcb-connection" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" + +[[package]] +name = "ash" +version = "0.38.0+1.3.281" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb44936d800fea8f016d7f2311c6a4f97aebd5dc86f09906139ec848cf3a46f" +dependencies = [ + "libloading", +] + +[[package]] +name = "assert_type_match" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f548ad2c4031f2902e3edc1f29c29e835829437de49562d8eb5dc5584d3a1043" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "async-broadcast" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c48ccdbf6ca6b121e0f586cbc0e73ae440e56c67c30fa0873b4e110d9c26d2b" +dependencies = [ + "event-listener 2.5.3", + "futures-core", +] + +[[package]] +name = "async-channel" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "slab", +] + +[[package]] +name = "async-fs" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebcd09b382f40fcd159c2d695175b2ae620ffa5f3bd6f664131efff4e8b9e04a" +dependencies = [ + "async-lock", + "blocking", + "futures-lite", +] + +[[package]] +name = "async-lock" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +dependencies = [ + "event-listener 5.4.0", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "atomicow" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "467163b50876d3a4a44da5f4dbd417537e522fc059ede8d518d57941cfb3d745" + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "av1-grain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6678909d8c5d46a42abcf571271e15fdbc0a225e3646cf23762cd415046c78bf" +dependencies = [ + "anyhow", + "arrayvec", + "log", + "nom", + "num-rational", + "v_frame", +] + +[[package]] +name = "avif-serialize" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e335041290c43101ca215eed6f43ec437eb5a42125573f600fc3fa42b9bddd62" +dependencies = [ + "arrayvec", +] + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "bevy" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb2a21c9f3306676077a88700bb8f354be779cf9caba9c21e94da9e696751af4" +dependencies = [ + "bevy_dylib", + "bevy_internal", +] + +[[package]] +name = "bevy-inspector-egui" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3d3ea87310d78bacc94471bcf5a8b63ead43e7263d404571832c2297458b856" +dependencies = [ + "bevy-inspector-egui-derive", + "bevy_app", + "bevy_asset", + "bevy_color", + "bevy_core", + "bevy_core_pipeline", + "bevy_ecs", + "bevy_egui", + "bevy_hierarchy", + "bevy_image", + "bevy_log", + "bevy_math", + "bevy_pbr", + "bevy_reflect", + "bevy_render", + "bevy_state", + "bevy_time", + "bevy_utils", + "bevy_window", + "bytemuck", + "disqualified", + "egui", + "fuzzy-matcher", + "image", + "smallvec", + "uuid", + "winit", +] + +[[package]] +name = "bevy-inspector-egui-derive" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7259e525c7844b23f10fd2b2efaa3eea57996f101cc30e833070d139e2b4e4d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "bevy_a11y" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f96642402d2cd7c8e58c5994bbd14a2e44ca72dd7e460a2edad82aa3bf0348f9" +dependencies = [ + "accesskit", + "bevy_app", + "bevy_derive", + "bevy_ecs", + "bevy_reflect", +] + +[[package]] +name = "bevy_app" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "454a8cfd134864dcdcba6ee56fb958531b981021bba6bb2037c9e3df6046603c" +dependencies = [ + "bevy_derive", + "bevy_ecs", + "bevy_reflect", + "bevy_tasks", + "bevy_utils", + "console_error_panic_hook", + "ctrlc", + "derive_more", + "downcast-rs", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "bevy_args" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "757c6028597b67a7af5a8b55cb62f167d10bd44926faf499e155e550567ab385" +dependencies = [ + "bevy", + "clap", + "console_error_panic_hook", + "serde", + "serde_json", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "bevy_asset" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d762dd4422fb6219fd904e514a4a5d1d451711a0a8e1d6495dea15a545f04f3" +dependencies = [ + "async-broadcast", + "async-fs", + "async-lock", + "atomicow", + "bevy_app", + "bevy_asset_macros", + "bevy_ecs", + "bevy_reflect", + "bevy_tasks", + "bevy_utils", + "bevy_window", + "bitflags 2.8.0", + "blake3", + "crossbeam-channel", + "derive_more", + "disqualified", + "downcast-rs", + "either", + "futures-io", + "futures-lite", + "js-sys", + "parking_lot", + "ron", + "serde", + "stackfuture", + "uuid", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "bevy_asset_macros" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8db6957e3f9649d415ee613901cf487898d0339455aa9c3a2525fc37facee920" +dependencies = [ + "bevy_macro_utils", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "bevy_color" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f00aa2966c7ca0c7dd39f5ba8f3b1eaa5c2005a93ffdefb7a4090150d8327678" +dependencies = [ + "bevy_math", + "bevy_reflect", + "bytemuck", + "derive_more", + "encase", + "serde", + "wgpu-types", +] + +[[package]] +name = "bevy_core" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ff28118f5ae3193f7f6cab30d4fd4246ba1802776910ab256dc7c20e8696381" +dependencies = [ + "bevy_app", + "bevy_ecs", + "bevy_reflect", + "bevy_tasks", + "bevy_utils", + "uuid", +] + +[[package]] +name = "bevy_core_pipeline" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0c0eea548a55fd04acf01d351bd16da4d1198037cb9c7b98dea6519f5d7dade" +dependencies = [ + "bevy_app", + "bevy_asset", + "bevy_color", + "bevy_core", + "bevy_derive", + "bevy_ecs", + "bevy_image", + "bevy_math", + "bevy_reflect", + "bevy_render", + "bevy_transform", + "bevy_utils", + "bevy_window", + "bitflags 2.8.0", + "derive_more", + "nonmax", + "radsort", + "serde", + "smallvec", +] + +[[package]] +name = "bevy_derive" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b962df2a1bef274ae76ec75279eb6f8ef0ffd85b5e4c43433f5d08ba57b3d071" +dependencies = [ + "bevy_macro_utils", + "quote", + "syn", +] + +[[package]] +name = "bevy_diagnostic" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21fe41b22fdf47bf11f0a3ca3e61975b003e86fa44d87e070f2dc7e752dd99f5" +dependencies = [ + "bevy_app", + "bevy_core", + "bevy_ecs", + "bevy_tasks", + "bevy_time", + "bevy_utils", + "const-fnv1a-hash", +] + +[[package]] +name = "bevy_dylib" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b120f96b1f18f3aac28729b6d7765114486b64df4c2af3314fe2bf30d4eb11c3" +dependencies = [ + "bevy_internal", +] + +[[package]] +name = "bevy_ecs" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b747210d7db09dfacc237707d4fd31c8b43d7744cd5e5829e2c4ca86b9e47baf" +dependencies = [ + "arrayvec", + "bevy_ecs_macros", + "bevy_ptr", + "bevy_reflect", + "bevy_tasks", + "bevy_utils", + "bitflags 2.8.0", + "concurrent-queue", + "derive_more", + "disqualified", + "fixedbitset 0.5.7", + "nonmax", + "petgraph", + "serde", + "smallvec", +] + +[[package]] +name = "bevy_ecs_macros" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d36ba5874ee278d20f17b8934d2969f8fbab90f3ea3fcf8d3583814b3661ada" +dependencies = [ + "bevy_macro_utils", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "bevy_egui" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a4b8df063d7c4d4171bc853e5ea0d67c7f1b5edd3b014d43acbfe3042dd6cf4" +dependencies = [ + "arboard", + "bevy_app", + "bevy_asset", + "bevy_derive", + "bevy_ecs", + "bevy_image", + "bevy_input", + "bevy_log", + "bevy_math", + "bevy_picking", + "bevy_reflect", + "bevy_render", + "bevy_time", + "bevy_utils", + "bevy_window", + "bevy_winit", + "bytemuck", + "crossbeam-channel", + "egui", + "encase", + "js-sys", + "thread_local", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "wgpu-types", + "winit", +] + +[[package]] +name = "bevy_encase_derive" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46db3d4ebc2ab23045a7d32fa1afb4be78894ec3fbe2f52b28f6cd6e4011e400" +dependencies = [ + "bevy_macro_utils", + "encase_derive_impl", +] + +[[package]] +name = "bevy_gizmos" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca821905afffe1f3aaf33b496903a24a0c980e4c83fa7523fb41eac16892a57a" +dependencies = [ + "bevy_app", + "bevy_asset", + "bevy_color", + "bevy_core_pipeline", + "bevy_ecs", + "bevy_gizmos_macros", + "bevy_image", + "bevy_math", + "bevy_pbr", + "bevy_reflect", + "bevy_render", + "bevy_sprite", + "bevy_time", + "bevy_transform", + "bevy_utils", + "bytemuck", +] + +[[package]] +name = "bevy_gizmos_macros" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19843a638c93364950ca54a879832f325be7fa9b89f226fced3b4105594afb70" +dependencies = [ + "bevy_macro_utils", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "bevy_hierarchy" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd9aab2cd1684d30f2eedf953b6377a6416fd6b482f8145b6c05f4684bd60c3e" +dependencies = [ + "bevy_app", + "bevy_core", + "bevy_ecs", + "bevy_reflect", + "bevy_utils", + "disqualified", + "smallvec", +] + +[[package]] +name = "bevy_image" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c5942a7d681b81aa9723bb1d918135c2f88e7871331f5676119c86c01984759" +dependencies = [ + "bevy_asset", + "bevy_color", + "bevy_math", + "bevy_reflect", + "bevy_utils", + "bitflags 2.8.0", + "bytemuck", + "derive_more", + "futures-lite", + "image", + "ktx2", + "ruzstd", + "serde", + "wgpu", +] + +[[package]] +name = "bevy_input" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9bbf39c1d2d33350e03354a67bebee5c21973c5203b1456a9a4b90a5e6f8e75" +dependencies = [ + "bevy_app", + "bevy_core", + "bevy_ecs", + "bevy_math", + "bevy_reflect", + "bevy_utils", + "derive_more", + "smol_str", +] + +[[package]] +name = "bevy_internal" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd7fc4db9a1793ee71f79abb15e7a8fcfe4e2081e5f18ed91b802bf6cf30e088" +dependencies = [ + "bevy_a11y", + "bevy_app", + "bevy_asset", + "bevy_color", + "bevy_core", + "bevy_core_pipeline", + "bevy_derive", + "bevy_diagnostic", + "bevy_ecs", + "bevy_gizmos", + "bevy_hierarchy", + "bevy_image", + "bevy_input", + "bevy_log", + "bevy_math", + "bevy_pbr", + "bevy_picking", + "bevy_ptr", + "bevy_reflect", + "bevy_render", + "bevy_scene", + "bevy_sprite", + "bevy_tasks", + "bevy_text", + "bevy_time", + "bevy_transform", + "bevy_ui", + "bevy_utils", + "bevy_window", + "bevy_winit", +] + +[[package]] +name = "bevy_log" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "774238dcf70a0ef4d82aa2860b24b1cffdd4633f3694d3bcbfbb05c4f17ae4fe" +dependencies = [ + "android_log-sys", + "bevy_app", + "bevy_ecs", + "bevy_utils", + "tracing-log", + "tracing-oslog", + "tracing-subscriber", + "tracing-wasm", +] + +[[package]] +name = "bevy_macro_utils" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bdb3a681c24abace65bf18ed467ad8befbedb42468b32e459811bfdb01e506c" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "toml_edit", +] + +[[package]] +name = "bevy_math" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edec18d90e6bab27b5c6131ee03172ece75b7edd0abe4e482a26d6db906ec357" +dependencies = [ + "bevy_reflect", + "derive_more", + "glam", + "itertools 0.13.0", + "rand", + "rand_distr", + "serde", + "smallvec", +] + +[[package]] +name = "bevy_mesh" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "183abae7c6695a80d7408c860bd737410cd66d2a9f910dafc914485da06e43dc" +dependencies = [ + "bevy_asset", + "bevy_derive", + "bevy_ecs", + "bevy_image", + "bevy_math", + "bevy_mikktspace", + "bevy_reflect", + "bevy_transform", + "bevy_utils", + "bitflags 2.8.0", + "bytemuck", + "derive_more", + "hexasphere", + "serde", + "wgpu", +] + +[[package]] +name = "bevy_mikktspace" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b53f0cf879a0682280937f515ecf00ab2140f7224881d6a621f40093a36a2ef6" +dependencies = [ + "glam", +] + +[[package]] +name = "bevy_panorbit_camera" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2fb9f1e002d1d58de3e52a1024dba4e0942f06ebc047aa6c486556af58173e5" +dependencies = [ + "bevy", + "bevy_egui", +] + +[[package]] +name = "bevy_pbr" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7f17067399cf00f4441e93d39fb4c391a16cc223e0d35346ac388e66712c418" +dependencies = [ + "bevy_app", + "bevy_asset", + "bevy_color", + "bevy_core_pipeline", + "bevy_derive", + "bevy_ecs", + "bevy_image", + "bevy_math", + "bevy_reflect", + "bevy_render", + "bevy_transform", + "bevy_utils", + "bevy_window", + "bitflags 2.8.0", + "bytemuck", + "derive_more", + "fixedbitset 0.5.7", + "nonmax", + "radsort", + "smallvec", + "static_assertions", +] + +[[package]] +name = "bevy_picking" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "125e0c7327ec155c566c044c6eefd1a02e904134fa5dc0ba54665e06a35297b0" +dependencies = [ + "bevy_app", + "bevy_asset", + "bevy_derive", + "bevy_ecs", + "bevy_hierarchy", + "bevy_input", + "bevy_math", + "bevy_reflect", + "bevy_render", + "bevy_time", + "bevy_transform", + "bevy_utils", + "bevy_window", + "uuid", +] + +[[package]] +name = "bevy_ptr" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa65df6a190b7dfc84d79f09cf02d47ae046fa86a613e202c31559e06d8d3710" + +[[package]] +name = "bevy_reflect" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bab3264acc3b6f48bc23fbd09fdfea6e5d9b7bfec142e4f3333f532acf195bca" +dependencies = [ + "assert_type_match", + "bevy_ptr", + "bevy_reflect_derive", + "bevy_utils", + "derive_more", + "disqualified", + "downcast-rs", + "erased-serde", + "glam", + "serde", + "smallvec", + "smol_str", + "uuid", +] + +[[package]] +name = "bevy_reflect_derive" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f83876a322130ab38a47d5dcf75258944bf76b3387d1acdb3750920fda63e2" +dependencies = [ + "bevy_macro_utils", + "proc-macro2", + "quote", + "syn", + "uuid", +] + +[[package]] +name = "bevy_render" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b14d77d8ff589743237c98502c0e47fd31059cf348ab86a265c4f90bb5e2a22" +dependencies = [ + "async-channel", + "bevy_app", + "bevy_asset", + "bevy_color", + "bevy_core", + "bevy_derive", + "bevy_diagnostic", + "bevy_ecs", + "bevy_encase_derive", + "bevy_hierarchy", + "bevy_image", + "bevy_math", + "bevy_mesh", + "bevy_reflect", + "bevy_render_macros", + "bevy_tasks", + "bevy_time", + "bevy_transform", + "bevy_utils", + "bevy_window", + "bytemuck", + "codespan-reporting", + "derive_more", + "downcast-rs", + "encase", + "futures-lite", + "image", + "js-sys", + "ktx2", + "naga", + "naga_oil", + "nonmax", + "offset-allocator", + "send_wrapper", + "serde", + "smallvec", + "wasm-bindgen", + "web-sys", + "wgpu", +] + +[[package]] +name = "bevy_render_macros" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "285769c193b832d67c5742a716c6063db573573d5df5ce0c41aa7584ef0e348e" +dependencies = [ + "bevy_macro_utils", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "bevy_scene" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd00a08d01a190a826a5f6ad0fcb3dbf7bd1bd4f64ebe6108c38384691a21111" +dependencies = [ + "bevy_app", + "bevy_asset", + "bevy_derive", + "bevy_ecs", + "bevy_hierarchy", + "bevy_reflect", + "bevy_render", + "bevy_transform", + "bevy_utils", + "derive_more", + "serde", + "uuid", +] + +[[package]] +name = "bevy_sprite" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84c7d22da88e562fb2ae8fe7f8cc749d3024caa4dcb57a777d070ef9141577aa" +dependencies = [ + "bevy_app", + "bevy_asset", + "bevy_color", + "bevy_core_pipeline", + "bevy_derive", + "bevy_ecs", + "bevy_image", + "bevy_math", + "bevy_picking", + "bevy_reflect", + "bevy_render", + "bevy_transform", + "bevy_utils", + "bevy_window", + "bitflags 2.8.0", + "bytemuck", + "derive_more", + "fixedbitset 0.5.7", + "guillotiere", + "nonmax", + "radsort", + "rectangle-pack", +] + +[[package]] +name = "bevy_state" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd10c8b01a982642596406fc4486fcd52239aa9c4aa47fed27abab93a69fba59" +dependencies = [ + "bevy_app", + "bevy_ecs", + "bevy_hierarchy", + "bevy_reflect", + "bevy_state_macros", + "bevy_utils", +] + +[[package]] +name = "bevy_state_macros" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23773797bf8077a6ad9299f10b063b6947f22dad311d855c4b3523102ab4381b" +dependencies = [ + "bevy_macro_utils", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "bevy_tasks" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c28f2db2619203aa82342dbbe77e49aeea4f933212c0b7a1f285e94c4008e5b" +dependencies = [ + "async-channel", + "async-executor", + "concurrent-queue", + "futures-channel", + "futures-lite", + "pin-project", + "wasm-bindgen-futures", +] + +[[package]] +name = "bevy_text" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17ee0b5f52946d222521f93773a6230f42e868548f881c4c5bddb1393a96298b" +dependencies = [ + "bevy_app", + "bevy_asset", + "bevy_color", + "bevy_derive", + "bevy_ecs", + "bevy_hierarchy", + "bevy_image", + "bevy_math", + "bevy_reflect", + "bevy_render", + "bevy_sprite", + "bevy_transform", + "bevy_utils", + "bevy_window", + "cosmic-text", + "derive_more", + "serde", + "smallvec", + "sys-locale", + "unicode-bidi", +] + +[[package]] +name = "bevy_time" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb3108ed1ef864bc40bc859ba4c9c3844213c7be3674f982203cf5d87c656848" +dependencies = [ + "bevy_app", + "bevy_ecs", + "bevy_reflect", + "bevy_utils", + "crossbeam-channel", +] + +[[package]] +name = "bevy_transform" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "056fabcedbf0503417af69447d47a983e18c7cfb5e6b6728636be3ec285cbcfa" +dependencies = [ + "bevy_app", + "bevy_ecs", + "bevy_hierarchy", + "bevy_math", + "bevy_reflect", + "derive_more", +] + +[[package]] +name = "bevy_ui" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4556fc2202c6339f95e0c24ca4c96ee959854b702e23ecf73e05fb20e67d67b0" +dependencies = [ + "accesskit", + "bevy_a11y", + "bevy_app", + "bevy_asset", + "bevy_color", + "bevy_core_pipeline", + "bevy_derive", + "bevy_ecs", + "bevy_hierarchy", + "bevy_image", + "bevy_input", + "bevy_math", + "bevy_picking", + "bevy_reflect", + "bevy_render", + "bevy_sprite", + "bevy_text", + "bevy_transform", + "bevy_utils", + "bevy_window", + "bytemuck", + "derive_more", + "nonmax", + "smallvec", + "taffy", +] + +[[package]] +name = "bevy_utils" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f01088c048960ea50ee847c3f668942ecf49ed26be12a1585a5e59b6a941d9a" +dependencies = [ + "ahash", + "bevy_utils_proc_macros", + "getrandom", + "hashbrown 0.14.5", + "thread_local", + "tracing", + "web-time", +] + +[[package]] +name = "bevy_utils_proc_macros" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a0c3244d543cc964545b7aa074f6fb18a915a7121cf3de5d7ed37a4aae8662d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "bevy_window" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36139955777cc9e7a40a97833ff3a95b7401ce525a3dbac05fc52557968b31a7" +dependencies = [ + "android-activity", + "bevy_a11y", + "bevy_app", + "bevy_ecs", + "bevy_input", + "bevy_math", + "bevy_reflect", + "bevy_utils", + "raw-window-handle", + "smol_str", +] + +[[package]] +name = "bevy_winit" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36e84e7f94583cac93de4ba641029eb0b6551d35e559c829209f2b1b9fe532d8" +dependencies = [ + "accesskit", + "accesskit_winit", + "approx", + "bevy_a11y", + "bevy_app", + "bevy_asset", + "bevy_derive", + "bevy_ecs", + "bevy_hierarchy", + "bevy_image", + "bevy_input", + "bevy_log", + "bevy_math", + "bevy_reflect", + "bevy_tasks", + "bevy_utils", + "bevy_window", + "bytemuck", + "cfg-if", + "crossbeam-channel", + "raw-window-handle", + "wasm-bindgen", + "web-sys", + "wgpu-types", + "winit", +] + +[[package]] +name = "bevy_zeroverse" +version = "0.6.0" +dependencies = [ + "bevy", + "bevy-inspector-egui", + "bevy_args", + "bevy_panorbit_camera", + "clap", + "console_error_panic_hook", + "criterion", + "futures-intrusive", + "glob", + "itertools 0.14.0", + "noise", + "pollster", + "pyo3", + "rand", + "rayon", + "serde", + "strum", + "strum_macros", + "wasm-bindgen", + "web-sys", + "wgpu", +] + +[[package]] +name = "bevy_zeroverse_ffi" +version = "0.10.0" +dependencies = [ + "bevy", + "bevy_args", + "bevy_zeroverse", + "bytemuck", + "clap", + "image", + "ndarray", + "once_cell", + "pyo3", + "pyo3-log", + "safetensors", + "serde", +] + +[[package]] +name = "bindgen" +version = "0.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f" +dependencies = [ + "bitflags 2.8.0", + "cexpr", + "clang-sys", + "itertools 0.13.0", + "log", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "syn", +] + +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec 0.6.3", +] + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec 0.8.0", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bit_field" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" +dependencies = [ + "serde", +] + +[[package]] +name = "bitstream-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6099cdc01846bc367c4e7dd630dc5966dccf36b652fae7a74e17b640411a91b2" + +[[package]] +name = "blake3" +version = "1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8ee0c1824c4dea5b5f81736aff91bae041d2c07ee1192bec91054e10e3e601e" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", +] + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + +[[package]] +name = "block2" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" +dependencies = [ + "objc2", +] + +[[package]] +name = "blocking" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" +dependencies = [ + "async-channel", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + +[[package]] +name = "built" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c360505aed52b7ec96a3636c3f039d99103c37d1d9b4f7a8c743d3ea9ffcd03b" + +[[package]] +name = "bumpalo" +version = "3.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" + +[[package]] +name = "bytemuck" +version = "1.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + +[[package]] +name = "bytes" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" + +[[package]] +name = "calloop" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" +dependencies = [ + "bitflags 2.8.0", + "log", + "polling", + "rustix", + "slab", + "thiserror", +] + +[[package]] +name = "calloop-wayland-source" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95a66a987056935f7efce4ab5668920b5d0dac4a7c99991a67395f13702ddd20" +dependencies = [ + "calloop", + "rustix", + "wayland-backend", + "wayland-client", +] + +[[package]] +name = "cast" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" + +[[package]] +name = "cblas-sys" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6feecd82cce51b0204cf063f0041d69f24ce83f680d87514b004248e7b0fa65" +dependencies = [ + "libc", +] + +[[package]] +name = "cc" +version = "1.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13208fcbb66eaeffe09b99fffbe1af420f00a7b35aa99ad683dfc1aa76145229" +dependencies = [ + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] + +[[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cfg_aliases" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "ciborium" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" + +[[package]] +name = "ciborium-ll" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" +dependencies = [ + "ciborium-io", + "half", +] + +[[package]] +name = "clang-sys" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +dependencies = [ + "glob", + "libc", + "libloading", +] + +[[package]] +name = "clap" +version = "4.5.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "769b0145982b4b48713e01ec42d61614425f27b7058bda7180a3a41f30104796" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b26884eb4b57140e4d2d93652abfa49498b938b3c9179f9fc487b0acc3edad7" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54b755194d6389280185988721fffba69495eed5ee9feeee9a599b53db80318c" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" + +[[package]] +name = "clipboard-win" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15efe7a882b08f34e38556b14f2fb3daa98769d06c7f0c1b076dfd0d983bc892" +dependencies = [ + "error-code", +] + +[[package]] +name = "codespan-reporting" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" +dependencies = [ + "termcolor", + "unicode-width", +] + +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + +[[package]] +name = "colorchoice" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if", + "wasm-bindgen", +] + +[[package]] +name = "const-fnv1a-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32b13ea120a812beba79e34316b3942a857c86ec1593cb34f27bb28272ce2cca" + +[[package]] +name = "const-random" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" +dependencies = [ + "const-random-macro", +] + +[[package]] +name = "const-random-macro" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" +dependencies = [ + "getrandom", + "once_cell", + "tiny-keccak", +] + +[[package]] +name = "const_panic" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2459fc9262a1aa204eb4b5764ad4f189caec88aea9634389c0a25f8be7f6265e" + +[[package]] +name = "const_soft_float" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ca1caa64ef4ed453e68bb3db612e51cf1b2f5b871337f0fcab1c8f87cc3dff" + +[[package]] +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + +[[package]] +name = "constgebra" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1aaf9b65849a68662ac6c0810c8893a765c960b907dd7cfab9c4a50bf764fbc" +dependencies = [ + "const_soft_float", +] + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "libc", +] + +[[package]] +name = "cosmic-text" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59fd57d82eb4bfe7ffa9b1cec0c05e2fd378155b47f255a67983cb4afe0e80c2" +dependencies = [ + "bitflags 2.8.0", + "fontdb", + "log", + "rangemap", + "rayon", + "rustc-hash", + "rustybuzz", + "self_cell", + "swash", + "sys-locale", + "ttf-parser 0.21.1", + "unicode-bidi", + "unicode-linebreak", + "unicode-script", + "unicode-segmentation", +] + +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "criterion" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f" +dependencies = [ + "anes", + "cast", + "ciborium", + "clap", + "criterion-plot", + "is-terminal", + "itertools 0.10.5", + "num-traits", + "once_cell", + "oorandom", + "plotters", + "rayon", + "regex", + "serde", + "serde_derive", + "serde_json", + "tinytemplate", + "walkdir", +] + +[[package]] +name = "criterion-plot" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" +dependencies = [ + "cast", + "itertools 0.10.5", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crunchy" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" + +[[package]] +name = "ctrlc" +version = "3.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90eeab0aa92f3f9b4e87f258c72b139c207d251f9cbc1080a0086b86a8870dd3" +dependencies = [ + "nix", + "windows-sys 0.59.0", +] + +[[package]] +name = "cursor-icon" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96a6ac251f4a2aca6b3f91340350eab87ae57c3f127ffeb585e92bd336717991" + +[[package]] +name = "data-encoding" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e60eed09d8c01d3cee5b7d30acb059b76614c918fa0f992e0dd6eeb10daad6f" + +[[package]] +name = "derive_more" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "unicode-xid", +] + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "disqualified" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9c272297e804878a2a4b707cfcfc6d2328b5bb936944613b4fdf2b9269afdfd" + +[[package]] +name = "dlib" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" +dependencies = [ + "libloading", +] + +[[package]] +name = "document-features" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb6969eaabd2421f8a2775cfd2471a2b634372b4a25d41e3bd647b79912850a0" +dependencies = [ + "litrs", +] + +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + +[[package]] +name = "dpi" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f25c0e292a7ca6d6498557ff1df68f32c99850012b6ea401cf8daf771f22ff53" + +[[package]] +name = "ecolor" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d72e9c39f6e11a2e922d04a34ec5e7ef522ea3f5a1acfca7a19d16ad5fe50f5" +dependencies = [ + "bytemuck", + "emath", +] + +[[package]] +name = "egui" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "252d52224d35be1535d7fd1d6139ce071fb42c9097773e79f7665604f5596b5e" +dependencies = [ + "ahash", + "emath", + "epaint", + "nohash-hasher", + "profiling", +] + +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + +[[package]] +name = "emath" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4fe73c1207b864ee40aa0b0c038d6092af1030744678c60188a05c28553515d" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "encase" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0a05902cf601ed11d564128448097b98ebe3c6574bd7b6a653a3d56d54aa020" +dependencies = [ + "const_panic", + "encase_derive", + "glam", + "thiserror", +] + +[[package]] +name = "encase_derive" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "181d475b694e2dd56ae919ce7699d344d1fd259292d590c723a50d1189a2ea85" +dependencies = [ + "encase_derive_impl", +] + +[[package]] +name = "encase_derive_impl" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f97b51c5cc57ef7c5f7a0c57c250251c49ee4c28f819f87ac32f4aceabc36792" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "epaint" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5666f8d25236293c966fbb3635eac18b04ad1914e3bab55bc7d44b9980cafcac" +dependencies = [ + "ab_glyph", + "ahash", + "bytemuck", + "ecolor", + "emath", + "epaint_default_fonts", + "nohash-hasher", + "parking_lot", + "profiling", +] + +[[package]] +name = "epaint_default_fonts" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66f6ddac3e6ac6fd4c3d48bb8b1943472f8da0f43a4303bcd8a18aa594401c80" + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "erased-serde" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24e2389d65ab4fab27dc2a5de7b191e1f6617d1f1c8855c0dc569c94a4cbb18d" +dependencies = [ + "serde", + "typeid", +] + +[[package]] +name = "errno" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "error-code" +version = "3.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5d9305ccc6942a704f4335694ecd3de2ea531b114ac2d51f5f843750787a92f" + +[[package]] +name = "euclid" +version = "0.22.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad9cdb4b747e485a12abb0e6566612956c7a1bafa3bdb8d682c5b6d403589e48" +dependencies = [ + "num-traits", +] + +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[package]] +name = "event-listener" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" +dependencies = [ + "event-listener 5.4.0", + "pin-project-lite", +] + +[[package]] +name = "exr" +version = "1.73.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83197f59927b46c04a183a619b7c29df34e63e63c7869320862268c0ef687e0" +dependencies = [ + "bit_field", + "half", + "lebe", + "miniz_oxide", + "rayon-core", + "smallvec", + "zune-inflate", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "fixedbitset" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" + +[[package]] +name = "flate2" +version = "1.0.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "foldhash" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" + +[[package]] +name = "font-types" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3971f9a5ca983419cdc386941ba3b9e1feba01a0ab888adf78739feb2798492" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "fontconfig-parser" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1fcfcd44ca6e90c921fee9fa665d530b21ef1327a4c1a6c5250ea44b776ada7" +dependencies = [ + "roxmltree", +] + +[[package]] +name = "fontdb" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0299020c3ef3f60f526a4f64ab4a3d4ce116b1acbf24cdd22da0068e5d81dc3" +dependencies = [ + "fontconfig-parser", + "log", + "memmap2", + "slotmap", + "tinyvec", + "ttf-parser 0.20.0", +] + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-intrusive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" +dependencies = [ + "futures-core", + "lock_api", + "parking_lot", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-lite" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "fuzzy-matcher" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54614a3312934d066701a80f20f15fa3b56d67ac7722b39eea5b4c9dd1d66c94" +dependencies = [ + "thread_local", +] + +[[package]] +name = "gethostname" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818" +dependencies = [ + "libc", + "windows-targets 0.48.5", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "gif" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2" +dependencies = [ + "color_quant", + "weezl", +] + +[[package]] +name = "gl_generator" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" +dependencies = [ + "khronos_api", + "log", + "xml-rs", +] + +[[package]] +name = "glam" +version = "0.29.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc46dd3ec48fdd8e693a98d2b8bafae273a2d54c1de02a2a7e3d57d501f39677" +dependencies = [ + "bytemuck", + "rand", + "serde", +] + +[[package]] +name = "glob" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" + +[[package]] +name = "glow" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d51fa363f025f5c111e03f13eda21162faeacb6911fe8caa0c0349f9cf0c4483" +dependencies = [ + "js-sys", + "slotmap", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "glutin_wgl_sys" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c4ee00b289aba7a9e5306d57c2d05499b2e5dc427f84ac708bd2c090212cf3e" +dependencies = [ + "gl_generator", +] + +[[package]] +name = "gpu-alloc" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" +dependencies = [ + "bitflags 2.8.0", + "gpu-alloc-types", +] + +[[package]] +name = "gpu-alloc-types" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" +dependencies = [ + "bitflags 2.8.0", +] + +[[package]] +name = "gpu-allocator" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c151a2a5ef800297b4e79efa4f4bec035c5f51d5ae587287c9b952bdf734cacd" +dependencies = [ + "log", + "presser", + "thiserror", + "windows", +] + +[[package]] +name = "gpu-descriptor" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf29e94d6d243368b7a56caa16bc213e4f9f8ed38c4d9557069527b5d5281ca" +dependencies = [ + "bitflags 2.8.0", + "gpu-descriptor-types", + "hashbrown 0.15.2", +] + +[[package]] +name = "gpu-descriptor-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" +dependencies = [ + "bitflags 2.8.0", +] + +[[package]] +name = "grid" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be136d9dacc2a13cc70bb6c8f902b414fb2641f8db1314637c6b7933411a8f82" + +[[package]] +name = "guillotiere" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b62d5865c036cb1393e23c50693df631d3f5d7bcca4c04fe4cc0fd592e74a782" +dependencies = [ + "euclid", + "svg_fmt", +] + +[[package]] +name = "half" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" +dependencies = [ + "cfg-if", + "crunchy", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", + "allocator-api2", + "serde", +] + +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +dependencies = [ + "foldhash", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" + +[[package]] +name = "hexasphere" +version = "15.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c9e718d32b6e6b2b32354e1b0367025efdd0b11d6a740b905ddf5db1074679" +dependencies = [ + "constgebra", + "glam", + "tinyvec", +] + +[[package]] +name = "hexf-parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" + +[[package]] +name = "image" +version = "0.25.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd6f44aed642f18953a158afeb30206f4d50da59fbc66ecb53c66488de73563b" +dependencies = [ + "bytemuck", + "byteorder-lite", + "color_quant", + "exr", + "gif", + "image-webp", + "num-traits", + "png", + "qoi", + "ravif", + "rayon", + "rgb", + "tiff", + "zune-core", + "zune-jpeg", +] + +[[package]] +name = "image-webp" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b77d01e822461baa8409e156015a1d91735549f0f2c17691bd2d996bef238f7f" +dependencies = [ + "byteorder-lite", + "quick-error", +] + +[[package]] +name = "imgref" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0263a3d970d5c054ed9312c0057b4f3bde9c0b33836d3637361d4a9e6e7a408" + +[[package]] +name = "immutable-chunkmap" +version = "2.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12f97096f508d54f8f8ab8957862eee2ccd628847b6217af1a335e1c44dee578" +dependencies = [ + "arrayvec", +] + +[[package]] +name = "indexmap" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" +dependencies = [ + "equivalent", + "hashbrown 0.15.2", +] + +[[package]] +name = "indoc" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5" + +[[package]] +name = "interpolate_name" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "is-terminal" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e19b23d53f35ce9f56aebc7d1bb4e6ac1e9c0db7ac85c8d1760c04379edced37" +dependencies = [ + "hermit-abi", + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "jobserver" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +dependencies = [ + "libc", +] + +[[package]] +name = "jpeg-decoder" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "khronos-egl" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" +dependencies = [ + "libc", + "libloading", + "pkg-config", +] + +[[package]] +name = "khronos_api" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" + +[[package]] +name = "ktx2" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87d65e08a9ec02e409d27a0139eaa6b9756b4d81fe7cde71f6941a83730ce838" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "lebe" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" + +[[package]] +name = "libc" +version = "0.2.169" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" + +[[package]] +name = "libfuzzer-sys" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf78f52d400cf2d84a3a973a78a592b4adc535739e0a5597a0da6f0c357adc75" +dependencies = [ + "arbitrary", + "cc", +] + +[[package]] +name = "libloading" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" +dependencies = [ + "cfg-if", + "windows-targets 0.52.6", +] + +[[package]] +name = "libm" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.8.0", + "libc", + "redox_syscall 0.5.8", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "litrs" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" + +[[package]] +name = "loop9" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" +dependencies = [ + "imgref", +] + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + +[[package]] +name = "matrixmultiply" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9380b911e3e96d10c1f415da0876389aaf1b56759054eeb0de7df940c456ba1a" +dependencies = [ + "autocfg", + "rawpointer", +] + +[[package]] +name = "maybe-rayon" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" +dependencies = [ + "cfg-if", + "rayon", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "memmap2" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "metal" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" +dependencies = [ + "bitflags 2.8.0", + "block", + "core-graphics-types", + "foreign-types", + "log", + "objc", + "paste", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "naga" +version = "23.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "364f94bc34f61332abebe8cad6f6cd82a5b65cff22c828d05d0968911462ca4f" +dependencies = [ + "arrayvec", + "bit-set 0.8.0", + "bitflags 2.8.0", + "cfg_aliases 0.1.1", + "codespan-reporting", + "hexf-parse", + "indexmap", + "log", + "pp-rs", + "rustc-hash", + "spirv", + "termcolor", + "thiserror", + "unicode-xid", +] + +[[package]] +name = "naga_oil" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31ea1f080bb359927cd5404d0af1e5e6758f4f2d82ecfbebb0a0c434764e40f1" +dependencies = [ + "bit-set 0.5.3", + "codespan-reporting", + "data-encoding", + "indexmap", + "naga", + "once_cell", + "regex", + "regex-syntax 0.8.5", + "rustc-hash", + "thiserror", + "tracing", + "unicode-ident", +] + +[[package]] +name = "ndarray" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "882ed72dce9365842bf196bdeedf5055305f11fc8c03dee7bb0194a6cad34841" +dependencies = [ + "cblas-sys", + "libc", + "matrixmultiply", + "num-complex", + "num-integer", + "num-traits", + "portable-atomic", + "portable-atomic-util", + "rawpointer", +] + +[[package]] +name = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.8.0", + "jni-sys", + "log", + "ndk-sys 0.6.0+11769913", + "num_enum", + "raw-window-handle", + "thiserror", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.5.0+25.2.9519653" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691" +dependencies = [ + "jni-sys", +] + +[[package]] +name = "ndk-sys" +version = "0.6.0+11769913" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" +dependencies = [ + "jni-sys", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "nix" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +dependencies = [ + "bitflags 2.8.0", + "cfg-if", + "cfg_aliases 0.2.1", + "libc", +] + +[[package]] +name = "nohash-hasher" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" + +[[package]] +name = "noise" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6da45c8333f2e152fc665d78a380be060eb84fad8ca4c9f7ac8ca29216cff0cc" +dependencies = [ + "num-traits", + "rand", + "rand_xorshift", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "nonmax" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "610a5acd306ec67f907abe5567859a3c693fb9886eb1f012ab8f2a47bef3db51" + +[[package]] +name = "noop_proc_macro" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_enum" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", +] + +[[package]] +name = "objc-sys" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" + +[[package]] +name = "objc2" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" +dependencies = [ + "objc-sys", + "objc2-encode", +] + +[[package]] +name = "objc2-app-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" +dependencies = [ + "bitflags 2.8.0", + "block2", + "libc", + "objc2", + "objc2-core-data", + "objc2-core-image", + "objc2-foundation", + "objc2-quartz-core", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" +dependencies = [ + "bitflags 2.8.0", + "block2", + "objc2", + "objc2-core-location", + "objc2-foundation", +] + +[[package]] +name = "objc2-contacts" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-data" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" +dependencies = [ + "bitflags 2.8.0", + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-image" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", + "objc2-metal", +] + +[[package]] +name = "objc2-core-location" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781" +dependencies = [ + "block2", + "objc2", + "objc2-contacts", + "objc2-foundation", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-foundation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" +dependencies = [ + "bitflags 2.8.0", + "block2", + "dispatch", + "libc", + "objc2", +] + +[[package]] +name = "objc2-link-presentation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" +dependencies = [ + "block2", + "objc2", + "objc2-app-kit", + "objc2-foundation", +] + +[[package]] +name = "objc2-metal" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" +dependencies = [ + "bitflags 2.8.0", + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" +dependencies = [ + "bitflags 2.8.0", + "block2", + "objc2", + "objc2-foundation", + "objc2-metal", +] + +[[package]] +name = "objc2-symbols" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" +dependencies = [ + "bitflags 2.8.0", + "block2", + "objc2", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-image", + "objc2-core-location", + "objc2-foundation", + "objc2-link-presentation", + "objc2-quartz-core", + "objc2-symbols", + "objc2-uniform-type-identifiers", + "objc2-user-notifications", +] + +[[package]] +name = "objc2-uniform-type-identifiers" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-user-notifications" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" +dependencies = [ + "bitflags 2.8.0", + "block2", + "objc2", + "objc2-core-location", + "objc2-foundation", +] + +[[package]] +name = "offset-allocator" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e234d535da3521eb95106f40f0b73483d80bfb3aacf27c40d7e2b72f1a3e00a2" +dependencies = [ + "log", + "nonmax", +] + +[[package]] +name = "once_cell" +version = "1.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" + +[[package]] +name = "oorandom" +version = "11.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b410bbe7e14ab526a0e86877eb47c6996a2bd7746f027ba551028c925390e4e9" + +[[package]] +name = "orbclient" +version = "0.3.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba0b26cec2e24f08ed8bb31519a9333140a6599b867dac464bb150bdb796fd43" +dependencies = [ + "libredox", +] + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "owned_ttf_parser" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec719bbf3b2a81c109a4e20b1f129b5566b7dce654bc3872f6a05abf82b2c4" +dependencies = [ + "ttf-parser 0.25.1", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.5.8", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "petgraph" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +dependencies = [ + "fixedbitset 0.4.2", + "indexmap", +] + +[[package]] +name = "pin-project" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e2ec53ad785f4d35dac0adea7f7dc6f1bb277ad84a680c7afefeae05d1f5916" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d56a66c0c55993aa927429d0f8a0abfd74f084e4d9c192cffed01e418d83eefb" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "piper" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + +[[package]] +name = "pkg-config" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" + +[[package]] +name = "plotters" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747" +dependencies = [ + "num-traits", + "plotters-backend", + "plotters-svg", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "plotters-backend" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a" + +[[package]] +name = "plotters-svg" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670" +dependencies = [ + "plotters-backend", +] + +[[package]] +name = "png" +version = "0.17.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "polling" +version = "3.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix", + "tracing", + "windows-sys 0.59.0", +] + +[[package]] +name = "pollster" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3" + +[[package]] +name = "portable-atomic" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "280dc24453071f1b63954171985a0b0d30058d287960968b9b2aca264c8d4ee6" + +[[package]] +name = "portable-atomic-util" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" +dependencies = [ + "portable-atomic", +] + +[[package]] +name = "pp-rs" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb458bb7f6e250e6eb79d5026badc10a3ebb8f9a15d1fff0f13d17c71f4d6dee" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "presser" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" + +[[package]] +name = "prettyplease" +version = "0.2.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6924ced06e1f7dfe3fa48d57b9f74f55d8915f5036121bef647ef4b204895fac" +dependencies = [ + "proc-macro2", + "syn", +] + +[[package]] +name = "proc-macro-crate" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro2" +version = "1.0.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "profiling" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afbdc74edc00b6f6a218ca6a5364d6226a259d4b8ea1af4a0ea063f27e179f4d" +dependencies = [ + "profiling-procmacros", +] + +[[package]] +name = "profiling-procmacros" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a65f2e60fbf1063868558d69c6beacf412dc755f9fc020f514b7955fc914fe30" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "pyo3" +version = "0.23.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57fe09249128b3173d092de9523eaa75136bf7ba85e0d69eca241c7939c933cc" +dependencies = [ + "cfg-if", + "indoc", + "libc", + "memoffset", + "once_cell", + "portable-atomic", + "pyo3-build-config", + "pyo3-ffi", + "pyo3-macros", + "unindent", +] + +[[package]] +name = "pyo3-build-config" +version = "0.23.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cd3927b5a78757a0d71aa9dff669f903b1eb64b54142a9bd9f757f8fde65fd7" +dependencies = [ + "once_cell", + "target-lexicon", +] + +[[package]] +name = "pyo3-ffi" +version = "0.23.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dab6bb2102bd8f991e7749f130a70d05dd557613e39ed2deeee8e9ca0c4d548d" +dependencies = [ + "libc", + "pyo3-build-config", +] + +[[package]] +name = "pyo3-log" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be5bb22b77965a7b5394e9aae9897a0607b51df5167561ffc3b02643b4200bc7" +dependencies = [ + "arc-swap", + "log", + "pyo3", +] + +[[package]] +name = "pyo3-macros" +version = "0.23.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91871864b353fd5ffcb3f91f2f703a22a9797c91b9ab497b1acac7b07ae509c7" +dependencies = [ + "proc-macro2", + "pyo3-macros-backend", + "quote", + "syn", +] + +[[package]] +name = "pyo3-macros-backend" +version = "0.23.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43abc3b80bc20f3facd86cd3c60beed58c3e2aa26213f3cda368de39c60a27e4" +dependencies = [ + "heck", + "proc-macro2", + "pyo3-build-config", + "quote", + "syn", +] + +[[package]] +name = "qoi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "quick-error" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" + +[[package]] +name = "quick-xml" +version = "0.36.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7649a7b4df05aed9ea7ec6f628c67c9953a43869b8bc50929569b2999d443fe" +dependencies = [ + "memchr", +] + +[[package]] +name = "quote" +version = "1.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "radsort" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "019b4b213425016d7d84a153c4c73afb0946fbb4840e4eece7ba8848b9d6da22" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_distr" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" +dependencies = [ + "num-traits", + "rand", +] + +[[package]] +name = "rand_xorshift" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" +dependencies = [ + "rand_core", +] + +[[package]] +name = "range-alloc" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d6831663a5098ea164f89cff59c6284e95f4e3c76ce9848d4529f5ccca9bde" + +[[package]] +name = "rangemap" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60fcc7d6849342eff22c4350c8b9a989ee8ceabc4b481253e8946b9fe83d684" + +[[package]] +name = "rav1e" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" +dependencies = [ + "arbitrary", + "arg_enum_proc_macro", + "arrayvec", + "av1-grain", + "bitstream-io", + "built", + "cfg-if", + "interpolate_name", + "itertools 0.12.1", + "libc", + "libfuzzer-sys", + "log", + "maybe-rayon", + "new_debug_unreachable", + "noop_proc_macro", + "num-derive", + "num-traits", + "once_cell", + "paste", + "profiling", + "rand", + "rand_chacha", + "simd_helpers", + "system-deps", + "thiserror", + "v_frame", + "wasm-bindgen", +] + +[[package]] +name = "ravif" +version = "0.11.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2413fd96bd0ea5cdeeb37eaf446a22e6ed7b981d792828721e74ded1980a45c6" +dependencies = [ + "avif-serialize", + "imgref", + "loop9", + "quick-error", + "rav1e", + "rayon", + "rgb", +] + +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + +[[package]] +name = "rawpointer" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" + +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "read-fonts" +version = "0.22.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69aacb76b5c29acfb7f90155d39759a29496aebb49395830e928a9703d2eec2f" +dependencies = [ + "bytemuck", + "font-types", +] + +[[package]] +name = "rectangle-pack" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0d463f2884048e7153449a55166f91028d5b0ea53c79377099ce4e8cf0cf9bb" + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" +dependencies = [ + "bitflags 2.8.0", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata 0.4.9", + "regex-syntax 0.8.5", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.8.5", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "renderdoc-sys" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" + +[[package]] +name = "rgb" +version = "0.8.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" + +[[package]] +name = "ron" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94" +dependencies = [ + "base64", + "bitflags 2.8.0", + "serde", + "serde_derive", +] + +[[package]] +name = "roxmltree" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustix" +version = "0.38.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +dependencies = [ + "bitflags 2.8.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustversion" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" + +[[package]] +name = "rustybuzz" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfb9cf8877777222e4a3bc7eb247e398b56baba500c38c1c46842431adc8b55c" +dependencies = [ + "bitflags 2.8.0", + "bytemuck", + "libm", + "smallvec", + "ttf-parser 0.21.1", + "unicode-bidi-mirroring", + "unicode-ccc", + "unicode-properties", + "unicode-script", +] + +[[package]] +name = "ruzstd" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fad02996bfc73da3e301efe90b1837be9ed8f4a462b6ed410aa35d00381de89f" +dependencies = [ + "twox-hash", +] + +[[package]] +name = "ryu" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" + +[[package]] +name = "safetensors" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0436dbfa2778e4ec1a00801b0ae24a1dd619499247d48b0589b679103379d0d4" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sctk-adwaita" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6277f0217056f77f1d8f49f2950ac6c278c0d607c45f5ee99328d792ede24ec" +dependencies = [ + "ab_glyph", + "log", + "memmap2", + "smithay-client-toolkit", + "tiny-skia", +] + +[[package]] +name = "self_cell" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2fdfc24bc566f839a2da4c4295b82db7d25a24253867d5c64355abb5799bdbe" + +[[package]] +name = "send_wrapper" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" + +[[package]] +name = "serde" +version = "1.0.217" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.217" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.138" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + +[[package]] +name = "simd_helpers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" +dependencies = [ + "quote", +] + +[[package]] +name = "skrifa" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1c44ad1f6c5bdd4eefed8326711b7dbda9ea45dfd36068c427d332aa382cbe" +dependencies = [ + "bytemuck", + "read-fonts", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "slotmap" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" +dependencies = [ + "version_check", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "smithay-client-toolkit" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" +dependencies = [ + "bitflags 2.8.0", + "calloop", + "calloop-wayland-source", + "cursor-icon", + "libc", + "log", + "memmap2", + "rustix", + "thiserror", + "wayland-backend", + "wayland-client", + "wayland-csd-frame", + "wayland-cursor", + "wayland-protocols", + "wayland-protocols-wlr", + "wayland-scanner", + "xkeysym", +] + +[[package]] +name = "smol_str" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" +dependencies = [ + "serde", +] + +[[package]] +name = "spirv" +version = "0.3.0+sdk-1.3.268.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" +dependencies = [ + "bitflags 2.8.0", +] + +[[package]] +name = "stackfuture" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eae92052b72ef70dafa16eddbabffc77e5ca3574be2f7bc1127b36f0a7ad7f2" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strict-num" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "strum" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" + +[[package]] +name = "strum_macros" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn", +] + +[[package]] +name = "svg_fmt" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce5d813d71d82c4cbc1742135004e4a79fd870214c155443451c139c9470a0aa" + +[[package]] +name = "swash" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbd59f3f359ddd2c95af4758c18270eddd9c730dde98598023cdabff472c2ca2" +dependencies = [ + "skrifa", + "yazi", + "zeno", +] + +[[package]] +name = "syn" +version = "2.0.96" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sys-locale" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eab9a99a024a169fe8a903cf9d4a3b3601109bcc13bd9e3c6fff259138626c4" +dependencies = [ + "libc", +] + +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck", + "pkg-config", + "toml", + "version-compare", +] + +[[package]] +name = "taffy" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cb893bff0f80ae17d3a57e030622a967b8dbc90e38284d9b4b1442e23873c94" +dependencies = [ + "arrayvec", + "grid", + "num-traits", + "serde", + "slotmap", +] + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "tiff" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" +dependencies = [ + "flate2", + "jpeg-decoder", + "weezl", +] + +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + +[[package]] +name = "tiny-skia" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83d13394d44dae3207b52a326c0c85a8bf87f1541f23b0d143811088497b09ab" +dependencies = [ + "arrayref", + "arrayvec", + "bytemuck", + "cfg-if", + "log", + "tiny-skia-path", +] + +[[package]] +name = "tiny-skia-path" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c9e7fc0c2e86a30b117d0462aa261b72b7a99b7ebd7deb3a14ceda95c5bdc93" +dependencies = [ + "arrayref", + "bytemuck", + "strict-num", +] + +[[package]] +name = "tinytemplate" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "tinyvec" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "toml" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-oslog" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "528bdd1f0e27b5dd9a4ededf154e824b0532731e4af73bb531de46276e0aab1e" +dependencies = [ + "bindgen", + "cc", + "cfg-if", + "once_cell", + "parking_lot", + "tracing-core", + "tracing-subscriber", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "tracing-wasm" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4575c663a174420fa2d78f4108ff68f65bf2fbb7dd89f33749b6e826b3626e07" +dependencies = [ + "tracing", + "tracing-subscriber", + "wasm-bindgen", +] + +[[package]] +name = "ttf-parser" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17f77d76d837a7830fe1d4f12b7b4ba4192c1888001c7164257e4bc6d21d96b4" + +[[package]] +name = "ttf-parser" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c591d83f69777866b9126b24c6dd9a18351f177e49d625920d19f989fd31cf8" + +[[package]] +name = "ttf-parser" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" + +[[package]] +name = "twox-hash" +version = "1.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" +dependencies = [ + "cfg-if", + "static_assertions", +] + +[[package]] +name = "typeid" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e13db2e0ccd5e14a544e8a246ba2312cd25223f616442d7f2cb0e3db614236e" + +[[package]] +name = "unicode-bidi" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" + +[[package]] +name = "unicode-bidi-mirroring" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23cb788ffebc92c5948d0e997106233eeb1d8b9512f93f41651f52b6c5f5af86" + +[[package]] +name = "unicode-ccc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1df77b101bcc4ea3d78dafc5ad7e4f58ceffe0b2b16bf446aeb50b6cb4157656" + +[[package]] +name = "unicode-ident" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034" + +[[package]] +name = "unicode-linebreak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" + +[[package]] +name = "unicode-properties" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" + +[[package]] +name = "unicode-script" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb421b350c9aff471779e262955939f565ec18b86c15364e6bdf0d662ca7c1f" + +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "unindent" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7de7d73e1754487cb58364ee906a499937a0dfabd86bcb980fa99ec8c8fa2ce" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "uuid" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3758f5e68192bb96cc8f9b7e2c2cfdabb435499a28499a42f8f984092adad4b" +dependencies = [ + "getrandom", + "serde", +] + +[[package]] +name = "v_frame" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f32aaa24bacd11e488aa9ba66369c7cd514885742c9fe08cfe85884db3e92b" +dependencies = [ + "aligned-vec", + "num-traits", + "wasm-bindgen", +] + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "version-compare" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wayland-backend" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "056535ced7a150d45159d3a8dc30f91a2e2d588ca0b23f70e56033622b8016f6" +dependencies = [ + "cc", + "downcast-rs", + "rustix", + "scoped-tls", + "smallvec", + "wayland-sys", +] + +[[package]] +name = "wayland-client" +version = "0.31.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66249d3fc69f76fd74c82cc319300faa554e9d865dab1f7cd66cc20db10b280" +dependencies = [ + "bitflags 2.8.0", + "rustix", + "wayland-backend", + "wayland-scanner", +] + +[[package]] +name = "wayland-csd-frame" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" +dependencies = [ + "bitflags 2.8.0", + "cursor-icon", + "wayland-backend", +] + +[[package]] +name = "wayland-cursor" +version = "0.31.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32b08bc3aafdb0035e7fe0fdf17ba0c09c268732707dca4ae098f60cb28c9e4c" +dependencies = [ + "rustix", + "wayland-client", + "xcursor", +] + +[[package]] +name = "wayland-protocols" +version = "0.32.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd0ade57c4e6e9a8952741325c30bf82f4246885dca8bf561898b86d0c1f58e" +dependencies = [ + "bitflags 2.8.0", + "wayland-backend", + "wayland-client", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-plasma" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b31cab548ee68c7eb155517f2212049dc151f7cd7910c2b66abfd31c3ee12bd" +dependencies = [ + "bitflags 2.8.0", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-wlr" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "782e12f6cd923c3c316130d56205ebab53f55d6666b7faddfad36cecaeeb4022" +dependencies = [ + "bitflags 2.8.0", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-scanner" +version = "0.31.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597f2001b2e5fc1121e3d5b9791d3e78f05ba6bfa4641053846248e3a13661c3" +dependencies = [ + "proc-macro2", + "quick-xml", + "quote", +] + +[[package]] +name = "wayland-sys" +version = "0.31.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efa8ac0d8e8ed3e3b5c9fc92c7881406a268e11555abe36493efabe649a29e09" +dependencies = [ + "dlib", + "log", + "once_cell", + "pkg-config", +] + +[[package]] +name = "web-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "weezl" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" + +[[package]] +name = "wgpu" +version = "23.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80f70000db37c469ea9d67defdc13024ddf9a5f1b89cb2941b812ad7cde1735a" +dependencies = [ + "arrayvec", + "cfg_aliases 0.1.1", + "document-features", + "js-sys", + "log", + "naga", + "parking_lot", + "profiling", + "raw-window-handle", + "smallvec", + "static_assertions", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "wgpu-core", + "wgpu-hal", + "wgpu-types", +] + +[[package]] +name = "wgpu-core" +version = "23.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d63c3c478de8e7e01786479919c8769f62a22eec16788d8c2ac77ce2c132778a" +dependencies = [ + "arrayvec", + "bit-vec 0.8.0", + "bitflags 2.8.0", + "cfg_aliases 0.1.1", + "document-features", + "indexmap", + "log", + "naga", + "once_cell", + "parking_lot", + "profiling", + "raw-window-handle", + "rustc-hash", + "smallvec", + "thiserror", + "wgpu-hal", + "wgpu-types", +] + +[[package]] +name = "wgpu-hal" +version = "23.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89364b8a0b211adc7b16aeaf1bd5ad4a919c1154b44c9ce27838213ba05fd821" +dependencies = [ + "android_system_properties", + "arrayvec", + "ash", + "bit-set 0.8.0", + "bitflags 2.8.0", + "block", + "bytemuck", + "cfg_aliases 0.1.1", + "core-graphics-types", + "glow", + "glutin_wgl_sys", + "gpu-alloc", + "gpu-allocator", + "gpu-descriptor", + "js-sys", + "khronos-egl", + "libc", + "libloading", + "log", + "metal", + "naga", + "ndk-sys 0.5.0+25.2.9519653", + "objc", + "once_cell", + "parking_lot", + "profiling", + "range-alloc", + "raw-window-handle", + "renderdoc-sys", + "rustc-hash", + "smallvec", + "thiserror", + "wasm-bindgen", + "web-sys", + "wgpu-types", + "windows", + "windows-core", +] + +[[package]] +name = "wgpu-types" +version = "23.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "610f6ff27778148c31093f3b03abc4840f9636d58d597ca2f5977433acfe0068" +dependencies = [ + "bitflags 2.8.0", + "js-sys", + "web-sys", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" +dependencies = [ + "windows-core", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-core" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-result", + "windows-strings", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-implement" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winit" +version = "0.30.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5d74280aabb958072864bff6cfbcf9025cf8bfacdde5e32b5e12920ef703b0f" +dependencies = [ + "ahash", + "android-activity", + "atomic-waker", + "bitflags 2.8.0", + "block2", + "bytemuck", + "calloop", + "cfg_aliases 0.2.1", + "concurrent-queue", + "core-foundation", + "core-graphics", + "cursor-icon", + "dpi", + "js-sys", + "libc", + "memmap2", + "ndk", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "objc2-ui-kit", + "orbclient", + "percent-encoding", + "pin-project", + "raw-window-handle", + "redox_syscall 0.4.1", + "rustix", + "sctk-adwaita", + "smithay-client-toolkit", + "smol_str", + "tracing", + "unicode-segmentation", + "wasm-bindgen", + "wasm-bindgen-futures", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-protocols-plasma", + "web-sys", + "web-time", + "windows-sys 0.52.0", + "x11-dl", + "x11rb", + "xkbcommon-dl", +] + +[[package]] +name = "winnow" +version = "0.6.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad699df48212c6cc6eb4435f35500ac6fd3b9913324f938aea302022ce19d310" +dependencies = [ + "memchr", +] + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "x11rb" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" +dependencies = [ + "as-raw-xcb-connection", + "gethostname", + "libc", + "libloading", + "once_cell", + "rustix", + "x11rb-protocol", +] + +[[package]] +name = "x11rb-protocol" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d" + +[[package]] +name = "xcursor" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ef33da6b1660b4ddbfb3aef0ade110c8b8a781a3b6382fa5f2b5b040fd55f61" + +[[package]] +name = "xkbcommon-dl" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" +dependencies = [ + "bitflags 2.8.0", + "dlib", + "log", + "once_cell", + "xkeysym", +] + +[[package]] +name = "xkeysym" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" + +[[package]] +name = "xml-rs" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5b940ebc25896e71dd073bad2dbaa2abfe97b0a391415e22ad1326d9c54e3c4" + +[[package]] +name = "yazi" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c94451ac9513335b5e23d7a8a2b61a7102398b8cca5160829d313e84c9d98be1" + +[[package]] +name = "zeno" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd15f8e0dbb966fd9245e7498c7e9e5055d9e5c8b676b95bd67091cd11a1e697" + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zune-core" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" + +[[package]] +name = "zune-inflate" +version = "0.2.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "zune-jpeg" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99a5bab8d7dedf81405c4bb1f2b83ea057643d9cb28778cea9eecddeedd2e028" +dependencies = [ + "zune-core", +] From 6b7bee6eb6de4a26e9e1b4f030bf65123993e13b Mon Sep 17 00:00:00 2001 From: mosure Date: Mon, 17 Feb 2025 02:47:03 -0600 Subject: [PATCH 5/7] feat: optical flow scaffold --- Cargo.lock | 53 +++++++++++----------- Cargo.toml | 10 ++--- ffi/src/lib.rs | 1 + src/camera.rs | 5 ++- src/render/depth.rs | 8 ++-- src/render/mod.rs | 9 ++++ src/render/normal.rs | 8 ++-- src/render/optical_flow.rs | 87 ++++++++++++++++++++++++++++++++++++ src/render/optical_flow.wgsl | 27 +++++++++++ src/render/semantic.rs | 8 ++-- 10 files changed, 167 insertions(+), 49 deletions(-) create mode 100644 src/render/optical_flow.rs create mode 100644 src/render/optical_flow.wgsl diff --git a/Cargo.lock b/Cargo.lock index 5835c76..0451a10 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -432,9 +432,9 @@ dependencies = [ [[package]] name = "bevy-inspector-egui" -version = "0.29.1" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3d3ea87310d78bacc94471bcf5a8b63ead43e7263d404571832c2297458b856" +checksum = "36172627eb6fd8586600972bcbba2880ed6f59e4e243dcf2ed7ff68d987577ce" dependencies = [ "bevy-inspector-egui-derive", "bevy_app", @@ -461,15 +461,14 @@ dependencies = [ "fuzzy-matcher", "image", "smallvec", - "uuid", "winit", ] [[package]] name = "bevy-inspector-egui-derive" -version = "0.29.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7259e525c7844b23f10fd2b2efaa3eea57996f101cc30e833070d139e2b4e4d" +checksum = "3afc67826e0a4347414545e022e748f42550a577a502b26af44e6d03742c9266" dependencies = [ "proc-macro2", "quote", @@ -510,9 +509,9 @@ dependencies = [ [[package]] name = "bevy_args" -version = "1.7.0" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "757c6028597b67a7af5a8b55cb62f167d10bd44926faf499e155e550567ab385" +checksum = "e48faacd79c4754e2a29cd34245eb2173ffd191eff24a561fb699dc6f4623d36" dependencies = [ "bevy", "clap", @@ -700,9 +699,9 @@ dependencies = [ [[package]] name = "bevy_egui" -version = "0.32.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a4b8df063d7c4d4171bc853e5ea0d67c7f1b5edd3b014d43acbfe3042dd6cf4" +checksum = "954fbe8551af4b40767ea9390ec7d32fe1070a6ab55d524cf0868c17f8469a55" dependencies = [ "arboard", "bevy_app", @@ -713,7 +712,6 @@ dependencies = [ "bevy_input", "bevy_log", "bevy_math", - "bevy_picking", "bevy_reflect", "bevy_render", "bevy_time", @@ -725,6 +723,7 @@ dependencies = [ "egui", "encase", "js-sys", + "log", "thread_local", "wasm-bindgen", "wasm-bindgen-futures", @@ -948,9 +947,9 @@ dependencies = [ [[package]] name = "bevy_panorbit_camera" -version = "0.22.0" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2fb9f1e002d1d58de3e52a1024dba4e0942f06ebc047aa6c486556af58173e5" +checksum = "55e54a2fbf69a596957134b387093009c1d4dc046a6c9f3d62f37230525dca19" dependencies = [ "bevy", "bevy_egui", @@ -2096,9 +2095,9 @@ checksum = "f25c0e292a7ca6d6498557ff1df68f32c99850012b6ea401cf8daf771f22ff53" [[package]] name = "ecolor" -version = "0.30.0" +version = "0.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d72e9c39f6e11a2e922d04a34ec5e7ef522ea3f5a1acfca7a19d16ad5fe50f5" +checksum = "775cfde491852059e386c4e1deb4aef381c617dc364184c6f6afee99b87c402b" dependencies = [ "bytemuck", "emath", @@ -2106,15 +2105,14 @@ dependencies = [ [[package]] name = "egui" -version = "0.30.0" +version = "0.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "252d52224d35be1535d7fd1d6139ce071fb42c9097773e79f7665604f5596b5e" +checksum = "53eafabcce0cb2325a59a98736efe0bf060585b437763f8c476957fb274bb974" dependencies = [ "ahash", "emath", "epaint", "nohash-hasher", - "profiling", ] [[package]] @@ -2125,9 +2123,9 @@ checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "emath" -version = "0.30.0" +version = "0.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4fe73c1207b864ee40aa0b0c038d6092af1030744678c60188a05c28553515d" +checksum = "b1fe0049ce51d0fb414d029e668dd72eb30bc2b739bf34296ed97bd33df544f3" dependencies = [ "bytemuck", ] @@ -2166,9 +2164,9 @@ dependencies = [ [[package]] name = "epaint" -version = "0.30.0" +version = "0.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5666f8d25236293c966fbb3635eac18b04ad1914e3bab55bc7d44b9980cafcac" +checksum = "a32af8da821bd4f43f2c137e295459ee2e1661d87ca8779dfa0eaf45d870e20f" dependencies = [ "ab_glyph", "ahash", @@ -2178,14 +2176,13 @@ dependencies = [ "epaint_default_fonts", "nohash-hasher", "parking_lot", - "profiling", ] [[package]] name = "epaint_default_fonts" -version = "0.30.0" +version = "0.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66f6ddac3e6ac6fd4c3d48bb8b1943472f8da0f43a4303bcd8a18aa594401c80" +checksum = "483440db0b7993cf77a20314f08311dbe95675092405518c0677aa08c151a3ea" [[package]] name = "equivalent" @@ -4423,15 +4420,15 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "strum" -version = "0.26.3" +version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" +checksum = "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32" [[package]] name = "strum_macros" -version = "0.26.4" +version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8" dependencies = [ "heck", "proc-macro2", diff --git a/Cargo.toml b/Cargo.toml index 9208746..9cf8ea3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -76,9 +76,9 @@ webgpu = [ [dependencies] -bevy_args = "1.6" -bevy-inspector-egui = { version = "0.29", optional = true } -bevy_panorbit_camera = { version = "0.22", optional = true, features = ["bevy_egui"] } +bevy_args = "1.7.1" +bevy-inspector-egui = { version = "0.28", optional = true } +bevy_panorbit_camera = { version = "0.21", optional = true, features = ["bevy_egui"] } clap = { version = "4.5", features = ["derive"] } futures-intrusive = "0.5" glob = "0.3" @@ -89,8 +89,8 @@ pyo3 = { version = "0.23", features = ["macros"], optional = true } rand = "0.8" rayon = { version = "1.10", optional = true } serde = "1.0" -strum = "0.26" -strum_macros = "0.26" +strum = "0.27" +strum_macros = "0.27" wgpu = "23.0.1" diff --git a/ffi/src/lib.rs b/ffi/src/lib.rs index 78a79bf..5defd68 100644 --- a/ffi/src/lib.rs +++ b/ffi/src/lib.rs @@ -334,6 +334,7 @@ fn sample_stream( RenderMode::Color => view.color = image_data, RenderMode::Depth => view.depth = image_data, RenderMode::Normal => view.normal = image_data, + RenderMode::OpticalFlow => panic!("optical flow rendering not supported"), RenderMode::Semantic => panic!("semantic rendering not supported"), } } diff --git a/src/camera.rs b/src/camera.rs index d753699..e08a0ca 100644 --- a/src/camera.rs +++ b/src/camera.rs @@ -3,6 +3,7 @@ use bevy::{ core_pipeline::{ bloom::Bloom, core_3d::ScreenSpaceTransmissionQuality, + prepass::MotionVectorPrepass, tonemapping::Tonemapping, }, gizmos::config::{ @@ -286,9 +287,10 @@ fn insert_cameras( Exposure::INDOOR, Projection::Perspective(zeroverse_camera.perspective_sampler.sample()), zeroverse_camera.override_transform.unwrap_or(zeroverse_camera.position_sampler.sample()), + Bloom::default(), + MotionVectorPrepass, Tonemapping::TonyMcMapface, PluckerCamera, - Bloom::default(), Name::new("zeroverse_camera"), )); @@ -358,6 +360,7 @@ fn setup_editor_camera( marker.transform.unwrap_or_default(), Tonemapping::TonyMcMapface, Bloom::default(), + MotionVectorPrepass, PluckerCamera, )) .insert(render_layer) diff --git a/src/render/depth.rs b/src/render/depth.rs index ac17bfb..22cb956 100644 --- a/src/render/depth.rs +++ b/src/render/depth.rs @@ -46,14 +46,14 @@ fn apply_depth_material( Entity, &DisabledPbrMaterial, ), - (With, Without), + (With, Without>), >, mut removed_depths: RemovedComponents, mut materials: ResMut>, ) { for e in removed_depths.read() { if let Some(mut commands) = commands.get_entity(e) { - commands.remove::(); + commands.remove::>(); } } @@ -70,15 +70,13 @@ fn apply_depth_material( ); - commands.entity(e).insert(DepthMaterialHandle(depth_material)); + commands.entity(e).insert(MeshMaterial3d(depth_material)); } } pub type DepthMaterial = ExtendedMaterial; -#[derive(Component, Debug, Default, Clone, Reflect)] -pub struct DepthMaterialHandle(pub Handle); #[derive(Default, AsBindGroup, TypePath, Debug, Clone, Asset)] pub struct DepthExtension { } diff --git a/src/render/mod.rs b/src/render/mod.rs index 0a22378..14e9957 100644 --- a/src/render/mod.rs +++ b/src/render/mod.rs @@ -15,6 +15,7 @@ use crate::primitive::process_primitives; pub mod depth; pub mod normal; +pub mod optical_flow; pub mod semantic; @@ -36,6 +37,7 @@ pub enum RenderMode { Color, Depth, Normal, + OpticalFlow, Semantic, } @@ -50,6 +52,7 @@ impl Plugin for RenderPlugin { app.add_plugins(depth::DepthPlugin); app.add_plugins(normal::NormalPlugin); + app.add_plugins(optical_flow::OpticalFlowPlugin); app.add_plugins(semantic::SemanticPlugin); // TODO: add wireframe depth, pbr disable, normals @@ -62,6 +65,7 @@ impl Plugin for RenderPlugin { ( auto_disable_pbr_material::, auto_disable_pbr_material::, + auto_disable_pbr_material::, auto_disable_pbr_material::, enable_pbr_material, ) @@ -152,6 +156,10 @@ fn apply_render_modes( commands.entity(entity) .insert(normal::Normal); } + RenderMode::OpticalFlow => { + commands.entity(entity) + .insert(optical_flow::OpticalFlow); + } RenderMode::Semantic => { commands.entity(entity) .insert(semantic::Semantic); @@ -164,6 +172,7 @@ fn apply_render_modes( commands.entity(entity) .remove::() .remove::() + .remove::() .remove::(); insert_render_mode_flag(&mut commands, entity); diff --git a/src/render/normal.rs b/src/render/normal.rs index 52fc768..2908927 100644 --- a/src/render/normal.rs +++ b/src/render/normal.rs @@ -46,14 +46,14 @@ fn apply_normal_material( Entity, &DisabledPbrMaterial, ), - (With, Without), + (With, Without>), >, mut removed_normals: RemovedComponents, mut materials: ResMut>, ) { for e in removed_normals.read() { if let Some(mut commands) = commands.get_entity(e) { - commands.remove::(); + commands.remove::>(); } } @@ -69,15 +69,13 @@ fn apply_normal_material( }, ); - commands.entity(e).insert(NormalMaterialHandle(normal_material)); + commands.entity(e).insert(MeshMaterial3d(normal_material)); } } pub type NormalMaterial = ExtendedMaterial; -#[derive(Component, Debug, Default, Clone, Reflect)] -pub struct NormalMaterialHandle(pub Handle); #[derive(Default, AsBindGroup, TypePath, Debug, Clone, Asset)] pub struct NormalExtension { } diff --git a/src/render/optical_flow.rs b/src/render/optical_flow.rs new file mode 100644 index 0000000..cc7fd36 --- /dev/null +++ b/src/render/optical_flow.rs @@ -0,0 +1,87 @@ +use bevy::{ + prelude::*, + asset::load_internal_asset, + pbr::{ + ExtendedMaterial, + MaterialExtension, + }, + render::render_resource::*, +}; + +use crate::render::DisabledPbrMaterial; + + +pub const OPTICAL_FLOW_SHADER_HANDLE: Handle = Handle::weak_from_u128(67489367583); + +#[derive(Component, Debug, Clone, Default, Reflect, Eq, PartialEq)] +#[reflect(Component, Default)] +pub struct OpticalFlow; + + +#[derive(Debug, Default)] +pub struct OpticalFlowPlugin; +impl Plugin for OpticalFlowPlugin { + fn build(&self, app: &mut App) { + load_internal_asset!( + app, + OPTICAL_FLOW_SHADER_HANDLE, + "optical_flow.wgsl", + Shader::from_wgsl + ); + + app.register_type::(); + + app.add_plugins(MaterialPlugin::::default()); + + app.add_systems(Update, apply_optical_flow_material); + } +} + + +#[allow(clippy::type_complexity)] +fn apply_optical_flow_material( + mut commands: Commands, + optical_flows: Query< + ( + Entity, + &DisabledPbrMaterial, + ), + (With, Without>), + >, + mut removed_optical_flows: RemovedComponents, + mut materials: ResMut>, +) { + for e in removed_optical_flows.read() { + if let Some(mut commands) = commands.get_entity(e) { + commands.remove::>(); + } + } + + for (e, pbr_material) in &optical_flows { + let optical_flow_material = materials.add( + ExtendedMaterial { + base: StandardMaterial { + double_sided: pbr_material.double_sided, + cull_mode: pbr_material.cull_mode, + ..default() + }, + extension: OpticalFlowExtension::default(), + }, + ); + + commands.entity(e).insert(MeshMaterial3d(optical_flow_material)); + } +} + + +pub type OpticalFlowMaterial = ExtendedMaterial; + + +#[derive(Default, AsBindGroup, TypePath, Debug, Clone, Asset)] +pub struct OpticalFlowExtension { } + +impl MaterialExtension for OpticalFlowExtension { + fn fragment_shader() -> ShaderRef { + OPTICAL_FLOW_SHADER_HANDLE.into() + } +} diff --git a/src/render/optical_flow.wgsl b/src/render/optical_flow.wgsl new file mode 100644 index 0000000..65d477a --- /dev/null +++ b/src/render/optical_flow.wgsl @@ -0,0 +1,27 @@ +#import bevy_pbr::{ + mesh_view_bindings::globals, + prepass_utils, + forward_io::VertexOutput, +} + + +@fragment +fn fragment( +#ifdef MULTISAMPLED + @builtin(sample_index) sample_index: u32, +#endif + in: VertexOutput, +) -> @location(0) vec4 { + +#ifndef MULTISAMPLED + let sample_index = 0u; +#endif + + // TODO: calculate video_jam optical flow rgb normalization + + let motion_vector = bevy_pbr::prepass_utils::prepass_motion_vector( + in.position, + sample_index, + ); + return vec4(motion_vector / globals.delta_time, 0.0, 1.0); +} diff --git a/src/render/semantic.rs b/src/render/semantic.rs index 1709817..29bfaf8 100644 --- a/src/render/semantic.rs +++ b/src/render/semantic.rs @@ -162,14 +162,14 @@ fn apply_semantic_material( &DisabledPbrMaterial, &SemanticLabel, ), - (With, Without), + (With, Without>), >, mut removed_semantics: RemovedComponents, mut materials: ResMut>, ) { for e in removed_semantics.read() { if let Some(mut commands) = commands.get_entity(e) { - commands.remove::(); + commands.remove::>(); } } @@ -188,15 +188,13 @@ fn apply_semantic_material( }, ); - commands.entity(e).insert(SemanticMaterialHandle(semantic_material)); + commands.entity(e).insert(MeshMaterial3d(semantic_material)); } } pub type SemanticMaterial = ExtendedMaterial; -#[derive(Component, Debug, Default, Clone, Reflect)] -pub struct SemanticMaterialHandle(pub Handle); #[derive(Default, AsBindGroup, TypePath, Debug, Clone, Asset)] pub struct SemanticExtension { From dd8ac354553266ccdbb08a80b83f8703df38f2d5 Mon Sep 17 00:00:00 2001 From: mosure Date: Mon, 17 Feb 2025 12:17:35 -0600 Subject: [PATCH 6/7] feat: mostly correct optical flow labels --- src/app.rs | 6 +++--- src/camera.rs | 3 +++ src/render/optical_flow.wgsl | 23 +++++++++++++++++++---- 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/src/app.rs b/src/app.rs index c489705..6b96214 100644 --- a/src/app.rs +++ b/src/app.rs @@ -487,9 +487,9 @@ fn setup_camera( #[cfg(feature = "viewer")] PanOrbitCamera { allow_upside_down: true, - orbit_smoothness: 0.0, - pan_smoothness: 0.0, - zoom_smoothness: 0.0, + orbit_smoothness: 0.8, + pan_smoothness: 0.6, + zoom_smoothness: 0.8, ..default() }, )); diff --git a/src/camera.rs b/src/camera.rs index e08a0ca..cbfc906 100644 --- a/src/camera.rs +++ b/src/camera.rs @@ -42,6 +42,9 @@ use crate::{ }; + +// TODO: support camera trajectories, requires custom motion vector prepass during capture +// TODO: disable tonemapping for optical flow render mode pub struct ZeroverseCameraPlugin; impl Plugin for ZeroverseCameraPlugin { fn build(&self, app: &mut App) { diff --git a/src/render/optical_flow.wgsl b/src/render/optical_flow.wgsl index 65d477a..2d18db1 100644 --- a/src/render/optical_flow.wgsl +++ b/src/render/optical_flow.wgsl @@ -1,8 +1,11 @@ #import bevy_pbr::{ + forward_io::VertexOutput, mesh_view_bindings::globals, + mesh_view_bindings::view, prepass_utils, - forward_io::VertexOutput, } +#import bevy_render::color_operations::hsv_to_rgb +#import bevy_render::maths::PI_2 @fragment @@ -17,11 +20,23 @@ fn fragment( let sample_index = 0u; #endif - // TODO: calculate video_jam optical flow rgb normalization - let motion_vector = bevy_pbr::prepass_utils::prepass_motion_vector( in.position, sample_index, ); - return vec4(motion_vector / globals.delta_time, 0.0, 1.0); + let flow = motion_vector / globals.delta_time; + + let radius = length(flow); + var angle = atan2(flow.y, flow.x); + if (angle < 0.0) { + angle += PI_2; + } + + // let sigma: f32 = 0.15; + // let norm_factor = sigma * length(view.viewport.zw); + // let m = clamp(radius / norm_factor, 0.0, 1.0); + let m = clamp(radius, 0.0, 1.0); + + let rgb = hsv_to_rgb(vec3(angle, m, 1.0)); + return vec4(rgb, 1.0); } From 99f692f05d7cca3b3adbe1e43b45e245754acaff Mon Sep 17 00:00:00 2001 From: mosure Date: Mon, 17 Feb 2025 12:20:04 -0600 Subject: [PATCH 7/7] fix: lint --- src/scene/semantic_room.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/scene/semantic_room.rs b/src/scene/semantic_room.rs index 04a4b16..89ed2dd 100644 --- a/src/scene/semantic_room.rs +++ b/src/scene/semantic_room.rs @@ -138,7 +138,7 @@ impl Default for ZeroverseSemanticRoomSettings { fn check_aabb_collision( center: Vec3, scale: Vec3, - aabb_colliders: &Vec<(Vec3, Vec3)>, + aabb_colliders: &[(Vec3, Vec3)], ) -> bool { let half_scale: Vec3 = scale * 0.3; let min_a = center - half_scale;