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

3dtiles: structural metadata のエンコーダ #393

Merged
merged 5 commits into from
Mar 8, 2024

Conversation

ciscorn
Copy link
Member

@ciscorn ciscorn commented Mar 6, 2024

Tasks

  • 3D Metadata Spec の Schema と Property tables を組む仕組み
  • Code type を ENUM にエンコードする
  • STRING (stringOffset) に対応する
  • (STRING以外で) array (arrayOffset) に対応する
  • STRING + array (arrayOffset) に対応する
  • noData 値を適当に設定

既知の問題

stractural metadata

Close #376

Summary by CodeRabbit

  • 新機能
    • Rust Analyzerの保存時チェック機能を無効にする設定を追加しました。
    • 構造メタデータのためのmetadata_encoderを使用して、ダミーメタデータの生成を置き換えました。
    • 特徴属性を特定の形式にエンコードするモジュールを追加しました。
    • メタデータエンコーディングプロセスに新しい機能とデータ構造を追加しました。
    • 可変バイトベクターを指定されたアライメントにパディングする新しい公開関数add_paddingを追加しました。
  • バグ修正
    • 多角形のリング長を比較するネストされたループを削除し、ApplyAppearanceTransform実装内の処理ロジックに影響を与えました。
  • リファクタ
    • 複数のファイルでインポートの再編成、関数への新しいパラメーターの追加、バッファーとアクセサーの命名と扱いの更新、コードの構造と可読性の向上、およびメタデータエンコーディングプロセスのリファクタリングを行いました。
  • スタイル
    • Image構造体の実装を変更して、BufferView作成プロセス内でnameフィールドを"image"に設定しました。
  • 機能改善
    • DataRequirements構造体のkey_valueフィールドをKeyValueSpec::JsonifyObjectsAndArraysに変更しました。
    • KeyValueSpec列挙型を精緻化して、ネストされたオブジェクトと配列の変換に影響を与えるJsonifyObjectsAndArraysJsonifyObjectsを区別しました。

@ciscorn ciscorn marked this pull request as draft March 6, 2024 02:20
Copy link

coderabbitai bot commented Mar 6, 2024

Walkthrough

この変更は、Rust Analyzerのcheck on save機能無効化設定を導入しました。nusamaiプロジェクト内では、cesiumtilesモジュールでGLTFファイル処理とメタデータの強化が行われ、EXT_structural_metadataへの属性情報エンコード機能が追加されました。JSON変換の改善とコードの可読性向上が行われました。

Changes

ファイルパス 変更概要
.vscode/settings.json Rust Analyzerのcheck on save機能無効化設定を追加
nusamai/src/sink/cesiumtiles/... GLTF/GLBの書き込みやメタデータエンコーディングの改善、新機能の追加
nusamai/src/sink/mod.rs DataRequirements構造体のkey_valueフィールド変更
nusamai/src/transformer/... KeyValueSpecの挙動洗練とJSON変換ロジックの更新

Assessment against linked issues

Objective Addressed Explanation
3dtiles: 属性情報 (EXT_structural_metadata) のエンコーダ

Poem

うさぎが跳ねる、コードの海を
データの森を、軽やかに
メタデータを編む、繊細な手
変わりゆく世界、彩るため
🌟✨🐇✨🌟
さあ、新しい旅が、今、始まる


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>.
    • Generate unit-tests 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 tests 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 generate interesting stats about this repository and render them as a table.
    • @coderabbitai show all the console.log statements in this repository.
    • @coderabbitai read src/utils.ts and generate unit tests.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

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 as PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger a review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai help to get help.

Additionally, you can add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.

CodeRabbit Configration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • The JSON schema for the configuration file is available here.
  • 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/coderabbit-overrides.v2.json

CodeRabbit Discord Community

Join our Discord Community to get help, request features, and share feedback.

Copy link

codecov bot commented Mar 6, 2024

Codecov Report

Attention: Patch coverage is 87.94326% with 51 lines in your changes are missing coverage. Please review.

Files Patch % Lines
nusamai/src/sink/cesiumtiles/metadata/mod.rs 87.53% 43 Missing ⚠️
nusamai/src/sink/cesiumtiles/mod.rs 82.35% 6 Missing ⚠️
nusamai/src/sink/cesiumtiles/material.rs 0.00% 1 Missing ⚠️
nusamai/src/transformer/transform/jsonify.rs 95.00% 1 Missing ⚠️
Additional details and impacted files
Components Coverage Δ
GUI ∅ <ø> (∅)
Backend 87.88% <87.94%> (-0.08%) ⬇️
Libraries 91.24% <ø> (ø)

