use crate::opengl::{BufferObject, ShaderProgram, VertexArrayObject, VertexAttribPointer};
use crate::opengl::{BufferTarget, BufferUsage, DataType};
use std::mem::size_of;
pub struct MeshRenderer {
vertex_array: VertexArrayObject, shader_program: ShaderProgram, element_buffer: BufferObject, vertex_buffer: BufferObject, vertices: Vec<f32>, indicies: Vec<u32>, }
impl MeshRenderer {
pub fn new(vertices: Vec<f32>, indicies: Vec<u32>, shaders: ShaderProgram) -> MeshRenderer {
let vertex_array = VertexArrayObject::new();
let vertex_buffer = BufferObject::new(BufferTarget::ArrayBuffer, BufferUsage::StaticDraw);
let element_buffer = BufferObject::new(BufferTarget::ElementArrayBuffer, BufferUsage::StaticDraw);
vertex_array.bind();
vertex_buffer.bind();
vertex_buffer.data(&vertices);
element_buffer.bind();
element_buffer.data(&indicies);
let vertex_attrib_pointer = VertexAttribPointer::new(0, 3, DataType::Float, false, 3 * size_of::<f32>() as i32);
vertex_attrib_pointer.enable();
vertex_buffer.unbind();
vertex_array.unbind();
element_buffer.unbind();
MeshRenderer {
shader_program: shaders,
element_buffer,
vertex_buffer,
vertex_array,
vertices,
indicies,
}
}
pub fn set_vertices(&mut self, vertices: Vec<f32>) {
self.vertex_buffer.bind();
self.vertex_buffer.data(&vertices);
self.vertex_buffer.unbind();
self.vertices = vertices;
}
pub fn set_indices(&mut self, indicies: Vec<u32>) {
self.element_buffer.bind();
self.element_buffer.data(&indicies);
self.element_buffer.unbind();
self.indicies = indicies;
}
pub fn render(&self) {
self.shader_program.bind();
self.vertex_array.bind();
unsafe {
gl::DrawElements(
gl::TRIANGLES,
self.indicies.len() as i32,
gl::UNSIGNED_INT,
std::ptr::null(),
);
}
}
}