use implement::math::mat::Mat3x1;
use implement::math::mat::Mat2x1;
use std::collections::HashMap;
use std::vec::Vec;
use std::any::Any;
use interface::i_ele;
use interface::i_renderobj;
use interface::i_component;
#[derive(Clone)]
pub struct Mesh {
pub _id: u64,
pub _pos: Vec< Mat3x1< f32 > >,
pub _normal: Vec< Mat3x1< f32 > >,
pub _tc: Vec< Mat2x1< f32 > >,
}
impl Mesh {
pub fn init( id: u64 ) -> Mesh {
Mesh {
_id: id,
_pos: vec![],
_normal: vec![],
_tc: vec![],
}
}
}
impl i_ele::IObjImpl for Mesh {
fn as_any( & self ) -> & Any {
self
}
fn update_components( & mut self, components: & mut Vec< Box< i_component::IComponent > > ) -> Result< (), & 'static str > {
{
if self._pos.len() != self._normal.len() ||
self._pos.len() != self._tc.len()
{
return Err( &"unequal length for position, normal, tc data" )
}
let ele_len = self._pos.len();
let mut pos = vec![];
let mut normal = vec![];
let mut tc = vec![];
for i in 0..self._pos.len() {
pos.extend_from_slice( &self._pos[i]._val[..] );
}
for i in 0..self._normal.len() {
normal.extend_from_slice( &self._normal[i]._val[..] );
}
for i in 0..self._tc.len() {
tc.extend_from_slice( &self._tc[i]._val[..] );
}
let data_map : HashMap< i_renderobj::BuffDataType, Vec<f32> > = [ ( i_renderobj::BuffDataType::POS, pos ),
( i_renderobj::BuffDataType::NORMAL, normal ),
( i_renderobj::BuffDataType::TC, tc ) ].iter().cloned().collect();
let c = i_component::ComponentRenderBuffer {
_data_dict: data_map,
};
components.push( Box::new(c) );
println!( "load into render buffer: mesh: vertex count:{}", ele_len / 3 );
}
{
}
Ok( () )
}
}