use glam::{Quat, Vec3};
use serde::{Deserialize, Serialize};
use std::path::PathBuf;
use uuid::Uuid;
use crate::packet::message::UIMessage;
#[derive(Clone, Debug, Serialize, Deserialize, Default)]
pub struct MeshUpdate {
pub path: PathBuf,
pub scale: Vec3,
pub rotation: Quat,
pub parent: Option<u32>,
pub scene_id: Option<u32>,
pub position: Vec3,
pub mesh_type: MeshType,
pub id: Option<Uuid>,
}
#[derive(Clone, Debug, Serialize, Deserialize, Default, PartialEq)]
pub enum MeshType {
Land,
#[default]
Avatar,
}
impl UIMessage {
pub fn new_mesh_update(mut data: MeshUpdate) -> Self {
data.rotation = yup_to_zup_rotation(data.rotation);
data.position = yup_to_zup_vec3(data.position);
data.scale = yup_to_zup_vec3(data.scale);
UIMessage::MeshUpdate(data)
}
}
fn yup_to_zup_rotation(q: Quat) -> Quat {
let q_convert = Quat::from_axis_angle(Vec3::X, -std::f32::consts::FRAC_PI_2);
q_convert * q * q_convert.inverse()
}
fn yup_to_zup_vec3(s: Vec3) -> Vec3 {
Vec3::new(s.x, s.z, s.y)
}