Simplify model rendering
This commit is contained in:
parent
a7c586b2e9
commit
75fb828a89
|
@ -107,17 +107,12 @@ impl Manager {
|
||||||
buffer_size: 0,
|
buffer_size: 0,
|
||||||
count: 0,
|
count: 0,
|
||||||
|
|
||||||
counts: Vec::with_capacity(parts.len()),
|
|
||||||
offsets: Vec::with_capacity(parts.len()),
|
|
||||||
|
|
||||||
verts: vec![],
|
verts: vec![],
|
||||||
};
|
};
|
||||||
|
|
||||||
for (i, part) in parts.into_iter().enumerate() {
|
for (i, part) in parts.into_iter().enumerate() {
|
||||||
model.matrix.push(Matrix4::identity());
|
model.matrix.push(Matrix4::identity());
|
||||||
model.colors.push([1.0, 1.0, 1.0, 1.0]);
|
model.colors.push([1.0, 1.0, 1.0, 1.0]);
|
||||||
model.counts.push(((part.len() / 4) * 6) as i32);
|
|
||||||
model.offsets.push((model.verts.len() / 4) * 6);
|
|
||||||
for mut pp in part {
|
for mut pp in part {
|
||||||
pp.id = i as u8;
|
pp.id = i as u8;
|
||||||
model.verts.push(pp);
|
model.verts.push(pp);
|
||||||
|
@ -127,11 +122,11 @@ impl Manager {
|
||||||
};
|
};
|
||||||
|
|
||||||
Self::rebuild_model(&mut model);
|
Self::rebuild_model(&mut model);
|
||||||
if self.max_index < model.count {
|
if self.max_index < model.count as usize {
|
||||||
let (data, ty) = super::generate_element_buffer(model.count);
|
let (data, ty) = super::generate_element_buffer(model.count as usize);
|
||||||
self.index_buffer.bind(gl::ELEMENT_ARRAY_BUFFER);
|
self.index_buffer.bind(gl::ELEMENT_ARRAY_BUFFER);
|
||||||
self.index_buffer.set_data(gl::ELEMENT_ARRAY_BUFFER, &data, gl::DYNAMIC_DRAW);
|
self.index_buffer.set_data(gl::ELEMENT_ARRAY_BUFFER, &data, gl::DYNAMIC_DRAW);
|
||||||
self.max_index = model.count;
|
self.max_index = model.count as usize;
|
||||||
self.index_type = ty;
|
self.index_type = ty;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -150,7 +145,7 @@ impl Manager {
|
||||||
|
|
||||||
fn rebuild_model(model: &mut Model) {
|
fn rebuild_model(model: &mut Model) {
|
||||||
model.array.bind();
|
model.array.bind();
|
||||||
model.count = (model.verts.len() / 4) * 6;
|
model.count = ((model.verts.len() / 4) * 6) as i32;
|
||||||
|
|
||||||
let mut buffer = Vec::with_capacity(36 * model.verts.len());
|
let mut buffer = Vec::with_capacity(36 * model.verts.len());
|
||||||
for vert in &model.verts {
|
for vert in &model.verts {
|
||||||
|
@ -206,12 +201,6 @@ impl Manager {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn draw(&mut self, frustum: &Frustum<f32>, perspective_matrix: &Matrix4<f32>, camera_matrix: &Matrix4<f32>, light_level: f32, sky_offset: f32) {
|
pub fn draw(&mut self, frustum: &Frustum<f32>, perspective_matrix: &Matrix4<f32>, camera_matrix: &Matrix4<f32>, light_level: f32, sky_offset: f32) {
|
||||||
let m = if self.index_type == gl::UNSIGNED_SHORT {
|
|
||||||
2
|
|
||||||
} else {
|
|
||||||
4
|
|
||||||
};
|
|
||||||
|
|
||||||
gl::enable(gl::BLEND);
|
gl::enable(gl::BLEND);
|
||||||
for collection in &self.collections {
|
for collection in &self.collections {
|
||||||
collection.shader.program.use_program();
|
collection.shader.program.use_program();
|
||||||
|
@ -231,19 +220,9 @@ impl Manager {
|
||||||
}
|
}
|
||||||
model.array.bind();
|
model.array.bind();
|
||||||
collection.shader.lighting.map(|v| v.set_float2(model.block_light, model.sky_light));
|
collection.shader.lighting.map(|v| v.set_float2(model.block_light, model.sky_light));
|
||||||
if model.counts.len() > 1 {
|
collection.shader.model_matrix.map(|v| v.set_matrix4_multi(&model.matrix));
|
||||||
let mut offsets = model.offsets.clone();
|
collection.shader.color_mul.map(|v| v.set_float_mutli_raw(model.colors.as_ptr() as *const _, model.colors.len()));
|
||||||
for offset in &mut offsets {
|
gl::draw_elements(gl::TRIANGLES, model.count, self.index_type, 0);
|
||||||
*offset *= m;
|
|
||||||
}
|
|
||||||
collection.shader.model_matrix.map(|v| v.set_matrix4_multi(&model.matrix));
|
|
||||||
collection.shader.color_mul.map(|v| v.set_float_mutli_raw(model.colors.as_ptr() as *const _, model.colors.len()));
|
|
||||||
gl::multi_draw_elements(gl::TRIANGLES, &model.counts, self.index_type, &offsets);
|
|
||||||
} else {
|
|
||||||
collection.shader.model_matrix.map(|v| v.set_matrix4_multi(&model.matrix));
|
|
||||||
collection.shader.color_mul.map(|v| v.set_float_mutli_raw(model.colors.as_ptr() as *const _, model.colors.len()));
|
|
||||||
gl::draw_elements(gl::TRIANGLES, model.counts[0], self.index_type, model.offsets[0] * m);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
gl::disable(gl::BLEND);
|
gl::disable(gl::BLEND);
|
||||||
|
@ -275,10 +254,7 @@ pub struct Model {
|
||||||
array: gl::VertexArray,
|
array: gl::VertexArray,
|
||||||
buffer: gl::Buffer,
|
buffer: gl::Buffer,
|
||||||
buffer_size: usize,
|
buffer_size: usize,
|
||||||
count: usize,
|
count: i32,
|
||||||
|
|
||||||
counts: Vec<i32>,
|
|
||||||
offsets: Vec<usize>,
|
|
||||||
|
|
||||||
pub verts: Vec<Vertex>,
|
pub verts: Vec<Vertex>,
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue