mirror of
https://github.com/bevyengine/bevy
synced 2024-11-22 04:33:37 +00:00
EntityArchetype proc macro
This commit is contained in:
parent
48cf0190ad
commit
ec4ca5559f
34 changed files with 94 additions and 82 deletions
|
@ -6,7 +6,6 @@ edition = "2018"
|
|||
|
||||
[dependencies]
|
||||
legion = { git = "https://github.com/TomGillen/legion.git", rev = "940ef3bfcb77e5d074ee3184b776ff1600da228d", features = ["serde-1"] }
|
||||
legion_transform = { path = "src/transform" }
|
||||
wgpu = { git = "https://github.com/gfx-rs/wgpu-rs.git", rev = "4a0da16fe6764c4e1dc918a31cbd7467d404df51"}
|
||||
glam = "0.8.4"
|
||||
winit = "0.20.0-alpha6"
|
||||
|
@ -21,6 +20,8 @@ uuid = { version = "0.8", features = ["v4"] }
|
|||
erased-serde = "0.3"
|
||||
type-uuid = "0.1"
|
||||
shaderc = "0.6"
|
||||
bevy_derive = { path = "bevy_derive" }
|
||||
bevy_transform = { path = "bevy_transform" }
|
||||
|
||||
[profile.release]
|
||||
debug = true
|
16
bevy_derive/Cargo.toml
Normal file
16
bevy_derive/Cargo.toml
Normal file
|
@ -0,0 +1,16 @@
|
|||
[package]
|
||||
name = "bevy_derive"
|
||||
version = "0.1.0"
|
||||
authors = ["Carter Anderson <mcanders1@gmail.com>"]
|
||||
edition = "2018"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
[lib]
|
||||
proc-macro = true
|
||||
|
||||
[dependencies]
|
||||
|
||||
syn = "1.0"
|
||||
quote = "1.0"
|
||||
|
||||
[dev-dependencies]
|
25
bevy_derive/src/lib.rs
Normal file
25
bevy_derive/src/lib.rs
Normal file
|
@ -0,0 +1,25 @@
|
|||
use proc_macro::TokenStream;
|
||||
use syn::{parse_macro_input, DeriveInput, Data, DataStruct, Fields};
|
||||
use quote::quote;
|
||||
|
||||
#[proc_macro_derive(EntityArchetype)]
|
||||
pub fn derive_entity_archetype(input: TokenStream) -> TokenStream {
|
||||
let ast = parse_macro_input!(input as DeriveInput);
|
||||
let fields = match &ast.data {
|
||||
Data::Struct(DataStruct { fields: Fields::Named(fields), .. }) => &fields.named,
|
||||
_ => panic!("expected a struct with named fields"),
|
||||
};
|
||||
|
||||
let struct_name = &ast.ident;
|
||||
let field_name = fields.iter().map(|field| &field.ident);
|
||||
|
||||
TokenStream::from(quote! {
|
||||
impl EntityArchetype for #struct_name {
|
||||
fn insert(self, world: &mut World) -> Entity {
|
||||
*world.insert((), vec![(
|
||||
#(self.#field_name),*
|
||||
)]).first().unwrap()
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
|
@ -1,5 +1,5 @@
|
|||
[package]
|
||||
name = "legion_transform"
|
||||
name = "bevy_transform"
|
||||
version = "0.3.0"
|
||||
authors = ["Alec Thilenius <alec@thilenius.com>"]
|
||||
edition = "2018"
|
||||
|
@ -8,7 +8,6 @@ license = "MIT"
|
|||
|
||||
[dependencies]
|
||||
legion = { git = "https://github.com/TomGillen/legion.git", rev = "940ef3bfcb77e5d074ee3184b776ff1600da228d" }
|
||||
#legion = { path = "../legion" }
|
||||
glam = "0.8.3"
|
||||
log = "0.4"
|
||||
rayon = "1.2"
|
|
@ -1,5 +1,4 @@
|
|||
use bevy::prelude::*;
|
||||
use bevy::ecs::*;
|
||||
|
||||
fn main() {
|
||||
AppBuilder::new().add_defaults().setup_world(setup).run();
|
||||
|
|
|
@ -3,11 +3,11 @@ use crate::{
|
|||
asset::*,
|
||||
core::Time,
|
||||
legion::prelude::{Runnable, Schedulable, Schedule, Universe, World},
|
||||
legion_transform::transform_system_bundle,
|
||||
render::{passes::*, *},
|
||||
ui,
|
||||
};
|
||||
|
||||
use bevy_transform::transform_system_bundle;
|
||||
use std::collections::HashMap;
|
||||
|
||||
pub const UPDATE: &str = "update";
|
||||
|
|
|
@ -1,70 +0,0 @@
|
|||
use crate::prelude::*;
|
||||
use legion::prelude::*;
|
||||
|
||||
|
||||
// builder macro that makes defaults easy? Object3dBuilder { Option<Material> } impl Builder for Object3dBuilder { }
|
||||
pub trait EntityArchetype {
|
||||
fn insert(self, world: &mut World) -> Entity;
|
||||
|
||||
// this would make composing entities from multiple archetypes possible
|
||||
// add_components appears to be missing from World. it will be less efficient without that
|
||||
// fn add_components(self, world: &mut World);
|
||||
|
||||
// generate by macro. maybe a separate macro?
|
||||
// fn query() -> Query
|
||||
}
|
||||
|
||||
pub struct Object3dEntity {
|
||||
pub mesh: Handle<Mesh>,
|
||||
pub material: Material,
|
||||
pub local_to_world: LocalToWorld,
|
||||
pub translation: Translation,
|
||||
}
|
||||
|
||||
// TODO: make this a macro
|
||||
impl EntityArchetype for Object3dEntity {
|
||||
fn insert(self, world: &mut World) -> Entity {
|
||||
*world.insert((), vec![(
|
||||
self.mesh,
|
||||
self.material,
|
||||
self.local_to_world,
|
||||
self.translation,
|
||||
)]).first().unwrap()
|
||||
}
|
||||
}
|
||||
|
||||
pub struct LightEntity {
|
||||
pub light: Light,
|
||||
pub local_to_world: LocalToWorld,
|
||||
pub translation: Translation,
|
||||
pub rotation: Rotation,
|
||||
}
|
||||
|
||||
// TODO: make this a macro
|
||||
impl EntityArchetype for LightEntity {
|
||||
fn insert(self, world: &mut World) -> Entity {
|
||||
*world.insert((), vec![(
|
||||
self.light,
|
||||
self.local_to_world,
|
||||
self.translation,
|
||||
self.rotation,
|
||||
)]).first().unwrap()
|
||||
}
|
||||
}
|
||||
|
||||
pub struct CameraEntity {
|
||||
pub camera: Camera,
|
||||
pub active_camera: ActiveCamera,
|
||||
pub local_to_world: LocalToWorld,
|
||||
}
|
||||
|
||||
// TODO: make this a macro
|
||||
impl EntityArchetype for CameraEntity {
|
||||
fn insert(self, world: &mut World) -> Entity {
|
||||
*world.insert((), vec![(
|
||||
self.camera,
|
||||
self.active_camera,
|
||||
self.local_to_world,
|
||||
)]).first().unwrap()
|
||||
}
|
||||
}
|
25
src/ecs/default_archetypes.rs
Normal file
25
src/ecs/default_archetypes.rs
Normal file
|
@ -0,0 +1,25 @@
|
|||
use crate::prelude::*;
|
||||
use bevy_derive::EntityArchetype;
|
||||
|
||||
#[derive(EntityArchetype)]
|
||||
pub struct Object3dEntity {
|
||||
pub mesh: Handle<Mesh>,
|
||||
pub material: Material,
|
||||
pub local_to_world: LocalToWorld,
|
||||
pub translation: Translation,
|
||||
}
|
||||
|
||||
#[derive(EntityArchetype)]
|
||||
pub struct LightEntity {
|
||||
pub light: Light,
|
||||
pub local_to_world: LocalToWorld,
|
||||
pub translation: Translation,
|
||||
pub rotation: Rotation,
|
||||
}
|
||||
|
||||
#[derive(EntityArchetype)]
|
||||
pub struct CameraEntity {
|
||||
pub camera: Camera,
|
||||
pub active_camera: ActiveCamera,
|
||||
pub local_to_world: LocalToWorld,
|
||||
}
|
13
src/ecs/entity_archetype.rs
Normal file
13
src/ecs/entity_archetype.rs
Normal file
|
@ -0,0 +1,13 @@
|
|||
use legion::prelude::*;
|
||||
|
||||
// builder macro that makes defaults easy? Object3dBuilder { Option<Material> } impl Builder for Object3dBuilder { }
|
||||
pub trait EntityArchetype {
|
||||
fn insert(self, world: &mut World) -> Entity;
|
||||
|
||||
// this would make composing entities from multiple archetypes possible
|
||||
// add_components appears to be missing from World. it will be less efficient without that
|
||||
// fn add_components(self, world: &mut World);
|
||||
|
||||
// generate by macro. maybe a separate macro?
|
||||
// fn query() -> Query
|
||||
}
|
|
@ -1,10 +1,12 @@
|
|||
mod entity_builder;
|
||||
mod archetypes;
|
||||
mod entity_archetype;
|
||||
pub mod default_archetypes;
|
||||
|
||||
pub use entity_builder::*;
|
||||
pub use archetypes::*;
|
||||
pub use entity_archetype::*;
|
||||
|
||||
use crate::prelude::{Children, Entity, SubWorld, World};
|
||||
use legion::{prelude::{Entity, World}, system::SubWorld};
|
||||
use bevy_transform::prelude::Children;
|
||||
|
||||
pub fn run_on_hierarchy<T>(
|
||||
world: &World,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
pub mod app;
|
||||
pub mod asset;
|
||||
pub mod core;
|
||||
pub mod ecs;
|
||||
pub mod core;
|
||||
pub mod prelude;
|
||||
pub mod render;
|
||||
pub mod serialization;
|
||||
|
@ -9,5 +9,5 @@ pub mod ui;
|
|||
|
||||
pub use glam as math;
|
||||
pub use legion;
|
||||
pub use legion_transform;
|
||||
pub use wgpu;
|
||||
pub use bevy_transform as transform;
|
||||
pub use wgpu;
|
|
@ -3,6 +3,8 @@ pub use crate::{
|
|||
asset::{Asset, AssetStorage, Handle, Mesh, MeshType, Texture, TextureType},
|
||||
core::Time,
|
||||
ecs,
|
||||
ecs::{EntityArchetype, EntityBuilder, EntityBuilderSource},
|
||||
ecs::default_archetypes::*,
|
||||
render::{
|
||||
ActiveCamera, ActiveCamera2d, Albedo, Camera, CameraType, Instanced, Light, Material,
|
||||
},
|
||||
|
@ -15,5 +17,5 @@ pub use legion::{
|
|||
system::SubWorld,
|
||||
system::SystemBuilder,
|
||||
};
|
||||
pub use legion_transform::prelude::*;
|
||||
pub use bevy_transform::prelude::*;
|
||||
pub use math::{Mat3, Mat4, Quat, Vec2, Vec3, Vec4};
|
||||
|
|
Loading…
Reference in a new issue