メインページ | ネームスペース一覧 | クラス階層 | 構成 | Directories | ファイル一覧 | ネームスペースメンバ | 構成メンバ | ファイルメンバ | 関連ページ

SGObject.h

00001 #ifndef SG_OBJECT_H
00002 #define SG_OBJECT_H
00003 
00004 #include <Base/BaseUtility.h>
00005 #include <Base/BaseTypeInfo.h>
00006 #include <Base/Affine.h>
00007 #include <FileIO/FIDocNode.h>
00008 #include <WinBasis/WBWin.h>
00009 
00010 
00011 namespace Spr {;
00012 
00013 /// SGObject を継承したクラスはメンバとしてこのマクロを持つ.
00014 #define SGOBJECTDEF(cls)                DEF_UTTYPEINFODEF(cls)
00015 #define SGOBJECTDEFABST(cls)            DEF_UTTYPEINFOABSTDEF(cls)
00016 #define SGOBJECTIMPBASE(cls)            DEF_UTTYPEINFO(cls)
00017 #define SGOBJECTIMPBASEABST(cls)        DEF_UTTYPEINFOABST(cls)
00018 #define SGOBJECTIMP(cls, base)          DEF_UTTYPEINFO1(cls, base)
00019 #define SGOBJECTIMP2(cls, b1, b2)       DEF_UTTYPEINFO2(cls, b1, b2)
00020 #define SGOBJECTIMP3(cls, b1, b2, b3)   DEF_UTTYPEINFO3(cls, b1, b2, b3)
00021 #define SGOBJECTIMPABST(cls, base)      DEF_UTTYPEINFOABST1(cls, base)
00022 #define SGOBJECTIMPABST2(cls, b1, b2)   DEF_UTTYPEINFOABST2(cls, b1,b2)
00023 #define SGOBJECTIMPABST3(cls, b1, b2, b3)   DEF_UTTYPEINFOABST3(cls, b1,b2,b3)
00024 
00025 class SGScene;
00026 
00027 /** シーングラフのオブジェクト型.
00028     クラス名を返す関数を持つ.  */
00029 class SPR_DLL SGObject:public UTRefCount, UTTypeInfoBase{
00030     UTString name;          ///<    名前
00031     UTString nameSpace;     ///<    名前空間=ファイル名
00032 protected:
00033     friend class SGObjectNames;
00034 public:
00035     /// クラス名の取得などの基本機能の実装
00036     SGOBJECTDEF(SGObject);
00037     /// このオブジェクトの元となったドキュメント
00038     UTRef<FIDocNodeBase> doc;
00039     /// ユーザが自由に使えるポインタ
00040     void* userData;
00041 
00042     ///
00043     SGObject(): userData(NULL) {}
00044     /// デストラクタをvirtualに
00045     virtual ~SGObject();
00046 
00047     /// 名前の取得
00048     const char* GetName() const { return name.c_str(); }
00049     /// 名前空間の取得
00050     const char* GetNameSpace() const { return nameSpace.c_str(); }
00051     /// 名前の設定
00052     void SetName(const char* n, SGScene* s);
00053     /// 関連付けられたドキュメントノードを開放
00054     virtual void ReleaseDoc(){ doc = NULL; }
00055 
00056     /// ドキュメントからのロード時,参照が解決したあとで呼び出される.
00057     virtual void Loaded(SGScene* scene){}
00058     /// デバッグ用の表示
00059     virtual void Print(std::ostream& os) const;
00060 
00061     /// 所有しているオブジェクトの数
00062     virtual size_t NChildObjects(){ return 0; }
00063     /// 所有しているオブジェクト
00064     virtual SGObject* ChildObject(size_t i){ return NULL; }
00065     /// 参照しているオブジェクトの数
00066     virtual size_t NReferenceObjects(){ return 0; }
00067     /// 参照しているオブジェクト
00068     virtual SGObject* ReferenceObject(size_t i){ return NULL; };
00069     /// 子オブジェクトの追加(所有・参照を問わない)
00070     virtual bool AddChildObject(SGObject* o, SGScene* s){ return false; }
00071     /// 子オブジェクトの削除
00072     virtual bool DelChildObject(SGObject* o, SGScene* s){ return false; }
00073     /// 子になりえるオブジェクトの型情報の配列
00074     virtual const UTTypeInfo** ChildCandidates();
00075 };
00076 
00077 /// SGObjectのポインタの配列
00078 class SGObjects:public UTStack< UTRef<SGObject> >{
00079 public:
00080     /// Tの派生クラスをスタックのTop側から探す.
00081     template <class T> bool Find(T*& t){
00082         for(iterator it = end(); it != begin();){
00083             --it;
00084             T* tmp = DCAST(T, *it);
00085             if (tmp){
00086                 t = tmp;
00087                 return true;
00088             }
00089         }
00090         return false;
00091     }
00092 };
00093 
00094 }
00095 #endif SG_OBJECT_H

Springheadに対してSun Apr 16 01:57:55 2006に生成されました。  doxygen 1.4.1