1use std::collections::HashMap;
2use std::rc::Rc;
3use super::geometry::Geometry;
4use super::gli;
5use super::program::{Program};
6use super::uniforms::{UniformValue, set_value_for_uniform};
7
8type LocalUniformMap = HashMap<String, UniformValue>;
9
10pub struct Node {
11 geometry: Geometry,
12 program: Rc<Program>,
13 uniforms: LocalUniformMap,
14}
15
16impl Node {
17 pub fn for_program(program: Rc<Program>) -> Node {
18 Node {
19 geometry: Geometry::new(),
20 program: program,
21 uniforms: HashMap::new(),
22 }
23 }
24
25 pub fn add_attribute(&mut self, name: String) {
26 if let Some(attr) = self.program.get_attribute(&name) {
27 self.geometry.add_attribute(attr);
28 }
29 }
30
31 pub fn buffer_data(&mut self, data: &[f32]) {
32 self.geometry.buffer_data(data);
33 }
34
35 pub fn set_uniform(&mut self, name: String, value: UniformValue) {
36 self.uniforms.insert(name, value);
37 }
38
39 pub fn draw(&mut self) {
40 let mut tex_slot = 0;
41 for (name, uniform) in self.program.uniforms.iter() {
42 if let Some(local) = self.uniforms.get(name) {
43 if let UniformValue::Texture2D(t) = local {
44 gli::active_texture(tex_slot);
45 gli::bind_texture_2d(*t);
46 gli::uniform_1i(uniform.location, tex_slot as i32);
47 tex_slot += 1;
48 } else {
49 set_value_for_uniform(uniform.location, &local);
50 }
51 }
52 }
53
54 self.geometry.draw();
55 }
56}