aboutsummaryrefslogtreecommitdiff
path: root/stockton-levels/src/q3/tree.rs
diff options
context:
space:
mode:
Diffstat (limited to 'stockton-levels/src/q3/tree.rs')
-rw-r--r--stockton-levels/src/q3/tree.rs151
1 files changed, 0 insertions, 151 deletions
diff --git a/stockton-levels/src/q3/tree.rs b/stockton-levels/src/q3/tree.rs
deleted file mode 100644
index 05f1531..0000000
--- a/stockton-levels/src/q3/tree.rs
+++ /dev/null
@@ -1,151 +0,0 @@
-//! Parses the BSP tree into a usable format
-
-use super::Q3BspFile;
-use crate::coords::CoordSystem;
-use crate::helpers::{slice_to_i32, slice_to_u32, slice_to_vec3i};
-use crate::traits::tree::*;
-use crate::types::{ParseError, Result};
-
-const NODE_SIZE: usize = 4 + (4 * 2) + (4 * 3) + (4 * 3);
-const LEAF_SIZE: usize = 4 * 6 + (4 * 3 * 2);
-
-pub fn from_data(
- nodes: &[u8],
- leaves: &[u8],
- leaf_faces: &[u8],
- leaf_brushes: &[u8],
- n_faces: u32,
- n_brushes: u32,
-) -> Result<BspNode> {
- if nodes.len() % NODE_SIZE != 0 || leaves.len() % LEAF_SIZE != 0 {
- return Err(ParseError::Invalid);
- }
-
- compile_node(
- 0,
- nodes,
- leaves,
- leaf_faces,
- leaf_brushes,
- n_faces,
- n_brushes,
- )
-}
-
-/// Internal function. Visits given node and all its children. Used to recursively build tree.
-fn compile_node(
- i: i32,
- nodes: &[u8],
- leaves: &[u8],
- leaf_faces: &[u8],
- leaf_brushes: &[u8],
- n_faces: u32,
- n_brushes: u32,
-) -> Result<BspNode> {
- if i < 0 {
- // Leaf.
- let i = i.abs() - 1;
-
- let raw = &leaves[i as usize * LEAF_SIZE..(i as usize * LEAF_SIZE) + LEAF_SIZE];
-
- let faces_idx = {
- let start = slice_to_u32(&raw[32..36]) as usize;
- let n = slice_to_u32(&raw[36..40]) as usize;
-
- let mut faces = Vec::with_capacity(n);
- if n > 0 {
- if start + n > leaf_faces.len() / 4 {
- return Err(ParseError::Invalid);
- }
-
- for i in start..start + n {
- let face_idx = slice_to_u32(&leaf_faces[i * 4..(i + 1) * 4]);
- if face_idx >= n_faces {
- return Err(ParseError::Invalid);
- }
-
- faces.push(face_idx);
- }
- }
-
- faces.into_boxed_slice()
- };
-
- let brushes_idx = {
- let start = slice_to_u32(&raw[40..44]) as usize;
- let n = slice_to_u32(&raw[44..48]) as usize;
- let mut brushes = Vec::with_capacity(n);
-
- if n > 0 {
- if start + n > leaf_brushes.len() / 4 {
- return Err(ParseError::Invalid);
- }
-
- for i in start..start + n {
- let brush_idx = slice_to_u32(&leaf_brushes[i * 4..(i + 1) * 4]);
- if brush_idx >= n_brushes {
- return Err(ParseError::Invalid);
- }
-
- brushes.push(brush_idx);
- }
- }
-
- brushes.into_boxed_slice()
- };
-
- let leaf = BspLeaf {
- cluster_id: slice_to_u32(&raw[0..4]),
- area: slice_to_i32(&raw[4..8]),
- // 8..20 = min
- // 20..32 = max
- faces_idx,
- brushes_idx,
- };
-
- Ok(BspNode {
- plane_idx: 0,
- min: slice_to_vec3i(&raw[8..20]),
- max: slice_to_vec3i(&raw[20..32]),
- value: BspNodeValue::Leaf(leaf),
- })
- } else {
- // Node.
- let raw = &nodes[i as usize * NODE_SIZE..(i as usize * NODE_SIZE) + NODE_SIZE];
-
- let plane_idx = slice_to_u32(&raw[0..4]);
- let child_one = compile_node(
- slice_to_i32(&raw[4..8]),
- nodes,
- leaves,
- leaf_faces,
- leaf_brushes,
- n_faces,
- n_brushes,
- )?;
- let child_two = compile_node(
- slice_to_i32(&raw[8..12]),
- nodes,
- leaves,
- leaf_faces,
- leaf_brushes,
- n_faces,
- n_brushes,
- )?;
- let min = slice_to_vec3i(&raw[12..24]);
- let max = slice_to_vec3i(&raw[24..36]);
-
- Ok(BspNode {
- plane_idx,
- value: BspNodeValue::Children(Box::new(child_one), Box::new(child_two)),
- min,
- max,
- })
- }
-}
-
-impl<T: CoordSystem> HasBspTree<T> for Q3BspFile<T> {
- fn get_bsp_root(&self) -> &BspNode {
- &self.tree_root
- }
-}