Added TrPageViewer.[h,cpp] to Demos/osgtxp (moved from the plugin directory)
and modified Makefile accordingly
This commit is contained in:
@@ -3,6 +3,7 @@ include $(TOPDIR)/Make/makedefs
|
|||||||
|
|
||||||
CXXFILES =\
|
CXXFILES =\
|
||||||
osgtxp.cpp\
|
osgtxp.cpp\
|
||||||
|
TrPageViewer.cpp\
|
||||||
|
|
||||||
LIBS += $(OSG_LIBS) $(GLUT_LIB) $(GL_LIBS) $(X_LIBS) $(OTHER_LIBS)
|
LIBS += $(OSG_LIBS) $(GLUT_LIB) $(GL_LIBS) $(X_LIBS) $(OTHER_LIBS)
|
||||||
|
|
||||||
|
|||||||
168
src/Demos/osgtxp/TrPageViewer.cpp
Normal file
168
src/Demos/osgtxp/TrPageViewer.cpp
Normal file
@@ -0,0 +1,168 @@
|
|||||||
|
#if defined(_MSC_VER)
|
||||||
|
#pragma warning( disable : 4786 )
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <osg/GL>
|
||||||
|
#include <osgGLUT/glut>
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#if (!defined(WIN32) && !defined(macintosh)) || defined(__CYGWIN__)
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#endif
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include <osg/Math>
|
||||||
|
#include <osg/Statistics>
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include <osgGLUT/Viewer>
|
||||||
|
#include <osgGLUT/GLUTEventAdapter>
|
||||||
|
|
||||||
|
#include <osg/Switch>
|
||||||
|
#include <osg/Billboard>
|
||||||
|
#include <osg/LOD>
|
||||||
|
#include <osg/Light>
|
||||||
|
#include <osg/LightSource>
|
||||||
|
#include <osg/Geode>
|
||||||
|
#include <osg/Group>
|
||||||
|
#include <osg/NodeVisitor>
|
||||||
|
#include <osg/LineSegment>
|
||||||
|
#include <osg/PolygonMode>
|
||||||
|
#include <osg/Texture2D>
|
||||||
|
#include <osg/LightModel>
|
||||||
|
#include <osg/ShadeModel>
|
||||||
|
#include <osg/Notify>
|
||||||
|
#include <osg/CollectOccludersVisitor>
|
||||||
|
|
||||||
|
#include <osg/Fog>
|
||||||
|
|
||||||
|
#include <osgDB/WriteFile>
|
||||||
|
|
||||||
|
#include <osgUtil/IntersectVisitor>
|
||||||
|
#include <osgUtil/DisplayListVisitor>
|
||||||
|
#include <osgUtil/SmoothingVisitor>
|
||||||
|
#include <osgUtil/TriStripVisitor>
|
||||||
|
#include <osgUtil/DisplayRequirementsVisitor>
|
||||||
|
|
||||||
|
#include <osgGA/TrackballManipulator>
|
||||||
|
#include <osgGA/FlightManipulator>
|
||||||
|
#include <osgGA/DriveManipulator>
|
||||||
|
|
||||||
|
#include <osg/Version>
|
||||||
|
#include <osgUtil/Version>
|
||||||
|
|
||||||
|
#ifdef WIN32
|
||||||
|
#define USE_FLTK
|
||||||
|
#define USE_GLUT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <osgTXP/TrPageArchive.h>
|
||||||
|
#include "TrPageViewer.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
#if defined(WIN32) && !defined(__CYGWIN__)
|
||||||
|
#include <sys/timeb.h>
|
||||||
|
#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<GLUTEventAdapter> 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();
|
||||||
|
}
|
||||||
59
src/Demos/osgtxp/TrPageViewer.h
Normal file
59
src/Demos/osgtxp/TrPageViewer.h
Normal file
@@ -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 <osg/Light>
|
||||||
|
#include <osg/NodeVisitor>
|
||||||
|
#include <osg/Geode>
|
||||||
|
#include <osg/Timer>
|
||||||
|
#include <osg/DisplaySettings>
|
||||||
|
|
||||||
|
#include <osgGLUT/Viewer>
|
||||||
|
|
||||||
|
#include <osgUtil/SceneView>
|
||||||
|
|
||||||
|
#include <osgGLUT/Window>
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include <osgTXP/Export.h>
|
||||||
|
|
||||||
|
#include <osgTXP/trPagePageManager.h>
|
||||||
|
|
||||||
|
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
|
||||||
@@ -15,7 +15,7 @@
|
|||||||
#include <osgGA/DriveManipulator>
|
#include <osgGA/DriveManipulator>
|
||||||
|
|
||||||
#include <osgTXP/TrPageArchive.h>
|
#include <osgTXP/TrPageArchive.h>
|
||||||
#include <osgTXP/TrPageViewer.h>
|
#include "TrPageViewer.h"
|
||||||
|
|
||||||
|
|
||||||
void write_usage(std::ostream& out,const std::string& name)
|
void write_usage(std::ostream& out,const std::string& name)
|
||||||
|
|||||||
Reference in New Issue
Block a user