aboutsummaryrefslogtreecommitdiff
path: root/src/mesh.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesh.rs')
-rw-r--r--src/mesh.rs52
1 files changed, 39 insertions, 13 deletions
diff --git a/src/mesh.rs b/src/mesh.rs
index b387721..ff1ced9 100644
--- a/src/mesh.rs
+++ b/src/mesh.rs
@@ -1,7 +1,13 @@
-use crate::proto::Mesh;
+use std::borrow::Cow;
+
+use crate::proto::{Mesh, Texture, texture::Format};
use anyhow::Result;
use glam::{Vec2, Vec3A, vec2, vec3a};
-use weareshared::{packets::Resource, resources::MeshPart, store::ResourceStore};
+use weareshared::{
+ packets::Resource,
+ resources::{Image, MeshPart},
+ store::ResourceStore,
+};
pub fn convert_mesh(
m: Mesh,
@@ -10,9 +16,9 @@ pub fn convert_mesh(
) -> Result<Resource<MeshPart>> {
let index = decode_indices(&m.indices);
let positions = decode_positions(m.vertices());
- let texcoords = decode_texcoords(m.texture_coords());
+ let texcoords = decode_texcoords(m.texture_coordinates(), &m.uv_offset_and_scale);
let normals = decode_normals(m.normals(), normal_table);
-
+ let texture = decode_texture(&m.texture[0]);
Ok(store.set(&MeshPart {
index: Some(store.set(&index)?),
@@ -20,27 +26,47 @@ pub fn convert_mesh(
va_texcoord: texcoords.map(|x| store.set(&x)).transpose()?,
va_normal: Some(store.set(&normals)?),
g_double_sided: Some(()),
+ tex_albedo: Some(store.set(&texture)?),
..Default::default()
})?)
}
-fn decode_texcoords(uv: &[u8]) -> Option<Vec<Vec2>> {
+fn decode_texture(texture: &Texture) -> Image<'static> {
+ match texture.format() {
+ Format::Jpg => Image(Cow::Owned(texture.data[0].clone())),
+ Format::Dxt1 => todo!(),
+ Format::Etc1 => todo!(),
+ Format::Pvrtc2 => todo!(),
+ Format::Pvrtc4 => todo!(),
+ Format::CrnDxt1 => todo!(),
+ }
+}
+
+fn decode_texcoords(uv: &[u8], offset_and_scale: &[f32]) -> Option<Vec<Vec2>> {
if uv.is_empty() {
return None;
}
let count = (uv.len() - 4) / 4;
- let u_mod = 1 + u16::from_le_bytes([uv[0], uv[1]]);
- let v_mod = 1 + u16::from_le_bytes([uv[2], uv[3]]);
+ let u_mod = u16::from_le_bytes([uv[0], uv[1]]);
+ let v_mod = u16::from_le_bytes([uv[2], uv[3]]);
let uv = &uv[4..];
+ let (offset, scale) = if offset_and_scale.len() == 4 {
+ (
+ vec2(offset_and_scale[0], offset_and_scale[1]),
+ vec2(offset_and_scale[2], offset_and_scale[3]),
+ )
+ } else {
+ (Vec2::ZERO, vec2(1. / u_mod as f32, -1. / v_mod as f32))
+ };
let (mut u, mut v) = (0u16, 0u16);
let mut texcoords = Vec::new();
for i in 0..count {
- u = (u + (uv[count * 0 + i] as u16) + ((uv[count * 2 + i] as u16) << 8)) % u_mod;
- v = (v + (uv[count * 1 + i] as u16) + ((uv[count * 3 + i] as u16) << 8)) % v_mod;
- texcoords.push(vec2(
- u as f32 / u_mod as f32 + 0.5,
- v as f32 / v_mod as f32 + 0.5,
- ));
+ u = u.wrapping_add((uv[count * 0 + i] as u16) + ((uv[count * 2 + i] as u16) << 8));
+ v = v.wrapping_add((uv[count * 1 + i] as u16) + ((uv[count * 3 + i] as u16) << 8));
+ u %= u_mod;
+ v %= v_mod;
+ let c = vec2(u as f32, v as f32);
+ texcoords.push(scale * (offset + c))
}
Some(texcoords)
}