summaryrefslogtreecommitdiff
path: root/world/src
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-01-08 00:01:07 +0100
committermetamuffin <metamuffin@disroot.org>2025-01-08 00:01:07 +0100
commit7e06efee8b33fb8619aa5e50afc8728fd330f39d (patch)
treedb8ffedb2d52d74438c104be731966d6507ed968 /world/src
parent30ef8aeb1fdf7f3686442d758ee77874aa29d53e (diff)
downloadweareserver-7e06efee8b33fb8619aa5e50afc8728fd330f39d.tar
weareserver-7e06efee8b33fb8619aa5e50afc8728fd330f39d.tar.bz2
weareserver-7e06efee8b33fb8619aa5e50afc8728fd330f39d.tar.zst
fix image ser bug
Diffstat (limited to 'world/src')
-rw-r--r--world/src/main.rs38
-rw-r--r--world/src/mesh.rs5
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());