space gravity: floor level

This commit is contained in:
Aleksander 2026-05-30 11:54:36 +02:00
parent 51f3126cae
commit 7e2033edd7
12 changed files with 39 additions and 12 deletions

View File

@ -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",

View File

@ -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"),

View File

@ -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 {

View File

@ -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()),

View File

@ -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;

View File

@ -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,

View File

@ -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,

View File

@ -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;

View File

@ -1,4 +1,4 @@
use wgui::{event::StyleSetRequest, parser::Fetchable, taffy};
use wgui::parser::Fetchable;
use wlx_common::{common::LeftRight, windowing::Positioning};
use crate::{

View File

@ -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,

View File

@ -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.

View File

@ -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<String>,