diff options
Diffstat (limited to 'world')
-rw-r--r-- | world/src/main.rs | 38 | ||||
-rw-r--r-- | world/src/mesh.rs | 5 |
2 files changed, 37 insertions, 6 deletions
diff --git a/world/src/main.rs b/world/src/main.rs index 546b73b..1b59cc6 100644 --- a/world/src/main.rs +++ b/world/src/main.rs @@ -20,12 +20,13 @@ pub mod mesh; use anyhow::{Result, bail}; use clap::Parser; use gltf::image::Source; +use image::{ImageReader, codecs::webp::WebPEncoder}; use log::info; use mesh::import_mesh; use rand::random; use std::{ fs::File, - io::{Read, Write}, + io::{Cursor, Read, Write}, net::{SocketAddr, TcpStream}, path::{Path, PathBuf}, thread::{self, sleep}, @@ -33,7 +34,8 @@ use std::{ }; use weareshared::{ Vec3A, - packets::{Data, Object, Packet, ReadWrite, Resource}, + helper::ReadWrite, + packets::{Data, Object, Packet, Resource}, resources::{Image, LightPart, Prefab}, store::ResourceStore, vec3a, @@ -50,6 +52,8 @@ struct Args { #[arg(short, long)] clear: bool, #[arg(short, long)] + webp: bool, + #[arg(short, long)] name: Option<String>, } @@ -68,7 +72,15 @@ fn main() -> Result<()> { let mut prefab = Prefab::default(); for node in gltf.nodes() { if let Some(mesh) = node.mesh() { - import_mesh(mesh, &buffers, &store, path_base, &node, &mut prefab)?; + import_mesh( + mesh, + &buffers, + &store, + path_base, + &node, + &mut prefab, + args.webp, + )?; } let (position, _, _) = node.transform().decomposed(); if let Some(light) = node.light() { @@ -153,13 +165,14 @@ fn load_texture( path: &Path, buffers: &[gltf::buffer::Data], source: &Source, + webp: bool, ) -> Result<Resource<Image>> { - match source { + let mut image = match source { gltf::image::Source::View { view, mime_type } => { info!("{name} texture is embedded and of type {mime_type:?}"); let buf = &buffers[view.buffer().index()].0[view.offset()..view.offset() + view.length()]; - return Ok(store.set(&Image(buf.to_vec()))?); + Image(buf.to_vec()) } gltf::image::Source::Uri { uri, @@ -169,10 +182,23 @@ fn load_texture( let path = path.join(uri); let mut buf = Vec::new(); File::open(path)?.read_to_end(&mut buf)?; - return Ok(store.set(&Image(buf))?); + Image(buf) } _ => { bail!("texture is external and has no mime type") } + }; + + if webp { + let mut image_out = Image(Vec::new()); + + let len = image.0.len(); + ImageReader::new(Cursor::new(image.0)) + .with_guessed_format()? + .decode()? + .write_with_encoder(WebPEncoder::new_lossless(&mut image_out.0))?; + info!("webp encode: {len} -> {}", image_out.0.len()); + image = image_out; } + Ok(store.set(&image)?) } diff --git a/world/src/mesh.rs b/world/src/mesh.rs index cbc33c0..8742fb7 100644 --- a/world/src/mesh.rs +++ b/world/src/mesh.rs @@ -32,6 +32,7 @@ pub fn import_mesh( path_base: &Path, node: &Node, prefab: &mut Prefab, + webp: bool, ) -> Result<()> { Ok(for p in mesh.primitives() { let reader = p.reader(|buf| Some(&buffers[buf.index()])); @@ -151,6 +152,7 @@ pub fn import_mesh( path_base, &buffers, &tex.texture().source().source(), + webp, )?; tex_albedo = Some(r.clone()); tex_transmission = Some(r.clone()); @@ -163,6 +165,7 @@ pub fn import_mesh( path_base, &buffers, &tex.texture().source().source(), + webp, )?); } let mut tex_emission = None; @@ -173,6 +176,7 @@ pub fn import_mesh( path_base, &buffers, &tex.texture().source().source(), + webp, )?); } let mut tex_roughness = None; @@ -188,6 +192,7 @@ pub fn import_mesh( path_base, &buffers, &tex.texture().source().source(), + webp, )?; tex_roughness = Some(r.clone()); tex_metallic = Some(r.clone()); |