注意: このページは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:PackageNodeIdentifierData: T
説明用: WorldElementRef
スキーマ WorldElementRef を UniquePtr(PackageNodeIdentifier) のエイリアスとして定義する。
WorldElementRef は マッチする PackageNodeIdentifier のノードを指す値として解決されなければならない。
説明用: ComponentTableIndex
スキーマ ComponentTableIndex は、自身の値をインデックスとして Types フィールドで宣言された型の要素を参照する非負整数である。
例えばComponentTableIndexが42であれば、型を解決するためには Types[42]を参照する必要がある。
Slot
本体のObjectは常にSlotから始まる。Slotが必要なコンポーネントを保持し、コンポーネントがドライブ先やアセットの参照、あるいは値を保持するいつもの構造と同型であることに気がつくだろう。
ID:PackageNodeIdentifierComponents:UniquePtr(Array(IComponent))ParentReference:PackageNodeIdentifierChildren:Array(Slot)- Slotと同じフィールド:
Name(string)Tag(string?)Position(float3)Rotation(floatQ)Scale(float3)OrderOffset(long)
IComponent
Type: ComponentTableIndexData: コンポーネントに依存するデータ
詳しいことは各コンポーネントのドキュメントを参照せよ。
ただし、一部の型については読み替えが必要である。
Sync<T>と書いてあった場合はT型として解決できるWorldElementRefSyncList<T>と書いてあった場合はArray(T)型として解決できるWorldElementRefSyncRef<T>と書いてあった場合はT型に解決できるWorldElementRef- インターフェイス型が代入されていた場合はもともとの型 (として解決できる
WorldElementRef)
また、[NameOverride(string)]属性がついている場合、フィールドはその名前で出力される。さらに、[NonPersistent]がついているフィールドはシリアライズから除外される。
例えば、Rig ([FrooxEngine]FrooxEngine.Rig) の Bones フィールドは「*list* of Slot」という定義だが、これはSyncList<Slot>にほかならない。そのため、各要素はSlotとしてデコードできるWorldElementRefとしてエンコードされている。
頻出のコンポーネントを利便性のために示す。
