User:Kisaragi marine/brson: Difference between revisions

From Resonite Wiki
fixup errors
m minor rewording
Tag: 2017 source edit
 
(2 intermediate revisions by the same user not shown)
Line 1: Line 1:
'''注意''': このページはbrsonの内部構成を記述しており、その内容は時とともに変化することがある。その場合でも、泣き言を言わないこと。
'''注意''': このページはbrsonの内部構成を記述しており、その内容は時とともに変化することがある。その場合でも、泣き言を言わないこと。


== 概要 ==
Resoniteは'''brson'''、'''7zbson'''、'''lz4bson'''と呼ばれる形式でアセットを保存したりエクスポートしたりすることができる。
Resoniteは'''brson'''、'''7zbson'''、'''lz4bson'''と呼ばれる形式でアセットを保存したりエクスポートしたりすることができる。


Line 6: Line 7:
以下に、構成を示す。
以下に、構成を示す。


# そのアセットが「レガシーモード」ではなく、Resoniteでエンコードされた場合はヘッダー。
# そのアセットが「レガシーモード」ではなく、Resoniteでエンコードされた場合は[[#ヘッダー|ヘッダー]]。
# 圧縮されたBSON。
# [[#圧縮アーカイブの種別|ヘッダーの圧縮アーカイブの種別フィールド]]によってその形式が識別される、[[#参照グラフ|圧縮されているかもしれないBSON]]。


圧縮されたBSONについては、ここで書くには長すぎる。<code>DataTreeDictionary</code>を見ること。
== ヘッダー ==
ヘッダーの内容を示す。


# ASCIIで<code>FrDT</code>。
# ASCIIで<code>FrDT</code>。
# <code>\x00\x00\x00\x00</code> (予約済みと思われる)。
# <code>\x00\x00\x00\x00</code> (予約済みと思われる)。
# [https://nlp.stanford.edu/IR-book/html/htmledition/variable-byte-codes-1.html Variable Byte code]でエンコードされた圧縮アーカイブの種別。
# [https://nlp.stanford.edu/IR-book/html/htmledition/variable-byte-codes-1.html Variable Byte code]でエンコードされた[[#圧縮アーカイブの種別|圧縮アーカイブの種別]]。


=== 圧縮アーカイブの種別 ===
圧縮アーカイブの種別を示す。
圧縮アーカイブの種別を示す。


