00001 #ifndef __FBXEVENTS_FBXEVENTS_H__
00002 #define __FBXEVENTS_FBXEVENTS_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 <kaydaradef.h>
00040 #ifndef KFBX_DLL
00041 #define KFBX_DLL K_DLLIMPORT
00042 #endif
00043
00044 #include <kfbxplugins/kfbxtypes.h>
00045 #include <kfbxplugins/kfbxdatatypes.h>
00046 #include <kfbxmp/kfbxmutex.h>
00047
00048
00049 #include <fbxfilesdk_nsbegin.h>
00050 namespace kfbxevents
00051 {
00055 class KFBX_DLL KFbxEventBase
00056 {
00057 public:
00062
00063 virtual ~KFbxEventBase();
00065
00069 virtual int GetTypeId() const = 0;
00070
00074 virtual const char* GetEventName() const = 0;
00075
00076 protected:
00077 static int GetStaticTypeId(char const*);
00078
00079 private:
00080 static kfbxmp::KFbxMutex smMutex;
00081 };
00082
00083
00084
00085
00086 #define KFBXEVENT_DECLARE(Class) \
00087 public: virtual const char* GetEventName() const { return FbxEventName(); } \
00088 private: static const char* FbxEventName() { return #Class; } \
00089 friend class KFbxEvent<Class>;
00090
00091
00092
00093
00094
00095 #define KFBXEVENT_DECLARE_FBXTYPE(Class, FBXType) \
00096 public: virtual const char* GetEventName() const { return FbxEventName(); } \
00097 private: \
00098 static const char* FbxEventName() { \
00099 static KString lEventName = KString(#Class) + KString("<") + \
00100 GetFbxDataType(FbxTypeOf(*((FBXType const*)0))).GetName() + ">"; \
00101 \
00102 return lEventName.Buffer(); \
00103 } \
00104 friend class KFbxEvent< Class<FBXType> >;
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115 #define KFBXEVENT_TEMPLATE_HEADER_NOT_FBXTYPE(ClassName, TemplateName)\
00116 template < class TemplateName, const char* T > \
00117 class ClassName: public kfbxevents:: KFbxEvent< ClassName <TemplateName,T> >\
00118 {\
00119 public: virtual const char* GetEventName() const {return FbxEventName();}\
00120 private: static const char* FbxEventName() {\
00121 static KString lEventName = (KString(#ClassName) +"<"+ KString(T) +">");\
00122 return lEventName.Buffer();\
00123 }\
00124 friend class KFbxEvent< ClassName<TemplateName, T> >;
00125
00126
00127
00128
00129 #define KFBXEVENT_TEMPLATE_FOOTER_NOT_FBXTYPE()\
00130 };
00131
00132
00133
00134
00135
00136 template<typename EventT>
00137 class KFbxEvent : public KFbxEventBase
00138 {
00139 public:
00140 virtual ~KFbxEvent(){}
00141 static void ForceTypeId(int pTypeId)
00142 {
00143 kfbxmp::KFbxMutexHelper lLock( smMutex );
00144
00145
00146
00147
00148 smTypeId = pTypeId;
00149 }
00150
00152 virtual int GetTypeId() const
00153 {
00154 return GetStaticTypeId();
00155 }
00156
00157 static int GetStaticTypeId()
00158 {
00159 if( !smTypeId )
00160 {
00161 kfbxmp::KFbxMutexHelper lLock( smMutex );
00162
00163 if( !smTypeId )
00164 {
00165
00166
00167 smTypeId = KFbxEventBase::GetStaticTypeId(EventT::FbxEventName());
00168 }
00169 }
00170
00171 return smTypeId;
00172 }
00173
00174 private:
00175 static int smTypeId;
00176 static kfbxmp::KFbxMutex smMutex;
00177 };
00178
00179
00180 template<typename EventT>
00181 int KFbxEvent<EventT>::smTypeId = 0;
00182 template<typename EventT>
00183 kfbxmp::KFbxMutex KFbxEvent<EventT>::smMutex;
00184 }
00185 using namespace kfbxevents;
00186
00187
00188
00189 #include <fbxfilesdk_nsend.h>
00190
00191 #endif