00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef __GZ_DYNAMIC_LOADER_H__
00023 #define __GZ_DYNAMIC_LOADER_H__
00024
00030 #include "gzGroup.h"
00031 #include "gzThread.h"
00032 #include "gzNodeOptimizer.h"
00033
00034 enum gzDynamicLoadingState
00035 {
00036 GZ_DYNAMIC_LOADER_UNLOADED ,
00037 GZ_DYNAMIC_LOADER_LOADED ,
00038 GZ_DYNAMIC_LOADER_REQUEST_LOAD,
00039 GZ_DYNAMIC_LOADER_REQUEST_LOAD_CANCEL,
00040 GZ_DYNAMIC_LOADER_IN_LOADING,
00041 GZ_DYNAMIC_LOADER_IN_TRAVERSAL,
00042 GZ_DYNAMIC_LOADER_REQUEST_UNLOAD,
00043 GZ_DYNAMIC_LOADER_NOT_FOUND,
00044
00045 };
00046
00047 class gzDynamicLoader;
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063 class gzDynamicLoaderGlobalInfoInterface
00064 {
00065 public:
00066
00067 GZ_GRAPH_EXPORT gzDynamicLoaderGlobalInfoInterface();
00068
00069 GZ_GRAPH_EXPORT virtual ~gzDynamicLoaderGlobalInfoInterface();
00070
00071 GZ_GRAPH_EXPORT virtual gzVoid onDynamicLoadState(gzDynamicLoadingState state,gzDynamicLoader *loader,gzNode *node);
00072
00073 private:
00074
00075 friend class gzDynamicLoader;
00076
00077 static gzVoid notify(gzDynamicLoadingState state,gzDynamicLoader *loader,gzNode *node);
00078
00079 static gzList<gzDynamicLoaderGlobalInfoInterface> s_subscribers;
00080 };
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096 class gzDynamicLoaderInfoInterface
00097 {
00098 public:
00099
00100 GZ_GRAPH_EXPORT gzDynamicLoaderInfoInterface();
00101
00102 GZ_GRAPH_EXPORT virtual ~gzDynamicLoaderInfoInterface();
00103
00104 GZ_GRAPH_EXPORT virtual gzVoid onDynamicLoadState(gzDynamicLoadingState state,gzDynamicLoader *loader,gzNode *node)=0;
00105
00106 private:
00107
00108 friend class gzDynamicLoader;
00109
00110 gzList<gzDynamicLoader> m_pendingSubscriptions;
00111 };
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128 class gzDynamicLoader : public gzGroup
00129 {
00130 public:
00131
00132 GZ_GRAPH_EXPORT gzDynamicLoader(const gzString & name=GZ_EMPTY_STRING);
00133
00134 GZ_GRAPH_EXPORT virtual ~gzDynamicLoader();
00135
00136 GZ_DECLARE_TYPE_INTERFACE_EXPORT(GZ_GRAPH_EXPORT);
00137
00138
00139
00140 GZ_GRAPH_EXPORT gzVoid setLoadState( gzBool load=TRUE );
00141
00142 GZ_GRAPH_EXPORT gzVoid setNodeURL(const gzString &name);
00143
00144 GZ_GRAPH_EXPORT gzVoid setLoadFlags(const gzSerializeAdapterFlags & flags );
00145
00146 GZ_GRAPH_EXPORT gzVoid setScale(gzReal scale=0);
00147
00148 GZ_GRAPH_EXPORT gzVoid setHPR(gzReal heading=0 , gzReal pitch=0 , gzReal roll=0);
00149
00150 GZ_GRAPH_EXPORT gzVoid waitForLoadedData();
00151
00153 GZ_GRAPH_EXPORT gzBool isLoaded();
00154
00156 GZ_GRAPH_EXPORT gzBool isInLoading();
00157
00159 GZ_GRAPH_EXPORT gzBool getLoadState();
00160
00161 GZ_GRAPH_EXPORT gzVoid useOptimizer(gzBool on);
00162
00163 GZ_GRAPH_EXPORT gzVoid setOptimizerFlags(const gzNodeOptimizeLevel & flags );
00164
00165 GZ_GRAPH_EXPORT virtual gzVoid onNodeLoadState(gzNode *node,gzDynamicLoadingState state);
00166
00167 GZ_GRAPH_EXPORT static gzBool isWorking();
00168
00169 GZ_GRAPH_EXPORT static gzDouble getWorkDelay();
00170
00171 GZ_GRAPH_EXPORT static gzULong getPendingWork();
00172
00173 GZ_GRAPH_EXPORT static gzVoid boostLoaderWork();
00174
00175 GZ_GRAPH_EXPORT static gzVoid unBoostLoaderWork();
00176
00177
00178
00179 GZ_GRAPH_EXPORT virtual gzReference* clone() const;
00180
00181 GZ_GRAPH_EXPORT virtual gzVoid preTraverseAction( gzTraverseAction *actionclass , gzContext *context);
00182 GZ_GRAPH_EXPORT virtual gzVoid postTraverseAction( gzTraverseAction *actionclass , gzContext *context);
00183 GZ_GRAPH_EXPORT virtual gzBool isTraversable( gzTraverseAction *action , gzNode *node , gzULong index , gzContext *context );
00184
00185
00186
00187 GZ_GRAPH_EXPORT virtual gzVoid write(gzSerializeAdapter *adapter);
00188 GZ_GRAPH_EXPORT virtual gzVoid read(gzSerializeAdapter *adapter);
00189 GZ_GRAPH_EXPORT virtual gzULong getDataSize(gzSerializeAdapter *adapter) const;
00190
00191
00192
00193 GZ_GRAPH_EXPORT gzVoid addSubscriber(gzDynamicLoaderInfoInterface *subscriber);
00194 GZ_GRAPH_EXPORT gzVoid removeSubscriber(gzDynamicLoaderInfoInterface *subscriber);
00195
00196
00197 GZ_PROPERTY_EXPORT(gzULong, AttachID, GZ_GRAPH_EXPORT);
00198 GZ_PROPERTY_EXPORT(gzDouble, LoadPriority, GZ_GRAPH_EXPORT);
00199
00200 protected:
00201
00202 GZ_GRAPH_EXPORT gzVoid notifyLoadState(gzDynamicLoadingState state,gzDynamicLoader *loader,gzNode *node);
00203
00204 friend class gzDynamicLoaderManager;
00205
00206
00207
00208 gzDynamicLoadingState m_state:4;
00209
00210 gzBool m_loadState:1;
00211
00212 gzBool m_optimize:1;
00213
00214 gzBool m_pendingWork:1;
00215
00216
00217
00218 gzString m_nodeURL;
00219
00220 gzSerializeAdapterFlags m_loadFlags;
00221
00222 gzReal m_scale;
00223
00224 gzReal m_heading;
00225
00226 gzReal m_pitch;
00227
00228 gzReal m_roll;
00229
00230 gzNodeOptimizeLevel m_optimizerFlags;
00231
00232 gzList<gzDynamicLoaderInfoInterface> m_subscribers;
00233
00234 private:
00235
00236 static gzULong s_pendingWork;
00237
00238 static gzDouble s_lastPingTime;
00239
00240 static gzBool s_isBoosted;
00241 };
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257 class gzDynamicLoaderManager : public gzThread
00258 {
00259 public:
00260
00261 gzDynamicLoaderManager();
00262
00263 virtual ~gzDynamicLoaderManager();
00264
00265 GZ_GRAPH_EXPORT static gzVoid startManager();
00266
00267 GZ_GRAPH_EXPORT static gzVoid stopManager();
00268
00269 GZ_GRAPH_EXPORT static gzBool isManagerRunning();
00270
00271 private:
00272
00273 friend class gzDynamicLoader;
00274
00275 virtual gzVoid process();
00276
00277 gzRefList<gzRefData<gzList<gzDynamicLoader> > > m_pendingLoaders;
00278 gzRefList<gzRefData<gzList<gzDynamicLoader> > > m_spareQueues;
00279
00280 gzEvent m_trigger;
00281
00282 };
00283
00284 #endif