diff --git a/engine/src/render/renderable.rs b/engine/src/render/renderable.rs index a97d84f..c1def93 100644 --- a/engine/src/render/renderable.rs +++ b/engine/src/render/renderable.rs @@ -25,7 +25,11 @@ use crate::render::resource::{ResourceID}; pub struct Transform(pub cgm::Matrix4); -impl Component for Transform {} +impl Component for Transform { + fn id(&self) -> &'static str { + "Transform" + } +} impl Transform { pub fn at(x: f32, y: f32, z: f32) -> Self { @@ -48,4 +52,8 @@ pub enum Renderable { Mesh(ResourceID, ResourceID), } -impl Component for Renderable {} +impl Component for Renderable { + fn id(&self) -> &'static str { + "Renderable" + } +} diff --git a/lib/ecs/BUILD b/lib/ecs/BUILD index bda3255..e3f789c 100644 --- a/lib/ecs/BUILD +++ b/lib/ecs/BUILD @@ -14,6 +14,9 @@ rust_library( "src/system.rs", "src/world.rs", ], + deps = [ + "//third_party/cargo:log", + ], visibility = ["//engine:__subpackages__"], ) diff --git a/lib/ecs/src/component.rs b/lib/ecs/src/component.rs index 5350980..7f9ab17 100644 --- a/lib/ecs/src/component.rs +++ b/lib/ecs/src/component.rs @@ -2,6 +2,9 @@ pub type ID = std::any::TypeId; pub trait Component: 'static { + fn id(&self) -> &'static str { + "" + } } pub fn component_id() -> ID { diff --git a/lib/ecs/src/world.rs b/lib/ecs/src/world.rs index 8efe2b9..d3c9a86 100644 --- a/lib/ecs/src/world.rs +++ b/lib/ecs/src/world.rs @@ -159,7 +159,12 @@ impl World { c: Box, e: entity::Entity ) { - let map = self.components.entry(cid).or_insert(ComponentMap::new()); + let map = self.components.entry(cid).or_insert_with(|| { + if c.id() == "" { + log::warn!("Component type {:?} has no .id() defined, will not be accessible from scripting.", cid); + } + ComponentMap::new() + }); map.insert(e.id(), c).unwrap(); }