e2rcore/implement/render/mesh.rs
1extern crate pretty_env_logger;
2extern crate mazth;
3
4// use self::mazth::mat::{ Mat3x1, Mat2x1 };
5use std::collections::HashMap;
6use std::vec::Vec;
7use std::any::Any;
8use std::mem;
9
10use interface::i_ele;
11use interface::i_renderobj;
12use interface::i_component;
13
14#[derive(Clone)]
15pub struct Mesh {
16 pub _id: u64,
17 // pub _pos: Vec< Mat3x1< f32 > >,
18 // pub _normal: Vec< Mat3x1< f32 > >,
19 // pub _tc: Vec< Mat2x1< f32 > >,
20 pub _batch_pos: Vec< f32 >,
21 pub _batch_normal: Vec< f32 >,
22 pub _batch_tc: Vec< f32 >,
23 // _xform: Mat4< f32 >,
24}
25
26impl Mesh {
27 pub fn init( id: u64 ) -> Mesh {
28 Mesh {
29 _id: id,
30 // _pos: vec![],
31 // _normal: vec![],
32 // _tc: vec![],
33 _batch_pos: vec![],
34 _batch_normal: vec![],
35 _batch_tc: vec![],
36 }
37 }
38}
39
40impl i_ele::IObjImpl for Mesh {
41 fn as_any( & self ) -> & Any {
42 self
43 }
44 fn update_components( & mut self, components: & mut Vec< Box< i_component::IComponent > > ) -> Result< (), & 'static str > {
45
46 //store vertex data
47 {
48 if self._batch_pos.len() != self._batch_normal.len() ||
49 self._batch_pos.len() / 3 != self._batch_tc.len() / 2
50 {
51 return Err( &"inconsistent length for position, normal, tc data" )
52 }
53 let ele_len = self._batch_pos.len();
54
55 // let pos = {
56 // self._pos.iter()
57 // .flat_map(|x| x._val[..].to_vec() )
58 // .collect::<Vec<_>>()
59 // };
60
61 // let normal = {
62 // self._normal.iter()
63 // .flat_map(|x| x.normalize().unwrap()._val[..].to_vec() )
64 // .collect::<Vec<_>>()
65 // };
66
67 // let tc = {
68 // self._tc.iter()
69 // .flat_map(|x| x._val[..].to_vec() )
70 // .collect::<Vec<_>>()
71 // };
72
73 // let pos = {
74 // let mut temp = vec![];
75 // temp.reserve_exact( 3 * self._pos.len() );
76 // self._pos.iter_mut().for_each( |x| temp.append( & mut x._val.to_vec() ) );
77 // temp
78 // };
79
80 // let normal = {
81 // let mut temp = vec![];
82 // temp.reserve_exact( 3 * self._normal.len() );
83 // self._normal.iter_mut().for_each( |x| temp.append( & mut x.normalize().unwrap()._val.to_vec() ) );
84 // temp
85 // };
86
87 // let tc = {
88 // let mut temp = vec![];
89 // temp.reserve_exact( 2 * self._tc.len() );
90 // self._tc.iter_mut().for_each( |x| temp.append( & mut x._val.to_vec() ) );
91 // temp
92 // };
93
94 let mut pos = vec![];
95 let mut normal = vec![];
96 let mut tc = vec![];
97 mem::swap( & mut pos, & mut self._batch_pos );
98 mem::swap( & mut normal, & mut self._batch_normal );
99 mem::swap( & mut tc, & mut self._batch_tc );
100
101 let data_map : HashMap< i_renderobj::BuffDataType, Vec<f32> > = [ ( i_renderobj::BuffDataType::POS, pos ),
102 ( i_renderobj::BuffDataType::NORMAL, normal ),
103 ( i_renderobj::BuffDataType::TC, tc ) ].into_iter().cloned().collect();
104
105 let c = i_component::ComponentRenderBuffer {
106 _data_dict: data_map,
107 };
108 components.push( Box::new(c) );
109 trace!( "load into render buffer: mesh: vertex count:{}", ele_len / 3 );
110 }
111 //todo: store uniform data
112 {
113
114
115 }
116 Ok( () )
117 }
118}