Skip to content

Commit

Permalink
3dtiles: structural metadata のエンコーダ (#393)
Browse files Browse the repository at this point in the history
## Tasks

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

## 既知の問題

- テストがない #406
- BOOLEAN (bitstreamでの表現) に対応していない #407
- 複数の地物種類 contents を含めた Tileset
を作ると一部のタイル表示されなくなる(これは今回の変更とは関係なく、以前から発生していた可能性が高い) #408

![stractural
metadata](https://github.com/MIERUNE/PLATEAU-GIS-Converter/assets/5351911/00b89f42-167f-4d25-9be6-830c5b8da74a)

Close #376

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit


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

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
  • Loading branch information
ciscorn authored Mar 8, 2024
1 parent 1069a3d commit 6aa98fd
Show file tree
Hide file tree
Showing 9 changed files with 580 additions and 126 deletions.
21 changes: 13 additions & 8 deletions nusamai/src/sink/cesiumtiles/gltf.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
use std::io::Write;

use crate::sink::cesiumtiles::metadata::make_dummy_metadata;

use super::material;
use super::{material, metadata::MetadataEncoder};
use ahash::{HashMap, HashSet};
use byteorder::{ByteOrder, LittleEndian};
use indexmap::IndexSet;
Expand All @@ -16,13 +14,13 @@ pub struct PrimitiveInfo {

pub type Primitives = HashMap<material::Material, PrimitiveInfo>;

/// とりいそぎの実装
pub fn write_gltf_glb<W: Write>(
writer: W,
translation: [f64; 3],
vertices: impl IntoIterator<Item = [u32; 9]>,
primitives: Primitives,
num_features: usize,
metadata_encoder: MetadataEncoder,
) -> std::io::Result<()> {
use nusamai_gltf_json::*;

Expand Down Expand Up @@ -62,6 +60,7 @@ pub fn write_gltf_glb<W: Write>(
let len_vertices = bin_content.len() - buffer_offset;
if len_vertices > 0 {
gltf_buffer_views.push(BufferView {
name: Some("vertices".to_string()),
byte_offset: buffer_offset as u32,
byte_length: len_vertices as u32,
byte_stride: Some(VERTEX_BYTE_STRIDE as u8),
Expand All @@ -71,6 +70,7 @@ pub fn write_gltf_glb<W: Write>(

// accessor (positions)
gltf_accessors.push(Accessor {
name: Some("positions".to_string()),
buffer_view: Some(gltf_buffer_views.len() as u32 - 1),
component_type: ComponentType::Float,
count: vertices_count,
Expand All @@ -82,6 +82,7 @@ pub fn write_gltf_glb<W: Write>(

// accessor (normal)
gltf_accessors.push(Accessor {
name: Some("normals".to_string()),
buffer_view: Some(gltf_buffer_views.len() as u32 - 1),
byte_offset: 4 * 3,
component_type: ComponentType::Float,
Expand All @@ -92,6 +93,7 @@ pub fn write_gltf_glb<W: Write>(

// accessor (texcoords)
gltf_accessors.push(Accessor {
name: Some("texcoords".to_string()),
buffer_view: Some(gltf_buffer_views.len() as u32 - 1),
byte_offset: 4 * 6,
component_type: ComponentType::Float,
Expand All @@ -102,6 +104,7 @@ pub fn write_gltf_glb<W: Write>(

// accessor (feature_id)
gltf_accessors.push(Accessor {
name: Some("_feature_ids".to_string()),
buffer_view: Some(gltf_buffer_views.len() as u32 - 1),
byte_offset: 4 * 8,
component_type: ComponentType::Float,
Expand All @@ -114,6 +117,9 @@ pub fn write_gltf_glb<W: Write>(

let mut gltf_primitives = vec![];

let structural_metadata =
metadata_encoder.into_metadata(&mut bin_content, &mut gltf_buffer_views);

// indices
{
let indices_offset = bin_content.len();
Expand All @@ -127,6 +133,7 @@ pub fn write_gltf_glb<W: Write>(
}

gltf_accessors.push(Accessor {
name: Some("indices".to_string()),
buffer_view: Some(gltf_buffer_views.len() as u32),
byte_offset,
component_type: ComponentType::UnsignedInt,
Expand Down Expand Up @@ -170,6 +177,7 @@ pub fn write_gltf_glb<W: Write>(
let indices_len = bin_content.len() - indices_offset;
if indices_len > 0 {
gltf_buffer_views.push(BufferView {
name: Some("indices".to_string()),
byte_offset: indices_offset as u32,
byte_length: indices_len as u32,
target: Some(BufferViewTarget::ElementArrayBuffer),
Expand Down Expand Up @@ -205,9 +213,6 @@ pub fn write_gltf_glb<W: Write>(
});
}

let ext_structural_metadata =
make_dummy_metadata(num_features, &mut bin_content, &mut gltf_buffer_views);

let gltf_buffers = {
let mut buffers = vec![];
if !bin_content.is_empty() {
Expand Down Expand Up @@ -238,7 +243,7 @@ pub fn write_gltf_glb<W: Write>(
buffer_views: gltf_buffer_views,
buffers: gltf_buffers,
extensions: nusamai_gltf_json::extensions::gltf::Gltf {
ext_structural_metadata,
ext_structural_metadata: structural_metadata,
..Default::default()
}
.into(),
Expand Down
1 change: 1 addition & 0 deletions nusamai/src/sink/cesiumtiles/material.rs
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ impl Image {
let content = load_image(&path)?;

buffer_views.push(BufferView {
name: Some("image".to_string()),
byte_offset: bin_content.len() as u32,
byte_length: content.len() as u32,
..Default::default()
Expand Down
Loading

0 comments on commit 6aa98fd

Please sign in to comment.