gllite/
texture.rs

1use super::gli;
2use super::uniforms::UniformValue;
3
4pub struct Texture {
5  gl_texture: u32,
6  width: i32,
7  height: i32,
8}
9
10impl Texture {
11  pub fn new() -> Texture {
12    let tex = gli::create_texture();
13    gli::bind_texture_2d(tex);
14    gli::tex_parameter_2d(gli::TEXTURE_WRAP_S, gli::CLAMP_TO_EDGE);
15    gli::tex_parameter_2d(gli::TEXTURE_WRAP_T, gli::CLAMP_TO_EDGE);
16    gli::tex_parameter_2d(gli::TEXTURE_MIN_FILTER, gli::LINEAR);
17    gli::tex_parameter_2d(gli::TEXTURE_MAG_FILTER, gli::LINEAR);
18    let empty: [u8; 4] = [0, 0, 0, 0];
19    gli::tex_image_2d_from_bytes(gli::RGBA, 1, 1, gli::RGBA, &empty[0] as *const u8);
20    Texture {
21      gl_texture: tex,
22      width: 1,
23      height: 1,
24    }
25  }
26
27  pub fn set_wrap_mode(&self, s: u32, t: u32) {
28    gli::bind_texture_2d(self.gl_texture);
29    gli::tex_parameter_2d(gli::TEXTURE_WRAP_S, s);
30    gli::tex_parameter_2d(gli::TEXTURE_WRAP_T, t);
31  }
32
33  pub fn set_filter_mode(&self, min: u32, mag: u32) {
34    gli::bind_texture_2d(self.gl_texture);
35    gli::tex_parameter_2d(gli::TEXTURE_MIN_FILTER, min);
36    gli::tex_parameter_2d(gli::TEXTURE_MAG_FILTER, mag);
37  }
38
39  pub fn as_uniform_value(&self) -> UniformValue {
40    UniformValue::Texture2D(self.gl_texture)
41  }
42
43  pub fn set_from_bytes(&self, internal: u32, width: i32, height: i32, format: u32, data: *const u8) {
44    gli::bind_texture_2d(self.gl_texture);
45    gli::tex_image_2d_from_bytes(internal, width, height, format, data);
46  }
47
48  pub fn bind_to_slot(&self, slot: u32) {
49    gli::active_texture(slot);
50    gli::bind_texture_2d(self.gl_texture);
51  }
52}