User:Kisaragi marine/brson: Difference between revisions

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


{{note|ライセンス上の問題を生じるため、このページをKisaragi marine以外が編集することは禁止します。追加するべきことがある場合は議論ページでお声がけ下さい|warning}}
{{note|このページの利用または二次利用にかかる利用許諾については[[Resonite Wiki:Copyrights]]に従うものとする。
以下は、クリエイティブ・コモンズ 表示-継承 4.0 国際のリーガルコード ([https://creativecommons.org/licenses/by-sa/4.0/legalcode.ja 日本語版]) によって要求される利用条件を緩和する追加条項である:
* [https://en.wikipedia.org/wiki/Open_Graph_Protocol OGP]など、システムの自動的な引用によって本コンテンツまたはその一部が「従の部分」として単語の順序を入れ替えることなく表示される場合、その部分が表示される親コンテキストの内容はリーガルコード第1条第a項によって定義された「翻案物」としてみなさない。
* SNSなどで本コンテンツ、本コンテンツの「翻案物」、またはその一部を共有する際に本ページへのリンクを含めた場合、リーガルコード第3条第a項の条件は全て満たしているとみなす。
}}
== 概要 ==
Resoniteは'''brson'''、'''7zbson'''、'''lz4bson'''と呼ばれる形式でアセットを保存したりエクスポートしたりすることができる。
Resoniteは'''brson'''、'''7zbson'''、'''lz4bson'''と呼ばれる形式でアセットを保存したりエクスポートしたりすることができる。


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


# そのアセットが「レガシーモード」ではなく、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
Line 24: Line 33:


[[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>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 08:41, 23 November 2024

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

ライセンス上の問題を生じるため、このページをKisaragi marine以外が編集することは禁止します。追加するべきことがある場合は議論ページでお声がけ下さい
このページの利用または二次利用にかかる利用許諾についてはResonite Wiki:Copyrightsに従うものとする。

以下は、クリエイティブ・コモンズ 表示-継承 4.0 国際のリーガルコード (日本語版) によって要求される利用条件を緩和する追加条項である:

  • OGPなど、システムの自動的な引用によって本コンテンツまたはその一部が「従の部分」として単語の順序を入れ替えることなく表示される場合、その部分が表示される親コンテキストの内容はリーガルコード第1条第a項によって定義された「翻案物」としてみなさない。
  • SNSなどで本コンテンツ、本コンテンツの「翻案物」、またはその一部を共有する際に本ページへのリンクを含めた場合、リーガルコード第3条第a項の条件は全て満たしているとみなす。


概要

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としてエンコードされている。

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