aboutsummaryrefslogtreecommitdiff
path: root/stockton-levels/src/q3/textures.rs
diff options
context:
space:
mode:
Diffstat (limited to 'stockton-levels/src/q3/textures.rs')
-rw-r--r--stockton-levels/src/q3/textures.rs137
1 files changed, 0 insertions, 137 deletions
diff --git a/stockton-levels/src/q3/textures.rs b/stockton-levels/src/q3/textures.rs
deleted file mode 100644
index 98c2fe4..0000000
--- a/stockton-levels/src/q3/textures.rs
+++ /dev/null
@@ -1,137 +0,0 @@
-use std::str;
-
-use super::Q3BspFile;
-use crate::coords::CoordSystem;
-use crate::helpers::slice_to_u32;
-use crate::traits::textures::*;
-use crate::types::{ParseError, Result};
-
-const TEXTURE_LUMP_SIZE: usize = 64 + 4 + 4;
-
-/// Try to parse the given buffer as an entities lump.
-/// # Format
-/// Each entity is:
-/// string[64] name Texture name.
-/// int flags Surface flags.
-/// int contents Content flags.
-/// Length of entities is total lump size / TEXTURE_LUMP_SIZE (64 + 4 + 4)
-pub fn from_data(lump: &[u8]) -> Result<Box<[Texture]>> {
- if lump.is_empty() || lump.len() % TEXTURE_LUMP_SIZE != 0 {
- return Err(ParseError::Invalid);
- }
- let length = lump.len() / TEXTURE_LUMP_SIZE;
-
- let mut textures = Vec::with_capacity(length);
- for n in 0..length {
- let offset = n * TEXTURE_LUMP_SIZE;
- textures.push(Texture {
- name: str::from_utf8(&lump[offset..offset + 64])
- .map_err(|_| ParseError::Invalid)?
- .trim_matches('\0')
- .to_owned(),
- surface: SurfaceFlags::from_bits_truncate(slice_to_u32(
- &lump[offset + 64..offset + 68],
- )),
- contents: ContentsFlags::from_bits_truncate(slice_to_u32(
- &lump[offset + 68..offset + 72],
- )),
- });
- }
-
- Ok(textures.into_boxed_slice())
-}
-
-impl<T: CoordSystem> HasTextures for Q3BspFile<T> {
- type TexturesIter<'a> = std::slice::Iter<'a, Texture>;
-
- fn textures_iter(&self) -> Self::TexturesIter<'_> {
- self.textures.iter()
- }
-
- fn get_texture(&self, idx: u32) -> Option<&Texture> {
- if idx >= self.textures.len() as u32 {
- None
- } else {
- Some(&self.textures[idx as usize])
- }
- }
-}
-
-#[test]
-fn textures_single_texture() {
- let buf: &[u8] = &[
- b'T', b'E', b'S', b'T', b' ', b'T', b'E', b'X', b'T', b'U', b'R', b'E', 0x00, 0x00, 0x00,
- 0x00, // name (padded to 64 bytes)
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x43, 0x00, 0x04, 0x00, // surface flags
- 0x09, 0x00, 0x00, 0x00, // contents flags
- ];
-
- let lump = from_data(buf).unwrap();
-
- assert_eq!(lump.len(), 1);
-
- assert_eq!(lump[0].name, "TEST TEXTURE");
- assert_eq!(
- lump[0].surface,
- SurfaceFlags::NO_DAMAGE | SurfaceFlags::SLICK | SurfaceFlags::FLESH | SurfaceFlags::DUST
- );
- assert_eq!(lump[0].contents, ContentsFlags::SOLID | ContentsFlags::LAVA);
-}
-
-#[test]
-fn textures_multiple_textures() {
- let buf: &[u8] = &[
- b'T', b'E', b'S', b'T', b' ', b'T', b'E', b'X', b'T', b'U', b'R', b'E', b'1', 0x00, 0x00,
- 0x00, // name (padded to 64 bytes)
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x43, 0x00, 0x04, 0x00, // surface flags
- 0x09, 0x00, 0x00, 0x00, // contents flags
- b'T', b'E', b'S', b'T', b' ', b'T', b'E', b'X', b'T', b'U', b'R', b'E', b'2', 0x00, 0x00,
- 0x00, // name (padded to 64 bytes)
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x2c, 0x10, 0x00, 0x00, // surface flags
- 0x01, 0x00, 0x00, 0x00, // contents flags
- b'T', b'E', b'S', b'T', b' ', b'T', b'E', b'X', b'T', b'U', b'R', b'E', b'3', 0x00, 0x00,
- 0x00, // name (padded to 64 bytes)
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, // surface flags
- 0x41, 0x00, 0x00, 0x00, // contents flags
- ];
-
- let lump = from_data(buf).unwrap();
-
- assert_eq!(lump.len(), 3);
-
- assert_eq!(lump[0].name, "TEST TEXTURE1");
- assert_eq!(lump[1].name, "TEST TEXTURE2");
- assert_eq!(lump[2].name, "TEST TEXTURE3");
-
- assert_eq!(
- lump[0].surface,
- SurfaceFlags::NO_DAMAGE | SurfaceFlags::SLICK | SurfaceFlags::FLESH | SurfaceFlags::DUST
- );
- assert_eq!(
- lump[1].surface,
- SurfaceFlags::METAL_STEPS
- | SurfaceFlags::NO_MARKS
- | SurfaceFlags::LADDER
- | SurfaceFlags::SKY
- );
- assert_eq!(
- lump[2].surface,
- SurfaceFlags::POINT_LIGHT | SurfaceFlags::SKIP
- );
-
- assert_eq!(lump[0].contents, ContentsFlags::SOLID | ContentsFlags::LAVA);
- assert_eq!(lump[1].contents, ContentsFlags::SOLID);
- assert_eq!(lump[2].contents, ContentsFlags::SOLID | ContentsFlags::FOG);
-}