summaryrefslogtreecommitdiffstats
path: root/src/uscxml/plugins/invoker/graphics/openscenegraph/CompositeDisplay.cpp
blob: d7e247bde396df8d83ded21f1c6ba26127e8126c (plain)
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
#include "CompositeDisplay.h"
#if 0
#ifdef MACOSX
USE_GRAPICSWINDOW_IMPLEMENTATION(Cocoa)
#else
USE_GRAPHICSWINDOW()
#endif
#endif

CompositeDisplay::CompositeDisplay(unsigned int x,
                                   unsigned int y,
                                   unsigned int width,
                                   unsigned int height,
                                   int screenId)
{
  _waitForViewOp = false;
  unsigned int tWidth = 0;
  unsigned int tHeight = 0;
  getResolution(tWidth, tHeight, screenId);
  
  osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
  traits->doubleBuffer = true;
  traits->sharedContext = 0;
  traits->screenNum = screenId;
  
  if (width == 0 || height == 0 || (width == tWidth && height == tHeight)) {
    // fullscreen
    traits->windowDecoration = false;
    traits->width = tWidth;
    traits->height = tHeight;
    traits->x = 0;
    traits->y = 0;    
  } else {
    // Start with given resolution
    traits->windowDecoration = true;
    traits->x = x;
    traits->y = y;
    traits->width = width;
    traits->height = height;
  }
  
  _gc = osg::GraphicsContext::createGraphicsContext(traits.get());
  if (_gc.valid()) {
    _gc->setClearColor(osg::Vec4f(1.0f,1.0f,1.0f,1.0f));
    _gc->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  }
  
  _width = traits->width;
  _height = traits->height;
  
  setRunMaxFrameRate(30);
//  setRunFrameScheme(osgViewer::ViewerBase::ON_DEMAND);
  setThreadingModel(osgViewer::Viewer::AutomaticSelection);
}

CompositeDisplay::~CompositeDisplay() {}

void CompositeDisplay::frame(double simulationTime) {
  tthread::lock_guard<tthread::recursive_mutex> lock(_mutex);
  CompositeViewer::frame();
}

bool CompositeDisplay::checkNeedToDoFrame() {
  return CompositeViewer::checkNeedToDoFrame();
}

void CompositeDisplay::addView(const std::string& name, osg::Viewport* v, osgViewer::View* view) {
  tthread::lock_guard<tthread::recursive_mutex> lock(_mutex);
	_viewports[name] = v;
  
	_views[name] = view;
	_views[name]->setName(name);
  _views[name]->getCamera()->setName(name);
  _views[name]->setCameraManipulator(new osgGA::TrackballManipulator);
  
  // add the state manipulator
  osg::ref_ptr<osgGA::StateSetManipulator> statesetManipulator = new osgGA::StateSetManipulator;
  statesetManipulator->setStateSet(_views[name]->getCamera()->getOrCreateStateSet());
  _views[name]->addEventHandler( statesetManipulator.get() );

	_views[name]->addEventHandler( new osgViewer::StatsHandler );
	_views[name]->addEventHandler( new osgViewer::HelpHandler );
	_views[name]->addEventHandler( new osgViewer::WindowSizeHandler );
	_views[name]->addEventHandler( new osgViewer::ThreadingHandler );
  
  _views[name]->getCamera()->setViewport(v);
  
  // set graphic context
  _views[name]->getCamera()->setGraphicsContext(_gc.get());
  CompositeViewer::addView(_views[name]);

}

void CompositeDisplay::moveView(const std::string& name, osg::Viewport* v) {  
  tthread::lock_guard<tthread::recursive_mutex> lock(_mutex);
  const osg::GraphicsContext::Traits* traits = _gc->getTraits();
  osg::Viewport* absoluteVp = new osg::Viewport(v->x() * (traits->width/100.0),
                                                v->y() * (traits->height/100.0),
                                                v->width() * (traits->width/100.0),
                                                v->height() * (traits->height/100.0));
  _views[name]->getCamera()->setViewport(absoluteVp);
}

void CompositeDisplay::removeView(const std::string& name) {
  tthread::lock_guard<tthread::recursive_mutex> lock(_mutex);
  
  _views[name]->getCamera()->setGraphicsContext(NULL);
  _views[name]->getCamera()->setViewport(NULL);

	CompositeViewer::removeView(_views[name]);
	
	if (_views.find(name) != _views.end()) {
		_views.erase(name);
  }
	if (_viewports.find(name) != _viewports.end())
		_viewports.erase(name);
}

osg::GraphicsContext::WindowingSystemInterface* CompositeDisplay::wsi = NULL;
void CompositeDisplay::getResolution(unsigned int& width, unsigned int& height, int screenId) {
  if (!wsi)
    wsi = osg::GraphicsContext::getWindowingSystemInterface();
	if (wsi) {
  	wsi->getScreenResolution(osg::GraphicsContext::ScreenIdentifier(screenId), width, height);
	} else {
		width = 800;
		height = 600;
	}
}