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
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
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
00078 class SGObjects:public UTStack< UTRef<SGObject> >{
00079 public:
00080
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