00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef __GZ_NODE_OPTIMIZER_H__
00023 #define __GZ_NODE_OPTIMIZER_H__
00024
00030 #include "gzNode.h"
00031
00032 #include "gzDbFlags.h"
00033
00034 typedef enum {
00035 GZ_NODE_OPTIMIZE_DEFAULT = 0,
00036 GZ_NODE_OPTIMIZE_ONLY_STATES = (1<<0),
00037 GZ_NODE_OPTIMIZE_DONT_COMBINE_NAME_ENCODED = (1<<1),
00038 GZ_NODE_OPTIMIZE_DONT_CONCAT_GEOMETRY = (1<<2),
00039 GZ_NODE_OPTIMIZE_USE_INDEXED_GEOMETRY = (1<<3),
00040 GZ_NODE_OPTIMIZE_USE_DISPLAYLIST_GEOMETRY = (1<<4),
00041 GZ_NODE_OPTIMIZE_USE_BUFFERED_GEOMETRY = (1<<5),
00042 GZ_NODE_OPTIMIZE_STRIP_USER_DATA = (1<<6),
00043 GZ_NODE_OPTIMIZE_EXCLUDE_TREE = (1<<7),
00044 GZ_NODE_OPTIMIZE_NO_PROGRESS_REPORT = (1<<8),
00045 GZ_NODE_OPTIMIZE_NO_BOUNDARY_CALC = (1<<9),
00046 GZ_NODE_OPTIMIZE_DONT_FLATTEN_GEOMETRY = (1<<10),
00047 GZ_NODE_OPTIMIZE_DONT_CHANGE_RENDER_ORDER = (1<<11),
00048 GZ_NODE_OPTIMIZE_DONT_OPTIMIZE_GEOMETRY = (1<<12),
00049
00050
00051 } gzNodeOptimizeLevel;
00052
00054 GZ_USE_BIT_LOGIC(gzNodeOptimizeLevel);
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070 class gzNodeOptimizer
00071 {
00072 public:
00073
00074 GZ_GRAPH_EXPORT gzNodeOptimizer();
00075
00076 GZ_GRAPH_EXPORT virtual ~gzNodeOptimizer();
00077
00079
00087 GZ_GRAPH_EXPORT gzNode *optimize(gzNode *node , gzNodeOptimizeLevel level=GZ_NODE_OPTIMIZE_DEFAULT);
00088
00089 GZ_GRAPH_EXPORT gzBool subOptimize(gzNode *subnode,gzNodeOptimizeLevel level=GZ_NODE_OPTIMIZE_DEFAULT);
00090
00092
00094 GZ_GRAPH_EXPORT gzVoid exclude(const gzString &pathName);
00095
00097 GZ_GRAPH_EXPORT gzVoid exclude(gzNode *node);
00098
00099 GZ_GRAPH_EXPORT gzVoid addCompileCandidate(const gzString &nodeName);
00100 GZ_GRAPH_EXPORT gzVoid removeCompileCandidate(const gzString &nodeName);
00101
00103
00106 GZ_GRAPH_EXPORT gzBool isExcluded(gzNode *node,gzNodeOptimizeLevel level);
00107
00108 GZ_GRAPH_EXPORT gzBool isCompileCandidate(const gzString &nodeName);
00109
00111 GZ_GRAPH_EXPORT gzVoid setMaxRecursionDepth(gzULong depth);
00112
00113 GZ_GRAPH_EXPORT gzULong getMaxRecursionDepth() const;
00114
00115 GZ_GRAPH_EXPORT gzVoid optimizeState(gzNode *node);
00116
00117 GZ_GRAPH_EXPORT gzVoid clearStateOptims();
00118
00119 GZ_GRAPH_EXPORT gzVoid reportProgress(gzUByte progress);
00120
00121 GZ_GRAPH_EXPORT gzReal getMaxCombineRadius();
00122 GZ_GRAPH_EXPORT gzVoid setMaxCombineRadius(gzReal radius);
00123
00124 GZ_GRAPH_EXPORT gzULong getMaxCombinations();
00125 GZ_GRAPH_EXPORT gzVoid setMaxCombinations(gzULong combs);
00126
00127 private:
00128
00129 gzDynamicArray<gzString> m_excludePaths;
00130
00131 gzDict<gzInstanceCompareInterface,gzVoid> m_excludeNodes;
00132
00133 gzDict<gzString,gzVoid> m_compileCandidate;
00134
00135 gzULong m_maxRecursionDepth;
00136
00137 gzRefDict<gzInstanceCompareInterface,gzState> m_stateDict;
00138
00139 gzRefDict<gzInstanceCompareInterface,gzState> m_convertStateDict;
00140
00141 gzUByte m_lastProgress;
00142
00143 gzReal m_maxCombineRadius;
00144
00145 gzULong m_maxCombinations;
00146 };
00147
00148 GZ_GRAPH_EXPORT gzNodeOptimizeLevel getNodeOptimizerFlagsFromDbFlags(const gzSerializeAdapterFlags &dbflags);
00149
00150 #endif // __GZ_NODE_OPTIMIZER_H__