From 8377f805d2da82b5ce156bbf7953b68011803341 Mon Sep 17 00:00:00 2001 From: Satoru Nishio <31245655+nokonoko1203@users.noreply.github.com> Date: Wed, 23 Oct 2024 21:03:21 +0900 Subject: [PATCH] =?UTF-8?q?3D=20Tiles=E3=81=AEglb=E3=83=95=E3=82=A1?= =?UTF-8?q?=E3=82=A4=E3=83=AB=E3=82=92gzip=E3=81=A7=E5=9C=A7=E7=B8=AE?= =?UTF-8?q?=E3=81=97=E3=81=9F=E7=8A=B6=E6=85=8B=E3=81=A7=E8=A1=A8=E7=A4=BA?= =?UTF-8?q?=E3=81=99=E3=82=8B=E3=82=AA=E3=83=97=E3=82=B7=E3=83=A7=E3=83=B3?= =?UTF-8?q?=E3=82=92=E8=BF=BD=E5=8A=A0=20(#672)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Close #665 ### What I did(変更内容) - gzipで圧縮するオプションを追加した - 拡張子は変更なしで「.glb」のまま - そのままではCesiumで読み込めない(配信サーバーでヘッダーを付与する必要がある)ことをマニュアルに追記する必要がある ### Notes(連絡事項) None / なし --- nusamai-plateau/src/models/mod.rs | 2 +- nusamai/src/sink/cesiumtiles/gltf.rs | 26 +++++++++++++++++++++----- nusamai/src/sink/cesiumtiles/mod.rs | 16 ++++++++++++++++ nusamai/src/sink/option.rs | 2 +- 4 files changed, 39 insertions(+), 7 deletions(-) diff --git a/nusamai-plateau/src/models/mod.rs b/nusamai-plateau/src/models/mod.rs index d478cf4ed..d9f54bcd9 100644 --- a/nusamai-plateau/src/models/mod.rs +++ b/nusamai-plateau/src/models/mod.rs @@ -308,7 +308,7 @@ pub enum TopLevelCityObject { #[citygml(path = b"urf:TideFacility")] TideFacility(urf::TideFacility), #[citygml(path = b"urf:TrafficFacility")] - TrafficFacility(urf::TrafficFacility), + TrafficFacility(Box), #[citygml(path = b"urf:TreatmentFacility")] TreatmentFacility(urf::TreatmentFacility), #[citygml(path = b"urf:TreePlantingDistrict")] diff --git a/nusamai/src/sink/cesiumtiles/gltf.rs b/nusamai/src/sink/cesiumtiles/gltf.rs index 5e7bbbf45..d711c72f5 100644 --- a/nusamai/src/sink/cesiumtiles/gltf.rs +++ b/nusamai/src/sink/cesiumtiles/gltf.rs @@ -2,6 +2,7 @@ use std::io::Write; use ahash::{HashMap, HashSet}; use byteorder::{ByteOrder, LittleEndian}; +use flate2::{write::GzEncoder, Compression}; use indexmap::IndexSet; use nusamai_gltf_json::extensions::mesh::ext_mesh_features; @@ -16,6 +17,7 @@ pub struct PrimitiveInfo { pub type Primitives = HashMap; +#[allow(clippy::too_many_arguments)] pub fn write_gltf_glb( feedback: &feedback::Feedback, writer: W, @@ -24,6 +26,7 @@ pub fn write_gltf_glb( primitives: Primitives, num_features: usize, metadata_encoder: MetadataEncoder, + gzip_compress: bool, ) -> Result<(), PipelineError> { use nusamai_gltf_json::*; @@ -281,12 +284,25 @@ pub fn write_gltf_glb( ..Default::default() }; - // Write glb to the writer - nusamai_gltf::glb::Glb { - json: serde_json::to_vec(&gltf).unwrap().into(), - bin: Some(bin_content.into()), + if gzip_compress { + // Write glb to the writer with gzip compression + let mut encoder = GzEncoder::new(writer, Compression::default()); + + nusamai_gltf::glb::Glb { + json: serde_json::to_vec(&gltf).unwrap().into(), + bin: Some(bin_content.into()), + } + .to_writer_with_alignment(&mut encoder, 8)?; + + encoder.finish()?; + } else { + // Write glb to the writer + nusamai_gltf::glb::Glb { + json: serde_json::to_vec(&gltf).unwrap().into(), + bin: Some(bin_content.into()), + } + .to_writer_with_alignment(writer, 8)?; } - .to_writer_with_alignment(writer, 8)?; Ok(()) } diff --git a/nusamai/src/sink/cesiumtiles/mod.rs b/nusamai/src/sink/cesiumtiles/mod.rs index 85cddb8ab..6d1db01a3 100644 --- a/nusamai/src/sink/cesiumtiles/mod.rs +++ b/nusamai/src/sink/cesiumtiles/mod.rs @@ -95,6 +95,15 @@ impl DataSinkProvider for CesiumTilesSinkProvider { }, }); params.define(limit_texture_resolution_parameter(false)); + params.define(ParameterDefinition { + key: "gzip".into(), + entry: ParameterEntry { + description: "gzip compress".into(), + required: false, + parameter: ParameterType::Boolean(BooleanParameter { value: Some(false) }), + label: Some("gzipで圧縮する".into()), + }, + }); params } @@ -112,12 +121,14 @@ impl DataSinkProvider for CesiumTilesSinkProvider { let max_z = get_parameter_value!(params, "max_z", Integer).unwrap() as u8; let limit_texture_resolution = *get_parameter_value!(params, "limit_texture_resolution", Boolean); + let gzip_compress = *get_parameter_value!(params, "gzip", Boolean); let transform_settings = self.transformer_options(); Box::::new(CesiumTilesSink { output_path: output_path.as_ref().unwrap().into(), transform_settings, limit_texture_resolution, + gzip_compress, min_z, max_z, }) @@ -128,6 +139,7 @@ struct CesiumTilesSink { output_path: PathBuf, transform_settings: TransformerRegistry, limit_texture_resolution: Option, + gzip_compress: Option, min_z: u8, max_z: u8, } @@ -157,6 +169,7 @@ impl DataSink for CesiumTilesSink { let max_zoom = self.max_z; let limit_texture_resolution = self.limit_texture_resolution; + let gzip_compress = self.gzip_compress; // TODO: refactoring @@ -205,6 +218,7 @@ impl DataSink for CesiumTilesSink { tile_id_conv, schema, limit_texture_resolution, + gzip_compress, ) { feedback.fatal_error(error); } @@ -327,6 +341,7 @@ fn tile_writing_stage( tile_id_conv: TileIdMethod, schema: &Schema, limit_texture_resolution: Option, + gzip_compress: Option, ) -> Result<()> { let ellipsoid = nusamai_projection::ellipsoid::wgs84(); let contents: Arc>> = Default::default(); @@ -707,6 +722,7 @@ fn tile_writing_stage( primitives, features.len(), metadata_encoder, + gzip_compress.unwrap_or_default(), )?; Ok::<(), PipelineError>(()) diff --git a/nusamai/src/sink/option.rs b/nusamai/src/sink/option.rs index d7631d7f8..d4bad44f9 100644 --- a/nusamai/src/sink/option.rs +++ b/nusamai/src/sink/option.rs @@ -26,7 +26,7 @@ pub fn limit_texture_resolution_parameter(default_value: bool) -> ParameterDefin parameter: ParameterType::Boolean(BooleanParameter { value: Some(default_value), }), - label: Some("距離(メートル)あたりのテクスチャの解像度を制限する".into()), + label: Some("距離あたりの解像度を制限する".into()), }, } }