|
@@ -1 +1,107 @@
|
|
|
-
|
|
|
+use std::fmt::Display;
|
|
|
+
|
|
|
+use binrw::{BinRead, BinWrite};
|
|
|
+use modular_bitfield::{
|
|
|
+ bitfield,
|
|
|
+ specifiers::{B1, B2, B21, B4},
|
|
|
+};
|
|
|
+
|
|
|
+use crate::{
|
|
|
+ array_of::ArrayOf,
|
|
|
+ field_of::FieldOf,
|
|
|
+ types::{Field, WString, F64, U32},
|
|
|
+};
|
|
|
+
|
|
|
+use super::{line::Lines, Object, ObjectBase};
|
|
|
+
|
|
|
+#[bitfield(bits = 32)]
|
|
|
+#[derive(BinRead, BinWrite, Debug, Copy, Clone)]
|
|
|
+#[br(map = Self::from_bytes)]
|
|
|
+#[bw(map = |&x| Self::into_bytes(x))]
|
|
|
+pub struct ObjectFlags {
|
|
|
+ #[skip]
|
|
|
+ __: B1,
|
|
|
+ pub follow_edge_once: B1,
|
|
|
+ #[skip]
|
|
|
+ __: B4,
|
|
|
+ pub auto_rotate_hatch_angle: B1,
|
|
|
+ pub average_distribute_line: B1,
|
|
|
+ #[skip]
|
|
|
+ __: B2,
|
|
|
+ pub cross_patch: B1,
|
|
|
+ #[skip]
|
|
|
+ __: B21,
|
|
|
+}
|
|
|
+
|
|
|
+#[derive(BinRead, BinWrite, Debug)]
|
|
|
+pub struct HatchLine {
|
|
|
+ lines: ArrayOf<Lines>,
|
|
|
+}
|
|
|
+
|
|
|
+#[derive(BinRead, BinWrite, Debug)]
|
|
|
+#[brw(magic(46u32))] // Number of fields in this struct
|
|
|
+pub struct HatchSettings1 {
|
|
|
+ pub mark_contour: U32,
|
|
|
+ _unknown_1: Field,
|
|
|
+ pub pen: U32,
|
|
|
+ pub flags: FieldOf<ObjectFlags>,
|
|
|
+ pub edge_offset: F64,
|
|
|
+ pub line_spacing: F64,
|
|
|
+ pub start_offset: F64,
|
|
|
+ pub end_offset: F64,
|
|
|
+ pub angle: F64,
|
|
|
+ _unknown_2: [Field; 9],
|
|
|
+ pub auto_rotate_angle: F64,
|
|
|
+ _unknown_3: [Field; 10],
|
|
|
+ pub line_reduction: F64,
|
|
|
+ _unknown_4: [Field; 2],
|
|
|
+ pub loop_count: U32,
|
|
|
+ _unknown_5: [Field; 2],
|
|
|
+ pub loop_distance: F64,
|
|
|
+ _unknown_6: [Field; 5],
|
|
|
+ pub contour_first: U32,
|
|
|
+ pub count: U32,
|
|
|
+ _unknown_7: [Field; 3],
|
|
|
+}
|
|
|
+
|
|
|
+#[derive(BinRead, BinWrite, Debug)]
|
|
|
+#[brw(magic(15u32))] // Number of fields in this struct
|
|
|
+pub struct HatchSettings2 {
|
|
|
+ pub count: U32,
|
|
|
+ _unknown_1: Field,
|
|
|
+ pub pen: U32,
|
|
|
+ pub flags: FieldOf<ObjectFlags>,
|
|
|
+ pub edge_offset: F64,
|
|
|
+ pub line_spacing: F64,
|
|
|
+ pub start_offset: F64,
|
|
|
+ pub end_offset: F64,
|
|
|
+ pub angle: F64,
|
|
|
+ pub auto_rotate_angle: F64,
|
|
|
+ pub line_reduction: F64,
|
|
|
+ pub loop_distance: F64,
|
|
|
+ pub loop_count: U32,
|
|
|
+ _unknown_2: [Field; 2],
|
|
|
+}
|
|
|
+
|
|
|
+#[derive(BinRead, BinWrite, Debug)]
|
|
|
+pub struct Hatch {
|
|
|
+ pub base: ObjectBase,
|
|
|
+ pub outline: ArrayOf<Object>,
|
|
|
+ pub settings_1: HatchSettings1,
|
|
|
+ pub settings_2: HatchSettings2,
|
|
|
+ _unknown_1: ArrayOf<Field>,
|
|
|
+ _unknown_2: u32,
|
|
|
+ _unknown_3: u32,
|
|
|
+ _unknown_4: u32,
|
|
|
+ pub pen: U32,
|
|
|
+ _unknown_5: [Field; 2],
|
|
|
+ pub name: WString,
|
|
|
+ _unknown_6: [Field; 13],
|
|
|
+ pub lines: ArrayOf<HatchLine>,
|
|
|
+}
|
|
|
+
|
|
|
+impl Display for Hatch {
|
|
|
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
|
+ write!(f, "[HATCH]")
|
|
|
+ }
|
|
|
+}
|