mod app;
pub mod env_vars;
pub(crate) mod gpu_bridge;
pub mod math;
mod misc;
mod remote_viewer_app;
mod ui;
mod viewer_analytics;
pub(crate) use misc::{mesh_loader, Item, TimeControl, TimeView, ViewerContext};
use re_log_types::PythonVersion;
pub(crate) use ui::{memory_panel, selection_panel, time_panel, UiVerbosity};
pub use app::{App, StartupOptions};
pub use remote_viewer_app::RemoteViewerApp;
pub mod external {
pub use eframe;
pub use egui;
pub use re_renderer;
}
#[cfg(not(target_arch = "wasm32"))]
mod native;
#[cfg(not(target_arch = "wasm32"))]
pub use native::{run_native_app, run_native_viewer_with_messages};
mod app_icon;
#[cfg(not(target_arch = "wasm32"))]
pub use misc::profiler::Profiler;
#[cfg(target_arch = "wasm32")]
mod web;
#[cfg(target_arch = "wasm32")]
pub use web::start;
#[doc(hidden)]
#[macro_export]
macro_rules! profile_function {
($($arg: tt)*) => {
#[cfg(not(target_arch = "wasm32"))]
puffin::profile_function!($($arg)*);
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! profile_scope {
($($arg: tt)*) => {
#[cfg(not(target_arch = "wasm32"))]
puffin::profile_scope!($($arg)*);
};
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum AppEnvironment {
PythonSdk(PythonVersion),
RustSdk {
rustc_version: String,
llvm_version: String,
},
RerunCli {
rustc_version: String,
llvm_version: String,
},
Web,
}
impl AppEnvironment {
pub fn from_recording_source(source: &re_log_types::RecordingSource) -> Self {
use re_log_types::RecordingSource;
match source {
RecordingSource::PythonSdk(python_version) => Self::PythonSdk(python_version.clone()),
RecordingSource::RustSdk {
rustc_version: rust_version,
llvm_version,
} => Self::RustSdk {
rustc_version: rust_version.clone(),
llvm_version: llvm_version.clone(),
},
RecordingSource::Unknown | RecordingSource::Other(_) => Self::RustSdk {
rustc_version: "unknown".into(),
llvm_version: "unknown".into(),
},
}
}
}
#[allow(dead_code)]
const APPLICATION_NAME: &str = "Rerun Viewer";
pub(crate) fn hardware_tier() -> re_renderer::config::HardwareTier {
re_renderer::config::HardwareTier::default()
}
pub(crate) fn wgpu_options() -> egui_wgpu::WgpuConfiguration {
egui_wgpu::WgpuConfiguration {
#[cfg(all(not(target_arch = "wasm32"), debug_assertions))] on_surface_error: std::sync::Arc::new(|err| {
if err == wgpu::SurfaceError::Outdated && !cfg!(target_os = "windows"){
egui_wgpu::SurfaceErrorAction::RecreateSurface
} else {
egui_wgpu::SurfaceErrorAction::SkipFrame
}
}),
backends: re_renderer::config::supported_backends(),
device_descriptor: crate::hardware_tier().device_descriptor(),
power_preference: wgpu::util::power_preference_from_env().unwrap_or(wgpu::PowerPreference::HighPerformance),
..Default::default()
}
}
#[must_use]
pub(crate) fn customize_eframe(cc: &eframe::CreationContext<'_>) -> re_ui::ReUi {
if let Some(render_state) = &cc.wgpu_render_state {
use re_renderer::{config::RenderContextConfig, RenderContext};
let paint_callback_resources = &mut render_state.renderer.write().paint_callback_resources;
paint_callback_resources.insert(RenderContext::new(
render_state.device.clone(),
render_state.queue.clone(),
RenderContextConfig {
output_format_color: render_state.target_format,
hardware_tier: crate::hardware_tier(),
},
));
}
re_ui::ReUi::load_and_apply(&cc.egui_ctx)
}
#[cfg(not(feature = "web_viewer"))]
#[cfg(not(target_arch = "wasm32"))]
pub fn wake_up_ui_thread_on_each_msg<T: Send + 'static>(
rx: re_smart_channel::Receiver<T>,
ctx: egui::Context,
) -> re_smart_channel::Receiver<T> {
let (tx, new_rx) = rx.chained_channel();
std::thread::Builder::new()
.name("ui_waker".to_owned())
.spawn(move || {
while let Ok((sent_at, msg)) = rx.recv_with_send_time() {
if tx.send_at(sent_at, msg).is_ok() {
ctx.request_repaint();
} else {
break;
}
}
re_log::debug!("Shutting down ui_waker thread");
})
.unwrap();
new_rx
}