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}