mirror of
https://github.com/bevyengine/bevy
synced 2024-11-10 07:04:33 +00:00
Shader code paths (#13908)
# Objective Add extra metadata for the shader examples that contains the location of their associated shader file(s). This is to be used for the bevy website shader examples so that the shader code is underneath the rust code. ## Solution Parse the example rust files for mentions of `.wgsl`, `.frag`, and `.vert`, then append the found paths to a field called `shader_code_paths` in the generated `index.md`s for each shader example.
This commit is contained in:
parent
6b2d4834e9
commit
f8014e0d01
2 changed files with 20 additions and 2 deletions
|
@ -13,6 +13,7 @@ toml_edit = { version = "0.22.7", default-features = false, features = [
|
||||||
"parse",
|
"parse",
|
||||||
] }
|
] }
|
||||||
pbr = "1.1"
|
pbr = "1.1"
|
||||||
|
regex = "1.10.5"
|
||||||
|
|
||||||
[lints]
|
[lints]
|
||||||
workspace = true
|
workspace = true
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
//! Tool to run all examples or generate a showcase page for the Bevy website.
|
//! Tool to run all examples or generate a showcase page for the Bevy website.
|
||||||
|
|
||||||
use std::{
|
use std::{
|
||||||
collections::{hash_map::DefaultHasher, HashMap},
|
collections::{hash_map::DefaultHasher, HashMap, HashSet},
|
||||||
fmt::Display,
|
fmt::Display,
|
||||||
fs::{self, File},
|
fs::{self, File},
|
||||||
hash::{Hash, Hasher},
|
hash::{Hash, Hasher},
|
||||||
|
@ -14,6 +14,7 @@ use std::{
|
||||||
|
|
||||||
use clap::{error::ErrorKind, CommandFactory, Parser, ValueEnum};
|
use clap::{error::ErrorKind, CommandFactory, Parser, ValueEnum};
|
||||||
use pbr::ProgressBar;
|
use pbr::ProgressBar;
|
||||||
|
use regex::Regex;
|
||||||
use toml_edit::DocumentMut;
|
use toml_edit::DocumentMut;
|
||||||
use xshell::{cmd, Shell};
|
use xshell::{cmd, Shell};
|
||||||
|
|
||||||
|
@ -546,6 +547,7 @@ technical_name = \"{}\"
|
||||||
link = \"/examples{}/{}/{}\"
|
link = \"/examples{}/{}/{}\"
|
||||||
image = \"../static/screenshots/{}/{}.png\"
|
image = \"../static/screenshots/{}/{}.png\"
|
||||||
code_path = \"content/examples{}/{}\"
|
code_path = \"content/examples{}/{}\"
|
||||||
|
shader_code_paths = {:?}
|
||||||
github_code_path = \"{}\"
|
github_code_path = \"{}\"
|
||||||
header_message = \"Examples ({})\"
|
header_message = \"Examples ({})\"
|
||||||
+++",
|
+++",
|
||||||
|
@ -580,6 +582,7 @@ header_message = \"Examples ({})\"
|
||||||
.skip(1)
|
.skip(1)
|
||||||
.collect::<PathBuf>()
|
.collect::<PathBuf>()
|
||||||
.display(),
|
.display(),
|
||||||
|
to_show.shader_paths,
|
||||||
&to_show.path,
|
&to_show.path,
|
||||||
match api {
|
match api {
|
||||||
WebApi::Webgpu => "WebGPU",
|
WebApi::Webgpu => "WebGPU",
|
||||||
|
@ -723,6 +726,18 @@ fn parse_examples() -> Vec<Example> {
|
||||||
.flat_map(|val| {
|
.flat_map(|val| {
|
||||||
let technical_name = val.get("name").unwrap().as_str().unwrap().to_string();
|
let technical_name = val.get("name").unwrap().as_str().unwrap().to_string();
|
||||||
|
|
||||||
|
let source_code = fs::read_to_string(val["path"].as_str().unwrap()).unwrap();
|
||||||
|
let shader_regex =
|
||||||
|
Regex::new(r"(shaders\/\w+\.wgsl)|(shaders\/\w+\.frag)|(shaders\/\w+\.vert)")
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
// Find all instances of references to shader files, collect into set to avoid duplicates, then convert to vec of strings.
|
||||||
|
let shader_paths = Vec::from_iter(
|
||||||
|
shader_regex
|
||||||
|
.find_iter(&source_code)
|
||||||
|
.map(|matches| matches.as_str().to_owned())
|
||||||
|
.collect::<HashSet<String>>(),
|
||||||
|
);
|
||||||
if metadatas
|
if metadatas
|
||||||
.get(&technical_name)
|
.get(&technical_name)
|
||||||
.and_then(|metadata| metadata.get("hidden"))
|
.and_then(|metadata| metadata.get("hidden"))
|
||||||
|
@ -736,6 +751,7 @@ fn parse_examples() -> Vec<Example> {
|
||||||
metadatas.get(&technical_name).map(|metadata| Example {
|
metadatas.get(&technical_name).map(|metadata| Example {
|
||||||
technical_name,
|
technical_name,
|
||||||
path: val["path"].as_str().unwrap().to_string(),
|
path: val["path"].as_str().unwrap().to_string(),
|
||||||
|
shader_paths,
|
||||||
name: metadata["name"].as_str().unwrap().to_string(),
|
name: metadata["name"].as_str().unwrap().to_string(),
|
||||||
description: metadata["description"].as_str().unwrap().to_string(),
|
description: metadata["description"].as_str().unwrap().to_string(),
|
||||||
category: metadata["category"].as_str().unwrap().to_string(),
|
category: metadata["category"].as_str().unwrap().to_string(),
|
||||||
|
@ -780,9 +796,10 @@ struct Example {
|
||||||
technical_name: String,
|
technical_name: String,
|
||||||
/// Path to the example file
|
/// Path to the example file
|
||||||
path: String,
|
path: String,
|
||||||
|
/// Path to the associated wgsl file if it exists
|
||||||
|
shader_paths: Vec<String>,
|
||||||
/// List of non default required features
|
/// List of non default required features
|
||||||
required_features: Vec<String>,
|
required_features: Vec<String>,
|
||||||
|
|
||||||
// From the example metadata
|
// From the example metadata
|
||||||
/// Pretty name, used for display
|
/// Pretty name, used for display
|
||||||
name: String,
|
name: String,
|
||||||
|
|
Loading…
Reference in a new issue