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

3D Tilesのglbファイルをgzipで圧縮した状態で表示するオプションを追加 #672

Merged
merged 4 commits into from
Oct 23, 2024

Conversation

nokonoko1203
Copy link
Collaborator

Close #665

What I did(変更内容)

  • gzipで圧縮するオプションを追加した
  • 拡張子は変更なしで「.glb」のまま
  • そのままではCesiumで読み込めない(配信サーバーでヘッダーを付与する必要がある)ことをマニュアルに追記する必要がある

Notes(連絡事項)

None / なし

Copy link

coderabbitai bot commented Oct 23, 2024

Walkthrough

このプルリクエストでは、GLBデータのgzip圧縮を制御するための新しいブールパラメータgzip_compresswrite_gltf_glb関数に追加しました。また、CesiumTilesSinkProvider構造体にもgzipというオプションパラメータを追加し、関連するメソッドを更新しました。これにより、GLBファイルの出力時にgzip圧縮を適用するかどうかを指定できるようになりました。さらに、limit_texture_resolution_parameter関数内のラベルを簡素化しました。

Changes

ファイルパス 変更概要
nusamai/src/sink/cesiumtiles/gltf.rs write_gltf_glb関数にgzip_compressパラメータを追加し、GLBデータの書き込み時にgzip圧縮を条件付きで使用するように変更。flate2クレートをインポート。
nusamai/src/sink/cesiumtiles/mod.rs CesiumTilesSinkProvider構造体にgzipパラメータを追加し、関連メソッドを更新。CesiumTilesSink構造体にgzip_compressフィールドを追加。tile_writing_stage関数を更新。
nusamai/src/sink/option.rs limit_texture_resolution_parameter関数内のラベルを簡素化。
nusamai-plateau/src/models/mod.rs 新しい列挙型TopLevelCityObjectを追加し、都市関連の構造体を統合。

Assessment against linked issues

