diff --git a/src/Demos/osgtxp/Makefile b/src/Demos/osgtxp/Makefile index 31c676a1c..7953c1b0e 100644 --- a/src/Demos/osgtxp/Makefile +++ b/src/Demos/osgtxp/Makefile @@ -3,6 +3,7 @@ include $(TOPDIR)/Make/makedefs CXXFILES =\ osgtxp.cpp\ + TrPageViewer.cpp\ LIBS += $(OSG_LIBS) $(GLUT_LIB) $(GL_LIBS) $(X_LIBS) $(OTHER_LIBS) diff --git a/src/Demos/osgtxp/TrPageViewer.cpp b/src/Demos/osgtxp/TrPageViewer.cpp new file mode 100644 index 000000000..9d5b50be9 --- /dev/null +++ b/src/Demos/osgtxp/TrPageViewer.cpp @@ -0,0 +1,168 @@ +#if defined(_MSC_VER) + #pragma warning( disable : 4786 ) +#endif + +#include +#include + +#include +#if (!defined(WIN32) && !defined(macintosh)) || defined(__CYGWIN__) +#include +#include +#endif +#include + +#include +#include + +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include + +#ifdef WIN32 +#define USE_FLTK +#define USE_GLUT +#endif + +#include +#include "TrPageViewer.h" + +/* +#if defined(WIN32) && !defined(__CYGWIN__) +#include +#else +#endif +*/ + +using namespace osg; +using namespace osgUtil; +using namespace osgGLUT; +using namespace osgGA; + +using namespace std; +using namespace txp; + +PagingViewer::PagingViewer() : Viewer() +{ + pageManage = NULL; +} + +bool PagingViewer::Init(OSGPageManager *in_manage,OSGPageManager::ThreadMode threadMode) +{ + pageManage = in_manage; + + // Start up the thread if needed + if (threadMode != OSGPageManager::ThreadNone) { + ThreadID newThread; + pageManage->StartThread(threadMode,newThread); + } + + return true; +} + +/* App call + This replaces the app() call for the base viewer. + In this one, we ask the page manager to load stuff in. + */ +float PagingViewer::app(unsigned int viewport) +{ + osg::Timer_t beforeApp = _timer.tick(); + + // update the camera manipulator. + osg::ref_ptr ea = osgNew GLUTEventAdapter; + ea->adaptFrame(_frameStamp->getReferenceTime()); + + bool handled = false; + for (EventHandlerList::iterator eh = _viewportList[viewport]._eventHandlerList.begin(); eh != _viewportList[viewport]._eventHandlerList.end(); + eh++ ) + { + if ( eh->valid() ) + { + if ( (*eh)->handle(*ea,*this) ) + { + handled = true; + break; + } + } + } + _viewportList[viewport]._cameraManipulator->handle(*ea,*this); + + if (getRecordingAnimationPath() && getAnimationPath()) + { + osg::Camera* camera = getViewportSceneView(viewport)->getCamera(); + osg::Matrix matrix; + matrix.invert(camera->getModelViewMatrix()); + osg::Quat quat; + quat.set(matrix); + getAnimationPath()->insert(_frameStamp->getReferenceTime(),osg::AnimationPath::ControlPoint(matrix.getTrans(),quat)); + } + + // Update the paging + if (pageManage) { + int numTile = 1; + osgUtil::SceneView *sceneView = getViewportSceneView(viewport); + osg::Camera *camera = sceneView->getCamera(); + const Vec3 &eyePt = camera->getEyePoint(); + double eyeX = eyePt[0]; + double eyeY = eyePt[1]; + + /* If we're in ThreadFree mode, merge in whatever may be ready. + If we're in non-thread mode, load in the given number of tiles (maximum). + */ + if (pageManage->GetThreadMode() == OSGPageManager::ThreadFree) { + pageManage->MergeUpdateThread((osg::Group *)sceneView->getSceneData()); + pageManage->UpdatePositionThread(eyeX,eyeY); + } else { + pageManage->UpdateNoThread((osg::Group *)sceneView->getSceneData(),eyeX,eyeY,numTile); + } + } + + // do app traversal. + + getViewportSceneView(viewport)->setFrameStamp(_frameStamp.get()); + getViewportSceneView(viewport)->app(); + + osg::Timer_t beforeCull = _timer.tick(); + + return _timer.delta_m(beforeApp,beforeCull); +} + +bool PagingViewer::run() +{ + updateFrameTick(); + return Window::run(); +} diff --git a/src/Demos/osgtxp/TrPageViewer.h b/src/Demos/osgtxp/TrPageViewer.h new file mode 100644 index 000000000..86ba05c3d --- /dev/null +++ b/src/Demos/osgtxp/TrPageViewer.h @@ -0,0 +1,59 @@ +/* ************************************************************************** + * OpenSceneGraph loader for Terrapage format database + * + * That loader is redistributed under the terms listed on Terrain Experts + * website (www.terrex.com/www/pages/technology/technologypage.htm) + * + * "TerraPage is provided as an Open Source format for use by anyone... + * We supply the TerraPage C++ source code free of charge. Anyone + * can use it and redistribute it as needed (including our competitors). + * We do, however, ask that you keep the TERREX copyrights intact." + * + * Copyright Terrain Experts Inc. 1999. + * All Rights Reserved. + * + *****************************************************************************/ + +#ifndef _TRPAGEVIEWER_H_ +#define _TRPAGEVIEWER_H_ + +#include +#include +#include +#include +#include + +#include + +#include + +#include + +#include + +#include + +#include + +namespace txp +{ + /* Paging Viewer + Variant of the regular viewer which knows to call + the Page Manager at the beginning of each app() phase. + */ + class OSGTXP_EXPORT PagingViewer : public osgGLUT::Viewer { + public: + PagingViewer(); + bool Init(OSGPageManager *,txp::OSGPageManager::ThreadMode = txp::OSGPageManager::ThreadNone); + + // called on each frame redraw..return the time in ms for each operation. + virtual float app(unsigned int viewport); + // The default Viewer resets the cameras at the beginning of the run() + // This is annoying. + bool run(); + protected: + OSGPageManager *pageManage; + }; +}; + +#endif diff --git a/src/Demos/osgtxp/osgtxp.cpp b/src/Demos/osgtxp/osgtxp.cpp index 64d5370b7..68c55f986 100644 --- a/src/Demos/osgtxp/osgtxp.cpp +++ b/src/Demos/osgtxp/osgtxp.cpp @@ -15,7 +15,7 @@ #include #include -#include +#include "TrPageViewer.h" void write_usage(std::ostream& out,const std::string& name)