diff --git a/dash-frontend/assets/lang/en.json b/dash-frontend/assets/lang/en.json index f8da5b28..25d4cd27 100644 --- a/dash-frontend/assets/lang/en.json +++ b/dash-frontend/assets/lang/en.json @@ -115,6 +115,8 @@ "SPACE_GRAVITY_GRAVITY_HELP": "Amount of downwards force. 0.0 - no gravity", "SPACE_GRAVITY_GROUND_FRICTION": "Ground friction", "SPACE_GRAVITY_GROUND_FRICTION_HELP": "Amount of friction slowing you down if you're touching the ground.\n0.0 - no friction (just like on ice), 1.0 - rough surface", + "SPACE_GRAVITY_FLOOR_HEIGHT": "Floor height", + "SPACE_GRAVITY_FLOOR_HEIGHT_HELP": "The Y position where the floor is. Gravity stops when you reach this height.", "SPACE_ROTATE_UNLOCKED": "Allow space rotate on all axes", "TROUBLESHOOTING": "Troubleshooting", "UI_GRADIENT_INTENSITY": "UI Gradient intensity", diff --git a/dash-frontend/src/tab/settings/mod.rs b/dash-frontend/src/tab/settings/mod.rs index 17f71d8c..4658a7d1 100644 --- a/dash-frontend/src/tab/settings/mod.rs +++ b/dash-frontend/src/tab/settings/mod.rs @@ -305,6 +305,7 @@ enum SettingType { SpaceGravityFlingStrength, SpaceGravityGravity, SpaceGravityGroundFriction, + SpaceGravityFloorHeight, SpaceRotateUnlocked, UiAnimationSpeed, UiGradientIntensity, @@ -369,6 +370,7 @@ impl SettingType { Self::SpaceGravityFlingStrength => &mut config.space_gravity_fling_strength, Self::SpaceGravityGravity => &mut config.space_gravity_gravity, Self::SpaceGravityGroundFriction => &mut config.space_gravity_ground_friction, + Self::SpaceGravityFloorHeight => &mut config.space_gravity_floor_height, Self::UiAnimationSpeed => &mut config.ui_animation_speed, Self::UiGradientIntensity => &mut config.ui_gradient_intensity, Self::UiRoundMultiplier => &mut config.ui_round_multiplier, @@ -475,6 +477,7 @@ impl SettingType { Self::SpaceGravityFlingStrength => Ok("APP_SETTINGS.SPACE_GRAVITY_FLING_STRENGTH"), Self::SpaceGravityGravity => Ok("APP_SETTINGS.SPACE_GRAVITY_GRAVITY"), Self::SpaceGravityGroundFriction => Ok("APP_SETTINGS.SPACE_GRAVITY_GROUND_FRICTION"), + Self::SpaceGravityFloorHeight => Ok("APP_SETTINGS.SPACE_GRAVITY_FLOOR_HEIGHT"), Self::SpaceRotateUnlocked => Ok("APP_SETTINGS.SPACE_ROTATE_UNLOCKED"), Self::UiAnimationSpeed => Ok("APP_SETTINGS.ANIMATION_SPEED"), Self::UiGradientIntensity => Ok("APP_SETTINGS.UI_GRADIENT_INTENSITY"), @@ -505,6 +508,7 @@ impl SettingType { Self::ScreenRenderDown => Some("APP_SETTINGS.SCREEN_RENDER_DOWN_HELP"), Self::SpaceGravityDamping => Some("APP_SETTINGS.SPACE_GRAVITY_DAMPING_HELP"), Self::SpaceGravityFlingStrength => Some("APP_SETTINGS.SPACE_GRAVITY_FLING_STRENGTH_HELP"), + Self::SpaceGravityFloorHeight => Some("APP_SETTINGS.SPACE_GRAVITY_FLOOR_HEIGHT_HELP"), Self::SpaceGravityGravity => Some("APP_SETTINGS.SPACE_GRAVITY_GRAVITY_HELP"), Self::SpaceGravityGroundFriction => Some("APP_SETTINGS.SPACE_GRAVITY_GROUND_FRICTION_HELP"), Self::UprightScreenFix => Some("APP_SETTINGS.UPRIGHT_SCREEN_FIX_HELP"), diff --git a/dash-frontend/src/tab/settings/tab_space_drag.rs b/dash-frontend/src/tab/settings/tab_space_drag.rs index 99aa1a50..45932cca 100644 --- a/dash-frontend/src/tab/settings/tab_space_drag.rs +++ b/dash-frontend/src/tab/settings/tab_space_drag.rs @@ -98,6 +98,14 @@ impl State { 1.0, 0.01, )?; + options_slider_f32( + par.mp, + id_space_gravity_parent, + SettingType::SpaceGravityFloorHeight, + -5.0, + 5.0, + 0.1, + )?; } if par.feats.monado { diff --git a/wayvr/src/backend/openxr/playspace.rs b/wayvr/src/backend/openxr/playspace.rs index 87f5111a..f8aa9c63 100644 --- a/wayvr/src/backend/openxr/playspace.rs +++ b/wayvr/src/backend/openxr/playspace.rs @@ -215,6 +215,7 @@ impl PlayspaceMover { dt: app.delta_time, dragging: self.drag.is_some(), config: &app.session.config, + floor_height: app.session.config.space_gravity_floor_height, }) { apply_offset( Affine3A::from_translation(res.playspace_pos.into()), diff --git a/wayvr/src/backend/playspace_common.rs b/wayvr/src/backend/playspace_common.rs index 5fbf29cf..ceac0e7e 100644 --- a/wayvr/src/backend/playspace_common.rs +++ b/wayvr/src/backend/playspace_common.rs @@ -7,6 +7,7 @@ pub struct SpaceGravityUpdateParams<'a> { pub dt: f32, pub dragging: bool, pub config: &'a GeneralConfig, + pub floor_height: f32, } pub struct SpaceGravity { @@ -78,10 +79,10 @@ impl SpaceGravity { self.space_pos += self.velocity * par.dt; - self.space_pos.y = self.space_pos.y.min(0.0); + self.space_pos.y = self.space_pos.y.min(par.floor_height); - if self.space_pos.y >= 0.0 - /* at zero or below ground level */ + if self.space_pos.y >= par.floor_height + /* at floor height or below */ { // apply ground friction self.velocity *= 1.0 - par.config.space_gravity_ground_friction * par.dt * 10.0; diff --git a/wayvr/src/config.rs b/wayvr/src/config.rs index df84e7c3..6c947708 100644 --- a/wayvr/src/config.rs +++ b/wayvr/src/config.rs @@ -170,6 +170,7 @@ pub struct AutoSettings { pub space_gravity_fling_strength: f32, pub space_gravity_gravity: f32, pub space_gravity_ground_friction: f32, + pub space_gravity_floor_height: f32, pub space_rotate_unlocked: bool, pub clock_12h: bool, pub hide_username: bool, @@ -230,6 +231,7 @@ pub fn save_settings(config: &GeneralConfig) -> anyhow::Result<()> { space_gravity_fling_strength: config.space_gravity_fling_strength, space_gravity_gravity: config.space_gravity_gravity, space_gravity_ground_friction: config.space_gravity_ground_friction, + space_gravity_floor_height: config.space_gravity_floor_height, space_rotate_unlocked: config.space_rotate_unlocked, clock_12h: config.clock_12h, hide_username: config.hide_username, diff --git a/wayvr/src/gui/panel/mod.rs b/wayvr/src/gui/panel/mod.rs index 5788f073..6d60d065 100644 --- a/wayvr/src/gui/panel/mod.rs +++ b/wayvr/src/gui/panel/mod.rs @@ -33,7 +33,6 @@ use wgui::{ self, CustomAttribsInfoOwned, Fetchable, ParseDocumentExtra, ParserState, parse_color_hex, }, renderer_vk::{context::Context as WguiContext, text::custom_glyph::CustomGlyphData}, - taffy, widget::{ EventResult, image::WidgetImage, label::WidgetLabel, rectangle::WidgetRectangle, sprite::WidgetSprite, diff --git a/wayvr/src/overlays/anchor.rs b/wayvr/src/overlays/anchor.rs index 3b8011da..8ca6c497 100644 --- a/wayvr/src/overlays/anchor.rs +++ b/wayvr/src/overlays/anchor.rs @@ -1,8 +1,7 @@ use glam::{Affine3A, Quat, Vec3}; use std::sync::{Arc, LazyLock}; -use wgui::event::{EventAlterables, StyleSetRequest}; +use wgui::event::EventAlterables; use wgui::parser::Fetchable; -use wgui::taffy; use wlx_common::windowing::{OverlayWindowState, Positioning}; use crate::gui::panel::GuiPanel; diff --git a/wayvr/src/overlays/edit/pos.rs b/wayvr/src/overlays/edit/pos.rs index a8128349..d98b0d36 100644 --- a/wayvr/src/overlays/edit/pos.rs +++ b/wayvr/src/overlays/edit/pos.rs @@ -1,4 +1,4 @@ -use wgui::{event::StyleSetRequest, parser::Fetchable, taffy}; +use wgui::parser::Fetchable; use wlx_common::{common::LeftRight, windowing::Positioning}; use crate::{ diff --git a/wayvr/src/overlays/watch.rs b/wayvr/src/overlays/watch.rs index 954be5df..8f622e05 100644 --- a/wayvr/src/overlays/watch.rs +++ b/wayvr/src/overlays/watch.rs @@ -4,9 +4,7 @@ use glam::{Affine3A, Quat, Vec3, vec3}; use wgui::{ assets::AssetPath, components::button::ComponentButton, - event::StyleSetRequest, parser::{Fetchable, ParseDocumentParams}, - taffy, }; use wlx_common::{ common::LeftRight, diff --git a/wayvr/src/res/config.yaml b/wayvr/src/res/config.yaml index 90920098..19107a39 100644 --- a/wayvr/src/res/config.yaml +++ b/wayvr/src/res/config.yaml @@ -118,13 +118,19 @@ #space_rotate_unlocked: false ## Space gravity: downward acceleration speed -#space_drag_gravity: 2.0 +#space_gravity_gravity: 2.0 ## Space gravity: velocity damping (0.98 = gentle slowdown, 0.5 = heavy drag) -#space_drag_damping: 0.98 +#space_gravity_damping: 0.98 ## Space gravity: multiplier for "throwing" yourself via space drag momentum -#space_drag_fling_strength: 1.0 +#space_gravity_fling_strength: 1.0 + +## Space gravity: floor height (Y position where gravity stops) +#space_gravity_floor_height: 0.0 + +## Space gravity: ground friction when touching the floor +#space_gravity_ground_friction: 1.0 ## Monado/WiVRn only. Use passthrough camera if the headset supports it. ## If disabled, the skybox will be shown. diff --git a/wlx-common/src/config.rs b/wlx-common/src/config.rs index 1c4dbf4d..3122687c 100644 --- a/wlx-common/src/config.rs +++ b/wlx-common/src/config.rs @@ -165,6 +165,10 @@ const fn def_point3() -> f32 { 0.3 } +const fn def_zero() -> f32 { + 0.0 +} + const fn def_osc_port() -> u16 { 9000 } @@ -351,6 +355,9 @@ pub struct GeneralConfig { #[serde(default = "def_one")] pub space_gravity_ground_friction: f32, + #[serde(default = "def_zero")] + pub space_gravity_floor_height: f32, + #[serde(default)] pub alt_click_down: Vec,