📢 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.

Review Status

Actionable comments generated: 0

Configuration used: CodeRabbit UI

Commits Files that changed from the base of the PR and between 30c6b23 and f9adce6.
Files selected for processing (10)
  • .vscode/settings.json (1 hunks)
  • nusamai/src/sink/cesiumtiles/gltf.rs (12 hunks)
  • nusamai/src/sink/cesiumtiles/material.rs (1 hunks)
  • nusamai/src/sink/cesiumtiles/metadata/mod.rs (1 hunks)
  • nusamai/src/sink/cesiumtiles/mod.rs (6 hunks)
  • nusamai/src/sink/cesiumtiles/utils.rs (1 hunks)
  • nusamai/src/sink/mod.rs (1 hunks)
  • nusamai/src/transformer/builder.rs (2 hunks)
  • nusamai/src/transformer/transform/appearance.rs (2 hunks)
  • nusamai/src/transformer/transform/jsonify.rs (2 hunks)
Files skipped from review due to trivial changes (1)
  • .vscode/settings.json
Additional comments: 14
nusamai/src/sink/cesiumtiles/utils.rs (1)
  • 36-40: add_padding関数の実装は正しいですが、大きなバッファに対してこの関数を頻繁に使用する場合、パフォーマンスに影響を与える可能性があります。特に、resizeメソッドは追加される要素数に比例して時間がかかるため、大量のデータを扱う場合は注意が必要です。
nusamai/src/sink/mod.rs (1)
  • 74-74: DataRequirements構造体のkey_valueフィールドの変更は、データ変換の柔軟性を高めるための良い改善です。ただし、この変更が他のモジュールやデータ変換のロジックにどのように影響するかを確認する必要があります。
nusamai/src/transformer/transform/jsonify.rs (1)
  • 8-24: JsonifyTransform構造体に追加されたjsonify_arrayフィールドは、配列の要素をJSON文字列に変換するかどうかを制御するための良い改善です。ただし、この変更がデータ変換の結果にどのように影響するかを確認する必要があります。
Verification successful

JsonifyTransform構造体に追加されたjsonify_arrayフィールドは、配列の要素を条件付きでJSON文字列に変換する機能を提供します。この変更は、JsonifyTransformが実装するTransformトレイトのtransformメソッドにおいて、意図した通りに機能していることが確認されました。したがって、この変更はデータ変換の柔軟性を高めるための良い改善であると言えます。

Scripts Executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# `JsonifyTransform`を使用している他の場所を検索します。
rg "JsonifyTransform"

Length of output: 584



Script:

#!/bin/bash
# `JsonifyTransform`が実装する`Transform`トレイトのメソッドを確認します。
rg "impl Transform for JsonifyTransform" -A 10

Length of output: 1125

nusamai/src/sink/cesiumtiles/material.rs (1)
  • 90-90: Image構造体のto_gltfメソッドでBufferViewnameフィールドに"image"を設定する変更は、GLTFファイルの可読性を向上させるための良い改善です。
nusamai/src/transformer/builder.rs (1)
  • 80-83: KeyValueSpec列挙型にJsonifyObjectsAndArraysJsonifyObjectsの区別が追加されたことは、データ変換の柔軟性を高めるための良い改善です。ただし、この変更がデータ変換の結果にどのように影響するかを確認する必要があります。
Verification successful

KeyValueSpec列挙型にJsonifyObjectsAndArraysJsonifyObjectsの区別が追加されたことは、データ変換の柔軟性を高め、特定のシンクでのデータの扱いを改善するための適切な改善です。nusamai/src/transformer/builder.rsおよびsinkモジュール内でのKeyValueSpecの使用方法を調査した結果、この変更がコードベースに適切に統合されていることが確認されました。

Scripts Executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# `KeyValueSpec`を使用している他の場所を検索します。
rg "KeyValueSpec"

Length of output: 833



Script:

#!/bin/bash
# `nusamai/src/transformer/builder.rs`内で`KeyValueSpec`の使用方法を調査
rg "KeyValueSpec" nusamai/src/transformer/builder.rs --context 5

# `sink`モジュール内で`KeyValueSpec`の使用方法を調査
rg "KeyValueSpec" nusamai/src/sink/ --context 5

