1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
use std::path::Path; use crate::eval::Env; use crate::objects::{Eval, Object, Vtable}; use nalgebra::Translation3; pub fn class_vtable() -> Vtable { Vtable::new("class SceneNode") } pub fn instance_vtable() -> Vtable { let vt = Vtable::new("SceneNode"); vt.add_primitive_method_or_panic("color:", scene_node_color); vt.add_primitive_method_or_panic("texture:from:", scene_node_texture_from); vt.add_primitive_method_or_panic("translate:", scene_node_translate); vt } fn scene_node_color(receiver: &Object, args: &[Object], env: &Env) -> Eval { { let mut x = 0.0; let mut y = 0.0; let mut z = 0.0; args[0].as_vec(|vec| { x = vec[0].send("asFloat", &[], env)?.float() as f32; y = vec[1].send("asFloat", &[], env)?.float() as f32; z = vec[2].send("asFloat", &[], env)?.float() as f32; Ok(()) })?; let mut node = receiver.scene_node().node.borrow_mut(); node.set_color(x, y, z); } Ok(receiver.clone()) } fn scene_node_texture_from(receiver: &Object, args: &[Object], _env: &Env) -> Eval { kiss3d::resource::TextureManager::get_global_manager(|manager| { let path = Path::new(args[1].string_as_str()); let texture = manager.add(&path, args[0].string_as_str()); let mut node = receiver.scene_node().node.borrow_mut(); node.set_texture(texture); Ok(()) })?; Ok(receiver.clone()) } fn scene_node_translate(receiver: &Object, args: &[Object], env: &Env) -> Eval { { let t = args[0].as_vec(|vec| { let x = vec[0].send("asFloat", &[], env)?.float() as f32; let y = vec[1].send("asFloat", &[], env)?.float() as f32; let z = vec[2].send("asFloat", &[], env)?.float() as f32; Ok(Translation3::new(x, y, z)) })?; let mut node = receiver.scene_node().node.borrow_mut(); node.append_translation(&t); } Ok(receiver.clone()) }