Updated the osgGLUT::Viewer to subclass from osgGLUT::Window as has been

intended since the development of osgGLUT::Window.
This commit is contained in:
Robert Osfield
2001-12-24 19:06:49 +00:00
parent 4221132626
commit a6d329b812
6 changed files with 65 additions and 198 deletions

View File

@@ -15,15 +15,12 @@
#include <osgUtil/CameraManipulator>
#include <osgUtil/SceneView>
#include <osgGLUT/Export>
#ifdef SGV_USE_RTFS
#include <rtfs/rtfs.h>
#endif
#include <osgGLUT/Window>
#include <string>
namespace osgGLUT{
namespace osgGLUT
{
/** A basic viewer base class which provides a window, simple keyboard and mouse interaction.
* Please note, this viewer class has been developed via a rather haphazard
@@ -31,17 +28,13 @@ namespace osgGLUT{
* but shouldn't be viewed as the be all and end of osg viewer classes.
* Someone please rewrite it :-)
*/
class OSGGLUT_EXPORT Viewer : public osgUtil::GUIActionAdapter
class OSGGLUT_EXPORT Viewer : public Window, osgUtil::GUIActionAdapter
{
public:
Viewer();
virtual ~Viewer();
void setWindowOrigin(int x, int y) { wx = x, wy = y; };
void setWindowSize(int width, int height) { ww = width, wh = height; };
void setWindowTitle(const std::string& title) { _title = title; }
/** init is deprecated, you should use addViewport instead. init is
* only available for backwards compatibility.*/
virtual void init(osg::Node* rootnode);
@@ -97,17 +90,8 @@ class OSGGLUT_EXPORT Viewer : public osgUtil::GUIActionAdapter
protected:
static void displayCB();
static void reshapeCB(int w, int h);
static void visibilityCB(int state);
static void mouseMotionCB(int x, int y);
static void mousePassiveMotionCB(int x, int y);
static void mouseCB(int button, int state, int x, int y);
static void keyboardCB(unsigned char key, int x, int y );
virtual void display();
virtual void reshape(GLint w, GLint h);
virtual void visibility(int state);
virtual void mouseMotion(int x, int y);
virtual void mousePassiveMotion(int x, int y);
virtual void mouse(int button, int state, int x, int y);
@@ -136,15 +120,6 @@ class OSGGLUT_EXPORT Viewer : public osgUtil::GUIActionAdapter
unsigned int _focusedViewport;
std::string _saveFileName;
std::string _title;
int wx, wy, ww, wh;
int _is_open;
#ifdef SGV_USE_RTFS
unsigned int frame_rate;
RTfs *fs;
#endif
bool _viewFrustumCullingActive;
bool _smallFeatureCullingActive;

View File

@@ -9,15 +9,16 @@
#include <string>
namespace osgGLUT{
namespace osgGLUT
{
/** A basic GLUTWindow base class which provides a just a basic window. */
class OSGGLUT_EXPORT GLUTWindow
class OSGGLUT_EXPORT Window
{
public:
GLUTWindow();
virtual ~GLUTWindow();
Window();
virtual ~Window();
void setWindowOrigin(int x, int y) { _wx = x, _wy = y; };
void setWindowSize(int width, int height) { _ww = width, _wh = height; };
@@ -27,7 +28,7 @@ class OSGGLUT_EXPORT GLUTWindow
virtual bool open();
virtual bool run();
virtual void display();
protected:
static void displayCB();
@@ -45,7 +46,7 @@ class OSGGLUT_EXPORT GLUTWindow
virtual void mouse(int button, int state, int x, int y);
virtual void keyboard(unsigned char key, int x, int y);
static GLUTWindow* s_theGLUTWindow;
static Window* s_theWindow;
std::string _title;
int _wx, _wy, _ww, _wh;

View File

@@ -81,8 +81,6 @@ int main( int argc, char **argv )
viewer.selectCameraManipulator(pos);
osgUtil::SceneView* sv = viewer.getViewportSceneView(0);
viewer.run();
return 0;

View File

@@ -11,7 +11,7 @@ TARGET_BIN_FILES = sgv
#note, standard library list.
LIBS = -losgGLUT -losgUtil -losgDB -losg $(GLUTLIB) -lGLU -lGL -lm -lXmu -lX11 -lXi
C++FLAGS += -I../../../include -g
C++FLAGS += -I../../../include
LDFLAGS += -L../../../lib
include ../../../Make/makerules

View File

@@ -79,18 +79,6 @@ Viewer::Viewer()
{
s_theViewer = this;
fullscreen = false;
_is_open = 0;
_saved_wx = wx = _saved_wy = wy = 0;
_saved_ww = ww = 800,
_saved_wh = wh = 600;
_title = "OSG Viewer";
mx = ww/2,
my = wh/2;
mbutton = 0;
polymode = 0;
texture = 1;
backface = 1;
@@ -148,10 +136,6 @@ void Viewer::readCommandLine(std::vector<std::string>& commandLine)
*/
bool Viewer::open()
{
if ( _is_open ) {
osg::notify(osg::NOTICE)<<"osgGLUT::Viewer::open() called with window already open."<< std::endl;
return false;
}
if ( getNumViewports() <= 0 ) {
osg::notify(osg::FATAL)<<"osgGLUT::Viewer::open() called with no Viewports registered."<< std::endl;
return false;
@@ -177,7 +161,7 @@ bool Viewer::open()
selectCameraManipulator(0,index);
}
GLUTEventAdapter::setWindowSize( wx, wy, ww, wh );
GLUTEventAdapter::setWindowSize( _wx, _wy, _ww, _wh );
GLUTEventAdapter::setButtonMask(0);
@@ -192,8 +176,8 @@ bool Viewer::open()
++itr)
{
osgUtil::SceneView* sceneView = itr->sceneView.get();
int view[4] = { int(itr->viewport[0]*ww), int(itr->viewport[1]*wh),
int(itr->viewport[2]*ww), int(itr->viewport[3]*wh) };
int view[4] = { int(itr->viewport[0]*_ww), int(itr->viewport[1]*_wh),
int(itr->viewport[2]*_ww), int(itr->viewport[3]*_wh) };
sceneView->setViewport(view[0], view[1], view[2], view[3]);
@@ -223,12 +207,6 @@ bool Viewer::open()
if (_displaySettings->getStereo() &&
_displaySettings->getStereoMode()==osg::DisplaySettings::QUAD_BUFFER) needQuadBufferStereo = true;
//glutInit( &argc, argv ); // I moved this into main to avoid passing
// argc and argv to the Viewer
glutInitWindowPosition( wx, wy );
glutInitWindowSize( ww, wh );
// traverse the scene graphs gathering the requirements of the OpenGL buffers.
osgUtil::DisplayRequirementsVisitor drv;
drv.setDisplaySettings(_displaySettings.get());
@@ -270,7 +248,6 @@ bool Viewer::open()
// by other systems I've come across so not need to worry about it.
displayMode |= GLUT_MULTISAMPLE;
osg::notify(osg::INFO) <<"osgGLUT::Viewer::open() requesting displayMode = "<<displayMode<< std::endl;
if (displayMode & GLUT_DOUBLE) osg::notify(osg::INFO)<<" requesting GLUT_DOUBLE."<< std::endl;
if (displayMode & GLUT_SINGLE) osg::notify(osg::INFO)<<" requesting GLUT_SINGLE."<< std::endl;
@@ -281,29 +258,9 @@ bool Viewer::open()
if (displayMode & GLUT_MULTISAMPLE) osg::notify(osg::INFO)<<" requesting GLUT_MULTISAMPLE."<< std::endl;
if (displayMode & GLUT_STEREO) osg::notify(osg::INFO)<<" requesting GLUT_STEREO."<< std::endl;
glutInitDisplayMode( displayMode);
glutCreateWindow( _title.c_str() );
_displayMode = displayMode;
glutReshapeFunc( reshapeCB );
glutVisibilityFunc( visibilityCB );
glutDisplayFunc( displayCB );
glutKeyboardFunc( keyboardCB );
glutMouseFunc( mouseCB );
glutMotionFunc( mouseMotionCB );
glutPassiveMotionFunc( mousePassiveMotionCB );
#ifdef USE_FLTK
// required to specify the idle function when using FLTK.
// GLUT and FLTK GLUT differ in that GLUT implicitly calls visibilityFunc
// on window creation, while FLTK calls it when the windows is iconised
// or deiconsied but not on window creation.
visibilityCB(GLUT_VISIBLE);
#endif
_is_open = 1;
return true;
return Window::open();
}
@@ -410,76 +367,31 @@ float Viewer::draw(unsigned int viewport)
int Viewer::mapWindowXYToSceneView(int x, int y)
{
int ogl_y = wh-y;
int ogl_y = _wh-y;
int index = 0;
for(ViewportList::iterator itr=_viewportList.begin();
itr!=_viewportList.end();
++itr, ++index)
{
if ( x >= int( itr->viewport[0]*ww ) &&
ogl_y >= int( itr->viewport[1]*wh ) &&
x <= int( (itr->viewport[0]+itr->viewport[2])*ww ) &&
ogl_y <= int( (itr->viewport[1]+itr->viewport[3])*wh ) )
if ( x >= int( itr->viewport[0]*_ww ) &&
ogl_y >= int( itr->viewport[1]*_wh ) &&
x <= int( (itr->viewport[0]+itr->viewport[2])*_ww ) &&
ogl_y <= int( (itr->viewport[1]+itr->viewport[3])*_wh ) )
return index;
}
return -1;
}
void Viewer::displayCB()
{
s_theViewer->display();
}
//void Viewer::reshapeCB(GLint w, GLint h)
void Viewer::reshapeCB(int w, int h)
{
s_theViewer->reshape(w, h);
}
void Viewer::visibilityCB( int state )
{
s_theViewer->visibility(state);
}
void Viewer::mouseCB(int button, int state, int x, int y)
{
s_theViewer->mouse(button, state, x, y);
}
void Viewer::mouseMotionCB(int x, int y)
{
s_theViewer->mouseMotion(x,y);
}
void Viewer::mousePassiveMotionCB(int x, int y)
{
s_theViewer->mousePassiveMotion(x,y);
}
void Viewer::keyboardCB(unsigned char key, int x, int y)
{
s_theViewer->keyboard(key,x,y);
}
// GWM July 2001 - moved all draw stats to Statistics structure, and related RenderBin
// GWM Sept 2001 - all draw stats now calculated by calls to <Drawable>->getStats(Statistic..)
void Viewer::showStats(const unsigned int viewport)
void Viewer::showStats(const unsigned int /*viewport*/)
{ // collect stats for viewport
static int maxbins=1; // count number of bins
static GLfloat tmax=100;
glViewport(0,0,ww,wh);
float vh = wh;
glViewport(0,0,_ww,_wh);
float vh = _wh;
glDisable( GL_DEPTH_TEST ); // to see the stats always
glDisable( GL_ALPHA_TEST );
@@ -647,7 +559,7 @@ void Viewer::showStats(const unsigned int viewport)
delete [] primStats; // free up
}
if (_printStats==Statistics::STAT_DC) { // yet more stats - read the depth complexity
int wid=ww, ht=wh; // temporary local screen size - must change during this section
int wid=_ww, ht=_wh; // temporary local screen size - must change during this section
if (wid>0 && ht>0) {
const int blsize=16;
char *clin=new char[wid/blsize+2]; // buffer to print dc
@@ -756,8 +668,7 @@ void Viewer::display()
void Viewer::reshape(GLint w, GLint h)
{
ww = w;
wh = h;
Window::reshape(w,h);
// Propagate new window size to viewports
for(ViewportList::iterator itr=_viewportList.begin();
@@ -765,8 +676,8 @@ void Viewer::reshape(GLint w, GLint h)
++itr)
{
osgUtil::SceneView* sceneView = itr->sceneView.get();
int view[4] = { int(itr->viewport[0]*ww), int(itr->viewport[1]*wh),
int(itr->viewport[2]*ww), int(itr->viewport[3]*wh) };
int view[4] = { int(itr->viewport[0]*_ww), int(itr->viewport[1]*_wh),
int(itr->viewport[2]*_ww), int(itr->viewport[3]*_wh) };
sceneView->setViewport(view[0], view[1], view[2], view[3]);
@@ -783,15 +694,6 @@ void Viewer::reshape(GLint w, GLint h)
}
void Viewer::visibility(int state)
{
if (state == GLUT_VISIBLE)
glutIdleFunc( displayCB );
else
glutIdleFunc(0L);
}
void Viewer::mouseMotion(int x, int y)
{
osg::ref_ptr<GLUTEventAdapter> ea = new GLUTEventAdapter;
@@ -1043,8 +945,8 @@ void Viewer::keyboard(unsigned char key, int x, int y)
fullscreen = !fullscreen;
if (fullscreen)
{
_saved_ww = ww;
_saved_wh = wh;
_saved_ww = _ww;
_saved_wh = _wh;
glutFullScreen();
} else
{
@@ -1113,7 +1015,7 @@ void Viewer::keyboard(unsigned char key, int x, int y)
osg::notify(osg::NOTICE) << "***** Intersecting **************"<< std::endl;
osg::Vec3 near_point,far_point;
if (!sceneView->projectWindowXYIntoObject(x,wh-y,near_point,far_point))
if (!sceneView->projectWindowXYIntoObject(x,_wh-y,near_point,far_point))
{
osg::notify(osg::NOTICE) << "Failed to calculate intersection ray."<< std::endl;
return;
@@ -1275,11 +1177,6 @@ osg::Timer_t Viewer::updateFrameTick()
bool Viewer::run()
{
if (!_is_open) {
osg::notify(osg::NOTICE)<<"osgGLUT::Viewer::run() called without window open. Opening window."<< std::endl;
if ( !open() )
return false;
}
// Reset the views of all of SceneViews
osg::ref_ptr<GLUTEventAdapter> ea = new GLUTEventAdapter;
@@ -1292,11 +1189,7 @@ bool Viewer::run()
}
updateFrameTick();
#ifdef SGV_USE_RTFS
fs->start();
#endif
glutMainLoop();
return true;
return Window::run();
}

View File

@@ -14,11 +14,11 @@
using namespace osgGLUT;
GLUTWindow* GLUTWindow::s_theGLUTWindow = 0;
Window* Window::s_theWindow = 0;
GLUTWindow::GLUTWindow()
Window::Window()
{
s_theGLUTWindow = this;
s_theWindow = this;
_fullscreen = false;
_is_open = 0;
@@ -36,24 +36,24 @@ GLUTWindow::GLUTWindow()
}
GLUTWindow::~GLUTWindow()
Window::~Window()
{
}
/**
* Configure and open the GLUT window for this GLUTWindow
* Configure and open the GLUT window for this Window
*
*/
bool GLUTWindow::open()
bool Window::open()
{
if ( _is_open ) {
osg::notify(osg::NOTICE)<<"osgGLUT::GLUTWindow::open() called with window already open."<< std::endl;
osg::notify(osg::NOTICE)<<"osgGLUT::Window::open() called with window already open."<< std::endl;
return false;
}
//glutInit( &argc, argv ); // I moved this into main to avoid passing
// argc and argv to the GLUTWindow
// argc and argv to the Window
glutInitWindowPosition( _wx, _wy );
glutInitWindowSize( _ww, _wh );
@@ -74,62 +74,62 @@ bool GLUTWindow::open()
return true;
}
void GLUTWindow::displayCB()
void Window::displayCB()
{
s_theGLUTWindow->display();
s_theWindow->display();
}
//void GLUTWindow::reshapeCB(GLint w, GLint h)
void GLUTWindow::reshapeCB(int w, int h)
//void Window::reshapeCB(GLint w, GLint h)
void Window::reshapeCB(int w, int h)
{
s_theGLUTWindow->reshape(w, h);
s_theWindow->reshape(w, h);
}
void GLUTWindow::visibilityCB( int state )
void Window::visibilityCB( int state )
{
s_theGLUTWindow->visibility(state);
s_theWindow->visibility(state);
}
void GLUTWindow::mouseCB(int button, int state, int x, int y)
void Window::mouseCB(int button, int state, int x, int y)
{
s_theGLUTWindow->mouse(button, state, x, y);
s_theWindow->mouse(button, state, x, y);
}
void GLUTWindow::mouseMotionCB(int x, int y)
void Window::mouseMotionCB(int x, int y)
{
s_theGLUTWindow->mouseMotion(x,y);
s_theWindow->mouseMotion(x,y);
}
void GLUTWindow::mousePassiveMotionCB(int x, int y)
void Window::mousePassiveMotionCB(int x, int y)
{
s_theGLUTWindow->mousePassiveMotion(x,y);
s_theWindow->mousePassiveMotion(x,y);
}
void GLUTWindow::keyboardCB(unsigned char key, int x, int y)
void Window::keyboardCB(unsigned char key, int x, int y)
{
s_theGLUTWindow->keyboard(key,x,y);
s_theWindow->keyboard(key,x,y);
}
void GLUTWindow::display()
void Window::display()
{
}
void GLUTWindow::reshape(GLint w, GLint h)
void Window::reshape(GLint w, GLint h)
{
_ww = w;
_wh = h;
}
void GLUTWindow::visibility(int state)
void Window::visibility(int state)
{
if (state == GLUT_VISIBLE)
glutIdleFunc( displayCB );
@@ -138,22 +138,22 @@ void GLUTWindow::visibility(int state)
}
void GLUTWindow::mouseMotion(int x, int y)
void Window::mouseMotion(int , int )
{
}
void GLUTWindow::mousePassiveMotion(int x, int y)
void Window::mousePassiveMotion(int , int )
{
}
void GLUTWindow::mouse(int button, int state, int x, int y)
void Window::mouse(int , int , int , int )
{
}
void GLUTWindow::keyboard(unsigned char key, int x, int y)
void Window::keyboard(unsigned char key, int , int )
{
switch( key )
{
@@ -173,10 +173,10 @@ void GLUTWindow::keyboard(unsigned char key, int x, int y)
}
}
bool GLUTWindow::run()
bool Window::run()
{
if (!_is_open) {
osg::notify(osg::NOTICE)<<"osgGLUT::GLUTWindow::run() called without window open. Opening window."<< std::endl;
osg::notify(osg::NOTICE)<<"osgGLUT::Window::run() called without window open. Opening window."<< std::endl;
if ( !open() )
return false;
}