Length of output: 4438

nusamai/src/sink/cesiumtiles/gltf.rs (1)
  • 117-125: > 📝 NOTE

This review was outside the diff hunks and was mapped to the diff hunk with the greatest overlap. Original lines [23-246]

write_gltf_glb関数にmetadata_encoderパラメータが追加されたことは、構造メタデータの処理を改善するための良い改善です。ただし、この変更がGLTFファイルの生成にどのように影響するかを確認する必要があります。

Verification successful

write_gltf_glb関数の使用箇所を確認した結果、この関数はnusamai/src/sink/cesiumtiles/mod.rs内のtile_writing_stage関数から呼び出されています。この関数は、タイルごとにGLTFファイルを生成するために使用されており、metadata_encoderパラメータの追加により、メタデータのエンコーディングが可能になっています。これにより、生成されるGLTFファイルに構造メタデータを含めることができ、より詳細な情報を提供することが可能になります。

この変更は、GLTFファイルの生成プロセスにおいて重要な改善をもたらしており、特に3Dモデルのメタデータを扱う際の柔軟性と詳細度を高めることが期待されます。したがって、レビューコメントで指摘されたmetadata_encoderパラメータの追加とその影響は正確であり、コードベースにおいて適切な変更が行われていることが確認できました。

Scripts Executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# `write_gltf_glb`関数を使用している他の場所を検索します。
rg "write_gltf_glb"

Length of output: 215



Script:

#!/bin/bash
# `write_gltf_glb`関数の使用箇所のコードを表示します。
fd "mod.rs" nusamai/src/sink/cesiumtiles --exec cat {}

Length of output: 31159

nusamai/src/sink/cesiumtiles/mod.rs (4)
  • 95-95: DataRequirements 構造体の初期化に key_value フィールドが追加されました。これにより、より柔軟なキー値の変換が可能になります。この変更は、PRの目的に沿っています。
  • 100-100: run メソッドのシグネチャに schema: &Schema パラメータが追加されました。これにより、メタデータのエンコーディングに必要なスキーマ情報をメソッドに渡すことができるようになります。この変更は、メタデータの取り扱いを改善するPRの目的に適合しています。
  • 150-155: tile_writing_stage 関数のシグネチャに schema: &Schema パラメータが追加されました。これは、run メソッドの変更と一致し、メタデータエンコーディングのために必要なスキーマ情報を関数に渡すことを可能にします。
  • 309-310: metadata_encoder の初期化が追加されました。これは、メタデータのエンコーディングプロセスを開始するために必要です。この変更は、メタデータの取り扱いを改善するPRの目的に適合しています。
nusamai/src/sink/cesiumtiles/metadata/mod.rs (4)
  • 22-42: MetadataEncoder 構造体が追加されました。これは、メタデータのエンコーディングプロセスを管理するための重要な部分です。この構造体は、スキーマ情報とクラスのマッピングを保持し、メタデータのエンコーディングを効率的に行うためのメソッドを提供します。
  • 123-141: Class 構造体が定義されました。これは、特定のタイプのフィーチャーに関連するプロパティを管理するために使用されます。この構造体は、メタデータエンコーディングプロセスにおいて重要な役割を果たします。
  • 144-196: Class 構造体に add_feature メソッドが実装されました。このメソッドは、新しいフィーチャーをクラスに追加し、そのプロパティをエンコードするために使用されます。この実装は、メタデータのエンコーディングプロセスをサポートするために重要です。
  • 201-320: Class 構造体に make_metadata メソッドが実装されました。このメソッドは、クラスのプロパティを基にメタデータを生成し、バッファビューを作成するために使用されます。この実装は、メタデータのエンコーディングプロセスを完了するために必要です。

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.

Review Status

Actionable comments generated: 7

Configuration used: CodeRabbit UI

