mmap the bsp

This commit is contained in:
Robin Appelman 2022-03-19 21:30:12 +01:00
commit cb2310fd67
3 changed files with 24 additions and 6 deletions

10
Cargo.lock generated
View file

@ -1481,6 +1481,15 @@ dependencies = [
"winapi",
]
[[package]]
name = "mmarinus"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6f001c2c323e765b22d8248a0b8a7f8f66672a007babf01c380b579cc71e862c"
dependencies = [
"libc",
]
[[package]]
name = "native-tls"
version = "0.2.8"
@ -2676,6 +2685,7 @@ dependencies = [
"delaunator",
"itertools",
"miette",
"mmarinus",
"steamlocate",
"thiserror",
"three-d",

View file

@ -19,6 +19,7 @@ tracing = "0.1.29"
tracing-subscriber = { version = "0.3.3", features = ["env-filter"] }
tracing-tree = "0.2.0"
cgmath = "0.18.0"
mmarinus = "0.2.1"
[profile.dev.package."*"]
opt-level = 2

View file

@ -5,7 +5,8 @@ use camera::FirstPerson;
use itertools::Either;
use loader::Loader;
use std::env::args;
use std::fs;
use std::path::Path;
use std::time::Instant;
use thiserror::Error;
use three_d::*;
use tracing_subscriber::{prelude::*, EnvFilter};
@ -72,13 +73,9 @@ fn main() -> Result<(), Error> {
..Default::default()
})?;
let data = fs::read(&file)?;
let bsp = Bsp::read(&data)?;
let world_model = bsp.models().next().ok_or(Error::Other("No world model"))?;
let context = window.gl().unwrap();
let cpu_mesh = model_to_mesh(world_model);
let (cpu_mesh, bsp) = load_world(file.as_ref())?;
let forward_pipeline = ForwardPipeline::new(&context).unwrap();
let mut camera = Camera::new_perspective(
&context,
@ -360,6 +357,16 @@ fn prop_to_mesh(model: &vmdl::Model) -> CPUMesh {
mesh
}
fn load_world(path: &Path) -> Result<(CPUMesh, Bsp), Error> {
use mmarinus::{perms, Kind};
let map = Kind::Private.load::<perms::Read, _>(path).unwrap();
let bsp = Bsp::read(map.as_ref())?;
let world_model = bsp.models().next().ok_or(Error::Other("No world model"))?;
Ok((model_to_mesh(world_model), bsp))
}
fn merge_meshes<I: IntoIterator<Item = CPUMesh>>(meshes: I) -> CPUMesh {
let mut positions = Vec::new();
let mut normals = Vec::new();