pub use crate::schema::camera_shot::CameraShot;
pub use crate::schema::character_model::CharacterModel;
pub use crate::schema::character_schema::{
CharacterSchema, KeyPolarity, PanelSection, ProportionGroup, SchemaJoint, SchemaKey,
SchemaRegion, ShapePreset, SynthParams, SynthesizedTarget,
};
pub use crate::schema::engine_defaults::EngineDefaults;
pub use crate::schema::light_rig::LightRig;
pub use crate::schema::main_menu::{MainMenu, MainMenuItem, SettingsProfile};
pub use crate::schema::material_palette::{MaterialPalette, PaletteEntry};
pub use crate::schema::option_select::OptionSelect;
pub use crate::schema::panel::Panel;
pub use crate::schema::prefab::{Prefab, PrefabEntry, PrefabKind};
pub use crate::schema::scene_import::SceneImport;
pub use crate::schema::slider::Slider;
pub use crate::schema::story_import::StoryImport;
pub trait BuildOnlyAsset {}
#[macro_export]
macro_rules! for_each_build_only_type {
($cb:ident) => { $crate::for_each_build_only_type!($cb,); };
($cb:ident, $($prefix:tt)*) => {
$cb! {
$($prefix)*
build_only: {
LightRig => $crate::registry::build_only::LightRig { },
MaterialPalette => $crate::registry::build_only::MaterialPalette { },
CameraShot => $crate::registry::build_only::CameraShot { },
Prefab => $crate::registry::build_only::Prefab { },
SceneImport => $crate::registry::build_only::SceneImport { },
MainMenu => $crate::registry::build_only::MainMenu { renders },
OptionSelect => $crate::registry::build_only::OptionSelect { },
Slider => $crate::registry::build_only::Slider { },
EngineDefaults => $crate::registry::build_only::EngineDefaults { },
StoryImport => $crate::registry::build_only::StoryImport { },
Panel => $crate::registry::build_only::Panel { },
CharacterSchema => $crate::registry::build_only::CharacterSchema { },
CharacterModel => $crate::registry::build_only::CharacterModel { },
},
}
};
}
macro_rules! __impl_build_only {
(build_only: { $( $variant:ident => $ty:path { $($meta:tt)* } ),+ $(,)? } $(,)?) => {
$( impl BuildOnlyAsset for $ty {} )+
};
}
crate::for_each_build_only_type!(__impl_build_only);
#[cfg(test)]
mod tests {
use super::*;
use crate::registry::{AssetOrigin, RegisteredType, ScopeResolution};
macro_rules! assert_registered_as_build_only {
(build_only: { $( $variant:ident => $ty:path { $($meta:tt)* } ),+ $(,)? } $(,)?) => {
#[test]
fn every_build_only_type_reaches_the_authoring_registry() {
let mut count = 0;
$(
let name = stringify!($variant);
let ty = RegisteredType::parse(name)
.unwrap_or_else(|| panic!("{name} is not a registered type"));
assert_eq!(ty, RegisteredType::$variant);
assert!(
RegisteredType::all().contains(&ty),
"{name} is missing from all()"
);
assert_eq!(ty.registration().origin, AssetOrigin::BuildOnly);
assert!(!ty.addable(), "{name} is not externally addable");
assert_eq!(ty.discriminant(), None, "{name} carries a blob tag");
assert_eq!(ty.scope_resolution(), ScopeResolution::Expanded);
assert!(!ty.is_resource(), "{name} is not a resource");
count += 1;
)+
let registered = RegisteredType::all()
.iter()
.filter(|t| t.registration().origin == AssetOrigin::BuildOnly)
.count();
assert_eq!(registered, count);
}
};
}
crate::for_each_build_only_type!(assert_registered_as_build_only);
fn expanded_by_the_cook<T: BuildOnlyAsset>() {}
#[test]
fn the_group_carries_its_marker() {
expanded_by_the_cook::<Prefab>();
expanded_by_the_cook::<MainMenu>();
expanded_by_the_cook::<CharacterSchema>();
}
}