User:Kisaragi marine/brson

From Resonite Wiki
Revision as of 14:59, 11 November 2024 by Kisaragi marine (talk | contribs) (minor rewording)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

注意: このページは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としてエンコードされている。

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