use anyhow::Result;
use bevy::prelude::*;
use bevyhub_scene::prelude::*;
use std::borrow::Cow;
fn main() -> Result<()> {
SceneGroupExporter::new_no_filter(register_types)
.with_config(SceneExportConfig {
clear_target_dir: false,
..default()
})
.with_checks(
DynamicSceneChecks::default().with_num_ignored_resources(6),
)
.add_scene("test_scene", scene)
.export()?;
TypeRegistryExporter::new(register_types)
.with_name("test_scene_registry.json")
.export()?;
Ok(())
}
fn scene(mut commands: Commands) {
commands.insert_resource(MyResource((1.1, 2.2)));
commands.spawn(Name::new("Root")).with_children(|parent| {
parent.spawn((Name::new("Child1"), MyUnitStruct));
parent.spawn((
Name::new("Child2"),
MyNewTypeStruct("hello world".into()),
));
parent.spawn((Name::new("Child3"), MyTupleStruct(2.2, 3.3)));
parent
.spawn((
Name::new("Child4"),
MyNamedStruct::default(),
MyEnum::Named {
field1: 6.6,
field2: 7.7,
},
))
.with_children(|parent| {
parent.spawn((
Name::new("Kitchen Sink Grandchild"),
MyUnitStruct,
MyNewTypeStruct::default(),
MyTupleStruct::default(),
MyNamedStruct::default(),
MyEnum::default(),
));
})
.with_children(|parent| {
parent.spawn((
Name::new("Great Grandchild"),
MyBigStruct::default(),
));
});
});
}
fn register_types(app: &mut App) {
app
.register_type::<Name>()
.register_type::<Parent>()
.register_type::<Children>()
.register_type::<MyResource>()
.register_type::<MyUnitStruct>()
.register_type::<MyNewTypeStruct>()
.register_type::<MyTupleStruct>()
.register_type::<MyNamedStruct>()
.register_type::<MyEnum>()
.register_type::<MyBigStruct>()
;
}
#[derive(Default, Resource, Reflect)]
#[reflect(Default, Resource)]
struct MyResource((f32, f64));
#[derive(Default, Component, Reflect)]
#[reflect(Default, Component)]
struct MyUnitStruct;
#[derive(Default, Component, Reflect)]
#[reflect(Default, Component)]
struct MyNewTypeStruct(
Cow<'static, str>,
);
#[derive(Default, Component, Reflect)]
#[reflect(Default, Component)]
struct MyTupleStruct(
f32,
f32,
);
#[derive(Default, Component, Reflect)]
#[reflect(Default, Component)]
struct MyNamedStruct {
field1: f32,
field2: f32,
}
#[derive(Component, Reflect)]
#[reflect(Default, Component)]
enum MyEnum {
Unit,
NewType(
f32,
),
AnotherNewType(f32),
Tuple(f32, f32),
Named {
field1: f32,
field2: f32,
},
}
impl Default for MyEnum {
fn default() -> Self { MyEnum::AnotherNewType(0.3) }
}
#[derive(Default, Component, Reflect)]
#[reflect(Default, Component)]
struct MyBigStruct {
my_i8_type: i8,
my_i16_type: i16,
my_i32_type: i32,
my_i64_type: i64,
my_isize_type: isize,
my_u8_type: u8,
my_u16_type: u16,
my_u32_type: u32,
my_u64_type: u64,
my_usize_type: usize,
my_f32_type: f32,
my_f64_type: f64,
my_char_type: char,
my_bool_type: bool,
my_tuple_type: (i32, f64, char),
my_array_type: [i32; 5],
my_vec_type: Vec<i32>,
my_unit_struct: MyUnitStruct,
my_newtype_struct: MyNewTypeStruct,
my_tuple_struct: MyTupleStruct,
my_named_struct: MyNamedStruct,
my_enum: MyEnum,
my_optional_field: Option<f32>,
}