> Hi,
> 
> after some time spending on other task, I have now restarted my
> project using the OpenSG library.
> As you can see below I have spend some time into the OpenSG framework
> and did reach a lot.
> 
> But now I'm stuck and need some input from outside.
> 
> I have written some new classes in order to handle rendering into
> multiple windows and viewports
> with the same scene graph, possibly with different camera setups.
> 
> However, I'm facing a situation that when I have more then two windows
> the rendering of one
> window stalls for some time and eventually all windows get frozen. 
> With only one or two windows all is working perfektly fine.
> 
> What is happening when one window stalls for some time I don't know.
> But, when all windows
> eventually freeze I could see that the the program endlessly runs into
> the glErr macro in the 
> function RenderAction::start().
> 
> With the help of the gliIntercept tool I could see that the last call
> before the error
> GL_INVALID_OPERATION (0x502) was a call to glDisable(GL_SCISSOR_TEST).
> 
> Extract from the log:
> 
> glGetError()=GL_NO_ERROR 
> glLoadMatrixf([-0.766076,0.445564,-0.463248,0.000000,-0.393384,0.24495
> 1,0.886141,0.000000,0.508305,0.861088,-0.012371,0.000000,49.977875,41.
> 081268,-234.204254,1.000000])
> glCallList(3)
> glDisable(GL_LIGHTING)
> glDisable(GL_COLOR_MATERIAL)
> glDisable(GL_LIGHT0)
> glDepthMask(true)
> glFinish()
> wglSwapBuffers(0x0000)=false 
> glGetError()=GL_NO_ERROR 
> wglMakeCurrent(0x0000,0x0000)=true 
> wglMakeCurrent(0x0000,0x10001)=false 
> wglMakeCurrent(0x0000,0x10001)=false 
> glViewport(0,0,600,227)
> glDisable(GL_SCISSOR_TEST)
> glGetError()=GL_INVALID_OPERATION 
> 
> Below I try to outline some of my code. It is unfortunately a little
> bit lengthy so I don't show it all.
> The protagonists are instances form the following classes:
> SceneManager, CompositeViewer, View, GLCanvas and Gc3SystemData
> 
> So I ask for some help. Can someone tell me what I'm doing wrong? Is
> this a multthreading issue? What is disturbing me most is
> that I do not have any problems with two windows but with more than
> two of them.
> 
> With best regards
> Johannes
> 
> 
> SceneManager : 
>       This one is used as a singleton and holds the scene. Since I
> have situations when I need to render small parts of my scene
>       dynamically without flickering, I have a setup with the split
> into static and dynamic parts. However, for my current problem
>       this part of my implementation is not in use at all.
> 
> class SceneManager : private boost::noncopyable
> {
> public:
>     osg::NodePtr        getRoot             () const;
>     void                setRoot             (osg::NodePtr node);
> 
>     osg::NodePtr        getDynamicRoot      () const;
>     void                setDynamicRoot      (osg::NodePtr node);
>     osg::SwitchPtr      getSwitchCore       () const;
> 
>     osg::NodePtr        getInternalRoot     () const;
>     osg::NodePtr        getRootBeacon       () const;
> 
>     osg::NodePtr        getHighlight        () const;
>     void                setHighlight        (osg::NodePtr obj);
>     void                updateHighlight     ();
> 
>     typedef osg::DirectionalLightPtr DLight;
>     DLight              getHeadlight        () const;
>     void                setHeadlight        (bool on);
>     bool                getHeadlightState   () const;
>     void                turnHeadlightOn     ();
>     void                turnHeadlightOff    ();    
> 
> public:
>                 SceneManager();
>                ~SceneManager();
> 
> private:
> //
> // You have to grant friendship the the Creator policy class.
> //
>     friend Loki::CreateUsingNew< SceneManager >;
> 
> private:
>     void  initialize      ();
>     void  highlightChanged();
> 
>     osg::NodePtr                _internalRoot;
>     osg::NodePtr                _internalStatic;
>     osg::NodePtr                _internalDynamic;
>     osg::NodePtr                _switchNode;
>     osg::NodePtr                _staticRoot;
>     osg::NodePtr                _dynamicRoot;
>     osg::NodePtr                _highlight;
>     osg::NodePtr                _highlightNode;
>     osg::SimpleMaterialPtr      _highlightMaterial;
>     osg::GeoPositions3fPtr      _highlightPoints;
>     osg::DirectionalLightPtr    _headlight;
>     osg::TransformPtr           _cartesian;
>     osg::NodePtr                _cartesianNode;
> };
> 
> typedef Loki::SingletonHolder< SceneManager > TheSceneManagerT;
> 
> void SceneManager::initialize()       // Called on startup
> {
>     _internalStatic = Node::create();
>     {
>         FCEditGuard guard(_internalStatic);
>         _internalStatic->setCore(Group::create());
>     }
> 
>     _internalDynamic = Node::create();
>     {
>         FCEditGuard guard(_internalDynamic);
>         _internalDynamic->setCore(Group::create());
>     }
> 
>     SwitchPtr switch_core = Switch::create();
>     {
>         FCEditGuard guard(switch_core);
>         switch_core->setChoice(Switch::ALL);
>     }
> 
>     _switchNode = Node::create();
>     {
>         FCEditGuard guard(_switchNode);
>         _switchNode->setCore(switch_core);
>         _switchNode->addChild(_internalStatic);
>         _switchNode->addChild(_internalDynamic);
>     }
> 
>     // the camera and light beacon
>     _cartesianNode = Node::create();
>     _cartesian     = Transform::create();
>     {
>         FCEditGuard guard(_cartesianNode);
>         _cartesianNode->setCore(_cartesian);
>     }
> 
>     // the headlight
>     _internalRoot = Node::create();
>     _headlight    = DirectionalLight::create();
>     addRefCP(_internalRoot);
>     {
>         FCEditGuard guard(_internalRoot);
>         _internalRoot->setCore(_headlight);
>         _internalRoot->addChild(_cartesianNode);
>         _internalRoot->addChild(_switchNode);
>     }
> 
>     {
>         FCEditGuard guard(_headlight);
>         _headlight->setAmbient  (.3, .3, .3, 1);
>         _headlight->setDiffuse  ( 1,  1,  1, 1);
>         _headlight->setSpecular ( 1,  1,  1, 1);
>         _headlight->setDirection( 0,  0,  1);
>         _headlight->setBeacon   (_cartesianNode);
>     }
> }
> 
> void SceneManager::setRoot(NodePtr root)      // This is called after
> I have constructed my scene
> {
>     if(_staticRoot != root)
>     {
>         if(_staticRoot != NullFC)
>         {
>             FCEditGuard guard(_internalStatic,
> Node::ChildrenFieldMask);
>             _internalStatic->subChild(_staticRoot);
>         }
> 
>         _staticRoot = root;
>         if(_staticRoot != NullFC)
>         {
>             FCEditGuard guard(_internalStatic,
> Node::ChildrenFieldMask);
>             _internalStatic->addChild(_staticRoot);
>         }
>     }
> }
> 
> CompositeViewer :
>       This class administer a set of View objects, the WindowPtr and
> the RenderAction. It provides public Render function
>       and the following entry functions: mouseMove, mouseButtonPress,
> mouseButtonRelease, resize and redraw.
> 
> class CompositeViewer;
> typedef boost::shared_ptr<CompositeViewer> CompositeViewerT;
> 
> class CompositeViewer : public
> boost::enable_shared_from_this<CompositeViewer>
>                       , private boost::noncopyable
> {
> private:
>     typedef std::vector<ViewT> VecViewsT;
> public:
>     typedef VecViewsT::iterator         iterator;
>     typedef VecViewsT::const_iterator   const_iterator;
> 
>     void            push_back   (ViewT view);
>     iterator        insert      (iterator pos, ViewT view);
>     void            erase       (ViewT view);
>     void            erase       (iterator iter);
>     ViewT           operator[]  (VecViewsT::size_type idx) const;
>     ViewT           at          (VecViewsT::size_type idx) const;
>     void            clear       ();
>     iterator        find        (ViewT view);
>     const_iterator  find        (ViewT view) const;
>     iterator        begin       ();
>     const_iterator  begin       () const;
>     iterator        end         ();
>     const_iterator  end         () const;
> 
> public:
>     osg::WindowPtr          getWindow   ();
>     osg::DrawActionBase*    getAction   ();
> 
>     void                    setWindow   (osg::WindowPtr win);
>     void                    setAction   (osg::RenderAction* action);
> 
>     void                    Render      ();
>     void                    TickRender  ();
> 
>     void                    setDynamicMode  (bool flag);
>     bool                    getDynamicMode  () const;
>     void                    setRenderStatic (bool flag);
>     void                    setRenderDynamic(bool flag);
> 
>     void                    redraw      ();
>     void                    resize      (osg::UInt16 width,
> osg::UInt16 height);
> 
>     void                    mouseMove           (osg::Int16 x,
> osg::Int16 y);
>     void                    mouseButtonPress    (osg::UInt16 button,
> osg::Int16 x, osg::Int16 y);
>     void                    mouseButtonRelease  (osg::UInt16 button,
> osg::Int16 x, osg::Int16 y);
>     void                    key                 (osg::UChar8 key,
> osg::Int16 x, osg::Int16 y);
> 
> public:
>     static CompositeViewerT    create();
> 
>                ~CompositeViewer();
> protected:
>                 CompositeViewer();
> 
> private:
>     void        DoRenderStatic  ();
>     void        DoRenderDynamic ();
>     void        DoRender        ();
> 
>     enum {
>         RENDER_STATIC  = 0,
>         RENDER_DYNAMIC = 1
>     };
> 
> private:
>     VecViewsT           _views;
>     osg::WindowPtr      _win;
>     osg::RenderAction*  _action;
>     osg::RenderAction*  _ownAction;
>     int                 _iDynamicCnt;
>     bool                _bRenderStatic;
>     bool                _bRenderDynamic;
> };
> 
> // Multiple views are possible, but the problem case does use multiple
> CompositeViewer each 
> // containing exactly one View instance.
> 
> void CompositeViewer::push_back(ViewT view)
> {
>     iterator iter = find(view);
>     if (iter != end())
>         return;
> 
>     _views.push_back(view);
> 
>     beginEditCP(_win);
>         _win->addPort(view->getPort());
>     endEditCP(_win);
> 
>     view->setViewer(shared_from_this());
> }
> 
> WindowPtr CompositeViewer::getWindow()
> {
>     return _win;
> }
> 
> void CompositeViewer::setWindow(WindowPtr win)
> {
>     _win = win;
> }
> 
> DrawActionBase *CompositeViewer::getAction()
> {
>     return _action;
> }
> 
> void CompositeViewer::setAction(RenderAction *action)
> {
>     BOOST_FOREACH(ViewT& view, _views)
>     {
>         bool statstate = view->getStatistics();
> 
>         if(_action != NULL && statstate)
>             view->setStatistics(false);
> 
>         if(action == NULL)
>         {
>             _action = _ownAction;
>         }
>         else
>         {
>             _action = action;
>         }
>         
>         if(statstate)
>             view->setStatistics(true);
>     }
> }
> 
> void CompositeViewer::redraw()
> {
>     if (!_action) {
>         _ownAction = RenderAction::create();
>         _action = _ownAction;
>     }
> 
>     BOOST_FOREACH(ViewT& view, _views) {
>         assert(view->getSceneManager());
>         if (view->getSceneManager()->getInternalRoot() == NullFC)
>         {
>             view->showAll();
>         }
> 
>         if (view->getNavigatorOn() && view->getNavigator())
>             view->getNavigator()->updateCameraTransformation();
> 
>         view->getSceneManager()->updateHighlight();
>     }
> 
>     _win->render(_action);
> }
> 
> void CompositeViewer::Render()
> {
>     if (!_win) return;
> 
>     if (!_iDynamicCnt) {
>         redraw();                             // This is the branch
> which is used in the problem scenario. The other is not called at all.
>         _win->deactivate();
>     } else {
>         DoRenderStatic();
>     }
> }
> 
> void CompositeViewer::resize(UInt16 width, UInt16 height)
> {
>     _win->resize(width, height);
> 
>     if (_iDynamicCnt) {
>         BOOST_FOREACH(ViewT& view, _views) {
>             if (!view->getPassive()) {
>                 view->onResize();
>             }
>         }
>         _bRenderStatic = true;
>     }
> }
> 
> void CompositeViewer::mouseMove(osg::Int16 x, osg::Int16 y)
> {
>     BOOST_FOREACH(ViewT& view, _views) {
>         view->mouseMove(x, y);
>     }
> }
> 
> 
> View :
>       This class carries the viewport, background, camera, navigator,
> and a lot of other stuff not relevant for the case.
> 
> typedef boost::logic::tribool TriBoolT;
> 
> class CompositeViewer;
> typedef boost::shared_ptr<CompositeViewer> CompositeViewerT;
> 
> class View;
> typedef boost::shared_ptr<View> ViewT;
> 
> class View : public  boost::enable_shared_from_this<View>
>            , private boost::noncopyable
> {
> public:
>     enum {
>         MouseLeft   =  0,
>         MouseMiddle =  1, 
>         MouseRight  =  2,
>         MouseUp     =  3,
>         MouseDown   =  4,
>         NoButton    =  -1
>     };
> 
> public:
>     typedef boost::tuple<osg::Real32, osg::Real32, osg::Real32,
> osg::Real32> DimT;
>     DimT                getDimensions       () const;
>     osg::ViewportPtr    getPort             ();
>     osg::NodePtr        getRoot             () const;
>     SceneManager*       getSceneManager     () const;
>     osg::CameraPtr      getCamera           () const;
>     TriBoolT            getPerspective      () const;
>     osg::Navigator*     getNavigator        () const;
>     bool                getNavigatorOn      () const;
>     CompositeViewerT    getViewer           () const;
>     bool                getStatistics       () const;
>     bool                getPassive          () const;
>     bool                getDepthClearBgnd   () const;
>     osg::BackgroundPtr  getBackground       () const;
> 
>     void                setDimensions       (osg::Real32 left,
> osg::Real32 bottom, osg::Real32 right, osg::Real32 top);
>     void                setRoot             (osg::NodePtr root);
>     void                setSceneManager     (SceneManager* p);
>     void                setCamera           (osg::CameraPtr camera);
>     void                setPerspective      (TriBoolT perspective);
>     void                setNavigator        (osg::Navigator*
> navigator);
>     void                setNavigatorOn      (bool on);
>     void                setNavigationMode   (osg::Navigator::Mode
> new_mode);
>     bool                setClickCenter      (bool mode);
>     void                setStatistics       (bool on);
>     void                setViewer           (CompositeViewerT viewer);
>     void                setPassive          (bool passive);
>     void                setDepthClearBgnd   (bool flag);
>     void                setBackground       (osg::BackgroundPtr bg);
>     void                restoreBackground   (bool image);
>     void                setDynamicMode      (bool flag);
>     void                setGrabForeground   (bool flag);
>     void                onResize            ();
> 
>     osg::Line           calcViewRay                 (osg::Int16 x,
> osg::Int16 y);
> 
>     Frustum             calcViewFrustum             (osg::Int16 x,
> osg::Int16 y, osg::Int16 size, osg::Pnt3f* ap = NULL);
>     Frustum             calcViewFrustum             (osg::Int16 x0,
> osg::Int16 y0, osg::Int16 x1, osg::Int16 y1, osg::Pnt3f* ap = NULL);
>     osg::FrustumVolume  calcViewFrustumVolume       (osg::Int16 x,
> osg::Int16 y, osg::Int16 size, osg::Pnt3f* ap = NULL);
>     osg::FrustumVolume  calcViewFrustumVolume       (osg::Int16 x0,
> osg::Int16 y0, osg::Int16 x1, osg::Int16 y1, osg::Pnt3f* ap = NULL);
> 
> 
>     void                getViewMatrix               (osg::Matrix& m)
> const;
>     void                getProjectionMatrix         (osg::Matrix& m)
> const;
>     void                getProjectionTranslation    (osg::Matrix& m)
> const;
>     osg::Matrix         computeWindowMatrix         () const;
> 
>     void                idle                ();
>     void                showAll             ();
>     void                useOpenSGLogo       ();
> 
>     void                mouseMove           (osg::Int16 x, osg::Int16
> y);
>     void                mouseButtonPress    (osg::UInt16 button,
> osg::Int16 x, osg::Int16 y);
>     void                mouseButtonRelease  (osg::UInt16 button,
> osg::Int16 x, osg::Int16 y);
>     void                key                 (osg::UChar8 key,
> osg::Int16 x, osg::Int16 y);
> 
> public:
>     static ViewT    create();
> 
>                ~View();
> protected:
>                 View();
> 
> private:
>     void        initialize();
> 
> private:
>     osg::ViewportPtr             _viewport;
>     osg::ImageForegroundPtr      _foreground;
>     osg::StatisticsForegroundPtr _statforeground;
>     osg::BackgroundPtr           _background;
>     osg::BackgroundPtr           _passiveBackground;
>     bool                         _statstate;
>     osg::CameraPtr               _camera;
>     TriBoolT                     _perspective; // true, false,
> boost::logic::indeterminate
>     osg::Navigator*              _navigator;
>     bool                         _navigatorOn;
>     osg::Int16                   _lastx;
>     osg::Int16                   _lasty;
>     osg::UInt16                  _mousebuttons;
>     SceneManager*                _sceneManager;
>     CompositeViewerT             _viewer;                     // A
> View knows about the Viewer it belongs to
>     osg::Real32                  _left, _bottom, _right, _top;
>     bool                         _passive;
>     bool                         _depthClearBgnd;
>     bool                         _initialized;
>     osg::GrabForegroundPtr       _grabForeground;
>     osg::ImagePtr                _grabImage;
>     osg::ImageBackgroundPtr      _imageBackground;
>     bool                         _bDynamicMode;
> };
> 
> NodePtr View::getRoot() const
> {
>     assert(_sceneManager);
>     return _sceneManager->getRoot();
> }
> 
> void View::setRoot(NodePtr root)
> {
>     assert(_sceneManager);
>     _sceneManager->setRoot(root);
> }
> 
> CameraPtr View::getCamera(void) const
> {
>     return _camera;
> }
> 
> void View::setCamera(CameraPtr camera)
> {
>     if(camera == NullFC)
>         return;
> 
>     if (camera->getTypeId() == PerspectiveCamera::getClassTypeId())
>         _perspective = true;
>     else if (camera->getTypeId() ==
> OrthographicCamera::getClassTypeId())
>         _perspective = false;
>     else
>         _perspective = boost::logic::indeterminate;
> 
>     {
>         FCEditGuard guard(camera);
>         camera->setBeacon(_camera->getBeacon());
>         camera->setNear  (_camera->getNear());
>         camera->setFar   (_camera->getFar());
>     }
> 
>     if (_viewport != NullFC) {
>         FCEditGuard guard(_viewport);
>         _viewport->setCamera(camera);
>     }
> 
>     subRefCP(_camera);
>         _camera = camera;
>     addRefCP(_camera);
> }
> 
> Navigator* View::getNavigator(void) const
> {
>     return _navigator;
> }
> 
> void View::setNavigator(Navigator* navigator)
> {
>     if (_navigator)
>         delete _navigator;
> 
>     _navigator = navigator;
>     if (_navigator) {
>         if (_viewport != NullFC)
>             _navigator->setViewport(_viewport);
>         if (_sceneManager)
>  
> _navigator->setCameraTransformation(_sceneManager->getRootBeacon());
>     }
> }
> 
> CompositeViewerT View::getViewer() const
> {
>     return _viewer;
> }
> 
> void View::setViewer(CompositeViewerT viewer)
> {
>     if (_viewer) {
>         _viewer->erase(shared_from_this());
>     }
>     _viewer = viewer;
> }
> 
> void View::mouseMove(Int16 x, Int16 y)
> {
>     if (!_navigatorOn || !_navigator)
>         return;
> 
>     if (_mousebuttons)
>         _navigator->moveTo(x,y);
> 
>     _lastx = x;
>     _lasty = y;
> 
> }
> 
> 
> void View::initialize()
> {
>     if (_initialized)
>         return;
> 
>     _initialized = true;
> 
>     assert(_sceneManager);
> 
>     // the camera
>     if (_perspective) {
>         PerspectiveCameraPtr camera = PerspectiveCamera::create();
> 
>         addRefCP(camera);
>         FCEditGuard guard(camera);
>         camera->setBeacon(_sceneManager->getRootBeacon());
>         camera->setFov   (deg2rad(60.f));
>         camera->setNear  (0.1f);
>         camera->setFar   (10000.f);
> 
>         _camera = camera;
>     } else if (!_perspective) {
>         OrthographicCameraPtr camera = OrthographicCamera::create();
> 
>         addRefCP(camera);
>         FCEditGuard guard(camera);
>         camera->setBeacon(_sceneManager->getRootBeacon());
>         camera->setVerticalSize(0);
>         camera->setNear  (0.1f);
>         camera->setFar   (10000.f);
> 
>         _camera = camera;
>     } else {
>         MatrixCameraPtr camera = MatrixCamera::create();
> 
>         addRefCP(camera);
>         FCEditGuard guard(camera);
>         camera->setBeacon(_sceneManager->getRootBeacon());
>         camera->setNear  (0.1f);
>         camera->setFar   (10000.f);
>         Matrix m;
>         m.setIdentity();
>         camera->setProjectionMatrix(m);
>         camera->setModelviewMatrix(m);
> 
>         _camera = camera;
>     }
> 
>     if(_viewport == NullFC)
>     {
>         _foreground = ImageForeground::create();
> 
>         BackgroundPtr bg;
>         if (_passive) {
>             if (_depthClearBgnd)
>                 _passiveBackground = DepthClearBackground::create();
>             else
>                 _passiveBackground = PassiveBackground::create();
> 
>             bg = _passiveBackground;
>         } else {
>             SolidBackgroundPtr bgnd = SolidBackground::create();
>             FCEditGuard guard(bgnd);
>             bgnd->setColor(Color3f(0, 0, 0));
> 
>             _background = bgnd;
>             bg = _background;
>         }
> 
>         _viewport = Viewport::create();
>         {
>             FCEditGuard guard(_viewport);
>             _viewport->setCamera(_camera);
>             _viewport->setRoot(_sceneManager->getInternalRoot());
>             _viewport->setSize(_left, _bottom, _right, _top);
>             _viewport->setBackground(bg);
>             _viewport->getForegrounds().push_back(_foreground);
>         }
>     }
> 
>     if (_navigator) {
>         _navigator->setViewport(_viewport);
>  
> _navigator->setCameraTransformation(_sceneManager->getRootBeacon());
>     }
> }
> 
> GLCanvas :
>       This class is a child class of the gui toolkit window class I'm
> using. Actually, it contains only
>       a pointer to the Gc3SystemData instance which contains the
> CompositeViewer instance.
>       The example instance is just a convenience I use to build
> different test programs with
>       minimal code change. It contains the actual start up code.
> 
> class Gc3SystemData;
> class Example;
> 
> class GLCanvas : public ZafWindow
> {
> public:
>                 GLCanvas();
>     virtual    ~GLCanvas();
> 
> public:
>     void SetExample(Example* p) { _example.reset(p); }
> 
>     Gc3SystemData*  pSystemData() const { return _pSystemData; }
> 
>     void    Render(); // Delegate to _pSystemData->Render()
>     void    TickRender();
>     void    SleepTickTimer();
>     void    WakeTickTimer();
> 
>     void    AddVisualizer   (components::VisualizerT visualizer);
>     void    RemoveVisualizer(components::VisualizerT visualizer);
> 
>     void                     PushVisualizer (components::VisualizerT
> cursor);
>     void                     PopVisualizer  ();
>     components::VisualizerT  TopVisualizer  () const;
> 
> protected:
>     virtual ZafEventType Event      (const ZafEventStruct& event);
> // Delegate to _pSystemData
>     virtual ZafEventType OSEvent    (const ZafEventStruct& event);
> // Delegate to _pSystemData
>     virtual ZafEventType Draw       (const ZafEventStruct& event,
> ZafEventType ccode);  // Delegate to Render()
> 
> private:
>     void    InitializeTickTimer();
>     void    DeinitalizeTickTimer();
> 
> private:
>     Gc3SystemData*              _pSystemData;
>     tools::timer_ptr            _spTimer;
>     boost::scoped_ptr<Example>  _example;
> };
> 
> Gc3SystemData : 
>       This class wraps the CompositeViewer for the window toolkit and
> handles the operating system requests for drawing and mouse.
> 
> typedef graphic::CompositeViewerT   ViewerT;
> 
> class Gc3SystemData
> {
> public:
>     ViewerT getViewer       () { return _viewer; }
> 
>     void    Event           (const ZafEventStruct& event);
>     void    OSEvent         (const ZafEventStruct& event);
>     void    Render          ();
>     void    TickRender      ();
> 
>     bool    eIsInitialized  () { return _bIsInitialized; }
> 
>     void                    AddVisualizer   (components::VisualizerT
> visualizer);
>     void                    RemoveVisualizer(components::VisualizerT
> visualizer);
> 
>     void                    PushVisualizer  (components::VisualizerT
> visualizer);
>     void                    PopVisualizer   ();
>     components::VisualizerT TopVisualizer   () const;
> 
>     int     Width           () const;
>     int     Height          () const;
> 
> private:
>     void    Initialize      ();
> 
> public:
>     explicit    Gc3SystemData   (HWND hWnd);
>                ~Gc3SystemData   ();
> 
> private:
>     HWND _hWnd;
>     ViewerT             _viewer;
>     bool                _bIsInitialized;
> 
>     typedef std::vector<components::VisualizerT> VecVisualizerT;
>     VecVisualizerT      _vecVisualizer;       // for things like
> tripods, clipplane visualization etc.
> 
>     typedef std::stack<components::VisualizerT> StackVisualizerT;
>     StackVisualizerT    _stackVisualizer;     // for things like
> selection box etc.
> };
> 
> Gc3SystemData::Gc3SystemData(HWND hWnd)
> : _hWnd(hWnd)
> , _viewer(graphic::CompositeViewer::create())
> , _bIsInitialized(false)
> , _vecVisualizer()
> , _stackVisualizer()
> {
>     DWORD dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL |
> PFD_DOUBLEBUFFER;
>     PIXELFORMATDESCRIPTOR pixelFormat = {
>         sizeof(PIXELFORMATDESCRIPTOR),
>         1,
>         dwFlags,
>         PFD_TYPE_RGBA,
>         24,
>         0, 0, 0, 0, 0, 0,
>         0, 0,
>         0, 0, 0, 0, 0,
>         32,
>         0,
>         0,
>         PFD_MAIN_PLANE,
>         0,
>         0, 0, 0
>     };
> 
>     HDC hdc = ::GetDC(_hWnd);
>     if (!hdc) {
>         ::DestroyWindow(_hWnd);
>         return;
>     }
> 
>     int pixelFormatIndex = ::ChoosePixelFormat(hdc, &pixelFormat);
>     if (!pixelFormatIndex) {
>         ::ReleaseDC(_hWnd, hdc);
>         ::DestroyWindow(_hWnd);
>         return;
>     }
> 
>     if (!::SetPixelFormat(hdc, pixelFormatIndex, &pixelFormat)) {
>         ::ReleaseDC(_hWnd, hdc);
>         ::DestroyWindow(_hWnd);
>         return;
>     }
> 
>     Initialize();
> }
> 
> void Gc3SystemData::Initialize()
> {
>     osg::osgInit(0,NULL);
> 
>     osg::WIN32WindowPtr window = osg::WIN32Window::create();
>     window->setHwnd(_hWnd);
> 
>     window->init();
>     window->deactivate();
> 
>     graphic::ViewT view(graphic::View::create());
> 
>     osg::Navigator* nav = new osg::Navigator;
>     nav->setMode(osg::Navigator::TRACKBALL);
>     view->setNavigator(nav);
> 
>     view->setSceneManager(&graphic::TheSceneManagerT::Instance());
>     _viewer->setWindow(window);
>     _viewer->push_back(view);
> 
>     _bIsInitialized = true;
> }
> 
> void Gc3SystemData::OSEvent(const ZafEventStruct& event)
> {
>     if (!_vecVisualizer.empty()) {
>         VecVisualizerT::iterator iter;
>         for (iter = _vecVisualizer.begin(); iter !=
> _vecVisualizer.end(); ++iter) {
>             components::VisualizerT vis = *iter;
>             vis->OSEvent(event);
>         }
>     }
> 
>     if (!_stackVisualizer.empty())
>         _stackVisualizer.top()->OSEvent(event);
> 
>     switch (event.osEvent.message) {
>         case WM_SIZE:
>             {
>                 int w = LOWORD(event.osEvent.lParam);
>                 int h = HIWORD(event.osEvent.lParam);
>                 _viewer->resize(w, h);
>             }
>             break;
>         case WM_LBUTTONDOWN:
>             {
>                 int x = LOWORD(event.osEvent.lParam);
>                 int y = HIWORD(event.osEvent.lParam);
>                 _viewer->mouseButtonPress(graphic::View::MouseLeft, x,
> y);
>             }
>             break;
>         ...
>         case WM_MOUSEMOVE:
>             {
>                 int x = LOWORD(event.osEvent.lParam);
>                 int y = HIWORD(event.osEvent.lParam);
>                 _viewer->mouseMove(x, y);
>             }
>             break;
>     }
> }
> 
> void Gc3SystemData::Render()
> {
>     if (_bIsInitialized) {
>         _viewer->Render();
>     }
> }
> 
> void Gc3SystemData::TickRender()
> {
>     if (_bIsInitialized) {
>         _viewer->TickRender();
>     }
> }
> 
> int Main(int argc, char** argv) // The main entry point of the program
> {
>     ZafWindow* window1 = new ZafWindow(0, 0, 600, 800);
>     ZafWindow* window2 = new ZafWindow(0, 0, 600, 800);
>     ZafWindow* window3 = new ZafWindow(0, 0, 600, 800);
> 
>     GLCanvas* pCanvas1 = new GLCanvas;
>     GLCanvas* pCanvas2 = new GLCanvas;
>     GLCanvas* pCanvas3 = new GLCanvas;
>     MultipleGenericOpenSG* pExample1 = new
> MultipleGenericOpenSG(pCanvas1);
>     MultipleGenericOpenSG* pExample2 = new
> MultipleGenericOpenSG(pCanvas2);
>     MultipleGenericOpenSG* pExample3 = new
> MultipleGenericOpenSG(pCanvas3);
> 
>     window1->Add(pCanvas1);
>     window2->Add(pCanvas2);
>     window3->Add(pCanvas3);
> 
>     // Center the window.
>     zafWindowManager->Center(window1);
>     zafWindowManager->Center(window2);
>     zafWindowManager->Center(window3);
> 
>     // Add the window to the window manager.
>     zafWindowManager->Add(window1);
>     zafWindowManager->Add(window2);
>     zafWindowManager->Add(window3);
> 
>     int ret1 = pExample1->Main(argc, argv);
>     int ret2 = pExample2->Main(argc, argv);
>     int ret3 = pExample3->Main(argc, argv);
> 
>     return ret1;
> }
> 
> class MultipleGenericOpenSG : public Example
> {
> public:
>     explicit    MultipleGenericOpenSG(GLCanvas* p) : Example(p);
>     virtual    ~MultipleGenericOpenSG(){};
> 
> public:
>     virtual int     Main(int argc, char** argv);
>     virtual void    Run ();
> };
> 
> MultipleGenericOpenSG ::MultipleGenericOpenSG (GLCanvas* p) 
> : Example(p)
> { 
>     p->SetExample(this);
> }
> 
> int MultipleGenericOpenSG::Main(int argc, char** argv)
> {
>     Example::Main(argc, argv);
>     Run();
>     return 0;
> }
> 
> void MultipleGenericOpenSG::Run()
> {
>     //
>     // The entity manager is responsible for storing loaded Acis
> entities
>     //
>     acis::EntityManager sEntMan;
> 
>     //
>     // static because root should be only created once in this example
>     // root contains the complete scene
>     static components::FileHandler fileHandler(sEntMan);
>     static osg::NodePtr root = fileHandler.Evaluate(_sCmdOptMap);
> // sCmdOptMap contains file to load
> 
>     components::SetupViewer setupViewer(_pGLCanvas, true);
>     setupViewer.setup(root);
> }
> 
> SetupViewer :
>       Helper class for conveniently setup the scene
> 
> class SetupViewer
> {
> public:
>     void    setup           (osg::NodePtr root);
>     void    setup           (osg::NodePtr root_static, osg::NodePtr
> root_dynamic);
>     void    changeBackground(bool flag);
> 
> public:
>     explicit    SetupViewer   (GLCanvas* pGLCanvas, bool perspective);
>     virtual    ~SetupViewer   ();
> 
> private:
>     GLCanvas*   _pGLCanvas;
>     bool        _perspective;
> };
> 
> 
> SetupViewer::SetupViewer(GLCanvas* pGLCanvas, bool perspective)
> : _pGLCanvas(pGLCanvas)
> , _perspective(perspective)
> {
> }
> 
> void SetupViewer::setup(osg::NodePtr root)
> {
>     using namespace osg;
> 
>     GradientBackgroundPtr background = GradientBackground::create();
>     {
>         FCEditGuard guard(background);
>         background->addLine(Color3f(0,0,0), 0);
>         background->addLine(Color3f(1,1,1), 1);
>     }
> 
>     ViewerT viewer = _pGLCanvas->pSystemData()->getViewer();
>     (*viewer)[0]->setPerspective(_perspective);
>     (*viewer)[0]->setBackground(background);
>     (*viewer)[0]->setRoot(root);                      // This
> delegates to SceneManager instance
>     (*viewer)[0]->showAll();
> }
> 
> 
> 
> 
> ____________
> Virus checked by G DATA AntiVirusKit
> Version: AVK 18.3779 from 14.05.2008
> Virus news: www.antiviruslab.com
> 
> 
> ____________
> Virus checked by G DATA AntiVirusKit
> Version: AVK 18.3780 from 14.05.2008
> Virus news: www.antiviruslab.com

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft 
Defy all challenges. Microsoft(R) Visual Studio 2008. 
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Opensg-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensg-users

Reply via email to