Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Add geometry_refs field to Entity struct #17

Merged
merged 1 commit into from
Aug 15, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions .taplo.toml
Original file line number Diff line number Diff line change
@@ -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
18 changes: 9 additions & 9 deletions nusamai-citygml/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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"] }
2 changes: 1 addition & 1 deletion nusamai-citygml/macros/src/derive.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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),
});
};

Expand Down
77 changes: 35 additions & 42 deletions nusamai-citygml/src/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ pub enum ParseError {

pub struct CityGmlReader<'a> {
state: InternalState<'a>,
geomrefs: GeometryRefs,
}

struct InternalState<'a> {
Expand Down Expand Up @@ -108,6 +109,7 @@ impl<'a> CityGmlReader<'a> {
pub fn new(context: ParseContext<'a>) -> Self {
Self {
state: InternalState::new(context),
geomrefs: Vec::new(),
}
}

Expand All @@ -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)) => {
Expand All @@ -132,6 +135,7 @@ impl<'a> CityGmlReader<'a> {
reader,
state,
path_start: 0,
geomrefs,
});
}
Ok(Event::Eof) => {
Expand All @@ -150,9 +154,18 @@ pub struct SubTreeReader<'a, 'b, R> {
reader: &'a mut quick_xml::NsReader<R>,
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<R>) -> Result<(), ParseError>,
Expand All @@ -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)
}
Expand Down Expand Up @@ -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()?;
Expand All @@ -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) {
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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,
Expand All @@ -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();
Expand All @@ -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,
Expand All @@ -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) {
Expand All @@ -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!(
Expand Down Expand Up @@ -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) {
Expand All @@ -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") => {
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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()),
}
}
Expand Down
8 changes: 4 additions & 4 deletions nusamai-czml/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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"
4 changes: 2 additions & 2 deletions nusamai-geojson/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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"] }
4 changes: 2 additions & 2 deletions nusamai-geometry/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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
6 changes: 3 additions & 3 deletions nusamai-gltf/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions nusamai-gpkg/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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"] }
18 changes: 9 additions & 9 deletions nusamai-plateau/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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"] }
2 changes: 2 additions & 0 deletions nusamai-plateau/src/entity.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,6 @@ pub struct Entity {
pub appearance_store: Arc<RwLock<AppearanceStore>>,
/// Bounded by
pub bounded: GeometryRefs,

pub geometry_refs: GeometryRefs,
}