File: Renderer

package info (click to toggle)
openscenegraph 3.6.5%2Bdfsg1-9
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 40,100 kB
  • sloc: cpp: 392,065; ansic: 21,495; java: 1,020; yacc: 548; makefile: 430; objc: 406; xml: 155; lex: 151; javascript: 34
file content (131 lines) | stat: -rw-r--r-- 4,323 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
 *
 * This library is open source and may be redistributed and/or modified under
 * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
 * (at your option) any later version.  The full license is in LICENSE file
 * included with this distribution, and on the openscenegraph.org website.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * OpenSceneGraph Public License for more details.
*/

#ifndef OSGVIEWER_RENDERER
#define OSGVIEWER_RENDERER 1

#include <OpenThreads/Condition>
#include <osg/Timer>
#include <osgDB/DatabasePager>
#include <osgUtil/SceneView>
#include <osgViewer/Export>

namespace osgViewer {

class OSGVIEWER_EXPORT OpenGLQuerySupport : public osg::Referenced
{
    public:
        OpenGLQuerySupport();

        virtual void checkQuery(osg::Stats* stats, osg::State* state,
                                osg::Timer_t startTick) = 0;

        virtual void beginQuery(unsigned int frameNumber, osg::State* state) = 0;
        virtual void endQuery(osg::State* state) = 0;
        virtual void initialize(osg::State* state, osg::Timer_t startTick);
    protected:

        const osg::GLExtensions*            _extensions;
};

class OSGVIEWER_EXPORT Renderer : public osg::GraphicsOperation
{
    public:

        Renderer(osg::Camera* camera);

        osgUtil::SceneView* getSceneView(unsigned int i) { return _sceneView[i].get(); }
        const osgUtil::SceneView* getSceneView(unsigned int i) const { return _sceneView[i].get(); }

        void setDone(bool done) { _done = done; }
        bool getDone() { return _done; }

        void setGraphicsThreadDoesCull(bool flag);
        bool getGraphicsThreadDoesCull() const { return _graphicsThreadDoesCull; }


        virtual void cull();
        virtual void draw();
        virtual void cull_draw();

        virtual void compile();

        virtual void resizeGLObjectBuffers(unsigned int maxSize);
        virtual void releaseGLObjects(osg::State* = 0) const;

        void setCompileOnNextDraw(bool flag) { _compileOnNextDraw = flag; }
        bool getCompileOnNextDraw() const { return _compileOnNextDraw; }

        virtual void operator () (osg::Object* object);

        virtual void operator () (osg::GraphicsContext* context);

        virtual void release();

        virtual void reset();

        /** Force update of state associated with cameras. */
        void setCameraRequiresSetUp(bool flag);
        bool getCameraRequiresSetUp() const;

    protected:
        void initialize(osg::State* state);
        virtual ~Renderer();

        virtual void updateSceneView(osgUtil::SceneView* sceneView);

        osg::observer_ptr<osg::Camera>                      _camera;

        bool                                                _done;
        bool                                                _graphicsThreadDoesCull;
        bool                                                _compileOnNextDraw;
        bool                                                _serializeDraw;

        osg::ref_ptr<osgUtil::SceneView>                    _sceneView[2];

        struct OSGVIEWER_EXPORT ThreadSafeQueue
        {
            OpenThreads::Mutex _mutex;
            OpenThreads::Condition _cond;
            typedef std::list<osgUtil::SceneView*> SceneViewList;
            SceneViewList _queue;
            bool _isReleased;

            ThreadSafeQueue();
            ~ThreadSafeQueue();

            /** Release any thread waiting on the queue, even if the queue is empty. */
            void release();

            /** Reset to fefault state (_isReleased = false)*/
            void reset();

            /** Take a SceneView from the queue. Can return 0 if release() is called when the queue is empty. */
            osgUtil::SceneView* takeFront();

            /**  Add a SceneView object to the back of the queue. */
            void add(osgUtil::SceneView* sv);
        };


        ThreadSafeQueue _availableQueue;
        ThreadSafeQueue _drawQueue;

        bool _initialized;
        osg::ref_ptr<OpenGLQuerySupport> _querySupport;
        osg::Timer_t _startTick;
};

}

#endif