|
@@ -1,4 +1,122 @@
|
|
|
use binrw::{BinRead, BinWrite};
|
|
|
|
|
|
+use crate::{
|
|
|
+ field_of::FieldOf,
|
|
|
+ types::{Field, ObjectType, Point, WString, F64, U32, U16},
|
|
|
+};
|
|
|
+
|
|
|
+#[derive(BinRead, BinWrite, Debug)]
|
|
|
+pub enum LineType {
|
|
|
+ #[brw(magic = 0x0001u64)]
|
|
|
+ Point(Point),
|
|
|
+ #[brw(magic = 0x0100u64)]
|
|
|
+ Line {
|
|
|
+ count: u32,
|
|
|
+ #[br(count = count)]
|
|
|
+ points: Vec<Point>,
|
|
|
+ },
|
|
|
+ #[brw(magic = 0x0300u64)]
|
|
|
+ Bezier {
|
|
|
+ count: u32,
|
|
|
+ #[br(count = count)]
|
|
|
+ points: Vec<Point>,
|
|
|
+ },
|
|
|
+}
|
|
|
+
|
|
|
+#[derive(BinRead, BinWrite, Debug)]
|
|
|
+#[brw(magic(17u32))]
|
|
|
+pub struct ObjBase {
|
|
|
+ pub pen: U32,
|
|
|
+ pub obj_type: FieldOf<ObjectType>,
|
|
|
+ pub flags: U16,
|
|
|
+ pub name: WString,
|
|
|
+ pub count: U32,
|
|
|
+ _unknown_1: Field,
|
|
|
+ pub io_control_enable_mask: U16,
|
|
|
+ pub io_control_disable_mask: U16,
|
|
|
+ _unknown_2: [Field; 5],
|
|
|
+ pub origin: FieldOf<Point>,
|
|
|
+ pub z: F64,
|
|
|
+ pub a: F64,
|
|
|
+ _unknown_3: Field,
|
|
|
+}
|
|
|
+
|
|
|
+#[derive(BinRead, BinWrite, Debug)]
|
|
|
+pub struct Lines {
|
|
|
+ pub base: ObjBase,
|
|
|
+ count: u64,
|
|
|
+ #[br(count = count)]
|
|
|
+ pub lines: Vec<LineType>,
|
|
|
+}
|
|
|
+
|
|
|
+#[derive(BinRead, BinWrite, Debug)]
|
|
|
+pub struct Rectangle {
|
|
|
+ pub base: ObjBase,
|
|
|
+ #[br(assert(field_count == 8))]
|
|
|
+ field_count: u32,
|
|
|
+ pub corner_a: FieldOf<Point>,
|
|
|
+ pub corner_b: FieldOf<Point>,
|
|
|
+ pub round_bottom_left: F64,
|
|
|
+ pub round_bottom_right: F64,
|
|
|
+ pub round_top_right: F64,
|
|
|
+ pub round_top_left: F64,
|
|
|
+ _unknown_1: [Field; 2],
|
|
|
+}
|
|
|
+
|
|
|
+#[derive(BinRead, BinWrite, Debug)]
|
|
|
+pub struct Circle {
|
|
|
+ pub base: ObjBase,
|
|
|
+ #[br(assert(field_count == 6))]
|
|
|
+ field_count: u32,
|
|
|
+ pub origin: FieldOf<Point>,
|
|
|
+ pub radius: F64,
|
|
|
+ pub start_angle: F64,
|
|
|
+ pub clockwise: U32,
|
|
|
+ _unknown_1: [Field; 2],
|
|
|
+}
|
|
|
+
|
|
|
+#[derive(BinRead, BinWrite, Debug)]
|
|
|
+pub struct Ellipse {
|
|
|
+ pub base: ObjBase,
|
|
|
+ #[br(assert(field_count == 8))]
|
|
|
+ field_count: u32,
|
|
|
+ pub clockwise: U32,
|
|
|
+ pub corner_a: FieldOf<Point>,
|
|
|
+ pub corner_b: FieldOf<Point>,
|
|
|
+ pub start_angle: F64,
|
|
|
+ pub end_angle: F64,
|
|
|
+ _unknown_1: [Field; 2],
|
|
|
+ pub open_curve: U32,
|
|
|
+}
|
|
|
+
|
|
|
+#[derive(BinRead, BinWrite, Debug)]
|
|
|
+pub struct Polygon {
|
|
|
+ pub base: ObjBase,
|
|
|
+ #[br(assert(field_count == 10))]
|
|
|
+ field_count: u32,
|
|
|
+ pub invert_shape: U32,
|
|
|
+ pub corner_a: FieldOf<Point>,
|
|
|
+ pub corner_b: FieldOf<Point>,
|
|
|
+ pub offset_cx: F64,
|
|
|
+ pub offset_cy: F64,
|
|
|
+ pub offset_dx: F64,
|
|
|
+ pub offset_dy: F64,
|
|
|
+ pub edges: U32,
|
|
|
+ _unknown_1: [Field; 2],
|
|
|
+}
|
|
|
+
|
|
|
#[derive(BinRead, BinWrite, Debug)]
|
|
|
-pub struct Object {}
|
|
|
+pub enum Object {
|
|
|
+ #[brw(magic = 1u32)]
|
|
|
+ Curve(Lines),
|
|
|
+ #[brw(magic = 2u32)]
|
|
|
+ Point(Lines),
|
|
|
+ #[brw(magic = 3u32)]
|
|
|
+ Rectangle(Rectangle),
|
|
|
+ #[brw(magic = 4u32)]
|
|
|
+ Circle(Circle),
|
|
|
+ #[brw(magic = 5u32)]
|
|
|
+ Ellipse(Ellipse),
|
|
|
+ #[brw(magic = 6u32)]
|
|
|
+ Polygon(Polygon),
|
|
|
+}
|