Microsoft® DirectX®ファイルフォーマットは、アーキテクチャから独立し、コンテキストに依存しないファイルフォーマットである。また、テンプレート駆動であり、使用する上で前提とする知識を必要としない。このファイルフォーマットは、すべてのクライアントアプリケーションが使用することができ、現在、Microsoft Direct3D®保持モードが、幾何データ、フレーム階層、およびアニメーションを記述するために使用している。
以下のセクションでは、このファイルフォーマットの内容と構文を説明する。ファイルフォーマットは、DirectX Software Development Kit (SDK) での使用時には拡張子.xを使用する。
以下の語は、予約されているので使用してはならない。
- ARRAY
- BINARY
- BINARY_RESOURCE
- CHAR
- CSTRING
- DOUBLE
- DWORD
- FLOAT
- SDWORD
- STRING
- SWORD
- TEMPLATE
- UCHAR
- ULONGLONG
- UNICODE
- WORD
可変長ヘッダは必須であり、データストリームの先頭になければならない。ヘッダは、以下のものを含む。
タイプ | サブタイプ | サイズ | 内容 | 内容の意味 |
---|---|---|---|---|
マジックナンバ(必須) | 4バイト | "xof " | ||
バージョン番号(必須) | メジャー番号 | 2バイト | 03 | メジャーバージョン3 |
マイナー番号 | 2バイト | 02 | マイナーバージョン2 | |
フォーマットタイプ(必須) | 4バイト | "txt " | テキストファイル | |
"bin " | バイナリファイル | |||
"tzip" | MSZip圧縮テキストファイル | |||
"bzip" | MSZip圧縮バイナリファイル | |||
浮動小数点サイズ(必須) | 4バイト | 0064 | 64ビット浮動小数点 | |
0032 | 32ビット浮動小数点 |
xof 0302txt 0064
コメントは、テキストファイルの中だけで適用できる。コメントは、データストリーム中のどこにでも現れることができる。コメントは、C++式の二重スラッシュ "//"またはシャープ文字 "#"で始まる。コメントは、次の行に継続できる。
# これはコメントである。 // これもコメントである。
テンプレートは、データストリームを解釈する仕方を定義する。データは、テンプレート定義によって調節される。 この節では、テンプレートについて説明する。
テンプレートの例は「例」に示す。
テンプレートの形式は、以下のとおりである。
template <template-name> { <UUID> <member 1>; ... <member n>; [restrictions] }
これは、英数字からなる名前で、下線文字の"_"を含めても良い。数字で始めてはならない。
国際的に決められた一意な識別子(UUID)で、OSF DCE(Open Software Foundation's Distributed Computing Environment)規格でフォーマット化され、かぎ括弧の"<"と">"で囲まれる。たとえば、<3D82AB43-62DA-11cf-AB39-0020AF71E433>。
テンプレートのメンバは、名前付きデータ型とそれに続くオプション名または名前付きデータ型の配列で構成される。有効なプリミティブデータ型は、以下のとおりである。
型 | サイズ |
---|---|
WORD | 16ビット |
DWORD | 32ビット |
FLOAT | IEEE浮動小数点数 |
DOUBLE | 64ビット |
CHAR | 8ビット |
UCHAR | 8ビット |
BYTE | 8ビット |
STRING | NULL終端文字列 |
CSTRING | フォーマット済みC文字列 (現在サポートされてない) |
UNICODE | Unicode文字列 (現在サポートされてない) |
データストリーム中で前に遭遇した、テンプレートによって定義されている追加のデータ型は、テンプレート定義の中で参照することもできる。前方参照は許されていない。
任意の有効なデータ型は、テンプレート定義中で配列として表現することができる。基本的な構文は、以下のとおりである。
array <data-type> <name>[<dimension-size>];
ここで<dimension-size>は、整数またはその値で置き換えられる他のテンプレートメンバに対する参照名のどちらでも良い。
配列は、n次元でも良い。ここで、nはステートメントに続く対の角括弧の数によって決まる。たとえば、以下のとおりである。
array DWORD FixedHerd[24]; array DWORD Herd[nCows]; array FLOAT Matrix4x4[4][4];
テンプレートにはオープン、クローズ、または制約がある。これらの制限は、テンプレートが定義するデータオブジェクトの直接の階層の中で、どのデータ型が現れるかを決定する。オープンテンプレートには制限がなく、クローズドテンプレートには、すべてのデータ型を拒絶し、制約テンプレートはデータ型の名前付きリストを許す。
角括弧で囲まれた3つのピリオドは、オープンテンプレートを示す。
[ ... ]
名前付きデータ型のコンマで区切られたリストで、その後にオプションの角括弧で囲まれたそのUUIDが続くものは、制約テンプレートであることを示す。
[ { data-type [ UUID ] , }... ]
上記のいずれでもない場合は、クローズドテンプレートであることを示す。
template Mesh { <3D82AB44-62DA-11cf-AB39-0020AF71E433> DWORD nVertices; array Vector vertices[nVertices]; DWORD nFaces; array MeshFace faces[nFaces]; [ ... ] // オープンテンプレート } template Vector { <3D82AB5E-62DA-11cf-AB39-0020AF71E433> FLOAT x; FLOAT y; FLOAT z; } // クローズドテンプレート template FileSystem { <UUID> STRING name; [ Directory <UUID>, File <UUID> ] // 制約テンプレート }
特殊なテンプレートが1つある。それはヘッダテンプレートである。各アプリケーションがヘッダテンプレートを定義し、バージョン情報などのアプリケーションに特有の情報を定義することを推奨する。このヘッダは、DirectXファイルフォーマットAPIが読み込み、flagsメンバが使用可能であれば、以下のデータを解釈する仕方を決定するのに使用される。flagsメンバは、定義する場合にはDWORDにする必要がある。ビット0の1ビットが現在定義されている。このビットがクリアされていれば、ファイル中の以下のデータは、バイナリであり、セットされていれば、以下のデータは、テキストである。マルチヘッダデータオブジェクトは、ファイルの中でバイナリとテキストを切り替えるのに使用できる。
データオブジェクトは実際のデータか、データに対する参照を含む。それぞれ、データ型を指定する対応するテンプレートを持つ。
データオブジェクトの形式は以下のとおりである。
<Identifier> [name] { [<UUID>] <member 1>; ... <member n>; }
この節では、データオブジェクトの以下の部分を説明する。
テンプレートの例は「例」に示す。
これは必須であり、以前の定義済みのデータ型またはプリミティブと一致しなければならない。
これはオプションである(構文定義については上記を参照すること)。
データオブジェクト
ネストされたデータオブジェクト。これは、階層的な性質を持つフォーマットを表現することを可能にする。階層内で許されるネストデータオブジェクトの型は制限される。詳細については「テンプレート」を参照すること。
データ参照
前に遭遇したデータ型に対する参照。構文は、以下のとおりである。
{ name | UUID | name UUID }
整数リスト
セミコロンで整数のリストを区切る。例は、以下のとおりである。
1; 2; 3;
浮動小数点リスト
セミコロンで浮動小数点のリストを区切る。例は、以下のとおりである。
1.0; 2.0; 3.0;
文字列リスト
セミコロンで文字列のリストを区切る。例は、以下のとおりである。
"Moose"; "Goats"; "Sheep";
これが、おそらくファイルフォーマットの最も複雑な構文問題であり、その使用法に厳密さが求められる。コンマは、配列のメンバを区切るのに使用する。セミコロンは、各データ項目を終了するのに使用する。
たとえば、以下のようにテンプレートを定義したとする。
template mytemp { DWORD myvar; }
このインスタンスは、以下のようになる。
mytemp dataTemp { 1; }
以下のように、テンプレートが別のテンプレートを含む場合がある。
template mytemp { DWORD myvar; DWORD myvar2; } template container { FLOAT aFloat; mytemp aTemp; }
このインスタンスは、以下のようになる。
container dataContainer { 1.1; 2; 3;; }
container内部のmytempを表す2番目の行に、2つのセミコロンがその終わりに付いていることに注意する。最初のセミコロンは、データ項目のaTempの終了(container内部)、2番目のセミコロンはcontainerの終わりをそれぞれ示す。
次は、配列の場合である。
Template mytemp { array DWORD myvar[3]; }
このインスタンスは、以下のようになる。
mytemp aTemp { 1, 2, 3; }
配列の場合、コンマで区切られているので、データ項目をセミコロンで区切る必要はない。最後のセミコロンは配列の終わりをマークする。
ここで、テンプレートが定義するデータ項目の配列を含むテンプレートを考えてみる。
template mytemp { DWORD myvar; DWORD myvar2; } template container { DWORD count; array mytemp tempArray[count]; }
このインスタンスは、以下のようになる。
container aContainer { 3; 1;2;,3;4;,5;6;; }
トップに戻る
© 1999 Microsoft and/or its suppliers. All rights reserved. Terms of Use.