新しい物理法則エンジンの作成方法について述べる。
namespace Spr{; }で閉じられる必要がある(インクルードは別でよい)。
SGOBJECTDEF(PHTestEngine);と書けばよい。これは<FileIO/FIDocScene.h>で宣言されているため インクルードが必要。
SGOBJECTIMP(PHTestEngine, SGBehaviorEngine);
class PHTestEngineLoader:public FIObjectLoader<PHTestEngine>{ public: PHTestEngineLoader(){} virtual bool LoadData(FILoadScene* ctx, PHTestEngine* test){} }; class PHTestEngineSaver:public FIObjectSaver<PHTestEngine>{ virtual UTString GetType() const{ return "PHTestEngine"; } virtual void SaveData(FISaveScene* ctx, FIDocNodeBase* doc, PHTestEngine* test){} };
DEF_REGISTER_BOTH(PHTestEngine);ここの引数を使って登録するため名前は宣言と合わせること。
DEF_RECORD(XTestEngine,{ //コードの部分は、~\Microsoft Visual Studio\Common\Tools\GUIDGEN.EXEで作成したコードを記述する。 GUID Guid(){ return WBGuid("コード"); } データの宣言; });データの宣言では、Xファイルに合わせたデータ型でなければいけないため、
typedef Vec3f Vector;このように、型を合わせる必要がある。
UTRef<FITypeDescDb> db = new FITypeDescDb; db->SetPrefix("X"); db->REG_FIELD(Vector); //型を合わせたときの宣言型 db->REG_RECORD_PROTO(XTestEngine); //DEF_RECORDの最初の引数と合わせる
XTestEngine tes;このように記述。
virtual bool LoadData(FILoadScene* ctx, PHMTestEngine* test){ ctx->docs.Top()->GetWholeData(test->tes); return true; }逆にデータに代入する場合、
virtual void SaveData(FISaveScene* ctx, FIDocNodeBase* doc, PHTestEngine* test){ doc->SetWholeData(test->tes); }②の場合、
virtual bool LoadData(FILoadScene* ctx, PHMTestEngine* test){ XTestEngine tes; ctx->docs.Top()->GetWholeData(tes); 自分の考えた形でメンバ変数に代入 return true; }逆にデータに代入する場合、
virtual void SaveData(FISaveScene* ctx, FIDocNodeBase* doc, PHTestEngine* test){ XTestEngine tes; 自分の考えた形で上の構造体に代入 doc->SetWholeData(tes); }
bool PHTestEngine::AddChildObject(SGObject* o, SGScene* s){ if(DCAST(PHSolid, o)){ solid = (PHSolid*)o; return true; } return false; }子オブジェクトを持つクラスを保存する場合はSaveData関数は使えない。代わりに Save()を使う。
virtual void Save(FISaveScene* ctx, SGObject* arg){ 手動でノードを作成する必要あり PHTestEngine* test = (PHSolid*)arg; FIDocNodeBase* doc = ctx->CreateDocNode("TestEngine", test); ctx->docs.back()->AddChild(doc); XTestEngine tes; 自分の考えた形で上の構造体に代入 doc->SetWholeData(tes); 子オブジェクトへの参照ノードを作成 if (test->solid){ doc->AddChild(ctx->CreateDocNode("REF", test->solid)); } }