Deduplicate vertices for model rendering
This commit is contained in:
parent
e5a30c50a9
commit
e61e15770e
@ -8,7 +8,6 @@ use ::std::collections::HashMap;
|
|||||||
use ::std::collections::HashSet;
|
use ::std::collections::HashSet;
|
||||||
use ::std::ffi::CStr;
|
use ::std::ffi::CStr;
|
||||||
use ::std::fs::File;
|
use ::std::fs::File;
|
||||||
use ::std::hash::{Hash, Hasher};
|
|
||||||
use ::std::io::BufReader;
|
use ::std::io::BufReader;
|
||||||
use ::std::os::raw::c_void;
|
use ::std::os::raw::c_void;
|
||||||
use ::std::ptr::copy_nonoverlapping as memcpy;
|
use ::std::ptr::copy_nonoverlapping as memcpy;
|
||||||
@ -926,6 +925,8 @@ impl AppData {
|
|||||||
|_| Ok(Default::default()),
|
|_| Ok(Default::default()),
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
|
let mut unique_vertices = HashMap::new();
|
||||||
|
|
||||||
for model in &models {
|
for model in &models {
|
||||||
for index in &model.mesh.indices {
|
for index in &model.mesh.indices {
|
||||||
let pos_offset = (3 * index) as usize;
|
let pos_offset = (3 * index) as usize;
|
||||||
@ -944,8 +945,14 @@ impl AppData {
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
self.vertices.push(vertex);
|
if let Some(index) = unique_vertices.get(&vertex) {
|
||||||
self.indices.push(self.indices.len() as u32);
|
self.indices.push(*index as u32);
|
||||||
|
} else {
|
||||||
|
let index = self.vertices.len();
|
||||||
|
unique_vertices.insert(vertex, index);
|
||||||
|
self.vertices.push(vertex);
|
||||||
|
self.indices.push(index as u32);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
use ::anyhow::{anyhow, Result};
|
use ::anyhow::{anyhow, Result};
|
||||||
use ::log::*;
|
use ::log::*;
|
||||||
use ::nalgebra_glm as glm;
|
use ::nalgebra_glm as glm;
|
||||||
|
use ::std::hash::{Hash, Hasher};
|
||||||
use ::std::mem::size_of;
|
use ::std::mem::size_of;
|
||||||
use ::thiserror::Error;
|
use ::thiserror::Error;
|
||||||
use ::vulkanalia::prelude::v1_0::*;
|
use ::vulkanalia::prelude::v1_0::*;
|
||||||
@ -145,6 +146,27 @@ impl Vertex {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl PartialEq for Vertex {
|
||||||
|
fn eq(&self, other: &Self) -> bool {
|
||||||
|
self.pos == other.pos && self.color == other.color && self.tex_coord == other.tex_coord
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Eq for Vertex {}
|
||||||
|
|
||||||
|
impl Hash for Vertex {
|
||||||
|
fn hash<H: Hasher>(&self, state: &mut H) {
|
||||||
|
self.pos[0].to_bits().hash(state);
|
||||||
|
self.pos[1].to_bits().hash(state);
|
||||||
|
self.pos[2].to_bits().hash(state);
|
||||||
|
self.color[0].to_bits().hash(state);
|
||||||
|
self.color[1].to_bits().hash(state);
|
||||||
|
self.color[2].to_bits().hash(state);
|
||||||
|
self.tex_coord[0].to_bits().hash(state);
|
||||||
|
self.tex_coord[1].to_bits().hash(state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// Resource Descriptors
|
// Resource Descriptors
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
Loading…
Reference in New Issue
Block a user