mirror of
https://github.com/neocturne/MinedMap.git
synced 2025-03-04 17:23:33 +01:00
minedmap: write info.json file with tilemap metadata
With this change, the new minedmap implementation can generate all necessary data for the frontend to work.
This commit is contained in:
parent
429b7888f6
commit
757f6ff166
5 changed files with 143 additions and 2 deletions
24
Cargo.lock
generated
24
Cargo.lock
generated
|
@ -325,6 +325,12 @@ dependencies = [
|
||||||
"either",
|
"either",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "itoa"
|
||||||
|
version = "1.0.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "jobserver"
|
name = "jobserver"
|
||||||
version = "0.1.26"
|
version = "0.1.26"
|
||||||
|
@ -372,6 +378,7 @@ dependencies = [
|
||||||
"itertools",
|
"itertools",
|
||||||
"num-integer",
|
"num-integer",
|
||||||
"serde",
|
"serde",
|
||||||
|
"serde_json",
|
||||||
"zstd",
|
"zstd",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -471,6 +478,12 @@ dependencies = [
|
||||||
"windows-sys",
|
"windows-sys",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ryu"
|
||||||
|
version = "1.0.13"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde"
|
name = "serde"
|
||||||
version = "1.0.164"
|
version = "1.0.164"
|
||||||
|
@ -500,6 +513,17 @@ dependencies = [
|
||||||
"syn",
|
"syn",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde_json"
|
||||||
|
version = "1.0.99"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "46266871c240a00b8f503b877622fe33430b3c7d963bdc0f2adc511e54a1eae3"
|
||||||
|
dependencies = [
|
||||||
|
"itoa",
|
||||||
|
"ryu",
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "simd-adler32"
|
name = "simd-adler32"
|
||||||
version = "0.3.5"
|
version = "0.3.5"
|
||||||
|
|
|
@ -20,6 +20,7 @@ image = { version = "0.24.5", default-features = false, features = ["png"] }
|
||||||
itertools = "0.11.0"
|
itertools = "0.11.0"
|
||||||
num-integer = "0.1.45"
|
num-integer = "0.1.45"
|
||||||
serde = "1.0.152"
|
serde = "1.0.152"
|
||||||
|
serde_json = "1.0.99"
|
||||||
zstd = "0.12.3"
|
zstd = "0.12.3"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
|
|
|
@ -20,7 +20,8 @@ impl Debug for TileCoords {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Default)]
|
#[derive(Debug, Clone, Default, Serialize)]
|
||||||
|
#[serde(transparent)]
|
||||||
pub struct TileCoordMap(pub BTreeMap<i32, BTreeSet<i32>>);
|
pub struct TileCoordMap(pub BTreeMap<i32, BTreeSet<i32>>);
|
||||||
|
|
||||||
impl TileCoordMap {
|
impl TileCoordMap {
|
||||||
|
@ -45,6 +46,8 @@ pub struct Config {
|
||||||
pub region_dir: PathBuf,
|
pub region_dir: PathBuf,
|
||||||
pub processed_dir: PathBuf,
|
pub processed_dir: PathBuf,
|
||||||
pub output_dir: PathBuf,
|
pub output_dir: PathBuf,
|
||||||
|
pub level_dat_path: PathBuf,
|
||||||
|
pub metadata_path: PathBuf,
|
||||||
}
|
}
|
||||||
|
|
||||||
fn coord_filename(coords: TileCoords, ext: &str) -> String {
|
fn coord_filename(coords: TileCoords, ext: &str) -> String {
|
||||||
|
@ -61,11 +64,15 @@ impl Config {
|
||||||
pub fn new(args: super::Args) -> Self {
|
pub fn new(args: super::Args) -> Self {
|
||||||
let region_dir = [&args.input_dir, Path::new("region")].iter().collect();
|
let region_dir = [&args.input_dir, Path::new("region")].iter().collect();
|
||||||
let processed_dir = [&args.output_dir, Path::new("processed")].iter().collect();
|
let processed_dir = [&args.output_dir, Path::new("processed")].iter().collect();
|
||||||
|
let level_dat_path = [&args.input_dir, Path::new("level.dat")].iter().collect();
|
||||||
|
let metadata_path = [&args.output_dir, Path::new("info.json")].iter().collect();
|
||||||
|
|
||||||
Config {
|
Config {
|
||||||
region_dir,
|
region_dir,
|
||||||
processed_dir,
|
processed_dir,
|
||||||
output_dir: args.output_dir,
|
output_dir: args.output_dir,
|
||||||
|
level_dat_path,
|
||||||
|
metadata_path,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
mod common;
|
mod common;
|
||||||
|
mod metadata_writer;
|
||||||
mod region_processor;
|
mod region_processor;
|
||||||
mod tile_mipmapper;
|
mod tile_mipmapper;
|
||||||
mod tile_renderer;
|
mod tile_renderer;
|
||||||
|
@ -9,6 +10,7 @@ use anyhow::Result;
|
||||||
use clap::Parser;
|
use clap::Parser;
|
||||||
|
|
||||||
use common::Config;
|
use common::Config;
|
||||||
|
use metadata_writer::MetadataWriter;
|
||||||
use region_processor::RegionProcessor;
|
use region_processor::RegionProcessor;
|
||||||
use tile_mipmapper::TileMipmapper;
|
use tile_mipmapper::TileMipmapper;
|
||||||
use tile_renderer::TileRenderer;
|
use tile_renderer::TileRenderer;
|
||||||
|
@ -27,7 +29,8 @@ fn main() -> Result<()> {
|
||||||
|
|
||||||
let regions = RegionProcessor::new(&config).run()?;
|
let regions = RegionProcessor::new(&config).run()?;
|
||||||
TileRenderer::new(&config).run(®ions)?;
|
TileRenderer::new(&config).run(®ions)?;
|
||||||
TileMipmapper::new(&config).run(®ions)?;
|
let tiles = TileMipmapper::new(&config).run(®ions)?;
|
||||||
|
MetadataWriter::new(&config).run(tiles)?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
106
src/bin/minedmap/metadata_writer.rs
Normal file
106
src/bin/minedmap/metadata_writer.rs
Normal file
|
@ -0,0 +1,106 @@
|
||||||
|
use anyhow::{Context, Result};
|
||||||
|
use minedmap::{io::fs, world::de};
|
||||||
|
use serde::Serialize;
|
||||||
|
|
||||||
|
use super::common::*;
|
||||||
|
|
||||||
|
pub struct MetadataWriter<'a> {
|
||||||
|
config: &'a Config,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize)]
|
||||||
|
#[serde(rename_all = "camelCase")]
|
||||||
|
struct Bounds {
|
||||||
|
min_x: i32,
|
||||||
|
max_x: i32,
|
||||||
|
min_z: i32,
|
||||||
|
max_z: i32,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize)]
|
||||||
|
struct Mipmap<'t> {
|
||||||
|
bounds: Bounds,
|
||||||
|
regions: &'t TileCoordMap,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize)]
|
||||||
|
struct Spawn {
|
||||||
|
x: i32,
|
||||||
|
z: i32,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize)]
|
||||||
|
struct Metadata<'t> {
|
||||||
|
mipmaps: Vec<Mipmap<'t>>,
|
||||||
|
spawn: Spawn,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> MetadataWriter<'a> {
|
||||||
|
pub fn new(config: &'a Config) -> Self {
|
||||||
|
MetadataWriter { config }
|
||||||
|
}
|
||||||
|
|
||||||
|
fn mipmap_entry(regions: &TileCoordMap) -> Mipmap {
|
||||||
|
let mut min_x = i32::MAX;
|
||||||
|
let mut max_x = i32::MIN;
|
||||||
|
let mut min_z = i32::MAX;
|
||||||
|
let mut max_z = i32::MIN;
|
||||||
|
|
||||||
|
for (&z, xs) in ®ions.0 {
|
||||||
|
if z < min_z {
|
||||||
|
min_z = z;
|
||||||
|
}
|
||||||
|
if z > max_z {
|
||||||
|
max_z = z;
|
||||||
|
}
|
||||||
|
|
||||||
|
for &x in xs {
|
||||||
|
if x < min_x {
|
||||||
|
min_x = x;
|
||||||
|
}
|
||||||
|
if x > max_x {
|
||||||
|
max_x = x;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Mipmap {
|
||||||
|
bounds: Bounds {
|
||||||
|
min_x,
|
||||||
|
max_x,
|
||||||
|
min_z,
|
||||||
|
max_z,
|
||||||
|
},
|
||||||
|
regions,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn read_level_dat(&self) -> Result<de::LevelDat> {
|
||||||
|
minedmap::io::data::from_file(&self.config.level_dat_path)
|
||||||
|
.context("Failed to read level.dat")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn spawn(level_dat: &de::LevelDat) -> Spawn {
|
||||||
|
Spawn {
|
||||||
|
x: level_dat.data.spawn_x,
|
||||||
|
z: level_dat.data.spawn_z,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn run(&self, tiles: Vec<TileCoordMap>) -> Result<()> {
|
||||||
|
let level_dat = self.read_level_dat()?;
|
||||||
|
|
||||||
|
let mut metadata = Metadata {
|
||||||
|
mipmaps: Vec::new(),
|
||||||
|
spawn: Self::spawn(&level_dat),
|
||||||
|
};
|
||||||
|
|
||||||
|
for tile_map in tiles.iter() {
|
||||||
|
metadata.mipmaps.push(Self::mipmap_entry(tile_map));
|
||||||
|
}
|
||||||
|
|
||||||
|
fs::create_with_tmpfile(&self.config.metadata_path, |file| {
|
||||||
|
serde_json::to_writer(file, &metadata).context("Failed to write metadata")
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue