mirror of
https://codeberg.org/icewind/vbsp.git
synced 2026-06-03 18:54:05 +02:00
lump decompression fixes
This commit is contained in:
parent
08a1c53535
commit
cc93a2889e
2 changed files with 21 additions and 7 deletions
|
|
@ -1,6 +1,7 @@
|
||||||
use crate::*;
|
use crate::*;
|
||||||
use binread::io::Cursor;
|
use binread::io::Cursor;
|
||||||
use binread::BinReaderExt;
|
use binread::BinReaderExt;
|
||||||
|
use lzma_rs::decompress::{Options, UnpackedSize};
|
||||||
use std::borrow::Cow;
|
use std::borrow::Cow;
|
||||||
|
|
||||||
pub struct BspFile<'a> {
|
pub struct BspFile<'a> {
|
||||||
|
|
@ -30,9 +31,6 @@ impl<'a> BspFile<'a> {
|
||||||
|
|
||||||
let directories = cursor.read_le()?;
|
let directories = cursor.read_le()?;
|
||||||
|
|
||||||
let map_version: u32 = cursor.read_le()?;
|
|
||||||
dbg!(map_version);
|
|
||||||
|
|
||||||
Ok(BspFile {
|
Ok(BspFile {
|
||||||
data,
|
data,
|
||||||
directories,
|
directories,
|
||||||
|
|
@ -55,6 +53,7 @@ impl<'a> BspFile<'a> {
|
||||||
|
|
||||||
fn get_lump(&self, lump: LumpType) -> BspResult<Cow<[u8]>> {
|
fn get_lump(&self, lump: LumpType) -> BspResult<Cow<[u8]>> {
|
||||||
let lump = &self.directories[lump];
|
let lump = &self.directories[lump];
|
||||||
|
dbg!(lump);
|
||||||
let raw_data = self
|
let raw_data = self
|
||||||
.data
|
.data
|
||||||
.get(lump.offset as usize..lump.offset as usize + lump.length as usize)
|
.get(lump.offset as usize..lump.offset as usize + lump.length as usize)
|
||||||
|
|
@ -65,8 +64,21 @@ impl<'a> BspFile<'a> {
|
||||||
_ => {
|
_ => {
|
||||||
let mut data: Vec<u8> = Vec::with_capacity(lump.ident as usize);
|
let mut data: Vec<u8> = Vec::with_capacity(lump.ident as usize);
|
||||||
let mut cursor = Cursor::new(raw_data);
|
let mut cursor = Cursor::new(raw_data);
|
||||||
lzma_rs::lzma_decompress(&mut cursor, &mut data)
|
if b"LZMA" != &<[u8; 4]>::read(&mut cursor)? {
|
||||||
.map_err(BspError::LumpDecompressError)?;
|
return Err(BspError::LumpDecompressError(
|
||||||
|
lzma_rs::error::Error::LZMAError("Invalid lzma header".into()),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
let actual_size: u32 = cursor.read_le()?;
|
||||||
|
let _lzma_size: u32 = cursor.read_le()?;
|
||||||
|
lzma_rs::lzma_decompress_with_options(
|
||||||
|
&mut cursor,
|
||||||
|
&mut data,
|
||||||
|
&Options {
|
||||||
|
unpacked_size: UnpackedSize::UseProvided(Some(actual_size as u64)),
|
||||||
|
},
|
||||||
|
)
|
||||||
|
.map_err(BspError::LumpDecompressError)?;
|
||||||
if data.len() != lump.ident as usize {
|
if data.len() != lump.ident as usize {
|
||||||
return Err(BspError::UnexpectedUncompressedLumpSize {
|
return Err(BspError::UnexpectedUncompressedLumpSize {
|
||||||
got: data.len() as u32,
|
got: data.len() as u32,
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,6 @@
|
||||||
|
#![allow(dead_code)]
|
||||||
|
#![allow(unreachable_code)]
|
||||||
|
|
||||||
mod bspfile;
|
mod bspfile;
|
||||||
mod reader;
|
mod reader;
|
||||||
|
|
||||||
|
|
@ -93,7 +96,7 @@ impl TryFrom<u32> for FaceType {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
struct Directories {
|
pub struct Directories {
|
||||||
entries: [LumpEntry; 64],
|
entries: [LumpEntry; 64],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -661,7 +664,6 @@ pub struct Bsp {
|
||||||
impl Bsp {
|
impl Bsp {
|
||||||
pub fn read(data: &[u8]) -> BspResult<Self> {
|
pub fn read(data: &[u8]) -> BspResult<Self> {
|
||||||
let bsp_file = BspFile::new(data)?;
|
let bsp_file = BspFile::new(data)?;
|
||||||
let dir_entries = bsp_file.directories();
|
|
||||||
|
|
||||||
let entities = bsp_file.lump_reader(LumpType::Entities)?.read_entities()?;
|
let entities = bsp_file.lump_reader(LumpType::Entities)?.read_entities()?;
|
||||||
let textures = bsp_file
|
let textures = bsp_file
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue