Systems
WMMDのアーキテクチャ:ホストできるMMDランタイム
同じコードがエディタにもARホストにもオフラインレンダラーにもなるよう、Rustのクレートを厳格な依存不変条件で階層化する理由。
WMMDは、Rustで書かれた「ホストできる」MikuMikuDanceランタイム兼レンダリングバックエンドです。この「ホストできる」という点が設計上の制約そのものです。同じコードベースが今はデスクトップエディタを動かし、将来はVJツール、AR/VRランタイム、ゲームエンジン、モーションキャプチャのパイプライン、オフラインレンダラーに組み込まれることを想定しています。どの層も「ウィンドウ・GPU・時計は自分のものだ」と暗黙に仮定しないときだけ、それが成立します。
階層構造
ワークスペースは、依存が一方向にだけ向くように並べられたクレート群です。
wmmd-clock— トランスポート用の時計。外部依存はゼロ。wmmd-runtime— CPUのみのシミュレーションエンジン。シーンデータ、スケルトン、物理バックエンド、IKソルバー、フレーム更新ループ。wmmd-asset— PMX/PMDの解析、VMDアニメーションの読み込み、テクスチャ解析、パス解決。マテリアル処理はwmmd-materialに委譲します。wmmd-render— バックエンド非依存のレンダリングインターフェース。依存はglamとserdeだけです。wmmd-render-wgpu— そのインターフェースのwgpu実装。GPUパスをすべて所有します。wmmd-host-winit— デスクトップのサーフェス。それ以上のことはしません。wmmd-session、wmmd-ui-egui、wmmd-audio、wmmd-export、wmmd-editor、wmmd-desktop、wmmd-tools— ホスト中立のセッション状態、パネル、オーディオ、オフライン書き出し、そしてその上のアプリケーション。
不変条件こそがアーキテクチャ
依存グラフは明文化された不変条件のリストで守られ、違反はスタイルの問題ではなくバグとして扱われます。全体を形づくる主なものは次のとおりです。
wmmd-renderはGPU依存もランタイム依存もゼロ。CameraUniformのようなGPUレイアウト型はwgpuクレートに置かれ、抽象インターフェースがランタイムのコマンドを参照することはありません。wmmd-runtimeはファイルを読み込まない。 ホストがアセットクレートを呼び、解析済みのアセットを持つAddModelコマンドを積みます。エンジンはファイルシステムについて何の意見も持ちません。wmmd-render-wgpuはスワップチェーンを所有しない。 ホストがフレームを取得し、レンダーターゲットを作り、render()を呼び、提示します。この1つの規則があるからこそ、ARやヘッドレスのホストが存在できます。wmmd-render-wgpuはegui非依存であり、wmmd-host-winitはサーフェス専用です。GPUコンテキストはレンダークレート側にあるため、winitに依存しないホストでもデバイスを作れます。RenderRequestが唯一のインターフェース点。 呼び出し側がカメラ、シャドウ中心、ライティング、デバッグフラグ、フレームを組み立てて渡します。wmmd-clockとwmmd-audioは独立。 どちらもシーンやレンダリングを知らず、ホストがランタイムへ配線します。
この規律が報われる理由
これらの規則はどれも、デスクトップ専用エンジンなら楽だったはずの近道を意図的に断ったものです。見返りとして、新しいサーフェス――Vision Proホスト、VJプラグイン、書き出しジョブ――の追加は、レンダラーをフォークすることではなく既存のインターフェースを駆動することになります。エンジンは規則としてモデル非依存でもあります。修正は必ずシステムのレベルで行い、特定のMMDモデルで分岐しません。1つのファイルで再現したバグの修正が、妥当なPMX/VMD入力の空間全体に効きます。