目的 対応状況 説明
gzip圧縮を使用して出力する機能の追加 (#665)

Possibly related PRs

Suggested labels

Transformer

Suggested reviewers

  • ciscorn

うさぎの詩
ぴょんぴょん跳ねて、
新しい圧縮、
GLBが軽く、
みんなで楽しもう、
gzipの魔法、
うさぎも大喜び! 🐇✨


📜 Recent review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Files that changed from the base of the PR and between 2813fcb and b78702f.

📒 Files selected for processing (1)
  • nusamai-plateau/src/models/mod.rs (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • nusamai-plateau/src/models/mod.rs

🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Outside diff range and nitpick comments (3)
nusamai/src/sink/option.rs (1)

29-29: ラベルの具体性について検討してください

ラベルをシンプルにすることは良いアプローチですが、以下の2点について再考をお願いします:

  1. 距離の単位(メートル)を明示することで、ユーザーにとってより分かりやすくなります
  2. "テクスチャの" という文言を残すことで、何の解像度を制限するのかが明確になります

提案する修正:

-            label: Some("距離あたりの解像度を制限する".into()),
+            label: Some("距離(メートル)あたりのテクスチャの解像度を制限する".into()),
nusamai/src/sink/cesiumtiles/gltf.rs (1)

Line range hint 1-303: セキュリティとパフォーマンスに関する考慮事項

  1. メモリ使用量:

    • 大きなGLBファイルを処理する際のメモリ使用量を考慮する必要があります
    • bin_contentをストリーミング処理することを検討してください
  2. 圧縮処理:

    • 大きなファイルの圧縮は時間がかかる可能性があります
    • プログレス表示の追加を検討してください

これらの問題に対処するために、以下を推奨します:

  1. ストリーミング処理の実装
  2. プログレス表示の追加
  3. メモリ使用量の最適化

必要であれば、これらの改善案の具体的な実装例を提供できます。

nusamai/src/sink/cesiumtiles/mod.rs (1)

Line range hint 1-766: アーキテクチャに関する提案

大規模なデータセットを扱う場合、以下の点について検討することをお勧めします:

  1. 圧縮レベルを設定可能にする
  2. プログレッシブ読み込みの実装
  3. キャッシュ戦略の最適化
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Files that changed from the base of the PR and between 3da4084 and 4215f82.

📒 Files selected for processing (3)
  • nusamai/src/sink/cesiumtiles/gltf.rs (3 hunks)
  • nusamai/src/sink/cesiumtiles/mod.rs (7 hunks)
  • nusamai/src/sink/option.rs (1 hunks)
🧰 Additional context used
🔇 Additional comments (5)
nusamai/src/sink/cesiumtiles/gltf.rs (2)

5-5: 新しい依存関係の追加を確認

flate2クレートの追加は適切です。標準的なgzip圧縮ライブラリとして広く使用されており、安定性も実績もあります。


28-28: 関数シグネチャの変更は後方互換性に影響を与える可能性があります

新しいパラメータgzip_compressの追加により、この関数を呼び出している既存のコードに影響を与える可能性があります。

以下のスクリプトで、この関数の呼び出し箇所を確認してください:

nusamai/src/sink/cesiumtiles/mod.rs (3)

98-106: パラメータの定義が適切です

パラメータの定義は明確で、デフォルト値も適切に設定されています。


124-124: 構造体のフィールド追加が適切です

gzip_compressフィールドの追加と初期化が正しく実装されています。

Also applies to: 131-131, 142-142


344-344: gzip圧縮の実装に関する確認が必要です

圧縮機能は正しく実装されていますが、以下の点について確認をお願いします:

  1. サーバー側の設定(Content-Encodingヘッダー)が必要です
  2. 圧縮による影響(パフォーマンス、メモリ使用量)を考慮する必要があります

Also applies to: 725-725

✅ Verification successful

Let me analyze the results and generate additional verification scripts to check the implementation details.


Let me generate one final verification script to check the gzip implementation details more thoroughly.


gzip圧縮の実装は適切に行われています

コードベースの分析結果から、以下の点が確認できました:

  • flate2クレートを使用して適切なgzip圧縮が実装されています
  • 圧縮レベルはデフォルト設定を使用しており、一般的なユースケースに適しています
  • GLTFデータに対して8バイトアラインメントを保持しながら圧縮を行っています

ただし、以下の点についてはアプリケーション側で対応が必要です:

  • Content-Encodingヘッダーの設定(Content-Encoding: gzip
  • 圧縮されたデータを配信するWebサーバーの設定
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check if there are any existing gzip implementations or configurations
# Test: Search for gzip-related code and configurations
rg -i "gzip|compress" --type rust

Length of output: 6830


Script:

#!/bin/bash
# Check the gzip implementation in cesiumtiles
ast-grep --pattern 'fn $_($$$ gzip_compress: $_) {
  $$$
}'

Length of output: 61


Script:

#!/bin/bash
# Check for Content-Encoding header handling
rg -i "content.*encoding" --type rust

Length of output: 39


Script:

#!/bin/bash
# Check for performance/memory related configurations
rg -i "performance|memory|buffer" --type rust nusamai/src/sink/cesiumtiles/

Length of output: 8666


Script:

#!/bin/bash
# Check the specific gzip implementation in gltf.rs
rg -A 10 "if gzip_compress" nusamai/src/sink/cesiumtiles/gltf.rs

Length of output: 449

Comment on lines +286 to +303
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)?;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

圧縮処理の実装について改善の提案

圧縮処理の実装は機能的には問題ありませんが、以下の改善点を提案します:

  1. エラーハンドリングの強化
  2. 圧縮レベルの設定オプションの追加
  3. コードの重複を減らす

以下のような実装を提案します:

-    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)?;
-    }
+    let glb = nusamai_gltf::glb::Glb {
+        json: serde_json::to_vec(&gltf).map_err(|e| PipelineError::SerializationError(e.to_string()))?.into(),
+        bin: Some(bin_content.into()),
+    };
+
+    let mut writer = if gzip_compress {
+        Box::new(GzEncoder::new(writer, Compression::default())) as Box<dyn Write>
+    } else {
+        Box::new(writer) as Box<dyn Write>
+    };
+
+    glb.to_writer_with_alignment(&mut writer, 8)?;
+
+    if gzip_compress {
+        writer.flush()?;
+    }

この改善により:

  • エラーハンドリングが強化されます
  • コードの重複が減ります
  • より明確な制御フローになります
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
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)?;
let glb = nusamai_gltf::glb::Glb {
json: serde_json::to_vec(&gltf).map_err(|e| PipelineError::SerializationError(e.to_string()))?.into(),
bin: Some(bin_content.into()),
};
let mut writer = if gzip_compress {
Box::new(GzEncoder::new(writer, Compression::default())) as Box<dyn Write>
} else {
Box::new(writer) as Box<dyn Write>
};
glb.to_writer_with_alignment(&mut writer, 8)?;
if gzip_compress {
writer.flush()?;
}

Copy link

codecov bot commented Oct 23, 2024

Codecov Report

Attention: Patch coverage is 74.19355% with 8 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
nusamai/src/sink/cesiumtiles/gltf.rs 46.66% 8 Missing ⚠️
Additional details and impacted files
Components Coverage Δ
GUI ∅ <ø> (∅)
Backend 74.20% <74.19%> (-0.02%) ⬇️
Libraries 89.51% <ø> (ø)

