use std::ptr;
use gl;
#[derive(Debug)]
pub struct Framebuffer {
pub id: u32
}
impl Framebuffer {
pub fn new(width: u32, height: u32) -> Framebuffer {
let mut framebuffer = 0;
unsafe {
gl::GenFramebuffers(1, &mut framebuffer);
gl::BindFramebuffer(gl::FRAMEBUFFER, framebuffer);
let mut texture_colorbuffer = 0;
gl::GenTextures(1, &mut texture_colorbuffer);
gl::BindTexture(gl::TEXTURE_2D, texture_colorbuffer);
gl::TexImage2D(gl::TEXTURE_2D, 0, gl::RGBA as i32, width as i32, height as i32,
0, gl::RGBA, gl::UNSIGNED_BYTE, ptr::null());
gl::TexParameteri(gl::TEXTURE_2D, gl::TEXTURE_MIN_FILTER, gl::LINEAR as i32);
gl::TexParameteri(gl::TEXTURE_2D, gl::TEXTURE_MAG_FILTER, gl::LINEAR as i32);
gl::FramebufferTexture2D(gl::FRAMEBUFFER, gl::COLOR_ATTACHMENT0, gl::TEXTURE_2D, texture_colorbuffer, 0);
let mut rbo = 0;
gl::GenRenderbuffers(1, &mut rbo);
gl::BindRenderbuffer(gl::RENDERBUFFER, rbo);
gl::RenderbufferStorage(gl::RENDERBUFFER, gl::DEPTH24_STENCIL8, width as i32, height as i32); gl::FramebufferRenderbuffer(gl::FRAMEBUFFER, gl::DEPTH_STENCIL_ATTACHMENT, gl::RENDERBUFFER, rbo); if gl::CheckFramebufferStatus(gl::FRAMEBUFFER) != gl::FRAMEBUFFER_COMPLETE {
panic!("ERROR::FRAMEBUFFER:: Framebuffer is not complete!");
}
gl::BindFramebuffer(gl::FRAMEBUFFER, 0);
}
Framebuffer {
id: framebuffer
}
}
pub fn bind(&self) {
unsafe { gl::BindFramebuffer(gl::FRAMEBUFFER, self.id) }
}
#[allow(dead_code)]
pub fn unbind(&self) {
unsafe { gl::BindFramebuffer(gl::FRAMEBUFFER, 0) }
}
}