diff --git a/src/gameobject.rs b/src/gameobject.rs index 5a3bb3d..f25d12c 100644 --- a/src/gameobject.rs +++ b/src/gameobject.rs @@ -17,25 +17,6 @@ pub trait Childbearing { // TODO remove this fn add_child(&mut self, name: &str, child: T); } -impl Node { - pub fn find_node(&self, name: &str) -> Option { - self.children - .iter() - .find(|node| node.borrow().name == name) - .map(Rc::clone) - } -} - -macro_rules! impl_childbearing { - ($t:ty, $e:path) => { - impl Childbearing<$t> for Node { - fn add_child(&mut self, name: &str, child: $t) { - self.children.push(Rc::new(RefCell::new(Node::new(name.to_string(), $e(Box::new(child)))))); - } - } - } -} - impl Node { pub fn new(name: String, gameobject: GameObject) -> Self { Node { @@ -44,6 +25,15 @@ impl Node { children: Vec::new(), } } + pub fn find_node(&self, name: &str) -> Option { + self.children + .iter() + .find(|node| node.borrow().name == name) + .map(Rc::clone) + } + pub fn add_child(&mut self, child: NodeRef) { + self.children.push(child) + } } pub enum GameObject { @@ -114,8 +104,6 @@ impl Spatial for Camera { } } -impl_childbearing!(Camera, GameObject::Camera); - pub struct Mesh { pub model: Model, transform: Transform, @@ -138,5 +126,3 @@ impl Spatial for Mesh { self.transform = transform; } } - -impl_childbearing!(Mesh, GameObject::Mesh); diff --git a/src/main.rs b/src/main.rs index 5298b59..9efaa99 100644 --- a/src/main.rs +++ b/src/main.rs @@ -33,15 +33,14 @@ fn main() { { // Initial scene setup let mut root = root.borrow_mut(); - root.add_child("camera", Camera::new()); - + let mut cube = Mesh::new(Model::new(&display, "Box.glb")); cube.set_transform(gameobject::Transform { position: glm::vec3(0.0, 0.0, -10.0), rotation: glm::vec3(0.0, 15.0_f32.to_radians(), 0.0), scale: glm::vec3(1.0, 1.0, 1.0), }); - root.add_child("cube", cube); + root.add_child(Rc::new(RefCell::new(Node::new("cube".to_string(), GameObject::Mesh(Box::new(cube)))))); } let mut script_lang = Lua::new(Rc::clone(&root)); diff --git a/src/scripting/lua.rs b/src/scripting/lua.rs index 8b1a721..4cb4d92 100644 --- a/src/scripting/lua.rs +++ b/src/scripting/lua.rs @@ -1,8 +1,7 @@ use super::*; -use crate::gameobject::{ Node, Transform }; +use crate::gameobject::{ Node, NodeRef, Transform }; -extern crate mlua; use mlua::Lua as LuaContext; use mlua::Error::RuntimeError as LuaError; use mlua::chunk; @@ -61,13 +60,17 @@ impl ScriptLang for Lua { impl mlua::UserData for Node { fn add_methods<'lua, M: mlua::UserDataMethods<'lua, Self>>(methods: &mut M) { - methods.add_method_mut("find_node", |_, this, name: String| { + methods.add_method("find_node", |_, this, name: String| { let child = this.find_node(&name); match child { Some(child) => Ok(child), None => Err(mlua::Error::RuntimeError("Could not find child".to_string())), } }); + methods.add_method_mut("add_child", |_, this, child: NodeRef| { + this.add_child(child); + Ok(()) + }); methods.add_method("get_transform", |_, this, _: ()| { match this.gameobject.get_transform() { Ok(transform) => Ok(transform),