# 0x00=予約済み
# 0x00=予約済み?
# 0x01=LZ4 frame mode
# 0x01=LZ4 frame mode
# 0x02=LZMA
# 0x02=LZMA
# 0x03=Brotli
# 0x03=Brotli
[[File:The_internal_format_describer.png]]
== 参照グラフ ==
参照グラフのルートは次の通り。
* <code>VersionNumber</code>: このバイナリがエクスポートされたバージョンを示す。
* <code>FeatureFlags</code>: フィーチャーフラグを定義する。
** <code>ColorManagement</code>: ???
** <code>ResetGUID</code>: ???
** <code>ProtoFlux</code>: ???
** <code>TEXTURE_QUALITY</code>: ???
** <code>TypeManagement</code>: ???
* <code>Types</code>: 使われているコンポーネントの型を文字列で列挙する。
** (items): 共通言語基盤における型名の正準名。例: [[Component:VRIKAvatar|VRIKAvatar]]なら<code>[FrooxEngine]FrooxEngine.FinalIK.VRIKAvatar</code>。
* <code>TypeVersions</code>: 型のバージョン。全てのコンポーネントが含まれているとは限らない。
** (key): <code>Types</code>に含まれている文字列。
** (value): 数値。
* '''<code>Object</code>''': エンコードされた[[#Slot|Slot]]。
* '''<code>Asset</code>''': エンコードされたIAssetProviderの配列。
** (value): [[#IComponent|IComponent]]: エンコードされたの配列。
== スキーマ定義 ==
=== 説明用: PackageNodeIdentifier ===
<code>PackageNodeIdentifier</code> は本体に存在するノードに割り振られることがある不透明な識別子である。パッケージの全てのノードの中で一意であることが保証される。
=== 説明用: UniquePtr ===
スキーマ <code>UniquePtr</code>を次のように定義する。
* 型変数 <code>T</code> を受けとり、以下のスキーマを返す:
** <code>ID</code>: <code>PackageNodeIdentifier</code>
** <code>Data</code>: T
=== 説明用: WorldElementRef ===
スキーマ <code>WorldElementRef</code> を <code>UniquePtr(PackageNodeIdentifier)</code> のエイリアスとして定義する。
<code>WorldElementRef</code> は マッチする <code>PackageNodeIdentifier</code> のノードを指す値として解決されなければならない。
=== 説明用: ComponentTableIndex ===
スキーマ <code>ComponentTableIndex</code> は、自身の値をインデックスとして <code>Types</code> フィールドで宣言された型の要素を参照する非負整数である。
例えばComponentTableIndexが<code>42</code>であれば、型を解決するためには <code>Types[42]</code>を参照する必要がある。
=== Slot ===
本体の<code>Object</code>は常に[[Slot]]から始まる。Slotが必要なコンポーネントを保持し、コンポーネントがドライブ先やアセットの参照、あるいは値を保持するいつもの構造と同型であることに気がつくだろう。
* <code>ID</code>: <code>PackageNodeIdentifier</code>
* <code>Components</code>: <code>UniquePtr(Array(IComponent))</code>
* <code>ParentReference</code>: <code>PackageNodeIdentifier</code>
* <code>Children</code>: <code>Array(Slot)</code>
* [[Slot]]と同じフィールド:
** <code>Name</code> (string)
** <code>Tag</code> (string?)
** <code>Position</code> (float3)
** <code>Rotation</code> (floatQ)
** <code>Scale</code> (float3)
** <code>OrderOffset</code> (long)
=== IComponent ===
* <code>Type</code>: ComponentTableIndex
* <code>Data</code>: コンポーネントに依存するデータ
詳しいことは各コンポーネントのドキュメントを参照せよ。
ただし、一部の型については読み替えが必要である。
* <code>Sync<T></code>と書いてあった場合は<code>T</code>型として解決できる<code>WorldElementRef</code>
* <code>SyncList<T></code>と書いてあった場合は<code>Array(T)</code>型として解決できる<code>WorldElementRef</code>
* <code>SyncRef<T></code>と書いてあった場合は<code>T</code>型に解決できる<code>WorldElementRef</code>
* インターフェイス型が代入されていた場合はもともとの型 (として解決できる<code>WorldElementRef</code>)
また、<code>[NameOverride(string)]</code>属性がついている場合、フィールドはその名前で出力される。さらに、<code>[NonPersistent]</code>がついているフィールドはシリアライズから除外される。
例えば、[[Component:Rig|Rig]] (<code>[FrooxEngine]FrooxEngine.Rig</code>) の <code>Bones</code> フィールドは「*list* of [[Slot]]」という定義だが、これは<code>SyncList<Slot></code>にほかならない。そのため、各要素は<code>Slot</code>としてデコードできる<code>WorldElementRef</code>としてエンコードされている。
頻出のコンポーネントを利便性のために示す。
* [[Component:VRIKAvatrar]]
* [[Component:StaticTexture2D]]
* [[Component:StaticMesh]]
* [[Component:SkinnedMeshRenderer]]

Latest revision as of 14:59, 11 November 2024

注意: このページはbrsonの内部構成を記述しており、その内容は時とともに変化することがある。その場合でも、泣き言を言わないこと。

概要

Resoniteはbrson7zbsonlz4bsonと呼ばれる形式でアセットを保存したりエクスポートしたりすることができる。

ただし、そのコーデックは少しばかり複雑である。 以下に、構成を示す。

  1. そのアセットが「レガシーモード」ではなく、Resoniteでエンコードされた場合はヘッダー
  2. ヘッダーの圧縮アーカイブの種別フィールドによってその形式が識別される、圧縮されているかもしれないBSON

ヘッダー

  1. ASCIIでFrDT
  2. \x00\x00\x00\x00 (予約済みと思われる)。
  3. Variable Byte codeでエンコードされた圧縮アーカイブの種別

圧縮アーカイブの種別

圧縮アーカイブの種別を示す。

  1. 0x00=予約済み?
  2. 0x01=LZ4 frame mode
  3. 0x02=LZMA
  4. 0x03=Brotli

参照グラフ

参照グラフのルートは次の通り。

  • VersionNumber: このバイナリがエクスポートされたバージョンを示す。
  • FeatureFlags: フィーチャーフラグを定義する。
    • ColorManagement: ???
    • ResetGUID: ???
    • ProtoFlux: ???
    • TEXTURE_QUALITY: ???
    • TypeManagement: ???
  • Types: 使われているコンポーネントの型を文字列で列挙する。
    • (items): 共通言語基盤における型名の正準名。例: VRIKAvatarなら[FrooxEngine]FrooxEngine.FinalIK.VRIKAvatar
  • TypeVersions: 型のバージョン。全てのコンポーネントが含まれているとは限らない。
    • (key): Typesに含まれている文字列。
    • (value): 数値。
  • Object: エンコードされたSlot
  • Asset: エンコードされたIAssetProviderの配列。
    • (value): IComponent: エンコードされたの配列。

スキーマ定義

説明用: PackageNodeIdentifier

PackageNodeIdentifier は本体に存在するノードに割り振られることがある不透明な識別子である。パッケージの全てのノードの中で一意であることが保証される。

説明用: UniquePtr

スキーマ UniquePtrを次のように定義する。

  • 型変数 T を受けとり、以下のスキーマを返す:
    • ID: PackageNodeIdentifier
    • Data: T

説明用: WorldElementRef

スキーマ WorldElementRefUniquePtr(PackageNodeIdentifier) のエイリアスとして定義する。

WorldElementRef は マッチする PackageNodeIdentifier のノードを指す値として解決されなければならない。

説明用: ComponentTableIndex

スキーマ ComponentTableIndex は、自身の値をインデックスとして Types フィールドで宣言された型の要素を参照する非負整数である。

例えばComponentTableIndexが42であれば、型を解決するためには Types[42]を参照する必要がある。

Slot

本体のObjectは常にSlotから始まる。Slotが必要なコンポーネントを保持し、コンポーネントがドライブ先やアセットの参照、あるいは値を保持するいつもの構造と同型であることに気がつくだろう。

  • ID: PackageNodeIdentifier
  • Components: UniquePtr(Array(IComponent))
  • ParentReference: PackageNodeIdentifier
  • Children: Array(Slot)
  • Slotと同じフィールド:
    • Name (string)
    • Tag (string?)
    • Position (float3)
    • Rotation (floatQ)
    • Scale (float3)
    • OrderOffset (long)

IComponent

  • Type: ComponentTableIndex
  • Data: コンポーネントに依存するデータ

詳しいことは各コンポーネントのドキュメントを参照せよ。

ただし、一部の型については読み替えが必要である。

  • Sync<T>と書いてあった場合はT型として解決できるWorldElementRef
  • SyncList<T>と書いてあった場合はArray(T)型として解決できるWorldElementRef
  • SyncRef<T>と書いてあった場合はT型に解決できるWorldElementRef
  • インターフェイス型が代入されていた場合はもともとの型 (として解決できるWorldElementRef)

また、[NameOverride(string)]属性がついている場合、フィールドはその名前で出力される。さらに、[NonPersistent]がついているフィールドはシリアライズから除外される。

例えば、Rig ([FrooxEngine]FrooxEngine.Rig) の Bones フィールドは「*list* of Slot」という定義だが、これはSyncList<Slot>にほかならない。そのため、各要素はSlotとしてデコードできるWorldElementRefとしてエンコードされている。

頻出のコンポーネントを利便性のために示す。