Fixes #15175.
One question I have: I see that the scene_viewer example uses the
CARGO_MANIFEST_DIR. Should that line be removed, or would that break the
tool?
1fd478277e/examples/tools/scene_viewer/main.rs (L40)
89 lines
2.4 KiB
Rust
89 lines
2.4 KiB
Rust
#[cfg(feature = "file_watcher")]
|
|
mod file_watcher;
|
|
|
|
#[cfg(feature = "multi_threaded")]
|
|
mod file_asset;
|
|
#[cfg(not(feature = "multi_threaded"))]
|
|
mod sync_file_asset;
|
|
|
|
use bevy_utils::tracing::{debug, error};
|
|
#[cfg(feature = "file_watcher")]
|
|
pub use file_watcher::*;
|
|
|
|
use std::{
|
|
env,
|
|
path::{Path, PathBuf},
|
|
};
|
|
|
|
pub(crate) fn get_base_path() -> PathBuf {
|
|
if let Ok(manifest_dir) = env::var("BEVY_ASSET_ROOT") {
|
|
PathBuf::from(manifest_dir)
|
|
} else if let Ok(manifest_dir) = env::var("CARGO_MANIFEST_DIR") {
|
|
PathBuf::from(manifest_dir)
|
|
} else {
|
|
env::current_exe()
|
|
.map(|path| path.parent().map(ToOwned::to_owned).unwrap())
|
|
.unwrap()
|
|
}
|
|
}
|
|
|
|
/// I/O implementation for the local filesystem.
|
|
///
|
|
/// This asset I/O is fully featured but it's not available on `android` and `wasm` targets.
|
|
pub struct FileAssetReader {
|
|
root_path: PathBuf,
|
|
}
|
|
|
|
impl FileAssetReader {
|
|
/// Creates a new `FileAssetIo` at a path relative to the executable's directory, optionally
|
|
/// watching for changes.
|
|
///
|
|
/// See `get_base_path` below.
|
|
pub fn new<P: AsRef<Path>>(path: P) -> Self {
|
|
let root_path = Self::get_base_path().join(path.as_ref());
|
|
debug!(
|
|
"Asset Server using {} as its base path.",
|
|
root_path.display()
|
|
);
|
|
Self { root_path }
|
|
}
|
|
|
|
/// Returns the base path of the assets directory, which is normally the executable's parent
|
|
/// directory.
|
|
///
|
|
/// To change this, set [`AssetPlugin.file_path`].
|
|
pub fn get_base_path() -> PathBuf {
|
|
get_base_path()
|
|
}
|
|
|
|
/// Returns the root directory where assets are loaded from.
|
|
///
|
|
/// See `get_base_path`.
|
|
pub fn root_path(&self) -> &PathBuf {
|
|
&self.root_path
|
|
}
|
|
}
|
|
|
|
pub struct FileAssetWriter {
|
|
root_path: PathBuf,
|
|
}
|
|
|
|
impl FileAssetWriter {
|
|
/// Creates a new `FileAssetIo` at a path relative to the executable's directory, optionally
|
|
/// watching for changes.
|
|
///
|
|
/// See `get_base_path` below.
|
|
pub fn new<P: AsRef<Path> + std::fmt::Debug>(path: P, create_root: bool) -> Self {
|
|
let root_path = get_base_path().join(path.as_ref());
|
|
if create_root {
|
|
if let Err(e) = std::fs::create_dir_all(&root_path) {
|
|
error!(
|
|
"Failed to create root directory {:?} for file asset writer: {:?}",
|
|
root_path, e
|
|
);
|
|
}
|
|
}
|
|
Self { root_path }
|
|
}
|
|
}
|