mirror of
https://gitlab.com/gabmus/envision.git
synced 2025-04-19 19:14:53 +00:00
Merge branch 'main' of gitlab.com:gabmus/envision
This commit is contained in:
commit
a17ffc24b4
11 changed files with 60 additions and 56 deletions
|
@ -14,11 +14,11 @@ UI for building, configuring and running Monado, the open source OpenXR runtime.
|
|||
|
||||
Download the latest AppImage snapshot: [GitLab Pipelines](https://gitlab.com/gabmus/envision/-/pipelines?page=1&scope=all&ref=main)
|
||||
|
||||
## Running
|
||||
## Building and running from source
|
||||
|
||||
```bash
|
||||
git clone https://gitlab.com/gabmus/envision/
|
||||
cd envision
|
||||
cd envision
|
||||
meson setup build -Dprefix="$PWD/build/localprefix" -Dprofile=development
|
||||
ninja -C build
|
||||
ninja -C build install
|
||||
|
|
|
@ -28,6 +28,7 @@ pub fn get_build_basalt_jobs(profile: &Profile, clean_build: bool) -> VecDeque<W
|
|||
|
||||
let build_dir = format!("{}/build", profile.features.basalt.path.as_ref().unwrap());
|
||||
let mut cmake_vars: HashMap<String, String> = HashMap::new();
|
||||
cmake_vars.insert("CMAKE_EXPORT_COMPILE_COMMANDS".into(), "ON".into());
|
||||
cmake_vars.insert("CMAKE_BUILD_TYPE".into(), "RelWithDebInfo".into());
|
||||
cmake_vars.insert("CMAKE_INSTALL_PREFIX".into(), profile.prefix.clone());
|
||||
cmake_vars.insert("BUILD_TESTS".into(), "OFF".into());
|
||||
|
|
|
@ -31,6 +31,7 @@ pub fn get_build_libsurvive_jobs(profile: &Profile, clean_build: bool) -> VecDeq
|
|||
profile.features.libsurvive.path.as_ref().unwrap()
|
||||
);
|
||||
let mut cmake_vars: HashMap<String, String> = HashMap::new();
|
||||
cmake_vars.insert("CMAKE_EXPORT_COMPILE_COMMANDS".into(), "ON".into());
|
||||
cmake_vars.insert("CMAKE_BUILD_TYPE".into(), "RelWithDebInfo".into());
|
||||
cmake_vars.insert("ENABLE_api_example".into(), "OFF".into());
|
||||
cmake_vars.insert("USE_HIDAPI".into(), "ON".into());
|
||||
|
|
|
@ -33,6 +33,7 @@ pub fn get_build_monado_jobs(profile: &Profile, clean_build: bool) -> VecDeque<W
|
|||
format!("{}/lib/pkgconfig", profile.prefix),
|
||||
);
|
||||
let mut cmake_vars: HashMap<String, String> = HashMap::new();
|
||||
cmake_vars.insert("CMAKE_EXPORT_COMPILE_COMMANDS".into(), "ON".into());
|
||||
cmake_vars.insert("CMAKE_BUILD_TYPE".into(), "RelWithDebInfo".into());
|
||||
cmake_vars.insert("XRT_HAVE_SYSTEM_CJSON".into(), "NO".into());
|
||||
cmake_vars.insert("CMAKE_LIBDIR".into(), format!("{}/lib", profile.prefix));
|
||||
|
|
|
@ -28,6 +28,7 @@ pub fn get_build_opencomposite_jobs(profile: &Profile, clean_build: bool) -> Vec
|
|||
|
||||
let build_dir = format!("{}/build", profile.opencomposite_path);
|
||||
let mut cmake_vars: HashMap<String, String> = HashMap::new();
|
||||
cmake_vars.insert("CMAKE_EXPORT_COMPILE_COMMANDS".into(), "ON".into());
|
||||
cmake_vars.insert("CMAKE_BUILD_TYPE".into(), "RelWithDebInfo".into());
|
||||
let cmake = Cmake {
|
||||
env: None,
|
||||
|
|
|
@ -28,6 +28,7 @@ pub fn get_build_openhmd_jobs(profile: &Profile, clean_build: bool) -> VecDeque<
|
|||
|
||||
let build_dir = format!("{}/build", profile.features.openhmd.path.as_ref().unwrap());
|
||||
let mut cmake_vars: HashMap<String, String> = HashMap::new();
|
||||
cmake_vars.insert("CMAKE_EXPORT_COMPILE_COMMANDS".into(), "ON".into());
|
||||
cmake_vars.insert("CMAKE_BUILD_TYPE".into(), "RelWithDebInfo".into());
|
||||
cmake_vars.insert("CMAKE_INSTALL_PREFIX".into(), profile.prefix.clone());
|
||||
cmake_vars.insert(
|
||||
|
|
|
@ -28,6 +28,7 @@ pub fn get_build_wivrn_jobs(profile: &Profile, clean_build: bool) -> VecDeque<Wo
|
|||
|
||||
let build_dir = format!("{}/build", profile.xrservice_path);
|
||||
let mut cmake_vars: HashMap<String, String> = HashMap::new();
|
||||
cmake_vars.insert("CMAKE_EXPORT_COMPILE_COMMANDS".into(), "ON".into());
|
||||
cmake_vars.insert("CMAKE_BUILD_TYPE".into(), "RelWithDebInfo".into());
|
||||
cmake_vars.insert("XRT_HAVE_SYSTEM_CJSON".into(), "NO".into());
|
||||
cmake_vars.insert("WIVRN_BUILD_CLIENT".into(), "OFF".into());
|
||||
|
|
|
@ -79,8 +79,6 @@ pub struct WivrnConfEncoder {
|
|||
pub encoder: Encoder,
|
||||
pub codec: Codec,
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
pub bitrate: Option<u32>,
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
pub width: Option<f32>,
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
pub height: Option<f32>,
|
||||
|
@ -97,11 +95,10 @@ impl Default for WivrnConfEncoder {
|
|||
Self {
|
||||
encoder: Encoder::X264,
|
||||
codec: Codec::H264,
|
||||
bitrate: None,
|
||||
width: None,
|
||||
height: None,
|
||||
offset_x: None,
|
||||
offset_y: None,
|
||||
width: Some(1.0),
|
||||
height: Some(1.0),
|
||||
offset_x: Some(0.0),
|
||||
offset_y: Some(0.0),
|
||||
group: None,
|
||||
}
|
||||
}
|
||||
|
@ -111,6 +108,8 @@ impl Default for WivrnConfEncoder {
|
|||
pub struct WivrnConfig {
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
pub scale: Option<[f32; 2]>,
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
pub bitrate: Option<u32>,
|
||||
pub encoders: Vec<WivrnConfEncoder>,
|
||||
}
|
||||
|
||||
|
@ -118,16 +117,8 @@ impl Default for WivrnConfig {
|
|||
fn default() -> Self {
|
||||
Self {
|
||||
scale: Some([0.8, 0.8]),
|
||||
encoders: vec![WivrnConfEncoder {
|
||||
encoder: Encoder::X264,
|
||||
codec: Codec::H264,
|
||||
bitrate: Some(100000000),
|
||||
width: Some(1.0),
|
||||
height: Some(1.0),
|
||||
offset_x: Some(0.0),
|
||||
offset_y: Some(0.0),
|
||||
group: None,
|
||||
}],
|
||||
bitrate: Some(50000000),
|
||||
encoders: vec![WivrnConfEncoder::default()],
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -167,7 +158,7 @@ mod tests {
|
|||
assert_eq!(conf.encoders.len(), 1);
|
||||
assert_eq!(conf.encoders.get(0).unwrap().encoder, Encoder::X264);
|
||||
assert_eq!(conf.encoders.get(0).unwrap().codec, Codec::H264);
|
||||
assert_eq!(conf.encoders.get(0).unwrap().bitrate, Some(100000000));
|
||||
assert_eq!(conf.bitrate, Some(100000000));
|
||||
assert_eq!(conf.encoders.get(0).unwrap().width, Some(1.0));
|
||||
assert_eq!(conf.encoders.get(0).unwrap().height, Some(1.0));
|
||||
assert_eq!(conf.encoders.get(0).unwrap().offset_x, Some(0.0));
|
||||
|
|
|
@ -22,7 +22,6 @@ pub struct WivrnEncoderModel {
|
|||
pub enum WivrnEncoderModelMsg {
|
||||
EncoderChanged(u32),
|
||||
CodecChanged(u32),
|
||||
BitrateChanged(Option<u32>),
|
||||
WidthChanged(Option<f32>),
|
||||
HeightChanged(Option<f32>),
|
||||
OffsetXChanged(Option<f32>),
|
||||
|
@ -85,33 +84,6 @@ impl AsyncFactoryComponent for WivrnEncoderModel {
|
|||
}
|
||||
}
|
||||
) -> adw::ComboRow,
|
||||
add: bitrate_row = &number_entry_row(
|
||||
"Bitrate (Mbps)",
|
||||
&self.encoder_conf.bitrate
|
||||
.and_then(|n| if let Some(mbits) = bits_to_mbits(n) {
|
||||
Some(mbits.to_string())
|
||||
} else {
|
||||
None
|
||||
})
|
||||
.unwrap_or_default(),
|
||||
false,
|
||||
{
|
||||
let sender = sender.clone();
|
||||
move |row| {
|
||||
let txt = row.text();
|
||||
sender.input(Self::Input::BitrateChanged(
|
||||
if txt.is_empty() {
|
||||
None
|
||||
} else {
|
||||
match txt.parse::<u32>() {
|
||||
Ok(bits) => bits_from_mbits(bits),
|
||||
Err(e) => None,
|
||||
}
|
||||
}
|
||||
));
|
||||
}
|
||||
}
|
||||
) -> adw::EntryRow,
|
||||
add: width_row = &spin_row(
|
||||
"Width",
|
||||
None,
|
||||
|
@ -203,9 +175,6 @@ impl AsyncFactoryComponent for WivrnEncoderModel {
|
|||
Self::Input::CodecChanged(idx) => {
|
||||
self.encoder_conf.codec = Codec::as_vec().get(idx as usize).unwrap().clone();
|
||||
}
|
||||
Self::Input::BitrateChanged(val) => {
|
||||
self.encoder_conf.bitrate = val;
|
||||
}
|
||||
Self::Input::WidthChanged(val) => {
|
||||
self.encoder_conf.width = val;
|
||||
}
|
||||
|
|
|
@ -1,7 +1,13 @@
|
|||
use super::factories::wivrn_encoder_group_factory::{WivrnEncoderModel, WivrnEncoderModelInit};
|
||||
use super::{
|
||||
factories::wivrn_encoder_group_factory::{WivrnEncoderModel, WivrnEncoderModelInit},
|
||||
util::bits_from_mbits,
|
||||
};
|
||||
use crate::{
|
||||
file_builders::wivrn_config::{dump_wivrn_config, get_wivrn_config, WivrnConfig},
|
||||
ui::preference_rows::spin_row,
|
||||
ui::{
|
||||
preference_rows::{number_entry_row, spin_row},
|
||||
util::bits_to_mbits,
|
||||
},
|
||||
};
|
||||
use adw::prelude::*;
|
||||
use relm4::{factory::AsyncFactoryVecDeque, prelude::*};
|
||||
|
@ -17,6 +23,8 @@ pub struct WivrnConfEditor {
|
|||
pub scalex_row: Option<adw::SpinRow>,
|
||||
#[tracker::do_not_track]
|
||||
pub scaley_row: Option<adw::SpinRow>,
|
||||
#[tracker::do_not_track]
|
||||
bitrate_row: Option<adw::EntryRow>,
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
|
@ -101,6 +109,24 @@ impl SimpleComponent for WivrnConfEditor {
|
|||
move |_| {}
|
||||
) -> adw::SpinRow,
|
||||
},
|
||||
add: bitrategrp = &adw::PreferencesGroup {
|
||||
set_title: "Bitrate",
|
||||
add: bitrate_row = &number_entry_row(
|
||||
"Bitrate (Mbps)",
|
||||
&model.conf.bitrate
|
||||
.and_then(|n| if let Some(mbits) = bits_to_mbits(n) {
|
||||
Some(mbits.to_string())
|
||||
} else {
|
||||
None
|
||||
})
|
||||
.unwrap_or_default(),
|
||||
false,
|
||||
{
|
||||
let sender = sender.clone();
|
||||
move |_| {}
|
||||
}
|
||||
) -> adw::EntryRow,
|
||||
},
|
||||
add: encodersrgp = &adw::PreferencesGroup {
|
||||
set_title: "Encoders",
|
||||
adw::ActionRow {
|
||||
|
@ -133,8 +159,18 @@ impl SimpleComponent for WivrnConfEditor {
|
|||
Self::Input::Save => {
|
||||
let x = self.scalex_row.as_ref().unwrap().adjustment().value();
|
||||
let y = self.scaley_row.as_ref().unwrap().adjustment().value();
|
||||
Some([x as f32, y as f32]);
|
||||
|
||||
self.conf.scale = Some([x as f32, y as f32]);
|
||||
self.conf.bitrate = {
|
||||
let txt = self.bitrate_row.as_ref().unwrap().text();
|
||||
if txt.is_empty() {
|
||||
None
|
||||
} else {
|
||||
match txt.parse::<u32>() {
|
||||
Ok(mbits) => bits_from_mbits(mbits),
|
||||
Err(_) => None,
|
||||
}
|
||||
}
|
||||
};
|
||||
self.conf.encoders = self
|
||||
.encoder_models
|
||||
.as_ref()
|
||||
|
@ -180,6 +216,7 @@ impl SimpleComponent for WivrnConfEditor {
|
|||
win: None,
|
||||
scalex_row: None,
|
||||
scaley_row: None,
|
||||
bitrate_row: None,
|
||||
tracker: 0,
|
||||
};
|
||||
|
||||
|
@ -187,6 +224,7 @@ impl SimpleComponent for WivrnConfEditor {
|
|||
|
||||
model.scalex_row = Some(widgets.scalex_row.clone());
|
||||
model.scaley_row = Some(widgets.scaley_row.clone());
|
||||
model.bitrate_row = Some(widgets.bitrate_row.clone());
|
||||
|
||||
let mut encoder_models: AsyncFactoryVecDeque<WivrnEncoderModel> =
|
||||
AsyncFactoryVecDeque::new(widgets.pref_page.clone(), sender.input_sender());
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
{
|
||||
"scale": [0.8, 0.8],
|
||||
"bitrate": 100000000,
|
||||
"encoders": [
|
||||
{
|
||||
"encoder": "x264",
|
||||
"codec": "h264",
|
||||
"bitrate": 100000000,
|
||||
"width": 1.0,
|
||||
"height": 1.0,
|
||||
"offset_x": 0.0,
|
||||
|
|
Loading…
Add table
Reference in a new issue