📢 Thoughts on this report? Let us know!

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Outside diff range and nitpick comments (1)
nusamai/src/sink/cesiumtiles/gltf.rs (1)

29-29: 関数シグネチャの変更について

gzip_compressパラメータの追加は適切ですが、以下の点について検討が必要です:

  1. デフォルト値の設定
  2. ドキュメンテーションコメントの追加

以下のような修正を提案します:

+/// GLTFデータをGLBファイルとして書き出します。
+/// 
+/// # Arguments
+/// 
+/// * `gzip_compress` - trueの場合、出力をgzip圧縮します。この機能を使用する場合、
+///                     サーバー側で適切なContent-Encodingヘッダーの設定が必要です。
pub fn write_gltf_glb<W: Write>(
    feedback: &feedback::Feedback,
    writer: W,
    translation: [f64; 3],
    vertices: impl IntoIterator<Item = [u32; 9]>,
    primitives: Primitives,
    num_features: usize,
    metadata_encoder: MetadataEncoder,
-    gzip_compress: bool,
+    gzip_compress: bool = false,
) -> Result<(), PipelineError>
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Files that changed from the base of the PR and between 4215f82 and a2f2c2f.

📒 Files selected for processing (1)
  • nusamai/src/sink/cesiumtiles/gltf.rs (4 hunks)
🧰 Additional context used
🔇 Additional comments (2)
nusamai/src/sink/cesiumtiles/gltf.rs (2)

5-5: 新しい依存関係の追加を確認

flate2クレートの追加は適切です。gzip圧縮の実装に必要な最小限の機能を提供する標準的なクレートを選択しています。


287-304: ⚠️ Potential issue

圧縮処理の実装について

以前のレビューコメントで指摘された問題点が解決されていません。現在の実装には以下の課題があります:

  1. エラーハンドリングが不十分(unwrap()の使用)
  2. コードの重複
  3. 圧縮レベルのカスタマイズオプションがない

以前提案された実装を日本語でより詳しく説明します:

-    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)?;
-    }
+    // GLBデータの構築
+    let glb = nusamai_gltf::glb::Glb {
+        json: serde_json::to_vec(&gltf)
+            .map_err(|e| PipelineError::SerializationError(e.to_string()))?.into(),
+        bin: Some(bin_content.into()),
+    };
+
+    // 書き込み先の設定(圧縮あり/なし)
+    let mut writer = if gzip_compress {
+        Box::new(GzEncoder::new(writer, Compression::default())) as Box<dyn Write>
+    } else {
+        Box::new(writer) as Box<dyn Write>
+    };
+
+    // GLBデータの書き込み
+    glb.to_writer_with_alignment(&mut writer, 8)?;
+
+    // 圧縮ストリームの完了処理
+    if gzip_compress {
+        writer.flush()?;
+    }

この改善により:

  1. unwrap()を適切なエラーハンドリングに置き換え
  2. GLBデータの構築を一箇所にまとめてコードの重複を削減
  3. より明確な処理フローを実現

将来的な拡張として、圧縮レベルを設定できるようにすることも検討してください。

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Outside diff range and nitpick comments (2)
nusamai-plateau/src/models/mod.rs (2)

Line range hint 34-121: バリアント名の命名規則の一貫性を確認してください

TopLevelCityObjectのバリアント名が非常に長く、一部で命名規則が一貫していない可能性があります。可読性とメンテナンス性を向上させるため、命名規則を統一することを検討してください。


Line range hint 122-124: バリアント名の混乱を避けるための命名を検討してください

WaterwayZoneWaterwayというバリアントがありますが、名前が類似しており混乱を招く可能性があります。例えば、UroWaterwayUrfWaterwayなど、モジュールに基づいた明確な名前に変更することを検討してください。

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Files that changed from the base of the PR and between a2f2c2f and 2813fcb.

📒 Files selected for processing (1)
  • nusamai-plateau/src/models/mod.rs (1 hunks)
🧰 Additional context used

Comment on lines 32 to 33
#[allow(clippy::large_enum_variant)]
#[citygml_property(name = "_:TopLevelFeatureProperty")]
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

大きなenumによるパフォーマンスへの影響を考慮してください

#[allow(clippy::large_enum_variant)]が使用されていますが、大きなバリアントを含むenumはメモリ消費量が増加し、パフォーマンスに影響を与える可能性があります。大きなバリアントをBoxで包むことで、enumのサイズを小さく抑えることができます。

@nokonoko1203 nokonoko1203 merged commit 8377f80 into main Oct 23, 2024
9 checks passed
@nokonoko1203 nokonoko1203 deleted the feature/gzip-3d-tiles branch October 23, 2024 12:03
@coderabbitai coderabbitai bot mentioned this pull request Oct 23, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3dtiles: gzipでの圧縮
1 participant