m file |
write down how to decode the reference graph Tag: 2017 source edit |
||
Line 1: | Line 1: | ||
'''注意''': このページはbrsonの内部構成を記述しており、その内容は時とともに変化することがある。その場合でも、泣き言を言わないこと。 | '''注意''': このページはbrsonの内部構成を記述しており、その内容は時とともに変化することがある。その場合でも、泣き言を言わないこと。 | ||
== 概要 == | |||
Resoniteは'''brson'''、'''7zbson'''、'''lz4bson'''と呼ばれる形式でアセットを保存したりエクスポートしたりすることができる。 | Resoniteは'''brson'''、'''7zbson'''、'''lz4bson'''と呼ばれる形式でアセットを保存したりエクスポートしたりすることができる。 | ||
Line 6: | Line 7: | ||
以下に、構成を示す。 | 以下に、構成を示す。 | ||
# | # そのアセットが「レガシーモード」ではなく、Resoniteでエンコードされた場合は[[#ヘッダー|ヘッダー]]。 | ||
# | # [[#圧縮アーカイブの種別|ヘッダーの圧縮アーカイブの種別フィールド]]によってその形式が識別される、[[#参照グラフ|圧縮されているかもしれないBSON]]。 | ||
== ヘッダー == | |||
# 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 | ||
Line 24: | Line 25: | ||
[[File:The_internal_format_describer.png]] | [[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>WorldElementRef</code>) がエンコードされている。 | |||
例えば、[[Component:Rig|Rig]] (<code>[FrooxEngine]FrooxEngine.Rig</code>) の <code>Bones</code> フィールドは「*list* of [[Slot]]」という定義だが、これは各要素を解決すると<code>Slot</code>としてデコードできる<code>Array(WorldElementRef)</code>としてエンコードされている。 |
Revision as of 16:34, 9 November 2024
注意: このページはbrsonの内部構成を記述しており、その内容は時とともに変化することがある。その場合でも、泣き言を言わないこと。
概要
Resoniteはbrson、7zbson、lz4bsonと呼ばれる形式でアセットを保存したりエクスポートしたりすることができる。
ただし、そのコーデックは少しばかり複雑である。 以下に、構成を示す。
- そのアセットが「レガシーモード」ではなく、Resoniteでエンコードされた場合はヘッダー。
- ヘッダーの圧縮アーカイブの種別フィールドによってその形式が識別される、圧縮されているかもしれないBSON。
ヘッダー
- ASCIIで
FrDT
。 \x00\x00\x00\x00
(予約済みと思われる)。- Variable Byte codeでエンコードされた圧縮アーカイブの種別。
圧縮アーカイブの種別
圧縮アーカイブの種別を示す。
- 0x00=予約済み?
- 0x01=LZ4 frame mode
- 0x02=LZMA
- 0x03=Brotli
参照グラフ
参照グラフのルートは次の通り。
VersionNumber
: このバイナリがエクスポートされたバージョンを示す。FeatureFlags
: フィーチャーフラグを定義する。ColorManagement
: ???ResetGUID
: ???ProtoFlux
: ???TEXTURE_QUALITY
: ???TypeManagement
: ???
Types
: 使われているコンポーネントの型を文字列で列挙する。- (items): 共通言語基盤における型名の正準名。例: VRIKAvatarなら
[FrooxEngine]FrooxEngine.FinalIK.VRIKAvatar
。
- (items): 共通言語基盤における型名の正準名。例: VRIKAvatarなら
TypeVersions
: 型のバージョン。全てのコンポーネントが含まれているとは限らない。- (key):
Types
に含まれている文字列。 - (value): 数値。
- (key):
Object
: エンコードされたSlot。Asset
: エンコードされたIAssetProviderの配列。- (value): IComponent: エンコードされたの配列。
スキーマ定義
説明用: PackageNodeIdentifier
PackageNodeIdentifier
は本体に存在するノードに割り振られることがある不透明な識別子である。パッケージの全てのノードの中で一意であることが保証される。
説明用: UniquePtr
スキーマ UniquePtr
を次のように定義する。
- 型変数
T
を受けとり、以下のスキーマを返す:ID
:PackageNodeIdentifier
Data
: T
説明用: WorldElementRef
スキーマ WorldElementRef
を UniquePtr(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
: ComponentTableIndexData
: コンポーネントに依存するデータ
詳しいことは各コンポーネントのドキュメントを参照せよ。ドキュメントにSync<T>
と書いてあった場合はT
型として解決できるWorldElementRef
としてエンコードされている。また、SyncList<T>
と書いてあった場合はArray(T)
型として解決できるWorldElementRef
としてエンコードされている。さらに、インターフェイス型が代入されていた場合はもともとの型 (として解決できるWorldElementRef
) がエンコードされている。
例えば、Rig ([FrooxEngine]FrooxEngine.Rig
) の Bones
フィールドは「*list* of Slot」という定義だが、これは各要素を解決するとSlot
としてデコードできるArray(WorldElementRef)
としてエンコードされている。