aboutsummaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs87
1 files changed, 87 insertions, 0 deletions
diff --git a/src/main.rs b/src/main.rs
new file mode 100644
index 0000000..92d07b7
--- /dev/null
+++ b/src/main.rs
@@ -0,0 +1,87 @@
+pub mod render;
+
+use crate::render::{
+ composite::{
+ image_buffer_blit, isometric_coord_mapping, CHUNK_HEIGHT, CHUNK_SIZE, REGION_SIZE,
+ },
+ models::processed_block_texture,
+ processing::Texture,
+};
+use fastanvil::{tex::Render, Block, Chunk, CurrentJavaChunk, RegionLoader};
+use image::{ImageBuffer, Rgba};
+use log::debug;
+use std::{collections::HashMap, path::Path};
+
+fn main() {
+ env_logger::builder()
+ .filter_level(log::LevelFilter::Debug)
+ .parse_env("LOG")
+ .build();
+
+ let loader = fastanvil::RegionFileLoader::new(
+ Path::new("/home/muffin/containers/games/home/user/server/world/region/").to_path_buf(),
+ );
+
+ let mut region = loader
+ .region(fastanvil::RCoord(0), fastanvil::RCoord(0))
+ .unwrap();
+
+ let chunk = region.read_chunk(0, 0).unwrap().unwrap();
+
+ let chunk: CurrentJavaChunk = fastnbt::from_bytes(&chunk).unwrap();
+
+ let mut visible_blocks = Vec::new();
+
+ for x in 0..16 {
+ for y in -64..256 {
+ for z in 0..16 {
+ let solid = |x: isize, y: isize, z: isize| {
+ if x >= 0 && z >= 0 && x < 16 && z < 16 && y >= -64 && y < 256 {
+ chunk
+ .block(x as usize, y, z as usize)
+ .map(|b| b.name() != "minecraft:air")
+ .unwrap_or(false)
+ } else {
+ false
+ }
+ };
+ let visible = solid(x, y, z)
+ && !(solid(x + 1, y, z)
+ && solid(x - 1, y, z)
+ && solid(x, y + 1, z)
+ && solid(x, y - 1, z)
+ && solid(x, y, z + 1)
+ && solid(x, y, z - 1));
+
+ if visible {
+ visible_blocks.push((x, y, z))
+ }
+ }
+ }
+ }
+
+ debug!("{} potentially visible blocks", visible_blocks.len());
+ debug!("sorting by z-order");
+ visible_blocks.sort_by_cached_key(|(x, y, z)| x + y + z);
+ debug!("done");
+
+ let mut view: Texture = ImageBuffer::new(
+ 16 * CHUNK_SIZE as u32,
+ 16 * (CHUNK_SIZE as u32 + CHUNK_HEIGHT as u32) / 2,
+ );
+
+ let mut textures = HashMap::<String, Texture>::new();
+
+ for (x, y, z) in visible_blocks {
+ let coords = isometric_coord_mapping(x as i32, y as i32, z as i32);
+ let name = &chunk.block(x as usize, y, z as usize).unwrap().name()["minecraft:".len()..];
+ let texture = textures
+ .entry(name.to_owned())
+ .or_insert_with(|| processed_block_texture(name));
+
+ println!("{coords:?}");
+ image_buffer_blit(&mut view, texture, coords);
+ }
+
+ view.save(format!("/tmp/a.png")).unwrap();
+}