00001 #ifndef FBXFILESDK_KFBXEVENTS_KFBXEVENTS_H
00002 #define FBXFILESDK_KFBXEVENTS_KFBXEVENTS_H
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 #include <fbxfilesdk/components/kbaselib/kaydaradef_h.h>
00040 #include <fbxfilesdk/kfbxplugins/kfbxtypes.h>
00041 #include <fbxfilesdk/kfbxplugins/kfbxdatatypes.h>
00042 #include <fbxfilesdk/kfbxmp/kfbxmutex.h>
00043
00044
00045 #include <fbxfilesdk/fbxfilesdk_nsbegin.h>
00046 namespace kfbxevents
00047 {
00051 class KFBX_DLL KFbxEventBase
00052 {
00053 public:
00058
00059 virtual ~KFbxEventBase();
00061
00065 virtual int GetTypeId() const = 0;
00066
00070 virtual const char* GetEventName() const = 0;
00071
00072 protected:
00073 static int GetStaticTypeId(char const*);
00074
00075 private:
00076 static kfbxmp::KFbxMutex smMutex;
00077 };
00078
00079
00080
00081
00082 #define KFBXEVENT_DECLARE(Class) \
00083 public: virtual const char* GetEventName() const { return FbxEventName(); } \
00084 private: static const char* FbxEventName() { return #Class; } \
00085 friend class KFbxEvent<Class>;
00086
00087
00088
00089
00090
00091 #define KFBXEVENT_DECLARE_FBXTYPE(Class, FBXType) \
00092 public: virtual const char* GetEventName() const { return FbxEventName(); } \
00093 private: \
00094 static const char* FbxEventName() { \
00095 static KString lEventName = KString(#Class) + KString("<") + \
00096 GetFbxDataType(FbxTypeOf(*((FBXType const*)0))).GetName() + ">"; \
00097 \
00098 return lEventName.Buffer(); \
00099 } \
00100 friend class KFbxEvent< Class<FBXType> >;
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111 #define KFBXEVENT_TEMPLATE_HEADER_NOT_FBXTYPE(ClassName, TemplateName)\
00112 template < class TemplateName, const char* T > \
00113 class ClassName: public kfbxevents:: KFbxEvent< ClassName <TemplateName,T> >\
00114 {\
00115 public: virtual const char* GetEventName() const {return FbxEventName();}\
00116 private: static const char* FbxEventName() {\
00117 static KString lEventName = (KString(#ClassName) +"<"+ KString(T) +">");\
00118 return lEventName.Buffer();\
00119 }\
00120 friend class KFbxEvent< ClassName<TemplateName, T> >;
00121
00122
00123
00124
00125 #define KFBXEVENT_TEMPLATE_FOOTER_NOT_FBXTYPE()\
00126 };
00127
00128
00129
00130
00131
00132 template<typename EventT>
00133 class KFbxEvent : public KFbxEventBase
00134 {
00135 public:
00136 virtual ~KFbxEvent(){}
00137 static void ForceTypeId(int pTypeId)
00138 {
00139 kfbxmp::KFbxMutexHelper lLock( smMutex );
00140
00141
00142
00143
00144 smTypeId = pTypeId;
00145 }
00146
00148 virtual int GetTypeId() const
00149 {
00150 return GetStaticTypeId();
00151 }
00152
00153 static int GetStaticTypeId()
00154 {
00155 if( !smTypeId )
00156 {
00157 kfbxmp::KFbxMutexHelper lLock( smMutex );
00158
00159 if( !smTypeId )
00160 {
00161
00162
00163 smTypeId = KFbxEventBase::GetStaticTypeId(EventT::FbxEventName());
00164 }
00165 }
00166
00167 return smTypeId;
00168 }
00169
00170 private:
00171 static int smTypeId;
00172 static kfbxmp::KFbxMutex smMutex;
00173 };
00174
00175
00176 template<typename EventT>
00177 int KFbxEvent<EventT>::smTypeId = 0;
00178 template<typename EventT>
00179 kfbxmp::KFbxMutex KFbxEvent<EventT>::smMutex;
00180 }
00181 using namespace kfbxevents;
00182
00183
00184
00185 #include <fbxfilesdk/fbxfilesdk_nsend.h>
00186
00187 #endif // FBXFILESDK_KFBXEVENTS_KFBXEVENTS_H
00188