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