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