mirror of
https://codeberg.org/icewind/vbspview.git
synced 2026-06-03 18:24:09 +02:00
load model from packfile
This commit is contained in:
parent
cb2310fd67
commit
04bfb51bf4
3 changed files with 41 additions and 12 deletions
35
Cargo.lock
generated
35
Cargo.lock
generated
|
|
@ -235,7 +235,7 @@ checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"block-padding",
|
"block-padding",
|
||||||
"byte-tools",
|
"byte-tools",
|
||||||
"byteorder",
|
"byteorder 1.4.3",
|
||||||
"generic-array",
|
"generic-array",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
@ -295,6 +295,12 @@ dependencies = [
|
||||||
"syn",
|
"syn",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "byteorder"
|
||||||
|
version = "0.5.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "0fc10e8cc6b2580fda3f36eb6dc5316657f812a3df879a44a66fc9f0fdbc4855"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "byteorder"
|
name = "byteorder"
|
||||||
version = "1.4.3"
|
version = "1.4.3"
|
||||||
|
|
@ -608,7 +614,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "73770f8e1fe7d64df17ca66ad28994a0a623ea497fa69486e14984e715c5d174"
|
checksum = "73770f8e1fe7d64df17ca66ad28994a0a623ea497fa69486e14984e715c5d174"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"adler32",
|
"adler32",
|
||||||
"byteorder",
|
"byteorder 1.4.3",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|
@ -895,7 +901,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "8ff38b75359a0096dd0a8599b6e4f37a6ee41d5df300cc7669e62aafa697f7a2"
|
checksum = "8ff38b75359a0096dd0a8599b6e4f37a6ee41d5df300cc7669e62aafa697f7a2"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"base64 0.12.3",
|
"base64 0.12.3",
|
||||||
"byteorder",
|
"byteorder 1.4.3",
|
||||||
"gltf-json",
|
"gltf-json",
|
||||||
"image",
|
"image",
|
||||||
"lazy_static",
|
"lazy_static",
|
||||||
|
|
@ -1132,7 +1138,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "24ffcb7e7244a9bf19d35bf2883b9c080c4ced3c07a9895572178cdb8f13f6a1"
|
checksum = "24ffcb7e7244a9bf19d35bf2883b9c080c4ced3c07a9895572178cdb8f13f6a1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bytemuck",
|
"bytemuck",
|
||||||
"byteorder",
|
"byteorder 1.4.3",
|
||||||
"color_quant",
|
"color_quant",
|
||||||
"gif",
|
"gif",
|
||||||
"jpeg-decoder",
|
"jpeg-decoder",
|
||||||
|
|
@ -1307,13 +1313,22 @@ dependencies = [
|
||||||
"cfg-if 1.0.0",
|
"cfg-if 1.0.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "lzma"
|
||||||
|
version = "0.2.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "782ba3f542e8bc1349386c15e9dc3119ae6da96479f96b3863cc7a88bbdfd4e4"
|
||||||
|
dependencies = [
|
||||||
|
"byteorder 0.5.3",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lzma-rs"
|
name = "lzma-rs"
|
||||||
version = "0.2.0"
|
version = "0.2.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "aba8ecb0450dfabce4ad72085eed0a75dffe8f21f7ada05638564ea9db2d7fb1"
|
checksum = "aba8ecb0450dfabce4ad72085eed0a75dffe8f21f7ada05638564ea9db2d7fb1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"byteorder",
|
"byteorder 1.4.3",
|
||||||
"crc",
|
"crc",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
@ -2665,6 +2680,7 @@ dependencies = [
|
||||||
"static_assertions",
|
"static_assertions",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
"vbsp-derive",
|
"vbsp-derive",
|
||||||
|
"zip",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|
@ -3046,3 +3062,12 @@ name = "xml-rs"
|
||||||
version = "0.8.4"
|
version = "0.8.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3"
|
checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "zip"
|
||||||
|
version = "0.5.13"
|
||||||
|
dependencies = [
|
||||||
|
"byteorder 1.4.3",
|
||||||
|
"crc32fast",
|
||||||
|
"lzma",
|
||||||
|
]
|
||||||
|
|
|
||||||
|
|
@ -3,9 +3,11 @@ use std::fmt::{Debug, Formatter};
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use steamlocate::SteamDir;
|
use steamlocate::SteamDir;
|
||||||
use tracing::{debug, error};
|
use tracing::{debug, error};
|
||||||
|
use vbsp::Packfile;
|
||||||
use vpk::VPK;
|
use vpk::VPK;
|
||||||
|
|
||||||
pub struct Loader {
|
pub struct Loader {
|
||||||
|
pack: Packfile,
|
||||||
tf_dir: PathBuf,
|
tf_dir: PathBuf,
|
||||||
vpks: Vec<VPK>,
|
vpks: Vec<VPK>,
|
||||||
}
|
}
|
||||||
|
|
@ -19,7 +21,7 @@ impl Debug for Loader {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Loader {
|
impl Loader {
|
||||||
pub fn new() -> Result<Self, Error> {
|
pub fn new(pack: Packfile) -> Result<Self, Error> {
|
||||||
let tf_dir = SteamDir::locate()
|
let tf_dir = SteamDir::locate()
|
||||||
.ok_or("Can't find steam directory")?
|
.ok_or("Can't find steam directory")?
|
||||||
.app(&440)
|
.app(&440)
|
||||||
|
|
@ -35,16 +37,20 @@ impl Loader {
|
||||||
.filter_map(|res| res.ok())
|
.filter_map(|res| res.ok())
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
Ok(Loader { tf_dir, vpks })
|
Ok(Loader { pack, tf_dir, vpks })
|
||||||
}
|
}
|
||||||
|
|
||||||
#[tracing::instrument]
|
#[tracing::instrument]
|
||||||
pub fn load(&self, name: &str) -> Result<Vec<u8>, Error> {
|
pub fn load(&self, name: &str) -> Result<Vec<u8>, Error> {
|
||||||
debug!("loading file from vpk");
|
debug!("loading file");
|
||||||
|
if let Some(data) = self.pack.get(name)? {
|
||||||
|
debug!("got {} bytes from packfile", data.len());
|
||||||
|
return Ok(data);
|
||||||
|
}
|
||||||
for vpk in self.vpks.iter() {
|
for vpk in self.vpks.iter() {
|
||||||
if let Some(entry) = vpk.tree.get(name) {
|
if let Some(entry) = vpk.tree.get(name) {
|
||||||
let data = entry.get()?.into_owned();
|
let data = entry.get()?.into_owned();
|
||||||
debug!("got {} bytes", data.len());
|
debug!("got {} bytes from vpk", data.len());
|
||||||
return Ok(data);
|
return Ok(data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,6 @@ use itertools::Either;
|
||||||
use loader::Loader;
|
use loader::Loader;
|
||||||
use std::env::args;
|
use std::env::args;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use std::time::Instant;
|
|
||||||
use thiserror::Error;
|
use thiserror::Error;
|
||||||
use three_d::*;
|
use three_d::*;
|
||||||
use tracing_subscriber::{prelude::*, EnvFilter};
|
use tracing_subscriber::{prelude::*, EnvFilter};
|
||||||
|
|
@ -65,8 +64,6 @@ fn main() -> Result<(), Error> {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let loader = Loader::new()?;
|
|
||||||
|
|
||||||
let window = Window::new(WindowSettings {
|
let window = Window::new(WindowSettings {
|
||||||
title: file.clone(),
|
title: file.clone(),
|
||||||
max_size: Some((1920, 1080)),
|
max_size: Some((1920, 1080)),
|
||||||
|
|
@ -101,6 +98,7 @@ fn main() -> Result<(), Error> {
|
||||||
..Default::default()
|
..Default::default()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let loader = Loader::new(bsp.pack.clone())?;
|
||||||
let model = Model::new_with_material(&context, &cpu_mesh, material.clone())?;
|
let model = Model::new_with_material(&context, &cpu_mesh, material.clone())?;
|
||||||
let props = bsp
|
let props = bsp
|
||||||
.static_props()
|
.static_props()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue