RenderBin 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  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. #ifndef OSGUTIL_RENDERBIN
  14. #define OSGUTIL_RENDERBIN 1
  15. #include <osgUtil/StateGraph>
  16. #include <map>
  17. #include <vector>
  18. #include <string>
  19. namespace osgUtil {
  20. class RenderStage;
  21. class Statistics;
  22. /**
  23. * RenderBin base class. Renderbin contains geometries to be rendered as a group,
  24. * renderbins are rendered once each. They can improve efficiency or
  25. * use different rendering algorithms.
  26. * A renderBin can contain further renderBins producing a tree hierarchy of renderBins.
  27. */
  28. class OSGUTIL_EXPORT RenderBin : public osg::Object
  29. {
  30. public:
  31. typedef std::vector<RenderLeaf*> RenderLeafList;
  32. typedef std::vector<StateGraph*> StateGraphList;
  33. typedef std::map< int, osg::ref_ptr<RenderBin> > RenderBinList;
  34. enum SortMode
  35. {
  36. SORT_BY_STATE,
  37. SORT_BY_STATE_THEN_FRONT_TO_BACK,
  38. SORT_FRONT_TO_BACK,
  39. SORT_BACK_TO_FRONT,
  40. TRAVERSAL_ORDER
  41. };
  42. // static methods.
  43. static RenderBin* createRenderBin(const std::string& binName);
  44. static RenderBin* getRenderBinPrototype(const std::string& binName);
  45. static void addRenderBinPrototype(const std::string& binName,RenderBin* proto);
  46. static void removeRenderBinPrototype(RenderBin* proto);
  47. static void setDefaultRenderBinSortMode(SortMode mode);
  48. static SortMode getDefaultRenderBinSortMode();
  49. RenderBin();
  50. RenderBin(SortMode mode);
  51. /** Copy constructor using CopyOp to manage deep vs shallow copy.*/
  52. RenderBin(const RenderBin& rhs,const osg::CopyOp& copyop=osg::CopyOp::SHALLOW_COPY);
  53. virtual osg::Object* cloneType() const { return new RenderBin(); }
  54. virtual osg::Object* clone(const osg::CopyOp& copyop) const { return new RenderBin(*this,copyop); } // note only implements a clone of type.
  55. virtual bool isSameKindAs(const osg::Object* obj) const { return dynamic_cast<const RenderBin*>(obj)!=0L; }
  56. virtual const char* libraryName() const { return "osgUtil"; }
  57. virtual const char* className() const { return "RenderBin"; }
  58. virtual void reset();
  59. void setStateGraph(StateGraph* sg) { _rootStateGraph = sg; }
  60. StateGraph* getStateGraph() { return _rootStateGraph.get(); }
  61. void setStateSet(osg::StateSet* stateset) { _stateset = stateset; }
  62. osg::StateSet* getStateSet() { return _stateset.get(); }
  63. const osg::StateSet* getStateSet() const { return _stateset.get(); }
  64. RenderBin* getParent() { return _parent; }
  65. const RenderBin* getParent() const { return _parent; }
  66. RenderStage* getStage() { return _stage; }
  67. const RenderStage* getStage() const { return _stage; }
  68. int getBinNum() const { return _binNum; }
  69. StateGraphList& getStateGraphList() { return _stateGraphList; }
  70. const StateGraphList& getStateGraphList() const { return _stateGraphList; }
  71. RenderBinList& getRenderBinList() { return _bins; }
  72. const RenderBinList& getRenderBinList() const { return _bins; }
  73. RenderLeafList& getRenderLeafList() { return _renderLeafList; }
  74. const RenderLeafList& getRenderLeafList() const { return _renderLeafList; }
  75. RenderBin* find_or_insert(int binNum,const std::string& binName);
  76. void addStateGraph(StateGraph* rg)
  77. {
  78. _stateGraphList.push_back(rg);
  79. }
  80. virtual void sort();
  81. virtual void sortImplementation();
  82. void setSortMode(SortMode mode);
  83. SortMode getSortMode() const { return _sortMode; }
  84. virtual void sortByState();
  85. virtual void sortByStateThenFrontToBack();
  86. virtual void sortFrontToBack();
  87. virtual void sortBackToFront();
  88. virtual void sortTraversalOrder();
  89. struct SortCallback : public osg::Referenced
  90. {
  91. virtual void sortImplementation(RenderBin*) = 0;
  92. };
  93. void setSortCallback(SortCallback* sortCallback) { _sortCallback = sortCallback; }
  94. SortCallback* getSortCallback() { return _sortCallback.get(); }
  95. const SortCallback* getSortCallback() const { return _sortCallback.get(); }
  96. virtual void draw(osg::RenderInfo& renderInfo,RenderLeaf*& previous);
  97. virtual void drawImplementation(osg::RenderInfo& renderInfo,RenderLeaf*& previous);
  98. struct DrawCallback : public osg::Referenced
  99. {
  100. virtual void drawImplementation(RenderBin* bin,osg::RenderInfo& renderInfo,RenderLeaf*& previous) = 0;
  101. };
  102. void setDrawCallback(DrawCallback* drawCallback) { _drawCallback = drawCallback; }
  103. DrawCallback* getDrawCallback() { return _drawCallback.get(); }
  104. const DrawCallback* getDrawCallback() const { return _drawCallback.get(); }
  105. /** Extract stats for current draw list. */
  106. bool getStats(Statistics& primStats) const;
  107. /** Compute the number of dynamic RenderLeaves.*/
  108. virtual unsigned int computeNumberOfDynamicRenderLeaves() const;
  109. void copyLeavesFromStateGraphListToRenderLeafList();
  110. /** If State is non-zero, this function releases any associated OpenGL objects for
  111. * the specified graphics context. Otherwise, releases OpenGL objexts
  112. * for all graphics contexts. */
  113. virtual void releaseGLObjects(osg::State* state= 0) const;
  114. protected:
  115. virtual ~RenderBin();
  116. osg::ref_ptr<StateGraph> _rootStateGraph;
  117. int _binNum;
  118. RenderBin* _parent;
  119. RenderStage* _stage;
  120. RenderBinList _bins;
  121. StateGraphList _stateGraphList;
  122. RenderLeafList _renderLeafList;
  123. bool _sorted;
  124. SortMode _sortMode;
  125. osg::ref_ptr<SortCallback> _sortCallback;
  126. osg::ref_ptr<DrawCallback> _drawCallback;
  127. osg::ref_ptr<osg::StateSet> _stateset;
  128. };
  129. }
  130. #endif