diff --git a/.taplo.toml b/.taplo.toml new file mode 100644 index 000000000..6797fc6be --- /dev/null +++ b/.taplo.toml @@ -0,0 +1,11 @@ +# https://taplo.tamasfe.dev/configuration/formatter-options.html +include = ["Cargo.toml", "*/Cargo.toml"] + +[formatting] +trailing_newline = true +reorder_keys = true +align_comments = false +allowed_blank_lines = 1 +array_auto_collapse = false +array_auto_expand = false +reorder_arrays = true diff --git a/nusamai-citygml/Cargo.toml b/nusamai-citygml/Cargo.toml index 47868a517..253b03d5a 100644 --- a/nusamai-citygml/Cargo.toml +++ b/nusamai-citygml/Cargo.toml @@ -10,18 +10,18 @@ version.workspace = true [features] default = ["serde"] -serde = ["dep:serde", "serde_json", "nusamai-geometry/serde"] +serde = ["dep:serde", "nusamai-geometry/serde", "serde_json"] [dependencies] ahash = "0.8.11" -chrono = {workspace = true, features = ["serde"]} -indexmap = {workspace = true, features = ["serde"]} +chrono = { workspace = true, features = ["serde"] } +indexmap = { workspace = true, features = ["serde"] } log.workspace = true -macros = {path = "./macros"} -nusamai-geometry = {path = "../nusamai-geometry", features = ["serde"]} -nusamai-projection = {path = "../nusamai-projection"} +macros = { path = "./macros" } +nusamai-geometry = { path = "../nusamai-geometry", features = ["serde"] } +nusamai-projection = { path = "../nusamai-projection" } quick-xml.workspace = true -serde = {workspace = true, features = ["derive"], optional = true} -serde_json = {workspace = true, features = ["indexmap"], optional = true} +serde = { workspace = true, features = ["derive"], optional = true } +serde_json = { workspace = true, features = ["indexmap"], optional = true } thiserror.workspace = true -url = {workspace = true, features = ["serde"]} +url = { workspace = true, features = ["serde"] } diff --git a/nusamai-citygml/macros/src/derive.rs b/nusamai-citygml/macros/src/derive.rs index 57c491773..ce67c8d3a 100644 --- a/nusamai-citygml/macros/src/derive.rs +++ b/nusamai-citygml/macros/src/derive.rs @@ -134,7 +134,7 @@ fn generate_citygml_impl_for_struct( let hash = hash(&c); child_arms.push(quote! { - (#hash, #path) => st.parse_geometric_attr(&mut self.#field_ident, #lod, ::nusamai_citygml::geometry::GeometryParseType::#geomtype), + (#hash, #path) => st.parse_geometric_attr(#lod, ::nusamai_citygml::geometry::GeometryParseType::#geomtype), }); }; diff --git a/nusamai-citygml/src/parser.rs b/nusamai-citygml/src/parser.rs index 2f9803de7..1e46ab8fe 100644 --- a/nusamai-citygml/src/parser.rs +++ b/nusamai-citygml/src/parser.rs @@ -35,6 +35,7 @@ pub enum ParseError { pub struct CityGmlReader<'a> { state: InternalState<'a>, + geomrefs: GeometryRefs, } struct InternalState<'a> { @@ -108,6 +109,7 @@ impl<'a> CityGmlReader<'a> { pub fn new(context: ParseContext<'a>) -> Self { Self { state: InternalState::new(context), + geomrefs: Vec::new(), } } @@ -119,6 +121,7 @@ impl<'a> CityGmlReader<'a> { reader.config_mut().expand_empty_elements = true; let state = &mut self.state; + let geomrefs = &mut self.geomrefs; loop { match reader.read_event_into(&mut state.buf1) { Ok(Event::Start(start)) => { @@ -132,6 +135,7 @@ impl<'a> CityGmlReader<'a> { reader, state, path_start: 0, + geomrefs, }); } Ok(Event::Eof) => { @@ -150,9 +154,18 @@ pub struct SubTreeReader<'a, 'b, R> { reader: &'a mut quick_xml::NsReader, state: &'a mut InternalState<'b>, path_start: usize, + geomrefs: &'a mut GeometryRefs, } impl<'b, R: BufRead> SubTreeReader<'_, 'b, R> { + pub fn geometry_refs(&self) -> &GeometryRefs { + self.geomrefs + } + + pub fn refresh_geomrefs(&mut self) { + self.geomrefs.clear(); + } + pub fn parse_children( &mut self, logic: impl FnMut(&mut SubTreeReader) -> Result<(), ParseError>, @@ -162,6 +175,7 @@ impl<'b, R: BufRead> SubTreeReader<'_, 'b, R> { path_start: self.state.path_buf.len(), reader: self.reader, state: self.state, + geomrefs: self.geomrefs, } .parse_children_inner(logic) } @@ -316,20 +330,19 @@ impl<'b, R: BufRead> SubTreeReader<'_, 'b, R> { #[inline(never)] pub fn parse_geometric_attr( &mut self, - geomref: &mut GeometryRefs, lod: u8, geomtype: GeometryParseType, ) -> Result<(), ParseError> { use GeometryParseType::*; match geomtype { - Solid => self.parse_solid_prop(geomref, lod)?, - MultiSurface => self.parse_multi_surface_prop(geomref, lod)?, - Surface => self.parse_surface_prop(geomref, lod)?, // FIXME - Geometry => self.parse_geometry_prop(geomref, lod)?, // FIXME: not only surfaces - Triangulated => self.parse_triangulated_prop(geomref, lod)?, // FIXME - Point => todo!(), // FIXME - MultiPoint => todo!(), // FIXME + Solid => self.parse_solid_prop(lod)?, + MultiSurface => self.parse_multi_surface_prop(lod)?, + Surface => self.parse_surface_prop(lod)?, // FIXME + Geometry => self.parse_geometry_prop(lod)?, // FIXME: not only surfaces + Triangulated => self.parse_triangulated_prop(lod)?, + Point => todo!(), // FIXME + MultiPoint => todo!(), // FIXME MultiCurve => { log::warn!("CompositeCurve is not supported yet."); self.skip_current_element()?; @@ -344,11 +357,7 @@ impl<'b, R: BufRead> SubTreeReader<'_, 'b, R> { Ok(()) } - fn parse_multi_surface_prop( - &mut self, - geomrefs: &mut GeometryRefs, - lod: u8, - ) -> Result<(), ParseError> { + fn parse_multi_surface_prop(&mut self, lod: u8) -> Result<(), ParseError> { let mut surface_id = None; loop { match self.reader.read_event_into(&mut self.state.buf1) { @@ -383,7 +392,7 @@ impl<'b, R: BufRead> SubTreeReader<'_, 'b, R> { }; let poly_end = self.state.geometry_collector.multipolygon.len(); - geomrefs.push(GeometryRef { + self.geomrefs.push(GeometryRef { ty: geomtype, lod, pos: poly_begin as u32, @@ -417,15 +426,11 @@ impl<'b, R: BufRead> SubTreeReader<'_, 'b, R> { Ok(()) } - fn parse_surface_prop( - &mut self, - geomrefs: &mut GeometryRefs, - lod: u8, - ) -> Result<(), ParseError> { + fn parse_surface_prop(&mut self, lod: u8) -> Result<(), ParseError> { let poly_begin = self.state.geometry_collector.multipolygon.len(); let (surface_id, _) = self.parse_surface()?; let poly_end = self.state.geometry_collector.multipolygon.len(); - geomrefs.push(GeometryRef { + self.geomrefs.push(GeometryRef { ty: GeometryType::Surface, lod, pos: poly_begin as u32, @@ -436,7 +441,7 @@ impl<'b, R: BufRead> SubTreeReader<'_, 'b, R> { Ok(()) } - fn parse_solid_prop(&mut self, geomrefs: &mut GeometryRefs, lod: u8) -> Result<(), ParseError> { + fn parse_solid_prop(&mut self, lod: u8) -> Result<(), ParseError> { let poly_begin = self.state.geometry_collector.multipolygon.len(); let mut surface_id = None; let mut solid_ids = Vec::new(); @@ -447,7 +452,7 @@ impl<'b, R: BufRead> SubTreeReader<'_, 'b, R> { } let poly_end = self.state.geometry_collector.multipolygon.len(); - geomrefs.push(GeometryRef { + self.geomrefs.push(GeometryRef { ty: GeometryType::Solid, lod, pos: poly_begin as u32, @@ -458,11 +463,7 @@ impl<'b, R: BufRead> SubTreeReader<'_, 'b, R> { Ok(()) } - fn parse_multi_geometry( - &mut self, - geomrefs: &mut GeometryRefs, - lod: u8, - ) -> Result<(), ParseError> { + fn parse_multi_geometry(&mut self, lod: u8) -> Result<(), ParseError> { let mut inside_member = false; loop { match self.reader.read_event_into(&mut self.state.buf1) { @@ -472,7 +473,7 @@ impl<'b, R: BufRead> SubTreeReader<'_, 'b, R> { match (nsres, localname.as_ref()) { (Bound(GML31_NS), b"geometryMember") => { inside_member = true; - self.parse_geometry_prop(geomrefs, lod)?; + self.parse_geometry_prop(lod)?; } _ => { return Err(ParseError::SchemaViolation(format!( @@ -501,11 +502,7 @@ impl<'b, R: BufRead> SubTreeReader<'_, 'b, R> { Ok(()) } - fn parse_geometry_prop( - &mut self, - geomrefs: &mut GeometryRefs, - lod: u8, - ) -> Result<(), ParseError> { + fn parse_geometry_prop(&mut self, lod: u8) -> Result<(), ParseError> { let mut surface_id = None; loop { match self.reader.read_event_into(&mut self.state.buf1) { @@ -525,7 +522,7 @@ impl<'b, R: BufRead> SubTreeReader<'_, 'b, R> { let geomtype = match (nsres, localname.as_ref()) { (Bound(GML31_NS), b"MultiGeometry") => { - self.parse_multi_geometry(geomrefs, lod)?; + self.parse_multi_geometry(lod)?; return Ok(()); } (Bound(GML31_NS), b"Solid") => { @@ -581,7 +578,7 @@ impl<'b, R: BufRead> SubTreeReader<'_, 'b, R> { }; let poly_end = self.state.geometry_collector.multipolygon.len(); - geomrefs.push(GeometryRef { + self.geomrefs.push(GeometryRef { ty: geomtype, lod, pos: poly_begin as u32, @@ -615,11 +612,7 @@ impl<'b, R: BufRead> SubTreeReader<'_, 'b, R> { Ok(()) } - fn parse_triangulated_prop( - &mut self, - geomrefs: &mut GeometryRefs, - lod: u8, - ) -> Result<(), ParseError> { + fn parse_triangulated_prop(&mut self, lod: u8) -> Result<(), ParseError> { let poly_begin = self.state.geometry_collector.multipolygon.len(); loop { @@ -651,7 +644,7 @@ impl<'b, R: BufRead> SubTreeReader<'_, 'b, R> { } let poly_end = self.state.geometry_collector.multipolygon.len(); - geomrefs.push(GeometryRef { + self.geomrefs.push(GeometryRef { ty: GeometryType::Triangle, lod, pos: poly_begin as u32, @@ -972,7 +965,7 @@ impl<'b, R: BufRead> SubTreeReader<'_, 'b, R> { .add_interior_ring(iter, ring_id.take()); } } - Ok(_) => (), + Ok(_) => {} Err(e) => return Err(e.into()), } } diff --git a/nusamai-czml/Cargo.toml b/nusamai-czml/Cargo.toml index d7ce7957c..a141d5740 100644 --- a/nusamai-czml/Cargo.toml +++ b/nusamai-czml/Cargo.toml @@ -9,10 +9,10 @@ rust-version.workspace = true version.workspace = true [dependencies] -chrono = {workspace = true, features = ["serde"]} -nusamai-geometry = {path = "../nusamai-geometry"} -serde = {workspace = true, features = ["derive"]} -serde_json = {workspace = true, features = ["float_roundtrip"]} +chrono = { workspace = true, features = ["serde"] } +nusamai-geometry = { path = "../nusamai-geometry" } +serde = { workspace = true, features = ["derive"] } +serde_json = { workspace = true, features = ["float_roundtrip"] } [dev-dependencies] glob = "0.3.1" diff --git a/nusamai-geojson/Cargo.toml b/nusamai-geojson/Cargo.toml index 11444cdb1..160cb578d 100644 --- a/nusamai-geojson/Cargo.toml +++ b/nusamai-geojson/Cargo.toml @@ -12,5 +12,5 @@ version.workspace = true [dependencies] geojson = "0.24.1" -nusamai-geometry = {path = "../nusamai-geometry"} -serde_json = {workspace = true, features = ["indexmap"]} +nusamai-geometry = { path = "../nusamai-geometry" } +serde_json = { workspace = true, features = ["indexmap"] } diff --git a/nusamai-geometry/Cargo.toml b/nusamai-geometry/Cargo.toml index c19d81343..edf43af20 100644 --- a/nusamai-geometry/Cargo.toml +++ b/nusamai-geometry/Cargo.toml @@ -10,12 +10,12 @@ version.workspace = true [dependencies] num-traits = "0.2.19" -serde = {workspace = true, features = ["derive"], optional = true} +serde = { workspace = true, features = ["derive"], optional = true } [dev-dependencies] geo-types = "0.7.13" geojson = "0.24.1" indexmap.workspace = true -serde = {workspace = true, features = ["derive"]} +serde = { workspace = true, features = ["derive"] } serde_json.workspace = true thiserror.workspace = true diff --git a/nusamai-gltf/Cargo.toml b/nusamai-gltf/Cargo.toml index 48db67529..6988bd6c2 100644 --- a/nusamai-gltf/Cargo.toml +++ b/nusamai-gltf/Cargo.toml @@ -12,11 +12,11 @@ version.workspace = true [dependencies] byteorder = "1.5.0" -clap = {version = "4.5.4", features = ["derive"]} +clap = { version = "4.5.4", features = ["derive"] } earcut = "0.4" indexmap.workspace = true -nusamai-geometry = {path = "../nusamai-geometry"} -nusamai-gltf-json = {"path" = "nusamai-gltf-json"} +nusamai-geometry = { path = "../nusamai-geometry" } +nusamai-gltf-json = { "path" = "nusamai-gltf-json" } quick-xml.workspace = true serde_json.workspace = true thiserror.workspace = true diff --git a/nusamai-gpkg/Cargo.toml b/nusamai-gpkg/Cargo.toml index 3489405bd..56da67ef2 100644 --- a/nusamai-gpkg/Cargo.toml +++ b/nusamai-gpkg/Cargo.toml @@ -9,11 +9,11 @@ rust-version.workspace = true version.workspace = true [dependencies] -sqlx = { version = "0.8.0", features = ["sqlite", "runtime-tokio"] } +indexmap.workspace = true nusamai-geometry = { path = "../nusamai-geometry" } +sqlx = { version = "0.8.0", features = ["runtime-tokio", "sqlite"] } thiserror.workspace = true url.workspace = true -indexmap.workspace = true [dev-dependencies] tokio = { version = "1.36", features = ["full"] } diff --git a/nusamai-plateau/Cargo.toml b/nusamai-plateau/Cargo.toml index 211fad806..0b1947957 100644 --- a/nusamai-plateau/Cargo.toml +++ b/nusamai-plateau/Cargo.toml @@ -13,21 +13,21 @@ default = ["serde"] serde = ["dep:serde"] [dependencies] -chrono = {workspace = true, features = ["serde"]} -hashbrown = {version = "0.14.5", features = ["serde"]} +chrono = { workspace = true, features = ["serde"] } +hashbrown = { version = "0.14.5", features = ["serde"] } indexmap.workspace = true log.workspace = true -nusamai-citygml = {path = "../nusamai-citygml", features = ["serde"]} -nusamai-geometry = {path = "../nusamai-geometry"} +nusamai-citygml = { path = "../nusamai-citygml", features = ["serde"] } +nusamai-geometry = { path = "../nusamai-geometry" } quick-xml.workspace = true -serde = {workspace = true, features = ["derive", "rc"], optional = true} +serde = { workspace = true, features = ["derive", "rc"], optional = true } serde_json.workspace = true stretto = "0.8.4" url.workspace = true [dev-dependencies] -bincode = {version = "2.0.0-rc.3", default-features = false, features = ["std", "serde"]} -clap = {version = "4.5.13", features = ["derive"]} +bincode = { version = "2.0.0-rc.3", default-features = false, features = ["serde", "std"] } +clap = { version = "4.5.13", features = ["derive"] } lz4_flex = "0.11.3" -serde = {workspace = true, features = ["derive"]} -zstd = {version = "0.13.2", features = ["zdict_builder"]} +serde = { workspace = true, features = ["derive"] } +zstd = { version = "0.13.2", features = ["zdict_builder"] } diff --git a/nusamai-plateau/src/entity.rs b/nusamai-plateau/src/entity.rs index 78e8c3885..0ab6e0367 100644 --- a/nusamai-plateau/src/entity.rs +++ b/nusamai-plateau/src/entity.rs @@ -23,4 +23,6 @@ pub struct Entity { pub appearance_store: Arc>, /// Bounded by pub bounded: GeometryRefs, + + pub geometry_refs: GeometryRefs, }