Reenable early Z optimizations

This commit is contained in:
Patrick Walton 2017-10-02 15:36:39 -07:00
parent f3f893302a
commit 092b46e056
2 changed files with 31 additions and 14 deletions

View File

@ -242,20 +242,7 @@ impl PathPartitioningResult {
path_indices.push(PartitionPathIndices::new(index_ranges)); path_indices.push(PartitionPathIndices::new(index_ranges));
} }
// Reverse interior indices for early Z optimizations. partitioner.library_mut().optimize();
// FIXME(pcwalton): Reenable!
/*let mut new_cover_interior_indices = Vec::with_capacity(cover_interior_indices.len());
for path_indices in path_indices.iter_mut().rev() {
let old_byte_start = path_indices.cover_interior_indices.start * mem::size_of::<u32>();
let old_byte_end = path_indices.cover_interior_indices.end * mem::size_of::<u32>();
let new_start_index = new_cover_interior_indices.len() / mem::size_of::<u32>();
new_cover_interior_indices.extend(
cover_interior_indices[old_byte_start..old_byte_end].into_iter());
let new_end_index = new_cover_interior_indices.len() / mem::size_of::<u32>();
path_indices.cover_interior_indices.start = new_start_index;
path_indices.cover_interior_indices.end = new_end_index;
}
cover_interior_indices = new_cover_interior_indices;*/
let time_elapsed = timestamp_before.elapsed(); let time_elapsed = timestamp_before.elapsed();

View File

@ -49,6 +49,36 @@ impl MeshLibrary {
self.edge_indices.clear(); self.edge_indices.clear();
} }
/// Reverses interior indices so that they draw front-to-back.
///
/// This enables early Z optimizations.
pub fn optimize(&mut self) {
let mut new_cover_interior_indices =
Vec::with_capacity(self.cover_indices.interior_indices.len());
let mut last_cover_interior_index_index = self.cover_indices.interior_indices.len();
while last_cover_interior_index_index != 0 {
let mut first_cover_interior_index_index = last_cover_interior_index_index - 1;
let path_id =
self.b_vertex_path_ids[self.cover_indices
.interior_indices[first_cover_interior_index_index] as
usize];
while first_cover_interior_index_index != 0 {
let prev_path_id = self.b_vertex_path_ids[
self.cover_indices.interior_indices[first_cover_interior_index_index - 1] as
usize];
if prev_path_id != path_id {
break
}
first_cover_interior_index_index -= 1
}
let range = first_cover_interior_index_index..last_cover_interior_index_index;
new_cover_interior_indices.extend_from_slice(&self.cover_indices
.interior_indices[range]);
last_cover_interior_index_index = first_cover_interior_index_index;
}
self.cover_indices.interior_indices = new_cover_interior_indices
}
/// Writes this mesh library to a RIFF file. /// Writes this mesh library to a RIFF file.
/// ///
/// RIFF is a dead-simple extensible binary format documented here: /// RIFF is a dead-simple extensible binary format documented here: