Replaced use of ShapeDrawable with osgTerrain for the terrain tile

This commit is contained in:
Robert Osfield 2011-09-05 12:27:20 +00:00
parent 52c2bc3ff5
commit 454ccad3b9
2 changed files with 28 additions and 23 deletions

View File

@ -3,6 +3,6 @@
SET(TARGET_SRC osgshadow.cpp IslandScene.cpp ) SET(TARGET_SRC osgshadow.cpp IslandScene.cpp )
SET(TARGET_H terrain_coords.h IslandScene.h ) SET(TARGET_H terrain_coords.h IslandScene.h )
SET(TARGET_ADDED_LIBRARIES osgShadow ) SET(TARGET_ADDED_LIBRARIES osgShadow osgTerrain)
#### end var setup ### #### end var setup ###
SETUP_EXAMPLE(osgshadow) SETUP_EXAMPLE(osgshadow)

View File

@ -11,6 +11,8 @@
#include <osg/AlphaFunc> #include <osg/AlphaFunc>
#include <osg/CullFace> #include <osg/CullFace>
#include <osgTerrain/TerrainTile>
static unsigned int heightTexture[] = { static unsigned int heightTexture[] = {
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010101, 0x02000000, 0x00020809, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010101, 0x02000000, 0x00020809,
0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000000, 0x00000000, 0x00000000,
@ -469,19 +471,15 @@ osg::Node* createIsland(const osg::Vec3& center = osg::Vec3( 0,0,0 ), float radi
{ {
float height = 1000; float height = 1000;
osg::Geode* geode = new osg::Geode; osg::ref_ptr<osg::Group> group = new osg::Group;
// set up the texture of the base. osg::ref_ptr<osg::Image> heightMap = new osg::Image();
osg::StateSet* stateset = new osg::StateSet();
geode->setStateSet( stateset );
osg::Image * heightMap = new osg::Image();
heightMap->setImage( 64, 64, 1, heightMap->setImage( 64, 64, 1,
GL_LUMINANCE, GL_LUMINANCE, GL_UNSIGNED_BYTE, GL_LUMINANCE, GL_LUMINANCE, GL_UNSIGNED_BYTE,
orderBytes( heightTexture, sizeof( heightTexture ) ), orderBytes( heightTexture, sizeof( heightTexture ) ),
osg::Image::NO_DELETE ); osg::Image::NO_DELETE );
osg::Image* colorMap = NULL; // osgDB::readImageFile("Images/colorMap.png"); osg::ref_ptr<osg::Image> colorMap = NULL; // osgDB::readImageFile("Images/colorMap.png");
if ( !colorMap ) { if ( !colorMap ) {
struct colorElevation struct colorElevation
@ -527,15 +525,6 @@ osg::Node* createIsland(const osg::Vec3& center = osg::Vec3( 0,0,0 ), float radi
} }
} }
if (colorMap)
{
osg::Texture2D* texture = new osg::Texture2D;
texture->setImage(colorMap);
stateset->setTextureAttributeAndModes(0,texture,osg::StateAttribute::ON);
}
stateset->setAttributeAndModes( new osg::CullFace(), osg::StateAttribute::ON );
osg::HeightField* grid = new osg::HeightField; osg::HeightField* grid = new osg::HeightField;
grid->allocate(heightMap->s(),heightMap->t()); grid->allocate(heightMap->s(),heightMap->t());
grid->setOrigin( center - osg::Vec3( radius, radius, 0 ) ); grid->setOrigin( center - osg::Vec3( radius, radius, 0 ) );
@ -549,17 +538,33 @@ osg::Node* createIsland(const osg::Vec3& center = osg::Vec3( 0,0,0 ), float radi
grid->setHeight( c, r, height * exp( *heightMap->data(c,r) / 255.f ) / exp( 1.0 ) ); grid->setHeight( c, r, height * exp( *heightMap->data(c,r) / 255.f ) / exp( 1.0 ) );
} }
} }
osg::ShapeDrawable * sd = new osg::ShapeDrawable(grid);
sd->setColor( osg::Vec4( 1.0, 1.0, 1.0, 1.0 ) );
geode->addDrawable(sd); osg::ref_ptr<osgTerrain::TerrainTile> terrainTile = new osgTerrain::TerrainTile;
osg::Group* group = new osg::Group; osg::ref_ptr<osgTerrain::Locator> locator = new osgTerrain::Locator;
group->addChild(geode); locator->setCoordinateSystemType(osgTerrain::Locator::PROJECTED);
locator->setTransformAsExtents(center.x()-radius,center.y()-radius,center.x()+radius,center.y()+radius);
terrainTile->setLocator(locator.get());
osg::ref_ptr<osgTerrain::HeightFieldLayer> hfl = new osgTerrain::HeightFieldLayer;
hfl->setHeightField(grid);
hfl->setLocator(locator.get());
terrainTile->setElevationLayer(hfl.get());
osg::ref_ptr<osgTerrain::ImageLayer> imageLayer = new osgTerrain::ImageLayer;
imageLayer->setImage(colorMap.get());
imageLayer->setLocator(locator.get());
terrainTile->setColorLayer(0, imageLayer.get());
osg::StateSet* stateset = terrainTile->getOrCreateStateSet();
stateset->setAttributeAndModes( new osg::CullFace(), osg::StateAttribute::ON );
group->addChild(terrainTile.get());
group->addChild( createObjects( grid, 1 ) ); group->addChild( createObjects( grid, 1 ) );
return group; return group.release();
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
namespace ModelFour { namespace ModelFour {