1 | /**************************************************************************************** |
2 | |
3 | Copyright (C) 2015 Autodesk, Inc. |
4 | All rights reserved. |
5 | |
6 | Use of this software is subject to the terms of the Autodesk license agreement |
7 | provided at the time of installation or download, or which otherwise accompanies |
8 | this software in either electronic or hard copy form. |
9 | |
10 | ****************************************************************************************/ |
11 | |
12 | //! \file fbxplugin.h |
13 | #ifndef _FBXSDK_CORE_PLUGIN_H_ |
14 | #define _FBXSDK_CORE_PLUGIN_H_ |
15 | |
16 | #include <fbxsdk/fbxsdk_def.h> |
17 | |
18 | #ifndef FBXSDK_ENV_WINSTORE |
19 | |
20 | #include <fbxsdk/core/fbxobject.h> |
21 | #include <fbxsdk/core/fbxmodule.h> |
22 | #include <fbxsdk/core/fbxlistener.h> |
23 | |
24 | #include <fbxsdk/fbxsdk_nsbegin.h> |
25 | |
26 | class FbxManager; |
27 | class FbxPluginContainer; |
28 | |
29 | //! Plug-in declaration macro that must to be used when defining new FbxPlugin objects. |
30 | #define FBXSDK_PLUGIN_DECLARE(Plugin)\ |
31 | FBXSDK_FRIEND_NEW();\ |
32 | public:\ |
33 | static Plugin * Create(const FbxPluginDef& pDefinition, FbxModule pModuleHandle);\ |
34 | void Destroy(); |
35 | |
36 | //! Plug-in implementation macro that must be used when implementing new FbxPlugin objects. |
37 | #define FBXSDK_PLUGIN_IMPLEMENT(Plugin)\ |
38 | Plugin* Plugin::Create(const FbxPluginDef& pDefinition, FbxModule pModuleHandle){ return FbxNew<Plugin>(pDefinition, pModuleHandle); }\ |
39 | void Plugin::Destroy(){ FbxDelete(this); } |
40 | |
41 | /** Structure used by plug-ins for identification purposes. |
42 | * \note To avoid confusions in the system, it is recommended to choose an appropriate unique identifier string name when |
43 | * defining your plug-in, as well as incrementing the version string to a correct value whenever something changes in the |
44 | * implementation of the plug-in. Both of these string are used when comparing plug-ins for searches, as well as |
45 | * identification in FBX files. |
46 | */ |
47 | struct FBXSDK_DLL FbxPluginDef |
48 | { |
49 | //! Constructor |
50 | FbxPluginDef() : |
51 | mName("Unknown Name" ), |
52 | mVersion("Unknown Version" ) |
53 | { |
54 | } |
55 | |
56 | FbxString mName; //!< The identifier name string of the plug-in. If the name is already used by another plug-in, the plug-in will still register. |
57 | FbxString mVersion; //!< The version string of the plug-in. |
58 | }; |
59 | |
60 | /** Data used to communicate information between an application and the plug-in. |
61 | */ |
62 | struct FBXSDK_DLL FbxPluginData |
63 | { |
64 | //! Constructor |
65 | FbxPluginData() : |
66 | mQueryEmitter(NULL), |
67 | mSDKManager(NULL), |
68 | mPluginContainer(NULL) |
69 | { |
70 | } |
71 | |
72 | //! Copy Constructor |
73 | explicit FbxPluginData(const FbxPluginData& pOther) : |
74 | mQueryEmitter(pOther.mQueryEmitter), |
75 | mSDKManager(pOther.mSDKManager), |
76 | mPluginContainer(pOther.mPluginContainer) |
77 | { |
78 | } |
79 | |
80 | FbxEmitter* mQueryEmitter; //!< The emitter on which the plug-in can listen to receive events. |
81 | FbxManager* mSDKManager; //!< The FBX SDK Manager on which the plug-in was instanced. |
82 | FbxPluginContainer* mPluginContainer; //!< The container which will have the ownership of the plug-in. |
83 | }; |
84 | |
85 | /** The base class to inherit from when creating new plug-ins for the FBX SDK. Plug-ins for the FBX SDK are extremely flexible |
86 | * allowing a wide-range of possibilities. For example, one can write his own plug-in to add new readers/writers to the current list |
87 | * of supported I/O formats, or add new dynamic classes to instantiate custom objects that can later be stored in FBX files. We also use the same |
88 | * interface for plug-ins written using the FBX Extension SDK, which allow additional callbacks for other various Autodesk products |
89 | * enabling greater interoperability with multiple various SDKs. |
90 | * |
91 | * Here is typical implementation of an FBX SDK plug-in that doesn't do anything else than just registering itself: |
92 | * \code |
93 | * class MyPlugin : public FbxPlugin |
94 | * { |
95 | * FBXSDK_PLUGIN_DECLARE(MyPlugin); //This macro is mandatory for any plug-in definition |
96 | * |
97 | * protected: |
98 | * explicit MyPlugin(const FbxPluginDef& pDefinition, FbxModule pModuleHandle) : FbxPlugin(pDefinition, pModuleHandle) |
99 | * { |
100 | * } |
101 | * |
102 | * //Abstract functions that *must* be implemented |
103 | * virtual bool SpecificInitialize() |
104 | * { |
105 | * //For example, here we could register as many new I/O readers/writers as we would like, or classes, etc. |
106 | * return true; |
107 | * } |
108 | * |
109 | * virtual bool SpecificTerminate() |
110 | * { |
111 | * //Here we would have to unregister whatever we registered to the FBX SDK |
112 | * return true; |
113 | * } |
114 | * }; |
115 | * |
116 | * FBXSDK_PLUGIN_IMPLEMENT(MyPlugin); //This macro is mandatory for any plug-in implementation |
117 | * |
118 | * //Standard C export needed for any new FBX SDK plug-in |
119 | * extern "C" |
120 | * { |
121 | * static MyPlugin* sMyPluginInstance = NULL; //The module is owner of the plug-in |
122 | * |
123 | * //This function will be called when an application will request the plug-in |
124 | * #ifdef FBXSDK_ENV_WIN |
125 | * __declspec(dllexport) void FBXPluginRegistration(FbxPluginContainer& pContainer, FbxModule pModuleHandle) |
126 | * #else |
127 | * void FBXPluginRegistration(FbxPluginContainer& pContainer, FbxModule pModuleHandle) |
128 | * #endif |
129 | * { |
130 | * if( sPlugin == NULL ) |
131 | * { |
132 | * //Create the plug-in definition which contains the information about the plug-in |
133 | * FbxPluginDef sPluginDef; |
134 | * sPluginDef.mName = "My Plugin"; |
135 | * sPluginDef.mVersion = "1.0"; |
136 | * |
137 | * //Create an instance of the plug-in |
138 | * sMyPluginInstance = MyPlugin::Create(sPluginDef, pLibHandle); |
139 | * |
140 | * //Register the plug-in with the FBX SDK |
141 | * pContainer.Register(*sPlugin); |
142 | * } |
143 | * } |
144 | * } |
145 | * \endcode |
146 | * \see FbxPluginDef, FbxPluginData |
147 | */ |
148 | class FBXSDK_DLL FbxPlugin : public FbxListener |
149 | { |
150 | FBXSDK_INTRUSIVE_LIST_NODE(FbxPlugin, 1); |
151 | |
152 | public: |
153 | /** Abstract function called once at the end of the plug-in construction. At that moment, plug-in data have been properly initialized. |
154 | * This function must be implemented by anyone who writes a new plug-in for the FBX SDK. |
155 | */ |
156 | virtual bool SpecificInitialize()=0; |
157 | |
158 | /** Abstract function called once at the beginning of the plug-in destruction. At that moment, plug-in data is fully available. |
159 | * This function must be implemented by anyone who writes a new plug-in for the FBX SDK. |
160 | */ |
161 | virtual bool SpecificTerminate()=0; |
162 | |
163 | /** Virtual function called once when the FBX SDK is about to write an FBX file. Users can re-implement it in their plug-in if they need |
164 | * to perform tasks at that moment. The scene provided in parameter can be altered. If not re-implemented, this function does nothing. |
165 | * \param pScene The scene that is about to be written in the FBX file. |
166 | */ |
167 | virtual void WriteBegin(FbxScene& pScene); |
168 | |
169 | /** Virtual function called once when the FBX SDK is about to write plug-in's parameters. Users can re-implement it in their plug-in if they need |
170 | * to store properties in the FBX file for their own usage. The object in parameter is used to store those properties. |
171 | * If not re-implemented, this function does nothing. |
172 | * \param pParams An abstract object that can be used as a property container, to allow the plug-in to store properties about the plug-in. |
173 | */ |
174 | virtual void WriteParameters(FbxObject& pParams); |
175 | |
176 | /** Virtual function called once after the FBX SDK wrote an FBX file. Users can re-implement it in their plug-in if they need |
177 | * to perform tasks at that moment. The scene provided in parameter can be altered, but the changes will not appear in the FBX file. |
178 | * If not re-implemented, this function does nothing. |
179 | * \param pScene The scene that was written in the FBX file. |
180 | */ |
181 | virtual void WriteEnd(FbxScene& pScene); |
182 | |
183 | /** Virtual function called once when the FBX SDK is about to read an FBX file. Users can re-implement it in their plug-in if they need |
184 | * to perform tasks at that moment. The scene provided in parameter can be altered. If not re-implemented, this function does nothing. |
185 | * \param pScene The scene that is about to be read in the FBX file. |
186 | */ |
187 | virtual void ReadBegin(FbxScene& pScene); |
188 | |
189 | /** Virtual function called once after the FBX SDK reads the plug-in's parameters. Users can re-implement it in their plug-in if they need |
190 | * to retrieve properties for their own usage. The object in parameter is used to retrieve those properties. |
191 | * If not re-implemented, this function does nothing. |
192 | * \param pParams An abstract object that can be used as a property container, to allow the plug-in to read properties about the plug-in. |
193 | */ |
194 | virtual void ReadParameters(FbxObject& pParams); |
195 | |
196 | /** Virtual function called once after the FBX SDK read an FBX file. Users can re-implement it in their plug-in if they need |
197 | * to perform tasks at that moment. The scene provided in parameter can be altered. If not re-implemented, this function does nothing. |
198 | * \param pScene The scene that was read in the FBX file. |
199 | */ |
200 | virtual void ReadEnd(FbxScene& pScene); |
201 | |
202 | /** Accessor to the plug-in definition structure that contains basic information on the plug-in like its name or version. This is |
203 | * the only method available to differentiate plug-ins. |
204 | * \return The definition structure for this plug-in. |
205 | */ |
206 | const FbxPluginDef& GetDefinition() const; |
207 | |
208 | /** Retrieve the module address pointer for this plug-in. With this module instance handle, for example someone can query procedures addresses, |
209 | * allowing more complex interactions, as well as other operating system module specific functions. |
210 | */ |
211 | FbxModule GetModuleHdl(); |
212 | |
213 | protected: |
214 | /** Use the Create() and Destroy() methods declared and implemented in the FBXSDK_PLUGIN_DECLARE and FBXSDK_PLUGIN_IMPLEMENT macros to construct and destroy FbxPlugin objects. |
215 | * \param pDefinition The definition associated with this plug-in. Each plug-in must have its own definition to differentiate it with other plug-ins. |
216 | * \param pModuleHandle A pointer to the plug-in module address. |
217 | */ |
218 | explicit FbxPlugin(const FbxPluginDef& pDefinition, FbxModule pModuleHandle); |
219 | |
220 | /** Accessor to the plug-in private data. |
221 | * \return The data for the current plug-in. |
222 | */ |
223 | FbxPluginData& GetData(); |
224 | |
225 | /** Const accessor to the plug-in private data. |
226 | * \return The const data for the current plug-in. |
227 | */ |
228 | const FbxPluginData& GetData() const; |
229 | |
230 | /***************************************************************************************************************************** |
231 | ** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! ** |
232 | *****************************************************************************************************************************/ |
233 | #ifndef DOXYGEN_SHOULD_SKIP_THIS |
234 | public: |
235 | inline FbxObject& GetPluginSettings() { return *mPluginSettings; } |
236 | inline const FbxObject& GetPluginSettings() const { return *mPluginSettings; } |
237 | template <typename EventType, typename ListernerType> inline FbxEventHandler* Bind(void (ListernerType::*pFunc)(const EventType*)) |
238 | { |
239 | return FbxListener::Bind<EventType,ListernerType>(*(GetData().mQueryEmitter), pFunc ); |
240 | } |
241 | virtual void Destroy() = 0; |
242 | |
243 | protected: |
244 | virtual ~FbxPlugin(); |
245 | |
246 | private: |
247 | bool Initialize(const FbxPluginData& pData); |
248 | bool Terminate(); |
249 | |
250 | bool mInitialized; |
251 | FbxPluginData mData; |
252 | FbxPluginDef mDefinition; |
253 | FbxModule mModuleHandle; |
254 | FbxObject* mPluginSettings; |
255 | |
256 | friend class FbxLoadingStrategy; |
257 | #endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/ |
258 | }; |
259 | |
260 | #include <fbxsdk/fbxsdk_nsend.h> |
261 | |
262 | #endif /* !FBXSDK_ENV_WINSTORE */ |
263 | |
264 | #endif /* _FBXSDK_CORE_PLUGIN_H_ */ |
265 | |