Example setup for tooling (#13088)
# Objective - #12755 introduced the need to download a file to run an example - This means the example fails to run in CI without downloading that file ## Solution - Add a new metadata to examples "setup" that provides setup instructions - Replace the URL in the meshlet example to one that can actually be downloaded - example-showcase execute the setup before running an example
This commit is contained in:
parent
5ee1b40298
commit
1c15ac647a
@ -997,6 +997,14 @@ name = "Meshlet"
|
|||||||
description = "Meshlet rendering for dense high-poly scenes (experimental)"
|
description = "Meshlet rendering for dense high-poly scenes (experimental)"
|
||||||
category = "3D Rendering"
|
category = "3D Rendering"
|
||||||
wasm = false
|
wasm = false
|
||||||
|
setup = [
|
||||||
|
[
|
||||||
|
"curl",
|
||||||
|
"-o",
|
||||||
|
"assets/models/bunny.meshlet_mesh",
|
||||||
|
"https://raw.githubusercontent.com/JMS55/bevy_meshlet_asset/bd869887bc5c9c6e74e353f657d342bef84bacd8/bunny.meshlet_mesh",
|
||||||
|
],
|
||||||
|
]
|
||||||
|
|
||||||
[[example]]
|
[[example]]
|
||||||
name = "lightmaps"
|
name = "lightmaps"
|
||||||
|
@ -16,7 +16,7 @@ use bevy::{
|
|||||||
use camera_controller::{CameraController, CameraControllerPlugin};
|
use camera_controller::{CameraController, CameraControllerPlugin};
|
||||||
use std::{f32::consts::PI, path::Path, process::ExitCode};
|
use std::{f32::consts::PI, path::Path, process::ExitCode};
|
||||||
|
|
||||||
const ASSET_URL: &str = "https://github.com/JMS55/bevy_meshlet_asset/blob/bd869887bc5c9c6e74e353f657d342bef84bacd8/bunny.meshlet_mesh";
|
const ASSET_URL: &str = "https://raw.githubusercontent.com/JMS55/bevy_meshlet_asset/bd869887bc5c9c6e74e353f657d342bef84bacd8/bunny.meshlet_mesh";
|
||||||
|
|
||||||
fn main() -> ExitCode {
|
fn main() -> ExitCode {
|
||||||
if !Path::new("./assets/models/bunny.meshlet_mesh").exists() {
|
if !Path::new("./assets/models/bunny.meshlet_mesh").exists() {
|
||||||
|
@ -276,6 +276,13 @@ fn main() {
|
|||||||
.map(|s| s.to_string())
|
.map(|s| s.to_string())
|
||||||
.chain(required_features.iter().cloned())
|
.chain(required_features.iter().cloned())
|
||||||
.collect::<Vec<_>>();
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
|
for command in &to_run.setup {
|
||||||
|
let exe = &command[0];
|
||||||
|
let args = &command[1..];
|
||||||
|
cmd!(sh, "{exe} {args...}").run().unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
let _ = cmd!(
|
let _ = cmd!(
|
||||||
sh,
|
sh,
|
||||||
"cargo build --profile {profile} --example {example} {local_extra_parameters...}"
|
"cargo build --profile {profile} --example {example} {local_extra_parameters...}"
|
||||||
@ -726,18 +733,49 @@ fn parse_examples() -> Vec<Example> {
|
|||||||
.collect()
|
.collect()
|
||||||
})
|
})
|
||||||
.unwrap_or_default(),
|
.unwrap_or_default(),
|
||||||
|
setup: metadata
|
||||||
|
.get("setup")
|
||||||
|
.map(|setup| {
|
||||||
|
setup
|
||||||
|
.as_array()
|
||||||
|
.unwrap()
|
||||||
|
.into_iter()
|
||||||
|
.map(|v| {
|
||||||
|
v.as_array()
|
||||||
|
.unwrap()
|
||||||
|
.into_iter()
|
||||||
|
.map(|v| v.as_str().unwrap().to_string())
|
||||||
|
.collect()
|
||||||
|
})
|
||||||
|
.collect()
|
||||||
|
})
|
||||||
|
.unwrap_or_default(),
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
.collect()
|
.collect()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Data for this struct comes from both the entry for an example in the Cargo.toml file, and its associated metadata.
|
||||||
#[derive(Debug, PartialEq, Eq, Clone, Hash)]
|
#[derive(Debug, PartialEq, Eq, Clone, Hash)]
|
||||||
struct Example {
|
struct Example {
|
||||||
|
// From the example entry
|
||||||
|
/// Name of the example, used to start it from the cargo CLI with `--example`
|
||||||
technical_name: String,
|
technical_name: String,
|
||||||
|
/// Path to the example file
|
||||||
path: String,
|
path: String,
|
||||||
name: String,
|
/// List of non default required features
|
||||||
description: String,
|
|
||||||
category: String,
|
|
||||||
wasm: bool,
|
|
||||||
required_features: Vec<String>,
|
required_features: Vec<String>,
|
||||||
|
|
||||||
|
// From the example metadata
|
||||||
|
/// Pretty name, used for display
|
||||||
|
name: String,
|
||||||
|
/// Description of the example, for discoverability
|
||||||
|
description: String,
|
||||||
|
/// Pretty category name, matching the folder containing the example
|
||||||
|
category: String,
|
||||||
|
/// Does this example work in wasm?
|
||||||
|
// TODO: be able to differentiate between WebGL2, WebGPU, both, or neither (for examples that could run on wasm without a renderer)
|
||||||
|
wasm: bool,
|
||||||
|
/// List of commands to run before the example. Can be used for example to specify data to download
|
||||||
|
setup: Vec<Vec<String>>,
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user