load model from packfile

This commit is contained in:
Robin Appelman 2022-03-20 14:33:17 +01:00
commit 04bfb51bf4
3 changed files with 41 additions and 12 deletions

35
Cargo.lock generated
View file

@ -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",
]

View file

@ -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);
}
}

View file

@ -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()