diff --git a/src/main.rs b/src/main.rs index cf75b03..b439d0f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,11 +8,11 @@ mod wayland; use crate::core::destroy_queue; use crate::nodes::items::camera; -use crate::nodes::{audio, drawable, input}; +use crate::nodes::{drawable, input}; use bevy::MinimalPlugins; use bevy::a11y::AccessibilityPlugin; -use bevy::app::{App, TerminalCtrlCHandlerPlugin}; +use bevy::app::{App, ScheduleRunnerPlugin, TerminalCtrlCHandlerPlugin}; use bevy::asset::{AssetMetaCheck, UnapprovedPathMode}; use bevy::audio::AudioPlugin; use bevy::core_pipeline::CorePipelinePlugin; @@ -27,6 +27,7 @@ use bevy::remote::http::RemoteHttpPlugin; use bevy::render::{RenderDebugFlags, RenderPlugin}; use bevy::scene::ScenePlugin; use bevy::text::FontLoader; +use bevy::winit::{WakeUp, WinitPlugin}; use bevy_mod_openxr::action_set_attaching::OxrActionAttachingPlugin; use bevy_mod_openxr::action_set_syncing::OxrActionSyncingPlugin; use bevy_mod_openxr::add_xr_plugins; @@ -42,16 +43,17 @@ use bevy_mod_xr::camera::XrProjection; use bevy_mod_xr::hand_debug_gizmos::HandGizmosPlugin; use bevy_mod_xr::session::{XrFirst, XrHandleEvents}; use clap::Parser; -use nodes::audio::AudioNodePlugin; use core::client::{Client, tick_internal_client}; use core::entity_handle::EntityHandlePlugin; use core::task; use directories::ProjectDirs; +use nodes::audio::AudioNodePlugin; use nodes::drawable::lines::LinesNodePlugin; use nodes::drawable::model::ModelNodePlugin; use nodes::drawable::text::TextNodePlugin; use nodes::spatial::SpatialNodePlugin; use objects::ServerObjects; +use objects::input::mouse_pointer::FlatscreenInputPlugin; use objects::input::sk_controller::ControllerPlugin; use objects::input::sk_hand::HandPlugin; use objects::play_space::PlaySpacePlugin; @@ -323,6 +325,17 @@ fn bevy_loop( .async_compute .on_thread_spawn = Some(enter_runtime_context.clone()); plugins = plugins.set(task_pool_plugin); + if args.flatscreen + || std::env::var_os("DISPLAY").is_some() + || std::env::var_os("WAYLAND_DISPLAY").is_some() + { + let mut plugin = WinitPlugin::::default(); + plugin.run_on_any_thread = true; + plugins = plugins + .add(plugin) + .disable::() + .add(FlatscreenInputPlugin); + } app.add_plugins( add_xr_plugins(plugins.add(WindowPlugin::default())) .set(OxrInitPlugin { diff --git a/src/nodes/drawable/model.rs b/src/nodes/drawable/model.rs index 1b61e0d..833bc81 100644 --- a/src/nodes/drawable/model.rs +++ b/src/nodes/drawable/model.rs @@ -116,17 +116,16 @@ fn apply_materials( fn gen_model_parts( scenes: Res>, - query: Query<(Entity, &SceneRoot, &ModelNode, &Children)>, + query: Query<(&SceneRoot, &ModelNode, &Children)>, children_query: Query<&Children>, part_query: Query<(&Name, Option<&Children>, &Transform), Without>, part_mesh_query: Query<(&Transform, &Aabb), With>, has_mesh: Query>, mut cmds: Commands, ) { - for (entity, scene_root, model_node, model_children) in query.iter() { + for (scene_root, model_node, model_children) in query.iter() { let Some(model) = model_node.0.upgrade() else { - cmds.entity(entity).despawn(); - return; + continue; }; if model.parts.get().is_some() { continue; diff --git a/src/objects/input/mouse_pointer.rs b/src/objects/input/mouse_pointer.rs index a699c2e..d3f8362 100644 --- a/src/objects/input/mouse_pointer.rs +++ b/src/objects/input/mouse_pointer.rs @@ -1,5 +1,6 @@ use super::{CaptureManager, DistanceCalculator, get_sorted_handlers}; use crate::{ + DbusConnection, ObjectRegistryRes, core::client::INTERNAL_CLIENT, nodes::{ Node, OwnedNode, @@ -9,6 +10,15 @@ use crate::{ spatial::Spatial, }, }; +use bevy::{ + input::{ + ButtonState, + keyboard::{KeyboardInput, NativeKey, NativeKeyCode}, + mouse::{MouseMotion, MouseWheel}, + }, + prelude::*, + window::PrimaryWindow, +}; use color_eyre::eyre::Result; use glam::{Mat4, Vec3, vec3}; use mint::Vector2; @@ -25,6 +35,97 @@ use tokio::time::{Duration, timeout}; use xkbcommon_rs::{Context, Keymap, KeymapFormat, xkb_keymap::CompileFlags}; use zbus::{Connection, names::OwnedInterfaceName}; +pub struct FlatscreenInputPlugin; + +impl Plugin for FlatscreenInputPlugin { + fn build(&self, app: &mut App) { + app.add_systems(Startup, setup); + // yes the input method will be delayed by one frame, its only for debugging anyways + app.add_systems(Update, update_pointer); + } +} + +#[derive(Component)] +#[require(Camera3d)] +struct FlatscreenCam; + +fn setup(mut cmds: Commands) { + let Ok(pointer) = + MousePointer::new().inspect_err(|err| error!("unable to create mouse pointer: {err}")) + else { + return; + }; + cmds.spawn((FlatscreenCam, Name::new("Flatscreen Camera"))); + cmds.insert_resource(pointer); +} + +fn update_pointer( + window: Single<(&Window), With>, + mut cam: Single<(&Camera, &GlobalTransform, &mut Transform), With>, + mut pointer: ResMut, + connection: Res, + object_registry: Res, + mouse_buttons: Res>, + keyboard_buttons: Res>, + mut scroll: EventReader, + mut motion: EventReader, + mut keyboard_input_events: EventReader, + time: Res