Commits Files that changed from the base of the PR and between f9adce6 and bac4788.
Files ignored due to path filters (1)
  • Cargo.toml is excluded by: !**/*.toml
Files selected for processing (1)
  • nusamai/src/sink/cesiumtiles/metadata/mod.rs (1 hunks)

nusamai/src/sink/cesiumtiles/metadata/mod.rs Outdated Show resolved Hide resolved
nusamai/src/sink/cesiumtiles/metadata/mod.rs Outdated Show resolved Hide resolved
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.

Review Status

Actionable comments generated: 5

Configuration used: CodeRabbit UI

Commits Files that changed from the base of the PR and between ce8fcca and e13887d.
Files selected for processing (9)
  • nusamai/src/sink/cesiumtiles/gltf.rs (12 hunks)
  • nusamai/src/sink/cesiumtiles/material.rs (1 hunks)
  • nusamai/src/sink/cesiumtiles/metadata/mod.rs (1 hunks)
  • nusamai/src/sink/cesiumtiles/mod.rs (6 hunks)
  • nusamai/src/sink/cesiumtiles/utils.rs (1 hunks)
  • nusamai/src/sink/mod.rs (1 hunks)
  • nusamai/src/transformer/builder.rs (2 hunks)
  • nusamai/src/transformer/transform/appearance.rs (2 hunks)
  • nusamai/src/transformer/transform/jsonify.rs (2 hunks)
Files skipped from review as they are similar to previous changes (7)
  • nusamai/src/sink/cesiumtiles/gltf.rs
  • nusamai/src/sink/cesiumtiles/material.rs
  • nusamai/src/sink/cesiumtiles/utils.rs
  • nusamai/src/sink/mod.rs
  • nusamai/src/transformer/builder.rs
  • nusamai/src/transformer/transform/appearance.rs
  • nusamai/src/transformer/transform/jsonify.rs
Additional comments: 9
nusamai/src/sink/cesiumtiles/mod.rs (7)
  • 95-95: DataRequirements構造体の初期化において、key_valueフィールドにcrate::transformer::KeyValueSpec::JsonifyObjectsが追加されました。この変更は、構造化メタデータの取り扱いを強化する目的で行われたと思われます。この変更により、ネストされたオブジェクトや配列の変換がより効率的に行えるようになる可能性があります。
  • 100-100: runメソッドのシグネチャが変更され、schema: &Schemaパラメータが追加されました。この変更は、メタデータのエンコーディングに必要なスキーマ情報をメソッドに渡すために行われたと思われます。この変更により、メタデータのエンコーディング処理がより柔軟になり、機能性が向上する可能性があります。
  • 150-156: tile_writing_stage関数のシグネチャが変更され、schema: &Schemaパラメータが追加されました。これは、runメソッドと同様に、メタデータのエンコーディングに必要なスキーマ情報を関数に渡すための変更です。この変更により、メタデータのエンコーディング処理が関数内で行えるようになり、機能性が向上する可能性があります。
  • 252-252: tile_writing_stage関数内でschema: &Schemaパラメータが使用されています。これは、メタデータエンコーダの初期化に必要なスキーマ情報を提供するためのものです。この変更により、メタデータのエンコーディング処理がより正確に行えるようになります。
  • 309-310: metadata::MetadataEncoder::new(schema)を使用してmetadata_encoderが初期化されています。これは、メタデータのエンコーディングに必要な準備を行うための重要なステップです。この変更により、機能属性のエンコーディングが可能になり、メタデータの取り扱いが強化されます。
  • 349-351: メタデータエンコーダを使用して機能属性をエンコードする際に、エラーが発生した場合に警告ログを出力しています。このエラーハンドリングは、問題が発生した場合に開発者が迅速に対応できるようにするために重要です。ただし、エラーが発生した場合に処理を続行するかどうかについて、より詳細な検討が必要かもしれません。
  • 392-398: > 📝 NOTE

This review was outside the diff hunks and was mapped to the diff hunk with the greatest overlap. Original lines [395-410]

ファイルへの書き込み処理において、write_gltf_glb関数が呼び出されています。この関数には、metadata_encoderが渡されており、これによりエンコードされたメタデータがGLBファイルに含まれるようになります。この変更は、メタデータの取り扱いを強化し、3D Tilesの生成と操作の効率性と機能性を向上させる目的で行われたと思われます。

nusamai/src/sink/cesiumtiles/metadata/mod.rs (2)
  • 22-29: MetadataEncoder構造体のコメントには、「City model schema (Not the 3D metadata schema)」とありますが、このコメントは少し曖昧です。3Dメタデータスキーマとは異なることを明確にするために、もう少し具体的な説明を追加することをお勧めします。
  • 179-179: PropertyType_ => { prop.array_offsets.push(prop.count); }の処理にFIXMEがあります。このFIXMEは、コード内の問題点を指摘しており、将来的な修正が必要であることを示しています。具体的な問題点と修正の提案をコメントに記述することで、コードの可読性と保守性を向上させることができます。

このFIXMEに対する具体的な修正案を提案してください。

nusamai/src/sink/cesiumtiles/metadata/mod.rs Outdated Show resolved Hide resolved
nusamai/src/sink/cesiumtiles/metadata/mod.rs Outdated Show resolved Hide resolved
nusamai/src/sink/cesiumtiles/metadata/mod.rs Outdated Show resolved Hide resolved
@ciscorn ciscorn changed the title 3dtiles: structural metadata 3dtiles: structural metadata のエンコーダ Mar 7, 2024
@ciscorn ciscorn self-assigned this Mar 7, 2024
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.

Review Status

Actionable comments generated: 2

Configuration used: CodeRabbit UI

Commits Files that changed from the base of the PR and between e13887d and da45c45.
Files selected for processing (1)
  • nusamai/src/sink/cesiumtiles/metadata/mod.rs (1 hunks)

@ciscorn ciscorn marked this pull request as ready for review March 7, 2024 02:52
@ciscorn ciscorn requested a review from a team March 7, 2024 02:52
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.

Review Status

Actionable comments generated: 3

Configuration used: CodeRabbit UI

Commits Files that changed from the base of the PR and between da45c45 and 37f9531.
Files selected for processing (1)
  • nusamai/src/sink/cesiumtiles/metadata/mod.rs (1 hunks)
Additional comments: 2
nusamai/src/sink/cesiumtiles/metadata/mod.rs (2)
  • 53-56: add_feature関数で、original_schema.types.get(typename)Noneの場合にErr(())を返していますが、エラーハンドリングが非常に抽象的です。エラーの種類に応じて、より具体的なエラー型を返すことを検討してください。例えば、カスタムエラー型を定義することで、エラーの原因をより明確に伝えることができます。
  • 422-422: Value::Point(_)の処理がtodo!()になっており、実装が未完了であることを示しています。プロダクションコードにTODOを残す場合は、その理由と将来の対応計画をコメントに記述することが重要です。また、可能であれば、この処理を完了させるか、GitHubのIssueを作成して追跡することをお勧めします。

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.

Review Status

Actionable comments generated: 4

Configuration used: CodeRabbit UI

Commits Files that changed from the base of the PR and between da45c45 and c1b0cb2.
Files selected for processing (1)
  • nusamai/src/sink/cesiumtiles/metadata/mod.rs (1 hunks)

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.

Review Status

Actionable comments generated: 4

Configuration used: CodeRabbit UI

Commits Files that changed from the base of the PR and between da45c45 and 1b70236.
Files selected for processing (1)
  • nusamai/src/sink/cesiumtiles/metadata/mod.rs (1 hunks)

nusamai/src/sink/cesiumtiles/metadata/mod.rs Show resolved Hide resolved
TypeRef::Integer => PropertyType::Int64,
TypeRef::NonNegativeInteger => PropertyType::Uint64,
TypeRef::Double => PropertyType::Float64,
TypeRef::Boolean => PropertyType::Int64, // TODO: Boolean bitstream
Copy link

Choose a reason for hiding this comment

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

PropertyType::BooleanPropertyType::Int64として扱われている点について、これは一時的な対応でしょうか。EXT_structural_metadata仕様では、BOOLEAN型のデータをどのように扱うべきか明確にする必要があります。もしビットストリームとして扱う予定がある場合、その実装計画やTODOコメントを追加することをお勧めします。

nusamai/src/sink/cesiumtiles/metadata/mod.rs Show resolved Hide resolved
prop.value_buffer.extend(b);
prop.count += 1;
}
Value::Point(_) => todo!(), // TOOD
Copy link

Choose a reason for hiding this comment

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

Value::Point(_)の処理がtodo!()になっており、実装が未完了であることを示しています。PropertyType::Pointの扱いに関するコメントと合わせて、点データのエンコード方法についての具体的な実装計画やTODOコメントを追加することが重要です。これにより、将来的な対応が明確になり、開発チーム内での認識の齟齬を防ぐことができます。

Copy link
Collaborator

@nokonoko1203 nokonoko1203 left a comment

Choose a reason for hiding this comment

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

めっっっっちゃいい感じです!ありがとうございます!
LGTM!

@ciscorn ciscorn merged commit 6aa98fd into main Mar 8, 2024
4 checks passed
@ciscorn ciscorn deleted the structural-metadata-init branch March 8, 2024 04:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3dtiles: 属性情報 (EXT_structural_metadata) のエンコーダ
2 participants