XPD ファイルの仕様

 
 
 

概要

XGen は、プリミティブごとのベイク処理に XPD ファイルを使用します。この形式は、少なく見積もっても数千のプリミティブが値を保存する必要のあるというケースでの使用のために、特別に開発されています。この形式はスペース節約の効果がありますが、読み取りのパフォーマンスも向上します。ファイルの書き込みを遅くすることなく、読み取りパフォーマンスが可能な範囲で最高になるようにパフォーマンスが徹底的に微調整されています。

設計

XPD ファイルは、ヘッダ、フェース、ブロック、プリミティブという 4 つの主要部分に分けることができます。ヘッダは、ファイルの内容を記述するデータで構成されています。構成は次のとおりです。

magic
4 バイト。ファイル タイプ(およびメジャー バージョン)を特定するために定数 XPD3 が書き込まれます。
fileVersion
符号なし文字。ヘッダ データのバージョンです。追加データがヘッダに追加されたときの後方互換性を可能にします。これはマイナー バージョン番号(3.x)に相当すると解釈できます。
primType
enum - ファイル内のプリミティブのタイプです。有効な値は、ポイント、スプライン、カード、球、アーカイブ、またはCustomPT です。この enum は、必要に合わせて新しい値を追加するスペースが豊富にあるように定義されます。
primVersion
符号なし文字 - ファイル内で各プリミティブに含まれるデータのバージョンです。このバージョン情報はリーダによって使用される可能性があります。リーダは、古い XPD ファイルを読み込むときに、この情報を知ることでデータを適切に解凍することができます。これにより、すべての XPD ファイルを無効にしてしまうことなく将来の変更が可能になります。
time
浮動小数点 - データが書き込まれたときのフレーム番号または現在時間です。
numCVs
符号なし整数 - 各プリミティブの CV の数です。これは、すべてのプリミティブに同じ CV 数があることを暗示し、強制します。
coordSpace
enum - ファイル内のポイントの座標空間です。有効な値は、ワールド、オブジェクト、ローカル、マイクロ、CustomCS です。このうち、オブジェクトが XGen の既定の空間です。ローカルは、プリミティブの空間を参照します。つまりサーフェスの座標フレームの空間です。マイクロは、プリミティブの各 CV に配置された座標フレームを基準にした相対的な値である場合に、使用されます。この enum は、必要に合わせて新しい値を追加するスペースが豊富にあるように定義されます。
numBlocks
符号なし整数 - フェースごとの名前の付きデータ ブロックの数です。
blockSize
符号なし整数 - 組み合わせたすべてのブロック名に使用する文字数です(各ブロックの文字列最終文字を含む)。
blockNames
char * - ブロックの名前です。名前の順序も各フェースのデータの順番を定義します。
primSize
符号なし整数 - 各ブロックの単一プリミティブのサイズを表現する値の配列です。これは、各プリミティブが一定サイズにある必要があることを暗示し、強制します。
numKeys
符号なし整数 - ファイルに保存されているキーの数です。保存されたすべてのデータが浮動小数点タイプであるため、保存すべきあらゆるストリング データ(CV アトリビュート名など)を、この主要な機構を使用して保存する必要があります。キーがヘッダに保存されてから、キーのインデックスがデータに保存されます。
keySize
符号なし整数- 組み合わせたすべてのキー名の文字数です(各キーの文字列最終文字を含む)。
keyNames
char * - キーの名前です。名前の順序が、あらゆる参照に使用される各キーのインデックスを定義します。
numFaces
符号なし整数 - ファイルに含まれるフェースの数です。すべてにデータがあることが保証されているわけではありません。
faceid
整数 - ファイル内の各フェースの faceid の配列です。この配列の順序は、ファイル内のフェースの順序でもあります。
numPrims
符号なし整数 - 各フェースのプリミティブ数で構成される配列です。値はインデックスによって faceid の配列と照合されます。
blockPosition
符号なし長整数 - 各フェース内の各ブロックのジャンプ テーブルです。このテーブルには、ブロックとその最初のプリミティブへの直接ジャンプに使用できるフェース内のブロックの開始の絶対オフセットを保持します。

データのレイアウト

ヘッダのすぐ後はプリミティブのデータです。データがフェースの順序で(ヘッダでの定義に従って)配置されます。各フェース内では、ブロックの順番で(ヘッダでの定義に従って)データが配置されます。各ブロックは、各フェースに正しい順序で存在する必要があります。ブロック内にプリミティブがあります。プリミティブ自体は浮動小数点のベクトルです。書き込み側は、ベクトルを提供し、データの順序と解凍の仕方を知っています。読み込み側は、一度に単一のプリミティブを読み込み、プリミティブのバージョンを手がかりにデータの解凍方法を決めます。フェースごとまたはブロックごとのヘッダはありません。現実には、ファイル ヘッダの後のファイルは、プリミティブ データの一定のストリームです。

ファイルの読み込み時に、必要なフェースの検出、必要なブロックの検出、そして順序に従ったプリミティブの読み込みを行う必要があります必要なすべてのプリミティブを読み込んだら、次のブロックを検出して前のブロックと一致するプリミティブ データを読み込むことができます。ブロック構造により、XGen が必要とするデータ(たとえば場所)をアプリケーション(Paint3d など)が 1 ブロックで書き出すことができますが、その後に必要なデータをそれ自身のブロック(たとえば PointCloud)に書き出すことができます。それから XGen は、必要なデータのみ読み込んで、他のデータを簡単にスキップすることができます。さらに、両方のアプリケーションとも、自らのデータ形式を「所有する 」ことができ、他とのやり取りは必要ありません。

アクセサリ

XPD ファイルの使用に役立つプログラムが 2 つ利用できます。これの 1 つは xpd2txt です。このプログラムは、XPD ファイル内のバイナリ データを、読み取りが簡単なテキスト形式に変換します。これは、制作用スクリプトで解析し使用できる形にデータを変換するときにも使用できます(たとえば、データを Inventor 形式に変換するときや Maya に読み込むとき)。もう 1 つのプログラムは、xpdcmp です。これは、2 つの XPD ファイルを比較して同じかどうか検証できます。このプログラムは、ファイルの中身(フェース、ブロック、キー、プリミティブなどの数)を比較しますが、プリミティブの実際の値は比較しません。したがって、ファイルがもう 1 つのファイルと互換があるかを検証するときに使用できますが、ファイルがまったく同一かどうかは分かりません。

XGen のソース コードの中に 2 つのサンプルが含まれています。これは、タイプがポイントのプリミティブを保持する XPD ファイルの読み書きを行います。これは、XUV ファイルとも呼ばれます。一般的に、このタイプのファイルは Paint3d で作成され、プリミティブの場所(たとえば PointGenerator の使用)または束の場所(すなわち Clumping FX Module を介して)のいずれかの駆動に使用されます。サンプルは、wxuv.cpprxuv.cpp にあります。

XPD ファイルのもう 1 つの特殊のタイプは、Paint3d での使用を想定したカーブ/ガイド ファイルです。これは軽量化したファイルです。各プリミティブに関する id、u、v、CV は含まれていますが、XGen のその他のベイク処理情報は Paint3d には必要ないため、含まれていません。この軽量な形式により、Paint3d がロードできる形式を使用することができるため、XGen のベイク処理形式への変更について心配する必要がありません。この形式は、ブロックを調べ「Paint3d」と呼ばれるものを検索することで検知することができます。