OSG  3.4.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Optimizer.h
Go to the documentation of this file.
1 /* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
2  *
3  * This library is open source and may be redistributed and/or modified under
4  * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
5  * (at your option) any later version. The full license is in LICENSE file
6  * included with this distribution, and on the openscenegraph.org website.
7  *
8  * This library is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * OpenSceneGraph Public License for more details.
12 */
13 
14 #ifndef OSGUTIL_OPTIMIZER
15 #define OSGUTIL_OPTIMIZER
16 
17 #include <osg/NodeVisitor>
18 #include <osg/Matrix>
19 #include <osg/Geometry>
20 #include <osg/Transform>
21 #include <osg/Texture2D>
22 
23 #include <osgUtil/Export>
24 
25 #include <set>
26 
27 namespace osgUtil {
28 
29 // forward declare
30 class Optimizer;
31 
34 {
35  public:
36 
37  BaseOptimizerVisitor(Optimizer* optimizer, unsigned int operation):
38  osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN),
39  _optimizer(optimizer),
40  _operationType(operation)
41  {
42  setNodeMaskOverride(0xffffffff);
43  }
44 
45  inline bool isOperationPermissibleForObject(const osg::StateSet* object) const;
46  inline bool isOperationPermissibleForObject(const osg::StateAttribute* object) const;
47  inline bool isOperationPermissibleForObject(const osg::Drawable* object) const;
48  inline bool isOperationPermissibleForObject(const osg::Node* object) const;
49 
50  protected:
51 
53  unsigned int _operationType;
54 };
55 
61 {
62 
63  public:
64 
65  Optimizer() {}
66  virtual ~Optimizer() {}
67 
69  {
70  FLATTEN_STATIC_TRANSFORMS = (1 << 0),
71  REMOVE_REDUNDANT_NODES = (1 << 1),
72  REMOVE_LOADED_PROXY_NODES = (1 << 2),
73  COMBINE_ADJACENT_LODS = (1 << 3),
74  SHARE_DUPLICATE_STATE = (1 << 4),
75  MERGE_GEOMETRY = (1 << 5),
76  CHECK_GEOMETRY = (1 << 6),
77  MAKE_FAST_GEOMETRY = (1 << 7),
78  SPATIALIZE_GROUPS = (1 << 8),
79  COPY_SHARED_NODES = (1 << 9),
80  TRISTRIP_GEOMETRY = (1 << 10),
81  TESSELLATE_GEOMETRY = (1 << 11),
82  OPTIMIZE_TEXTURE_SETTINGS = (1 << 12),
83  MERGE_GEODES = (1 << 13),
84  FLATTEN_BILLBOARDS = (1 << 14),
85  TEXTURE_ATLAS_BUILDER = (1 << 15),
86  STATIC_OBJECT_DETECTION = (1 << 16),
87  FLATTEN_STATIC_TRANSFORMS_DUPLICATING_SHARED_SUBGRAPHS = (1 << 17),
88  INDEX_MESH = (1 << 18),
89  VERTEX_POSTTRANSFORM = (1 << 19),
90  VERTEX_PRETRANSFORM = (1 << 20),
91  DEFAULT_OPTIMIZATIONS = FLATTEN_STATIC_TRANSFORMS |
92  REMOVE_REDUNDANT_NODES |
93  REMOVE_LOADED_PROXY_NODES |
94  COMBINE_ADJACENT_LODS |
95  SHARE_DUPLICATE_STATE |
96  MERGE_GEOMETRY |
97  MAKE_FAST_GEOMETRY |
98  CHECK_GEOMETRY |
99  OPTIMIZE_TEXTURE_SETTINGS |
100  STATIC_OBJECT_DETECTION,
101  ALL_OPTIMIZATIONS = FLATTEN_STATIC_TRANSFORMS_DUPLICATING_SHARED_SUBGRAPHS |
102  REMOVE_REDUNDANT_NODES |
103  REMOVE_LOADED_PROXY_NODES |
104  COMBINE_ADJACENT_LODS |
105  SHARE_DUPLICATE_STATE |
106  MERGE_GEODES |
107  MERGE_GEOMETRY |
108  MAKE_FAST_GEOMETRY |
109  CHECK_GEOMETRY |
110  SPATIALIZE_GROUPS |
111  COPY_SHARED_NODES |
112  TRISTRIP_GEOMETRY |
113  OPTIMIZE_TEXTURE_SETTINGS |
114  TEXTURE_ATLAS_BUILDER |
115  STATIC_OBJECT_DETECTION
116  };
117 
119  void reset();
120 
123  void optimize(osg::Node* node);
124 
127  virtual void optimize(osg::Node* node, unsigned int options);
128 
129 
132  {
133  virtual bool isOperationPermissibleForObjectImplementation(const Optimizer* optimizer, const osg::StateSet* stateset,unsigned int option) const
134  {
135  return optimizer->isOperationPermissibleForObjectImplementation(stateset,option);
136  }
137 
138  virtual bool isOperationPermissibleForObjectImplementation(const Optimizer* optimizer, const osg::StateAttribute* attribute,unsigned int option) const
139  {
140  return optimizer->isOperationPermissibleForObjectImplementation(attribute,option);
141  }
142 
143  virtual bool isOperationPermissibleForObjectImplementation(const Optimizer* optimizer, const osg::Drawable* drawable,unsigned int option) const
144  {
145  return optimizer->isOperationPermissibleForObjectImplementation(drawable,option);
146  }
147 
148  virtual bool isOperationPermissibleForObjectImplementation(const Optimizer* optimizer, const osg::Node* node,unsigned int option) const
149  {
150  return optimizer->isOperationPermissibleForObjectImplementation(node,option);
151  }
152 
153  };
154 
156  void setIsOperationPermissibleForObjectCallback(IsOperationPermissibleForObjectCallback* callback) { _isOperationPermissibleForObjectCallback=callback; }
157 
159  IsOperationPermissibleForObjectCallback* getIsOperationPermissibleForObjectCallback() { return _isOperationPermissibleForObjectCallback.get(); }
160 
162  const IsOperationPermissibleForObjectCallback* getIsOperationPermissibleForObjectCallback() const { return _isOperationPermissibleForObjectCallback.get(); }
163 
164 
165  inline void setPermissibleOptimizationsForObject(const osg::Object* object, unsigned int options)
166  {
167  _permissibleOptimizationsMap[object] = options;
168  }
169 
170  inline unsigned int getPermissibleOptimizationsForObject(const osg::Object* object) const
171  {
172  PermissibleOptimizationsMap::const_iterator itr = _permissibleOptimizationsMap.find(object);
173  if (itr!=_permissibleOptimizationsMap.end()) return itr->second;
174  else return 0xffffffff;
175  }
176 
177 
178  inline bool isOperationPermissibleForObject(const osg::StateSet* object, unsigned int option) const
179  {
180  if (_isOperationPermissibleForObjectCallback.valid())
181  return _isOperationPermissibleForObjectCallback->isOperationPermissibleForObjectImplementation(this,object,option);
182  else
183  return isOperationPermissibleForObjectImplementation(object,option);
184  }
185 
186  inline bool isOperationPermissibleForObject(const osg::StateAttribute* object, unsigned int option) const
187  {
188  if (_isOperationPermissibleForObjectCallback.valid())
189  return _isOperationPermissibleForObjectCallback->isOperationPermissibleForObjectImplementation(this,object,option);
190  else
191  return isOperationPermissibleForObjectImplementation(object,option);
192  }
193 
194  inline bool isOperationPermissibleForObject(const osg::Drawable* object, unsigned int option) const
195  {
196  if (_isOperationPermissibleForObjectCallback.valid())
197  return _isOperationPermissibleForObjectCallback->isOperationPermissibleForObjectImplementation(this,object,option);
198  else
199  return isOperationPermissibleForObjectImplementation(object,option);
200  }
201 
202  inline bool isOperationPermissibleForObject(const osg::Node* object, unsigned int option) const
203  {
204  if (_isOperationPermissibleForObjectCallback.valid())
205  return _isOperationPermissibleForObjectCallback->isOperationPermissibleForObjectImplementation(this,object,option);
206  else
207  return isOperationPermissibleForObjectImplementation(object,option);
208  }
209 
210  bool isOperationPermissibleForObjectImplementation(const osg::StateSet* stateset, unsigned int option) const
211  {
212  return (option & getPermissibleOptimizationsForObject(stateset))!=0;
213  }
214 
215  bool isOperationPermissibleForObjectImplementation(const osg::StateAttribute* attribute, unsigned int option) const
216  {
217  return (option & getPermissibleOptimizationsForObject(attribute))!=0;
218  }
219 
220  bool isOperationPermissibleForObjectImplementation(const osg::Drawable* drawable, unsigned int option) const
221  {
222  if (option & (REMOVE_REDUNDANT_NODES|MERGE_GEOMETRY))
223  {
224  if (drawable->getUserData()) return false;
225  if (drawable->getUpdateCallback()) return false;
226  if (drawable->getEventCallback()) return false;
227  if (drawable->getCullCallback()) return false;
228  }
229  return (option & getPermissibleOptimizationsForObject(drawable))!=0;
230  }
231 
232  bool isOperationPermissibleForObjectImplementation(const osg::Node* node, unsigned int option) const
233  {
234  if (option & (REMOVE_REDUNDANT_NODES|COMBINE_ADJACENT_LODS|FLATTEN_STATIC_TRANSFORMS))
235  {
236  if (node->getUserData()) return false;
237  if (node->getUpdateCallback()) return false;
238  if (node->getEventCallback()) return false;
239  if (node->getCullCallback()) return false;
240  if (node->getNumDescriptions()>0) return false;
241  if (node->getStateSet()) return false;
242  if (node->getNodeMask()!=0xffffffff) return false;
243  // if (!node->getName().empty()) return false;
244  }
245 
246  return (option & getPermissibleOptimizationsForObject(node))!=0;
247  }
248 
249  protected:
250 
252 
253  typedef std::map<const osg::Object*,unsigned int> PermissibleOptimizationsMap;
254  PermissibleOptimizationsMap _permissibleOptimizationsMap;
255 
256  public:
257 
265  {
266  public:
267 
269  BaseOptimizerVisitor(optimizer, FLATTEN_STATIC_TRANSFORMS) {}
270 
271  virtual void apply(osg::Node& geode);
272  virtual void apply(osg::Geode& geode);
273  virtual void apply(osg::Billboard& geode);
274  virtual void apply(osg::ProxyNode& node);
275  virtual void apply(osg::PagedLOD& node);
276  virtual void apply(osg::Transform& transform);
277 
278  bool removeTransforms(osg::Node* nodeWeCannotRemove);
279 
280  protected:
281 
282  typedef std::vector<osg::Transform*> TransformStack;
283  typedef std::set<osg::Drawable*> DrawableSet;
284  typedef std::set<osg::Billboard*> BillboardSet;
285  typedef std::set<osg::Node* > NodeSet;
286  typedef std::set<osg::Transform*> TransformSet;
287 
288  TransformStack _transformStack;
290  DrawableSet _drawableSet;
291  BillboardSet _billboardSet;
292  TransformSet _transformSet;
293  };
294 
303  {
304  public:
305 
307  BaseOptimizerVisitor(optimizer, FLATTEN_STATIC_TRANSFORMS_DUPLICATING_SHARED_SUBGRAPHS) {}
308 
309  virtual void reset();
310 
311  virtual void apply(osg::Group& group);
312  virtual void apply(osg::Transform& transform);
313  virtual void apply(osg::LOD& lod);
314  virtual void apply(osg::Geode& geode);
315  virtual void apply(osg::Billboard& billboard);
316 
317  protected:
318 
319  void transformGeode(osg::Geode& geode);
320  void transformDrawable(osg::Drawable& drawable);
321  void transformBillboard(osg::Billboard& billboard);
322 
323  std::vector<osg::Matrix> _matrixStack;
324 
325  };
326 
329  {
330  public:
331 
333  BaseOptimizerVisitor(optimizer, FLATTEN_STATIC_TRANSFORMS) {}
334 
335  virtual void apply(osg::MatrixTransform& transform);
336 
337  bool removeTransforms(osg::Node* nodeWeCannotRemove);
338 
339  protected:
340 
341  typedef std::set<osg::MatrixTransform*> TransformSet;
342  TransformSet _transformSet;
343  };
344 
347  {
348  public:
349 
350 
351  typedef std::set<osg::Node*> NodeList;
353 
355  BaseOptimizerVisitor(optimizer, REMOVE_REDUNDANT_NODES) {}
356 
357  virtual void apply(osg::Geode& geode);
358  virtual void apply(osg::Group& group);
359 
360  void removeEmptyNodes();
361 
362  };
363 
366  {
367  public:
368 
369  typedef std::set<osg::Node*> NodeList;
371 
373  BaseOptimizerVisitor(optimizer, REMOVE_REDUNDANT_NODES) {}
374 
375  virtual void apply(osg::Group& group);
376  virtual void apply(osg::Transform& transform);
377 
378  bool isOperationPermissible(osg::Node& node);
379 
380  void removeRedundantNodes();
381 
382  };
383 
386  {
387  public:
388 
389  typedef std::set<osg::Node*> NodeList;
391 
393  BaseOptimizerVisitor(optimizer, REMOVE_LOADED_PROXY_NODES) {}
394 
395  virtual void apply(osg::ProxyNode& group);
396 
397  void removeRedundantNodes();
398 
399  };
400 
403  {
404  public:
405 
406  typedef std::set<osg::Group*> GroupList;
407  GroupList _groupList;
408 
410  BaseOptimizerVisitor(optimizer, TESSELLATE_GEOMETRY) {}
411 
412  virtual void apply(osg::Geode& geode);
413 
414  };
415 
419  {
420  public:
421 
422  typedef std::set<osg::Group*> GroupList;
423  GroupList _groupList;
424 
426  BaseOptimizerVisitor(optimizer, COMBINE_ADJACENT_LODS) {}
427 
428  virtual void apply(osg::LOD& lod);
429 
430  void combineLODs();
431 
432  };
433 
438  {
439  public:
440 
442  StateVisitor(bool combineDynamicState,
443  bool combineStaticState,
444  bool combineUnspecifiedState,
445  Optimizer* optimizer=0):
446  BaseOptimizerVisitor(optimizer, SHARE_DUPLICATE_STATE)
447  {
448  _optimize[osg::Object::DYNAMIC] = combineDynamicState;
449  _optimize[osg::Object::STATIC] = combineStaticState;
450  _optimize[osg::Object::UNSPECIFIED] = combineUnspecifiedState;
451  }
452 
454  virtual void reset();
455 
456  virtual void apply(osg::Node& node);
457 
458  virtual void apply(osg::Geode& geode);
459 
460  void optimize();
461 
462  protected:
463 
464  void addStateSet(osg::StateSet* stateset, osg::Node* node);
465 
466  inline bool optimize(osg::Object::DataVariance variance)
467  {
468  return _optimize[variance];
469  }
470 
471  typedef std::set<osg::Node*> NodeSet;
472  typedef std::map<osg::StateSet*, NodeSet> StateSetMap;
473 
474  // note, one element for DYNAMIC, STATIC and UNSPECIFIED
475  bool _optimize[3];
476 
477  StateSetMap _statesets;
478 
479  };
480 
484  {
485  public:
486 
489  BaseOptimizerVisitor(optimizer, MERGE_GEODES) {}
490 
491  virtual void apply(osg::Group& group);
492 
493  bool mergeGeodes(osg::Group& group);
494 
495  protected:
496 
497  bool mergeGeode(osg::Geode& lhs, osg::Geode& rhs);
498 
499  };
500 
502  {
503  public:
504 
507  BaseOptimizerVisitor(optimizer, CHECK_GEOMETRY) {}
508 
509  virtual void apply(osg::Geode& geode) { checkGeode(geode); }
510 
511  void checkGeode(osg::Geode& geode);
512 
513  };
514 
516  {
517  public:
518 
521  BaseOptimizerVisitor(optimizer, MAKE_FAST_GEOMETRY) {}
522 
523  virtual void apply(osg::Geode& geode) { checkGeode(geode); }
524 
525  void checkGeode(osg::Geode& geode);
526 
527  };
528 
530  {
531  public:
532 
535  BaseOptimizerVisitor(optimizer, MERGE_GEOMETRY),
536  _targetMaximumNumberOfVertices(10000) {}
537 
538  void setTargetMaximumNumberOfVertices(unsigned int num)
539  {
540  _targetMaximumNumberOfVertices = num;
541  }
542 
543  unsigned int getTargetMaximumNumberOfVertices() const
544  {
545  return _targetMaximumNumberOfVertices;
546  }
547 
548  virtual void apply(osg::Geode& geode) { mergeGeode(geode); }
549  virtual void apply(osg::Billboard&) { /* don't do anything*/ }
550 
551  bool mergeGeode(osg::Geode& geode);
552 
553  static bool geometryContainsSharedArrays(osg::Geometry& geom);
554 
555  static bool mergeGeometry(osg::Geometry& lhs,osg::Geometry& rhs);
556 
557  static bool mergePrimitive(osg::DrawArrays& lhs,osg::DrawArrays& rhs);
558  static bool mergePrimitive(osg::DrawArrayLengths& lhs,osg::DrawArrayLengths& rhs);
559  static bool mergePrimitive(osg::DrawElementsUByte& lhs,osg::DrawElementsUByte& rhs);
560  static bool mergePrimitive(osg::DrawElementsUShort& lhs,osg::DrawElementsUShort& rhs);
561  static bool mergePrimitive(osg::DrawElementsUInt& lhs,osg::DrawElementsUInt& rhs);
562 
563  protected:
564 
566 
567  };
568 
571  {
572  public:
573 
575  BaseOptimizerVisitor(optimizer, SPATIALIZE_GROUPS) {}
576 
577  virtual void apply(osg::Group& group);
578  virtual void apply(osg::Geode& geode);
579 
580  bool divide(unsigned int maxNumTreesPerCell=8);
581 
582  bool divide(osg::Group* group, unsigned int maxNumTreesPerCell);
583  bool divide(osg::Geode* geode, unsigned int maxNumTreesPerCell);
584 
585  typedef std::set<osg::Group*> GroupsToDivideList;
586  GroupsToDivideList _groupsToDivideList;
587 
588  typedef std::set<osg::Geode*> GeodesToDivideList;
589  GeodesToDivideList _geodesToDivideList;
590  };
591 
594  {
595  public:
596 
598  BaseOptimizerVisitor(optimizer, COPY_SHARED_NODES) {}
599 
600  virtual void apply(osg::Node& node);
601 
602  void copySharedNodes();
603 
604  typedef std::set<osg::Node*> SharedNodeList;
605  SharedNodeList _sharedNodeList;
606 
607  };
608 
609 
612  {
613  public:
614 
615  TextureVisitor(bool changeAutoUnRef, bool valueAutoUnRef,
616  bool changeClientImageStorage, bool valueClientImageStorage,
617  bool changeAnisotropy, float valueAnisotropy,
618  Optimizer* optimizer=0):
619  BaseOptimizerVisitor(optimizer, OPTIMIZE_TEXTURE_SETTINGS),
620  _changeAutoUnRef(changeAutoUnRef), _valueAutoUnRef(valueAutoUnRef),
621  _changeClientImageStorage(changeClientImageStorage), _valueClientImageStorage(valueClientImageStorage),
622  _changeAnisotropy(changeAnisotropy), _valueAnisotropy(valueAnisotropy) {}
623 
624  virtual void apply(osg::Geode& node);
625  virtual void apply(osg::Node& node);
626 
627  void apply(osg::StateSet& stateset);
628  void apply(osg::Texture& texture);
629 
630  bool _changeAutoUnRef, _valueAutoUnRef;
631  bool _changeClientImageStorage, _valueClientImageStorage;
634 
635  };
636 
639  {
640  public:
642  BaseOptimizerVisitor(optimizer, FLATTEN_BILLBOARDS) {}
643 
644  typedef std::vector<osg::NodePath> NodePathList;
645  typedef std::map<osg::Billboard*, NodePathList > BillboardNodePathMap;
646 
647  virtual void reset();
648 
649  virtual void apply(osg::Billboard& billboard);
650 
651  void process();
652 
653  BillboardNodePathMap _billboards;
654 
655  };
656 
660  {
661  public:
663 
664  void reset();
665 
666  void setMaximumAtlasSize(int width, int height);
667 
668  int getMaximumAtlasWidth() const { return _maximumAtlasWidth; }
669  int getMaximumAtlasHeight() const { return _maximumAtlasHeight; }
670 
671  void setMargin(int margin);
672  int getMargin() const { return _margin; }
673 
674  void addSource(const osg::Image* image);
675  void addSource(const osg::Texture2D* texture);
676 
677  unsigned int getNumSources() const { return _sourceList.size(); }
678  const osg::Image* getSourceImage(unsigned int i) { return _sourceList[i]->_image.get(); }
679  const osg::Texture2D* getSourceTexture(unsigned int i) { return _sourceList[i]->_texture.get(); }
680 
681  void buildAtlas();
682  osg::Image* getImageAtlas(unsigned int i);
683  osg::Texture2D* getTextureAtlas(unsigned int i);
684  osg::Matrix getTextureMatrix(unsigned int i);
685 
686  osg::Image* getImageAtlas(const osg::Image* image);
687  osg::Texture2D* getTextureAtlas(const osg::Image* image);
688  osg::Matrix getTextureMatrix(const osg::Image* image);
689 
690  osg::Image* getImageAtlas(const osg::Texture2D* textue);
691  osg::Texture2D* getTextureAtlas(const osg::Texture2D* texture);
692  osg::Matrix getTextureMatrix(const osg::Texture2D* texture);
693 
694  protected:
695 
698  int _margin;
699 
700 
701  // forward declare
702  class Atlas;
703 
704  class Source : public osg::Referenced
705  {
706  public:
708  _x(0),_y(0),_atlas(0) {}
709 
710  Source(const osg::Image* image):
711  _x(0),_y(0),_atlas(0),_image(image) {}
712 
713  Source(const osg::Texture2D* texture):
714  _x(0),_y(0),_atlas(0),_texture(texture) { if (texture) _image = texture->getImage(); }
715 
716  int _x;
717  int _y;
719 
722 
723  bool suitableForAtlas(int maximumAtlasWidth, int maximumAtlasHeight, int margin);
724  osg::Matrix computeTextureMatrix() const;
725 
726 
727  protected:
728 
729  virtual ~Source() {}
730  };
731 
732  typedef std::vector< osg::ref_ptr<Source> > SourceList;
733 
734  class Atlas : public osg::Referenced
735  {
736  public:
737  Atlas(int width, int height, int margin):
738  _maximumAtlasWidth(width),
739  _maximumAtlasHeight(height),
740  _margin(margin),
741  _x(0),
742  _y(0),
743  _width(0),
744  _height(0),
745  _indexFirstOfRow(0){}
746 
749  int _margin;
750 
753 
754  SourceList _sourceList;
755 
756  int _x;
757  int _y;
758  int _width;
759  int _height;
760  unsigned int _indexFirstOfRow;
761  enum FitsIn
762  {
765  IN_NEXT_ROW
766  };
767  FitsIn doesSourceFit(Source* source);
768  bool addSource(Source* source);
769  void clampToNearestPowerOfTwoSize();
770  void copySources();
771 
772  protected:
773  virtual ~Atlas() {}
774  };
775 
776  typedef std::vector< osg::ref_ptr<Atlas> > AtlasList;
777 
778  Source* getSource(const osg::Image* image);
779  Source* getSource(const osg::Texture2D* texture);
780 
781  SourceList _sourceList;
782  AtlasList _atlasList;
783  private:
784  struct CompareSrc
785  {
786  bool operator()(osg::ref_ptr<Source> src1, osg::ref_ptr<Source> src2) const
787  {
788  return src1->_image->t() > src2->_image->t();
789  }
790  };
791  void completeRow(unsigned int indexAtlas);
792  };
793 
794 
799  {
800  public:
801 
804  BaseOptimizerVisitor(optimizer, TEXTURE_ATLAS_BUILDER) {}
805 
806 
808 
810  virtual void reset();
811 
812  virtual void apply(osg::Node& node);
813 
814  virtual void apply(osg::Geode& geode);
815 
816  void optimize();
817 
818  protected:
819 
820  bool pushStateSet(osg::StateSet* stateset);
821  void popStateSet();
822 
823  typedef std::set<osg::Drawable*> Drawables;
824  typedef std::map<osg::StateSet*, Drawables> StateSetMap;
825  typedef std::set<osg::Texture2D*> Textures;
826  typedef std::vector<osg::StateSet*> StateSetStack;
827 
829 
830  StateSetMap _statesetMap;
831  StateSetStack _statesetStack;
832  Textures _textures;
833 
834  };
835 
839  {
840  public:
841 
844  BaseOptimizerVisitor(optimizer, STATIC_OBJECT_DETECTION) {}
845 
846  virtual void apply(osg::Node& node);
847 
848  virtual void apply(osg::Geode& geode);
849 
850  protected:
851 
852  void applyStateSet(osg::StateSet& stateset);
853 
854  void applyDrawable(osg::Drawable& drawable);
855 
856  };
857 };
858 
860 {
861  return _optimizer ? _optimizer->isOperationPermissibleForObject(object,_operationType) : true;
862 }
863 
865 {
866  return _optimizer ? _optimizer->isOperationPermissibleForObject(object,_operationType) : true;
867 }
868 
870 {
871  return _optimizer ? _optimizer->isOperationPermissibleForObject(object,_operationType) : true;
872 }
873 
875 {
876  return _optimizer ? _optimizer->isOperationPermissibleForObject(object,_operationType) : true;
877 }
878 
879 }
880 
881 #endif
std::set< osg::Node * > NodeSet
Definition: Optimizer.h:471
bool isOperationPermissibleForObjectImplementation(const osg::Node *node, unsigned int option) const
Definition: Optimizer.h:232
bool isOperationPermissibleForObject(const osg::Node *object, unsigned int option) const
Definition: Optimizer.h:202
FlattenStaticTransformsVisitor(Optimizer *optimizer=0)
Definition: Optimizer.h:268
std::set< osg::Transform * > TransformSet
Definition: Optimizer.h:286
Atlas(int width, int height, int margin)
Definition: Optimizer.h:737
Callback * getUpdateCallback()
Definition: Node.h:216
bool isOperationPermissibleForObject(const osg::StateSet *object, unsigned int option) const
Definition: Optimizer.h:178
bool isOperationPermissibleForObjectImplementation(const osg::StateSet *stateset, unsigned int option) const
Definition: Optimizer.h:210
MergeGeodesVisitor(Optimizer *optimizer=0)
default to traversing all children.
Definition: Optimizer.h:488
std::vector< osg::Transform * > TransformStack
Definition: Optimizer.h:282
const osg::Image * getSourceImage(unsigned int i)
Definition: Optimizer.h:678
unsigned int getNumDescriptions() const
Callback * getEventCallback()
Definition: Node.h:251
MergeGeometryVisitor(Optimizer *optimizer=0)
default to traversing all children.
Definition: Optimizer.h:534
const osg::Texture2D * getSourceTexture(unsigned int i)
Definition: Optimizer.h:679
SpatializeGroupsVisitor(Optimizer *optimizer=0)
Definition: Optimizer.h:574
BaseOptimizerVisitor(Optimizer *optimizer, unsigned int operation)
Definition: Optimizer.h:37
NodeMask getNodeMask() const
Definition: Node.h:356
std::set< osg::Billboard * > BillboardSet
Definition: Optimizer.h:284
osg::ref_ptr< osg::Texture2D > _texture
Definition: Optimizer.h:751
RemoveEmptyNodesVisitor(Optimizer *optimizer=0)
Definition: Optimizer.h:354
bool isOperationPermissibleForObjectImplementation(const osg::StateAttribute *attribute, unsigned int option) const
Definition: Optimizer.h:215
std::set< osg::Texture2D * > Textures
Definition: Optimizer.h:825
virtual void apply(osg::Geode &geode)
Definition: Optimizer.h:548
virtual bool isOperationPermissibleForObjectImplementation(const Optimizer *optimizer, const osg::Drawable *drawable, unsigned int option) const
Definition: Optimizer.h:143
Callback * getCullCallback()
Definition: Node.h:286
void setIsOperationPermissibleForObjectCallback(IsOperationPermissibleForObjectCallback *callback)
Definition: Optimizer.h:156
osg::ref_ptr< IsOperationPermissibleForObjectCallback > _isOperationPermissibleForObjectCallback
Definition: Optimizer.h:251
virtual ~Optimizer()
Definition: Optimizer.h:66
std::vector< osg::StateSet * > StateSetStack
Definition: Optimizer.h:826
std::vector< osg::NodePath > NodePathList
Definition: Optimizer.h:644
std::vector< osg::ref_ptr< Source > > SourceList
Definition: Optimizer.h:732
unsigned int getTargetMaximumNumberOfVertices() const
Definition: Optimizer.h:543
CheckGeometryVisitor(Optimizer *optimizer=0)
default to traversing all children.
Definition: Optimizer.h:506
void setTargetMaximumNumberOfVertices(unsigned int num)
Definition: Optimizer.h:538
std::set< osg::Geode * > GeodesToDivideList
Definition: Optimizer.h:588
std::map< osg::Billboard *, NodePathList > BillboardNodePathMap
Definition: Optimizer.h:645
std::vector< osg::ref_ptr< Atlas > > AtlasList
Definition: Optimizer.h:776
StaticObjectDetectionVisitor(Optimizer *optimizer=0)
default to traversing all children.
Definition: Optimizer.h:843
bool isOperationPermissibleForObjectImplementation(const osg::Drawable *drawable, unsigned int option) const
Definition: Optimizer.h:220
virtual bool isOperationPermissibleForObjectImplementation(const Optimizer *optimizer, const osg::Node *node, unsigned int option) const
Definition: Optimizer.h:148
Definition: LOD.h:35
TextureAtlasVisitor(Optimizer *optimizer=0)
default to traversing all children.
Definition: Optimizer.h:803
GLint GLenum GLsizei width
Definition: GLU.h:71
CopySharedSubgraphsVisitor(Optimizer *optimizer=0)
Definition: Optimizer.h:597
virtual void apply(osg::Geode &geode)
Definition: Optimizer.h:509
std::map< osg::StateSet *, NodeSet > StateSetMap
Definition: Optimizer.h:472
std::set< osg::Group * > GroupList
Definition: Optimizer.h:406
StateVisitor(bool combineDynamicState, bool combineStaticState, bool combineUnspecifiedState, Optimizer *optimizer=0)
default to traversing all children.
Definition: Optimizer.h:442
bool optimize(osg::Object::DataVariance variance)
Definition: Optimizer.h:466
bool isOperationPermissibleForObject(const osg::StateSet *object) const
Definition: Optimizer.h:859
unsigned int getNumSources() const
Definition: Optimizer.h:677
CombineLODsVisitor(Optimizer *optimizer=0)
Definition: Optimizer.h:425
virtual void apply(osg::Billboard &)
Definition: Optimizer.h:549
virtual void apply(osg::Geode &geode)
Definition: Optimizer.h:523
virtual bool isOperationPermissibleForObjectImplementation(const Optimizer *optimizer, const osg::StateSet *stateset, unsigned int option) const
Definition: Optimizer.h:133
MakeFastGeometryVisitor(Optimizer *optimizer=0)
default to traversing all children.
Definition: Optimizer.h:520
virtual bool isOperationPermissibleForObjectImplementation(const Optimizer *optimizer, const osg::StateAttribute *attribute, unsigned int option) const
Definition: Optimizer.h:138
RemoveLoadedProxyNodesVisitor(Optimizer *optimizer=0)
Definition: Optimizer.h:392
GLint GLenum GLsizei GLsizei height
Definition: GLU.h:71
unsigned int _indexFirstOfRow
Contain the index of the first element of the last row.
Definition: Optimizer.h:760
RemoveRedundantNodesVisitor(Optimizer *optimizer=0)
Definition: Optimizer.h:372
std::set< osg::Group * > GroupList
Definition: Optimizer.h:422
TextureAtlasBuilder & getTextureAtlasBuilder()
Definition: Optimizer.h:807
PermissibleOptimizationsMap _permissibleOptimizationsMap
Definition: Optimizer.h:254
TextureVisitor(bool changeAutoUnRef, bool valueAutoUnRef, bool changeClientImageStorage, bool valueClientImageStorage, bool changeAnisotropy, float valueAnisotropy, Optimizer *optimizer=0)
Definition: Optimizer.h:615
std::set< osg::MatrixTransform * > TransformSet
Definition: Optimizer.h:341
Definition: Node.h:71
Definition: AlphaFunc.h:19
std::map< osg::StateSet *, Drawables > StateSetMap
Definition: Optimizer.h:824
#define OSGUTIL_EXPORT
Definition: Export.h:40
IsOperationPermissibleForObjectCallback * getIsOperationPermissibleForObjectCallback()
Definition: Optimizer.h:159
Image * getImage()
Definition: Texture2D.h:47
std::set< osg::Group * > GroupsToDivideList
Definition: Optimizer.h:585
unsigned int getPermissibleOptimizationsForObject(const osg::Object *object) const
Definition: Optimizer.h:170
Source(const osg::Texture2D *texture)
Definition: Optimizer.h:713
osg::ref_ptr< const osg::Texture2D > _texture
Definition: Optimizer.h:721
bool isOperationPermissibleForObject(const osg::Drawable *object, unsigned int option) const
Definition: Optimizer.h:194
std::map< const osg::Object *, unsigned int > PermissibleOptimizationsMap
Definition: Optimizer.h:253
FlattenBillboardVisitor(Optimizer *optimizer=0)
Definition: Optimizer.h:641
osg::ref_ptr< const osg::Image > _image
Definition: Optimizer.h:720
const IsOperationPermissibleForObjectCallback * getIsOperationPermissibleForObjectCallback() const
Definition: Optimizer.h:162
TessellateVisitor(Optimizer *optimizer=0)
Definition: Optimizer.h:409
virtual Referenced * getUserData()
CombineStaticTransformsVisitor(Optimizer *optimizer=0)
Definition: Optimizer.h:332
bool isOperationPermissibleForObject(const osg::StateAttribute *object, unsigned int option) const
Definition: Optimizer.h:186
osg::StateSet * getStateSet()
Definition: Node.h:369
void setPermissibleOptimizationsForObject(const osg::Object *object, unsigned int options)
Definition: Optimizer.h:165
std::set< osg::Drawable * > Drawables
Definition: Optimizer.h:823
Shader generator framework.
Definition: RenderInfo.h:20