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}