Theoretically can add children from script
This commit is contained in:
parent
d22584c44e
commit
2d5ce7ae98
@ -17,25 +17,6 @@ pub trait Childbearing<T> { // TODO remove this
|
|||||||
fn add_child(&mut self, name: &str, child: T);
|
fn add_child(&mut self, name: &str, child: T);
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Node {
|
|
||||||
pub fn find_node(&self, name: &str) -> Option<NodeRef> {
|
|
||||||
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 {
|
impl Node {
|
||||||
pub fn new(name: String, gameobject: GameObject) -> Self {
|
pub fn new(name: String, gameobject: GameObject) -> Self {
|
||||||
Node {
|
Node {
|
||||||
@ -44,6 +25,15 @@ impl Node {
|
|||||||
children: Vec::new(),
|
children: Vec::new(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
pub fn find_node(&self, name: &str) -> Option<NodeRef> {
|
||||||
|
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 {
|
pub enum GameObject {
|
||||||
@ -114,8 +104,6 @@ impl Spatial for Camera {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl_childbearing!(Camera, GameObject::Camera);
|
|
||||||
|
|
||||||
pub struct Mesh {
|
pub struct Mesh {
|
||||||
pub model: Model,
|
pub model: Model,
|
||||||
transform: Transform,
|
transform: Transform,
|
||||||
@ -138,5 +126,3 @@ impl Spatial for Mesh {
|
|||||||
self.transform = transform;
|
self.transform = transform;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl_childbearing!(Mesh, GameObject::Mesh);
|
|
||||||
|
@ -33,15 +33,14 @@ fn main() {
|
|||||||
{
|
{
|
||||||
// Initial scene setup
|
// Initial scene setup
|
||||||
let mut root = root.borrow_mut();
|
let mut root = root.borrow_mut();
|
||||||
root.add_child("camera", Camera::new());
|
|
||||||
|
|
||||||
let mut cube = Mesh::new(Model::new(&display, "Box.glb"));
|
let mut cube = Mesh::new(Model::new(&display, "Box.glb"));
|
||||||
cube.set_transform(gameobject::Transform {
|
cube.set_transform(gameobject::Transform {
|
||||||
position: glm::vec3(0.0, 0.0, -10.0),
|
position: glm::vec3(0.0, 0.0, -10.0),
|
||||||
rotation: glm::vec3(0.0, 15.0_f32.to_radians(), 0.0),
|
rotation: glm::vec3(0.0, 15.0_f32.to_radians(), 0.0),
|
||||||
scale: glm::vec3(1.0, 1.0, 1.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));
|
let mut script_lang = Lua::new(Rc::clone(&root));
|
||||||
|
@ -1,8 +1,7 @@
|
|||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
use crate::gameobject::{ Node, Transform };
|
use crate::gameobject::{ Node, NodeRef, Transform };
|
||||||
|
|
||||||
extern crate mlua;
|
|
||||||
use mlua::Lua as LuaContext;
|
use mlua::Lua as LuaContext;
|
||||||
use mlua::Error::RuntimeError as LuaError;
|
use mlua::Error::RuntimeError as LuaError;
|
||||||
use mlua::chunk;
|
use mlua::chunk;
|
||||||
@ -61,13 +60,17 @@ impl ScriptLang for Lua {
|
|||||||
|
|
||||||
impl mlua::UserData for Node {
|
impl mlua::UserData for Node {
|
||||||
fn add_methods<'lua, M: mlua::UserDataMethods<'lua, Self>>(methods: &mut M) {
|
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);
|
let child = this.find_node(&name);
|
||||||
match child {
|
match child {
|
||||||
Some(child) => Ok(child),
|
Some(child) => Ok(child),
|
||||||
None => Err(mlua::Error::RuntimeError("Could not find child".to_string())),
|
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, _: ()| {
|
methods.add_method("get_transform", |_, this, _: ()| {
|
||||||
match this.gameobject.get_transform() {
|
match this.gameobject.get_transform() {
|
||||||
Ok(transform) => Ok(transform),
|
Ok(transform) => Ok(transform),
|
||||||
|
Loading…
Reference in New Issue
Block a user