この節ではSpringheadでロード・セーブできるファイルのファイルフォーマットを紹介します。
拡張子 .spr のファイルは、Springhead独自のファイル形式です。 人が読み書きしやすく、Springheadの仕様が変化しても余り影響を受けないような形式になっています。ファイルを手書きする場合はこの形式を使ってください。
sprファイルはノード定義の繰り返しです。sprファイルの例を示します。
PHSdk{ #PHSdkノード
CDSphere sphere{ #↑の子ノードにCDSphereノードを追加
material = { # CDSphere の material(PHMaterial型)の
mu = 0.2 # 摩擦係数 mu に0.2を代入
}
radius = 0.5 # radiusに0.5を代入
}
CDBox bigBox{
boxsize = 2.0 1.1 0.9
}
}
Sprファイルのノードはディスクリプタ(第3.4節)を参照)に1対1で対応します。ディスクリプタさえ用意すれば自動的に使えるノードの型が増えます。 ファイルで値を代入しないと、ディスクリプタの初期値に なります。 上の例では、PHSdkに追加されるsphere(CDSphere型)は、
CDSphereDesc desc; desc.material.mu = 0.2; desc.radius = 0.5;
としたディスクリプタ desc で作るのと同じことになります。
Sprファイルの文法をBNF+正規表現で書くと
spr = node*
node = node type, (node id)?, block
block = ’{’ (node|refer|data)* ’}’
refer = ’*’ node id
data = field id, ’=’, (block | right)
right = ’[’ value*, ’]’ | value
value = bool | int | real | str | right
となります。right以降の解釈はfieldの型に依存します。
「 X ファイル 」は、Direct3Dのファイルフォーマットで、拡張子は .x です。 モデリングソフトXSIで使われており、多くのモデリングツールで出力できます。 3Dの形状データ、マテリアル、テクスチャ、ボーンなどを含めることができます。 Springhead2では、標 準的なXファイルのロードと、Springhead2独自のノードの ロードとセーブができます。ただし独自ノードを手書きする場合は Sprファイル の方が書きやすく便利ですのでそちらの使用をおすすめします。
Xファイルの例を示します。
xof 0302txt 0064 #最初の行はこれから始まる
# ノードは,
# 型名,ノード名 { フィールドの繰り返し 子ノード }
# からなる.
PHScene scene1{
0.01;0;; #フィールド は 値; の繰り返し
1;0;-9.8;0;; #値は 数値,文字列またはフィールド
PHSolid soFloor{ #子ノードは,ノードと同じ
(省略)
}
}
# コメントは #以外に // も使える
Springhead2 の通常のノードは,オブジェクトのディスクリプタ(第3.4節節)に1対1で対応します. ロード時には,ディスクリプタに対応するオブジェクトが生成され,シーングラフに追加されます. セーブ時 には,オブジェクトからディスクリプタを読み出し,ノードの形式でファイルに保存されます.
オブジェクトのディスクリプタには,必ず対応するノードがあります. 例えば,SprPHScene.h には,
struct PHSceneState{
double timeStep; ///< 積分ステップ
unsigned count; ///< 積分した回数
};
struct PHSceneDesc:PHSceneState{
/// 接触・拘束解決エンジンの種類
enum ContactMode{ MODE_NONE, MODE_PENALTY, MODE_LCP};
Vec3f gravity; ///< 重力加速度ベクトル.デフォルト値は(0.0f, -9.8f,0.0f).
};
のように,ステートとディスクリプタが宣言されています.この PHSceneDesc に対応する X ファイルのノードは,
PHScene scene1{ 0.01; #PHSceneState::timeStep
0;; #PHSceneState::count 最後の;はPHSceneState部の終わりを示す.
1; #PHSceneDesc::ContactMode
0;-9.8;0;;#PHSceneDesc::gravity 最後の;はPHSceneDesc部の終わりを示す.
}
のようになります.クラスのメンバ変数がそのままフィールドになります. また,基本クラスは,先頭にフィールドが追加された形になります.
通常ノードの一覧は TBU: デスクリプタ一覧のページ を参照下さい.
Springhead2の独自ノードだけでなく、普通のXファイルのノードもロードできます。 Xファイルには、
Frame{
FrameTransfromMatrix{ 1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1; }
}
のようなフレームのノード型がありますが、 Sprinhead2 には対応するディスクリプタやオブジェクトがありません. そこで,これらは、GRFrameやPHFrameに 変換されてロードされます. TBW ノード一覧のページ(pageNodeDefList) を参照下さい.