DirectXファイルフォーマットアーキテクチャ

Microsoft® DirectX®ファイルフォーマットは、アーキテクチャから独立し、コンテキストに依存しないファイルフォーマットである。また、テンプレート駆動であり、使用する上で前提とする知識を必要としない。このファイルフォーマットは、すべてのクライアントアプリケーションが使用することができ、現在、Microsoft Direct3D®保持モードが、幾何データ、フレーム階層、およびアニメーションを記述するために使用している。

以下のセクションでは、このファイルフォーマットの内容と構文を説明する。ファイルフォーマットは、DirectX Software Development Kit (SDK) での使用時には拡張子.xを使用する。

予約語

以下の語は、予約されているので使用してはならない。

ヘッダ

可変長ヘッダは必須であり、データストリームの先頭になければならない。ヘッダは、以下のものを含む。
タイプ サブタイプ サイズ 内容 内容の意味
マジックナンバ(必須) 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

国際的に決められた一意な識別子(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.