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 = [
|
||||
"block-padding",
|
||||
"byte-tools",
|
||||
"byteorder",
|
||||
"byteorder 1.4.3",
|
||||
"generic-array",
|
||||
]
|
||||
|
||||
|
|
@ -295,6 +295,12 @@ dependencies = [
|
|||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "byteorder"
|
||||
version = "0.5.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0fc10e8cc6b2580fda3f36eb6dc5316657f812a3df879a44a66fc9f0fdbc4855"
|
||||
|
||||
[[package]]
|
||||
name = "byteorder"
|
||||
version = "1.4.3"
|
||||
|
|
@ -608,7 +614,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "73770f8e1fe7d64df17ca66ad28994a0a623ea497fa69486e14984e715c5d174"
|
||||
dependencies = [
|
||||
"adler32",
|
||||
"byteorder",
|
||||
"byteorder 1.4.3",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -895,7 +901,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "8ff38b75359a0096dd0a8599b6e4f37a6ee41d5df300cc7669e62aafa697f7a2"
|
||||
dependencies = [
|
||||
"base64 0.12.3",
|
||||
"byteorder",
|
||||
"byteorder 1.4.3",
|
||||
"gltf-json",
|
||||
"image",
|
||||
"lazy_static",
|
||||
|
|
@ -1132,7 +1138,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "24ffcb7e7244a9bf19d35bf2883b9c080c4ced3c07a9895572178cdb8f13f6a1"
|
||||
dependencies = [
|
||||
"bytemuck",
|
||||
"byteorder",
|
||||
"byteorder 1.4.3",
|
||||
"color_quant",
|
||||
"gif",
|
||||
"jpeg-decoder",
|
||||
|
|
@ -1307,13 +1313,22 @@ dependencies = [
|
|||
"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]]
|
||||
name = "lzma-rs"
|
||||
version = "0.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "aba8ecb0450dfabce4ad72085eed0a75dffe8f21f7ada05638564ea9db2d7fb1"
|
||||
dependencies = [
|
||||
"byteorder",
|
||||
"byteorder 1.4.3",
|
||||
"crc",
|
||||
]
|
||||
|
||||
|
|
@ -2665,6 +2680,7 @@ dependencies = [
|
|||
"static_assertions",
|
||||
"thiserror",
|
||||
"vbsp-derive",
|
||||
"zip",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -3046,3 +3062,12 @@ name = "xml-rs"
|
|||
version = "0.8.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
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 steamlocate::SteamDir;
|
||||
use tracing::{debug, error};
|
||||
use vbsp::Packfile;
|
||||
use vpk::VPK;
|
||||
|
||||
pub struct Loader {
|
||||
pack: Packfile,
|
||||
tf_dir: PathBuf,
|
||||
vpks: Vec<VPK>,
|
||||
}
|
||||
|
|
@ -19,7 +21,7 @@ impl Debug for Loader {
|
|||
}
|
||||
|
||||
impl Loader {
|
||||
pub fn new() -> Result<Self, Error> {
|
||||
pub fn new(pack: Packfile) -> Result<Self, Error> {
|
||||
let tf_dir = SteamDir::locate()
|
||||
.ok_or("Can't find steam directory")?
|
||||
.app(&440)
|
||||
|
|
@ -35,16 +37,20 @@ impl Loader {
|
|||
.filter_map(|res| res.ok())
|
||||
.collect();
|
||||
|
||||
Ok(Loader { tf_dir, vpks })
|
||||
Ok(Loader { pack, tf_dir, vpks })
|
||||
}
|
||||
|
||||
#[tracing::instrument]
|
||||
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() {
|
||||
if let Some(entry) = vpk.tree.get(name) {
|
||||
let data = entry.get()?.into_owned();
|
||||
debug!("got {} bytes", data.len());
|
||||
debug!("got {} bytes from vpk", data.len());
|
||||
return Ok(data);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,7 +6,6 @@ use itertools::Either;
|
|||
use loader::Loader;
|
||||
use std::env::args;
|
||||
use std::path::Path;
|
||||
use std::time::Instant;
|
||||
use thiserror::Error;
|
||||
use three_d::*;
|
||||
use tracing_subscriber::{prelude::*, EnvFilter};
|
||||
|
|
@ -65,8 +64,6 @@ fn main() -> Result<(), Error> {
|
|||
}
|
||||
};
|
||||
|
||||
let loader = Loader::new()?;
|
||||
|
||||
let window = Window::new(WindowSettings {
|
||||
title: file.clone(),
|
||||
max_size: Some((1920, 1080)),
|
||||
|
|
@ -101,6 +98,7 @@ fn main() -> Result<(), Error> {
|
|||
..Default::default()
|
||||
};
|
||||
|
||||
let loader = Loader::new(bsp.pack.clone())?;
|
||||
let model = Model::new_with_material(&context, &cpu_mesh, material.clone())?;
|
||||
let props = bsp
|
||||
.static_props()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue