gllite/
node.rs

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}