diff --git a/gmflib/Cargo.toml b/gmflib/Cargo.toml index 19f5ba2..dc4f187 100644 --- a/gmflib/Cargo.toml +++ b/gmflib/Cargo.toml @@ -6,4 +6,5 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +serde = { version = "1.0", features = ["derive"] } gmfmacros = { path = "../gmfmacros" } diff --git a/gmflib/src/lib.rs b/gmflib/src/lib.rs index 2e2fe1d..d22acd0 100644 --- a/gmflib/src/lib.rs +++ b/gmflib/src/lib.rs @@ -3,3 +3,4 @@ mod gma; pub mod types; pub use types::*; +pub use gmi::ReadError as GMIReadError; diff --git a/gmflib/src/types.rs b/gmflib/src/types.rs index 67e15f1..3d6eef0 100644 --- a/gmflib/src/types.rs +++ b/gmflib/src/types.rs @@ -1,6 +1,7 @@ use std::{io, string}; use gmfmacros::{GMISerializable, GMASerializable}; +use serde::Serialize; use crate::{ gmi, gma, @@ -9,7 +10,7 @@ use crate::{ gma::Serializable as GMASerializable, }; -#[derive(Debug)] +#[derive(Debug,Serialize)] pub struct GMF { pub version: u32, pub model_type: ModelType, @@ -36,7 +37,7 @@ impl GMF { impl gmi::Serializable for GMF { fn read(r: &mut gmi::ReadStream) -> gmi::ReadResult { if r.bytes(3)? != b"GMI".to_vec() { - return Err(r.error("invaid magic")); + return Err(r.error("invalid magic")); } let version: u32 = r.read("version")?; if version != 3 { @@ -72,7 +73,7 @@ impl gma::Serializable for GMF { } } -#[derive(Debug,GMISerializable)] +#[derive(Debug,GMISerializable,Serialize)] pub struct Color { pub r: u8, pub g: u8, @@ -92,7 +93,7 @@ impl gma::Atom for Color { } -#[derive(Debug,GMISerializable)] +#[derive(Debug,GMISerializable,Serialize)] pub enum MapKind { Ambient = 0, Diffuse = 1, @@ -131,26 +132,26 @@ impl gma::Serializable for MapKind { } } -#[derive(Debug,GMISerializable,GMASerializable)] +#[derive(Debug,GMISerializable,GMASerializable,Serialize)] pub enum MapType { Explicit = 0, Spherical = 1, Screen = 4, } -#[derive(Debug,GMISerializable,GMASerializable)] +#[derive(Debug,GMISerializable,GMASerializable,Serialize)] pub enum BitmapFilter { Pyramidal = 0, SAT = 1, } -#[derive(Debug,GMISerializable,GMASerializable)] +#[derive(Debug,GMISerializable,GMASerializable,Serialize)] pub enum ModelType { #[gma_value("Basic Model")] BasicModel = 1, } -#[derive(Debug,GMISerializable,GMASerializable)] +#[derive(Debug,GMISerializable,GMASerializable,Serialize)] #[gmi_tagged(1,2)] pub struct Scene { pub filename: String, @@ -164,7 +165,7 @@ pub struct Scene { pub ambient: Color, } -#[derive(Debug,GMISerializable,GMASerializable)] +#[derive(Debug,GMISerializable,GMASerializable,Serialize)] #[gmi_tagged(7, 2)] #[gma_name("MATERIAL_LIST")] pub struct MaterialList { @@ -172,7 +173,7 @@ pub struct MaterialList { pub materials: Vec, } -#[derive(Debug,GMISerializable,GMASerializable)] +#[derive(Debug,GMISerializable,GMASerializable,Serialize)] #[gmi_tagged(8, 2)] pub struct Material { #[gma_name("MATERIAL_REF_NO")] @@ -197,13 +198,13 @@ pub struct Material { pub sub: Option, } -#[derive(Debug,GMISerializable,GMASerializable)] +#[derive(Debug,GMISerializable,GMASerializable,Serialize)] pub enum Shading { Other = 0, Blinn = 0xc, } -#[derive(Debug, GMISerializable)] +#[derive(Debug, GMISerializable,Serialize)] pub enum Falloff { In = 0, InTwoSided = 1, @@ -224,14 +225,14 @@ impl gma::Serializable for Falloff { } } -#[derive(Debug,GMISerializable,GMASerializable)] +#[derive(Debug,GMISerializable,GMASerializable,Serialize)] pub enum XPType { Other = 0, Filter = 1, Additive = 3, } -#[derive(Debug,GMISerializable,GMASerializable)] +#[derive(Debug,GMISerializable,GMASerializable,Serialize)] #[gmi_tagged(14, 2)] #[gma_name("TEXTURE_LIST")] pub struct TextureList { @@ -239,7 +240,7 @@ pub struct TextureList { pub textures: Vec, } -#[derive(Debug,GMISerializable,GMASerializable)] +#[derive(Debug,GMISerializable,GMASerializable,Serialize)] #[gmi_tagged(15, 4)] pub struct Texture { #[gma_name("MAP_NAME")] @@ -286,7 +287,7 @@ pub struct Texture { pub sub: Option, } -#[derive(Debug)] +#[derive(Debug,Serialize)] pub struct ObjectName(String); impl gmi::Serializable for ObjectName { @@ -305,7 +306,7 @@ impl gma::Serializable for ObjectName { } } -#[derive(Debug,GMISerializable,GMASerializable)] +#[derive(Debug,GMISerializable,GMASerializable,Serialize)] #[gmi_tagged_nolen(18,2)] #[gma_name("OBJECT_LIST")] pub struct ObjectList { @@ -313,7 +314,7 @@ pub struct ObjectList { pub objects: Vec, } -#[derive(Debug)] +#[derive(Debug,Serialize)] pub enum Object { Geometry(GeometryObject), Camera(CameraObject), @@ -361,7 +362,7 @@ impl gma::Serializable for Object { } } -#[derive(Debug,GMISerializable,GMASerializable)] +#[derive(Debug,GMISerializable,GMASerializable,Serialize)] #[gma_name("GEOMOBJECT")] pub struct GeometryObject { #[gma_name("NODE_NAME")] @@ -375,7 +376,7 @@ pub struct GeometryObject { pub mesh: Mesh, } -#[derive(Debug,GMISerializable)] +#[derive(Debug,GMISerializable,Serialize)] pub struct CameraObject { pub name: String, pub tm1: TransformMatrix, @@ -408,12 +409,12 @@ impl gma::Serializable for CameraObject { } } -#[derive(Debug,GMISerializable,GMASerializable)] +#[derive(Debug,GMISerializable,GMASerializable,Serialize)] pub enum CameraType { Target = 0, } -#[derive(Debug,GMISerializable,GMASerializable)] +#[derive(Debug,GMISerializable,GMASerializable,Serialize)] #[gmi_tagged(17, 2)] #[gma_name("NODE_TM")] pub struct TransformMatrix { @@ -429,7 +430,7 @@ pub struct TransformMatrix { pub row3: [f32; 3], } -#[derive(Debug, GMISerializable)] +#[derive(Debug, GMISerializable,Serialize)] #[gmi_tagged_nolen(16, 4)] pub struct Mesh { pub time: u32, @@ -506,7 +507,7 @@ impl gma::Serializable for Mesh { macro_rules! specialized_vec { ($newname:ident, $elemname:ident, $header:expr, $format:expr) => { - #[derive(Debug)] + #[derive(Debug,Serialize)] pub struct $newname(Vec<$elemname>); impl gmi::Serializable for $newname { fn read(r: &mut gmi::ReadStream) -> gmi::ReadResult { @@ -613,14 +614,14 @@ impl MeshNormalList { } } -#[derive(Debug,GMISerializable,GMASerializable)] +#[derive(Debug,GMISerializable,GMASerializable,Serialize)] pub struct Point { pub x: f32, pub y: f32, pub z: f32, } -#[derive(Debug,GMISerializable,GMASerializable)] +#[derive(Debug,GMISerializable,GMASerializable,Serialize)] pub struct Face { pub a: u32, pub b: u32, @@ -628,14 +629,14 @@ pub struct Face { pub mtlid: u32, } -#[derive(Debug,GMISerializable,GMASerializable)] +#[derive(Debug,GMISerializable,GMASerializable,Serialize)] pub struct TFace { pub a: u32, pub b: u32, pub c: u32, } -#[derive(Debug,GMISerializable)] +#[derive(Debug,GMISerializable,Serialize)] pub struct FaceNormal { pub face: [f32; 3], pub vertex: [[f32; 3]; 3], @@ -647,7 +648,7 @@ impl gma::Serializable for FaceNormal { } } -#[derive(Debug, GMISerializable,GMASerializable)] +#[derive(Debug, GMISerializable,GMASerializable,Serialize)] pub struct TextureChannel { pub unk1: u32, pub tvertex_count: u32, @@ -664,7 +665,7 @@ pub struct TextureChannel { pub tfaces: MeshTFaceList, } -#[derive(Debug,GMISerializable,GMASerializable)] +#[derive(Debug,GMISerializable,GMASerializable,Serialize)] #[gma_name("LIGHT")] pub struct LightObject { #[gma_name("NODE_NAME")] @@ -689,19 +690,19 @@ pub struct LightObject { pub use_far_attenuation: FarAttenuation, } -#[derive(Debug,GMISerializable,GMASerializable)] +#[derive(Debug,GMISerializable,GMASerializable,Serialize)] pub enum LightType { Omni = 0, } -#[derive(Debug,GMISerializable,GMASerializable)] +#[derive(Debug,GMISerializable,GMASerializable,Serialize)] pub enum LightShadows { Off = 0, Mapped = 1, Raytraced = 2, } -#[derive(Debug,GMASerializable)] +#[derive(Debug,GMASerializable,Serialize)] pub enum LightSpotShape { Circle = 0, } @@ -712,7 +713,7 @@ impl gmi::Serializable for LightSpotShape { } } -#[derive(Debug)] +#[derive(Debug,Serialize)] pub struct FarAttenuation(u32); impl gmi::Serializable for FarAttenuation { @@ -729,7 +730,7 @@ impl gma::Serializable for FarAttenuation { } } -#[derive(Debug,GMISerializable,GMASerializable)] +#[derive(Debug,GMISerializable,GMASerializable,Serialize)] #[gma_name("GMID_ATTACHMENTPT")] pub struct AttachmentPointObject { #[gma_name("NODE_NAME")] @@ -739,7 +740,7 @@ pub struct AttachmentPointObject { pub user_data: String, } -#[derive(Debug,GMISerializable,GMASerializable)] +#[derive(Debug,GMISerializable,GMASerializable,Serialize)] #[gma_name("GMID_HAVOK_CONSTRAINTSOLVER")] pub struct ConstraintSolverObject { #[gma_name("NODE_NAME")] @@ -751,7 +752,7 @@ pub struct ConstraintSolverObject { pub constraints: Option, } -#[derive(Debug,GMISerializable,GMASerializable)] +#[derive(Debug,GMISerializable,GMASerializable,Serialize)] #[gmi_tagged_nolen(44, 2)] #[gma_name("GMID_HAVOK_CONSTRAINT_LIST")] pub struct ConstraintList { @@ -759,7 +760,7 @@ pub struct ConstraintList { pub constraints: Vec, } -#[derive(Debug)] +#[derive(Debug,Serialize)] pub enum Constraint { Hinge(HingeConstraint), PointToPoint(PointToPointConstraint), @@ -787,7 +788,7 @@ impl gma::Serializable for Constraint { } } -#[derive(Debug,GMISerializable,GMASerializable)] +#[derive(Debug,GMISerializable,GMASerializable,Serialize)] #[gma_name("GMID_HAVOK_HINGE_CONSTRAINT")] pub struct HingeConstraint { #[gma_name("NODE_NAME")] @@ -811,7 +812,7 @@ pub struct HingeConstraint { pub angle_limits: [f32; 2], } -#[derive(Debug,GMISerializable,GMASerializable)] +#[derive(Debug,GMISerializable,GMASerializable,Serialize)] #[gma_name("GMID_HAVOK_POINTTOPOINT")] pub struct PointToPointConstraint { #[gma_name("NODE_NAME")] @@ -824,7 +825,7 @@ pub struct PointToPointConstraint { pub points: PTPPoints, } -#[derive(Debug,GMISerializable)] +#[derive(Debug,GMISerializable,Serialize)] pub struct PTPPoints { a: Point, b: Point, @@ -839,7 +840,7 @@ impl gma::Serializable for PTPPoints { } } -#[derive(Debug,GMISerializable,GMASerializable)] +#[derive(Debug,GMISerializable,GMASerializable,Serialize)] #[gma_name("GMID_HAVOK_SIMOBJECT")] pub struct SimulationObject { #[gma_name("NODE_NAME")] @@ -872,7 +873,7 @@ pub struct SimulationObject { pub collision_pairs: u32, } -#[derive(Debug)] +#[derive(Debug,Serialize)] pub struct Gravity(Point); impl gmi::Serializable for Gravity { @@ -889,7 +890,7 @@ impl gma::Serializable for Gravity { } -#[derive(Debug,GMISerializable,GMASerializable)] +#[derive(Debug,GMISerializable,GMASerializable,Serialize)] #[gma_name("GMID_HAVOK_RBCOLLECTION")] pub struct RBCollectionObject { #[gma_name("NODE_NAME")] @@ -903,7 +904,7 @@ pub struct RBCollectionObject { pub disabled_collision_pairs: Option, } -#[derive(Debug,GMISerializable)] +#[derive(Debug,GMISerializable,Serialize)] #[gmi_tagged_nolen(33, 2)] pub struct RigidBodyList { pub rigidbodies: Vec, @@ -922,7 +923,7 @@ impl gma::Serializable for RigidBodyList { } } -#[derive(Debug,GMISerializable,GMASerializable)] +#[derive(Debug,GMISerializable,GMASerializable,Serialize)] #[gmi_tagged_nolen(32, 4)] #[gma_name("GMID_HAVOK_RIGIDBODY")] pub struct RigidBody { @@ -956,7 +957,7 @@ pub struct RigidBody { pub children: NestedRigidBodyList, } -#[derive(Debug)] +#[derive(Debug,Serialize)] pub struct NestedRigidBodyList(Option); impl gmi::Serializable for NestedRigidBodyList { @@ -974,13 +975,13 @@ impl gma::Serializable for NestedRigidBodyList { } } -#[derive(Debug,GMISerializable,GMASerializable)] +#[derive(Debug,GMISerializable,GMASerializable,Serialize)] pub enum GeoType { Standard = 0, Plane = 1, } -#[derive(Debug,GMISerializable,GMASerializable)] +#[derive(Debug,GMISerializable,GMASerializable,Serialize)] #[gmi_tagged_nolen(51, 2)] #[gma_name("GMID_HAVOK_DIS_COLLISION_PAIRS")] pub struct DisabledCollisionPairList { @@ -988,7 +989,7 @@ pub struct DisabledCollisionPairList { pub pairs: Vec, } -#[derive(Debug,GMISerializable)] +#[derive(Debug,GMISerializable,Serialize)] pub struct DisabledCollisionPair { pub a: String, pub b: String, @@ -1001,7 +1002,7 @@ impl gma::Serializable for DisabledCollisionPair { } } -#[derive(Debug,GMISerializable,GMASerializable)] +#[derive(Debug,GMISerializable,GMASerializable,Serialize)] #[gma_name("GMID_HAVOK_ANGULAR_DASHPOT")] pub struct AngularDashpotObject { #[gma_name("NODE_NAME")] @@ -1021,7 +1022,7 @@ pub struct AngularDashpotObject { pub quaternion: Quaternion, } -#[derive(Debug)] +#[derive(Debug,Serialize)] pub struct Quaternion([f32; 4]); impl gmi::Serializable for Quaternion {