#include <osgEarth/MapNode>
#include <osgEarth/FindNode>
#include <osgEarth/TileSource>
#include <osgEarth/Registry>
#include <osgEarthUtil/EarthManipulator>
#include <osgViewer/Viewer>
#include <osgViewer/ViewerEventHandlers>
#include <osgGA/StateSetManipulator>
#include <iostream>
#define SHOW_PROBLEM 1
using namespace osg;
using namespace osgEarth;
using namespace osgEarthUtil;
struct BlankTileSource : public osgEarth::TileSource
{
BlankTileSource(const PluginOptions* options =0L) : osgEarth::TileSource( options ) { }
virtual void initialize( const std::string& referenceURI, const Profile* overrideProfile =0)
{
if (overrideProfile)
{
setProfile( overrideProfile );
}
else
{
setProfile( osgEarth::Registry::instance()->getGlobalGeodeticProfile() );
}
}
virtual osg::Image* createImage( const TileKey* key, ProgressCallback* progress ) {
osg::Image* image = new osg::Image();
image->setAllocationMode( osg::Image::USE_NEW_DELETE );
image->allocateImage( 256, 256, 1, GL_RGBA, GL_UNSIGNED_BYTE );
for( int y=0; y<image->t(); y++ ) {
for( int x=0; x<image->s(); x++ ) {
*((unsigned int*)(image->data(x,y))) = 0xff00ff00;
}
}
return image;
}
};
int main(int argc, char** argv)
{
// construct the viewer.
osgViewer::Viewer viewer();
// construct the main scene group.
osg::Group* group = new osg::Group;
// construct the map.
Map *map = new Map;
TileSource *tileSource = new BlankTileSource();
tileSource->initialize("");
MapLayer* layer = new MapLayer( "Green", MapLayer::TYPE_IMAGE, tileSource);
map->addMapLayer(layer);
MapNode* mapNode = new MapNode(map);
// construct pre-render texture.
osg::Texture2D *renderTex = new osg::Texture2D;
renderTex->setTextureSize(1024, 1024);
renderTex->setDataVariance(osg::Object::DYNAMIC);
renderTex->setInternalFormat(GL_RGBA);
renderTex->setFilter(osg::Texture2D::MIN_FILTER, osg::Texture2D::LINEAR);
renderTex->setFilter(osg::Texture2D::MAG_FILTER, osg::Texture2D::LINEAR);
// construct pre-render camera.
osg::Camera* camera = new osg::Camera;
camera->setRenderOrder(osg::Camera::PRE_RENDER);
camera->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT);
camera->setComputeNearFarMode(osg::CullSettings::COMPUTE_NEAR_FAR_USING_PRIMITIVES);
camera->setNearFarRatio(0.000003f);
camera->setClearColor(osg::Vec4(0.8f, 0.8f, 0.8f, 1.f));
camera->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
camera->setViewport(0, 0, 1024, 1024);
camera->attach(osg::Camera::COLOR_BUFFER, renderTex);
renderTex->setDataVariance(osg::Object::DYNAMIC);
camera->addChild(mapNode);
#if SHOW_PROBLEM == 0
group->addChild(camera);
#endif
// create scene.
group->addChild(mapNode);
// setup viewer.
viewer.setCameraManipulator( new osgEarthUtil::EarthManipulator() );
viewer.setUpViewInWindow(10, 10, 800, 800);
viewer.addEventHandler( new osgViewer::StatsHandler() );
viewer.addEventHandler( new osgViewer::WindowSizeHandler() );
viewer.addEventHandler( new osgViewer::ThreadingHandler() );
viewer.addEventHandler( new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet()) );
// set the scene to render.
viewer.setSceneData(group);
// run the viewers frame loop.
return viewer.run();
}