From bcfc5827a949172aedbd6c7cd1881a47db42c46d Mon Sep 17 00:00:00 2001 From: metamuffin Date: Mon, 17 Oct 2022 21:11:40 +0200 Subject: start with http --- src/dimension.rs | 8 ++++++-- src/main.rs | 37 ++++++++++++++++++++++++++----------- src/viewer/mod.rs | 28 ++++++++++++++++++++++++++++ 3 files changed, 60 insertions(+), 13 deletions(-) create mode 100644 src/viewer/mod.rs (limited to 'src') diff --git a/src/dimension.rs b/src/dimension.rs index 39a7fff..6c3bea8 100644 --- a/src/dimension.rs +++ b/src/dimension.rs @@ -1,6 +1,6 @@ use chashmap::{CHashMap, ReadGuard, WriteGuard}; use fastanvil::{Block, Chunk, CurrentJavaChunk, Region, RegionFileLoader, RegionLoader}; -use log::{info, debug}; +use log::{debug, info}; use std::{fs::File, path::Path}; pub struct Dimension { @@ -8,6 +8,7 @@ pub struct Dimension { regions: CHashMap<(isize, isize), Option>>, chunks: CHashMap<(isize, isize), Option>, } + impl Dimension { pub fn new(path: &str) -> Self { let loader = fastanvil::RegionFileLoader::new(Path::new(path).to_path_buf()); @@ -17,6 +18,7 @@ impl Dimension { chunks: Default::default(), } } + pub fn region( &self, rx: isize, @@ -34,6 +36,7 @@ impl Dimension { self.region(rx, rz) } } + pub fn chunk( &self, cx: isize, @@ -55,10 +58,11 @@ impl Dimension { self.chunk(cx, cz) } } + pub fn block(&self, x: isize, y: isize, z: isize) -> Option { self.chunk(x / 16, z / 16) .as_ref()? - .block(x.rem_euclid(16) as usize, y, z.rem_euclid(16) as usize) + .block((x % 16).abs() as usize, y, (z % 16).abs() as usize) .map(|e| e.to_owned()) } } diff --git a/src/main.rs b/src/main.rs index 9757748..ce1906e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,9 +1,28 @@ pub mod dimension; pub mod render; +pub mod viewer; -use crate::dimension::Dimension; -use log::info; -use render::Renderer; +use clap::{Parser, Subcommand}; +use std::{net::SocketAddr, path::PathBuf}; +use viewer::serve_http; + +#[derive(Parser)] +struct Args { + /// Dimension directory containing .mca files + #[clap(long, short, default_value = "./world/region")] + dimension: PathBuf, + + #[clap(subcommand)] + action: Action, +} +#[derive(Subcommand)] +enum Action { + /// Run a http server providing an interactive map viewer. + Serve { + #[arg(long, short, default_value = "127.0.0.1:8080")] + bind: SocketAddr, + }, +} fn main() { env_logger::builder() @@ -11,13 +30,9 @@ fn main() { .parse_env("LOG") .init(); - let dim = Dimension::new("/home/muffin/containers/games/home/user/server/world/region/"); - let renderer = Renderer::new(dim); - for sx in 0..2 { - for sy in 0..2 { - let view = renderer.render_segment(sx, sy); - info!("saving png"); - view.save(format!("/tmp/seg.{sx}.{sy}.png")).unwrap(); - } + let args = Args::parse(); + + match args.action { + Action::Serve { bind } => serve_http(bind), } } diff --git a/src/viewer/mod.rs b/src/viewer/mod.rs new file mode 100644 index 0000000..6ea540b --- /dev/null +++ b/src/viewer/mod.rs @@ -0,0 +1,28 @@ +use std::net::SocketAddr; + +use warp::Filter; + +pub fn serve_http(bind: SocketAddr) { + tokio::runtime::Builder::new_multi_thread() + .enable_all() + .build() + .unwrap() + .block_on(async move { + let tiles = warp::path!("tiles" / isize / isize / isize) + .map(|z, x, y| format!("blub {:?}", (x, y, z))); + + // let dim = + // Dimension::new("/home/muffin/containers/games/home/user/server/world/region/"); + // let renderer = Renderer::new(dim); + // for sx in 0..2 { + // for sy in 0..2 { + // let view = renderer.render_segment(sx, sy); + // info!("saving png"); + // view.save(format!("/tmp/seg.{sx}.{sy}.png")).unwrap(); + // } + // } + let router = tiles; + + warp::serve(router).run(bind).await; + }) +} -- cgit v1.2.3-70-g09d2