we3d 0.1.1

A Wasm Engine 3d. Test project
Documentation
use serde::{Serialize, Deserialize};
use serde_json;

fn default_translation() -> [f32; 3] { [1.,1.,1.] }
fn default_rotation() -> [f32; 4] { [0.,0.,0.,1.] }
fn default_scale() -> [f32; 3] { [1.,1.,1.] }
fn default_node_children() -> Vec<Node> { Vec::new() }
fn default_node_parts() -> Vec<NodePart> { Vec::new() }
fn default_bone_translation() -> [f32; 4] { [1.,1.,1.,0.] }
fn default_bone_rotation() -> [f32; 4] { [0.,0.,0.,1.] }
fn default_bone_scale() -> [f32; 4] { [1.,1.,1.,0.] }



#[derive(Serialize, Deserialize)]
pub struct Mesh {
    pub attributes: Vec<String>,
    pub vertices: Vec<f32>,
    pub parts: Vec<MeshPart>,
}
#[derive(Serialize, Deserialize)]
pub struct MeshPart {
    pub id: String, 
    pub r#type: String,
    pub indices: Vec<u16>, 
}
#[derive(Serialize, Deserialize)]
pub struct Material {
    pub id: String, 
    pub ambient: [ f32; 3 ], 
    pub diffuse: [ f32; 3 ], 
    pub emissive: [ f32; 3 ], 
    pub opacity:  f32, 
    pub textures: Vec< Texture >,
}
#[derive(Serialize, Deserialize)]
pub struct Texture {
    pub id: String, 
    pub filename: String, 
    pub r#type: String
}
#[derive(Serialize, Deserialize)]
pub struct Node {
    pub id: String,
    #[serde( default = "default_translation" )]
    pub translation: [f32; 3],
    #[serde( default = "default_rotation" )]
    pub rotation: [f32; 4],
    #[serde( default = "default_scale" )]
    pub scale: [f32; 3],
    #[serde( default = "default_node_children") ]
    pub children: Vec<Node>,
    #[serde( default = "default_node_parts") ]
    pub parts: Vec<NodePart>,
}
#[derive(Serialize, Deserialize)]
pub struct NodePart {
    pub meshpartid: String, 
    pub materialid: String, 
    pub bones: Vec<Bone>,
    pub uvMapping: [[  u16; 1 ];1]
}
#[derive(Serialize, Deserialize)]
pub struct Bone {
    node: String, 
    #[serde( default = "default_bone_translation" )]
    pub translation: [f32; 4],
    #[serde( default = "default_bone_rotation" )]
    pub rotation: [f32; 4],
    #[serde( default = "default_bone_scale" )]
    pub scale: [f32; 4],
}
#[derive(Serialize, Deserialize)]
pub struct Animation {
    pub id: String,
    pub bones: Vec<AnimationBone>,
}
#[derive(Serialize, Deserialize)]
pub struct AnimationBone {
    pub boneId: String,
    pub keyframes: Vec<KeyFrame>,
}
#[derive(Serialize, Deserialize)]
pub struct KeyFrame {
    pub keytime: f32,
    #[serde( default = "default_translation" )]
    pub translation: [f32; 3],
    #[serde( default = "default_rotation" )]
    pub rotation: [f32; 4],
    #[serde( default = "default_scale" )]
    pub scale: [f32; 3],
}

pub fn from_str(data: &String) -> G3dj { serde_json::from_str(data).unwrap() }

#[derive(Serialize, Deserialize)]
pub struct G3dj {
    version: [u8; 2],
    pub id: String,
    pub meshes: Vec< Mesh >,
    pub materials: Vec< Material >,
    pub nodes: Vec< Node >,
    pub animations: Vec< Animation >,
}