diff --git a/demo/server/src/main.rs b/demo/server/src/main.rs index d54d87ff..f67255cd 100644 --- a/demo/server/src/main.rs +++ b/demo/server/src/main.rs @@ -242,20 +242,7 @@ impl PathPartitioningResult { path_indices.push(PartitionPathIndices::new(index_ranges)); } - // Reverse interior indices for early Z optimizations. - // 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::(); - let old_byte_end = path_indices.cover_interior_indices.end * mem::size_of::(); - let new_start_index = new_cover_interior_indices.len() / mem::size_of::(); - 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::(); - 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;*/ + partitioner.library_mut().optimize(); let time_elapsed = timestamp_before.elapsed(); diff --git a/partitioner/src/mesh_library.rs b/partitioner/src/mesh_library.rs index 0b095cfd..fa4c0c90 100644 --- a/partitioner/src/mesh_library.rs +++ b/partitioner/src/mesh_library.rs @@ -49,6 +49,36 @@ impl MeshLibrary { 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. /// /// RIFF is a dead-simple extensible binary format documented here: