1
0
Fork 0
flightgear/test_suite/simgear_tests/scene/testVPBRasterRender.cxx

108 lines
4.3 KiB
C++
Raw Normal View History

2023-11-30 13:36:57 +00:00
// do some test relating to the VPBRasterRenderer
#include <iostream>
#include <config.h>
#include <osgTerrain/TerrainTile>
#include <osg/Texture2D>
#include <osgDB/WriteFile>
#include <osgDB/Registry>
#include <simgear/scene/tgdb/CoastlineBin.hxx>
#include <simgear/scene/tgdb/VPBRasterRenderer.hxx>
#include "testVPBRasterRender.hxx"
using std::cout;
using std::endl;
using namespace simgear;
void VPBRasterRenderTests::setUp()
{
CoastlineBinList coastlineBinList;
SGPath test_data = SGPath(SGPath::fromUtf8(FG_TEST_SUITE_DATA), "/scenery/2892939_Coastline.txt");
CPPUNIT_ASSERT(test_data.exists());
osg::ref_ptr<CoastlineBin> coastlineBinA = new CoastlineBin(test_data);
coastlineBinList.push_back(coastlineBinA);
_bucket = SGBucket(2892939);
VPBRasterRenderer::addCoastlineList(_bucket, coastlineBinList);
}
// The VPBRasterRenderer unit test.
void VPBRasterRenderTests::testRaster()
{
// Generate a raster that includes some coastline
osg::ref_ptr<osgTerrain::TerrainTile> tile = new osgTerrain::TerrainTile();
float frac = 1.0/32.0;
//unsigned int x = (unsigned int) ((_bucket.get_corner(0).getLongitudeDeg() - _bucket.get_chunk_lon()) * 32.0);
//unsigned int y = (unsigned int) ((_bucket.get_corner(0).getLatitudeDeg() - _bucket.get_chunk_lat()) * 32.0);
unsigned int x = 28;
unsigned int y = 4;
SGVec3d center, bottom_left, top_right, bottom_right, top_left;
float lat[] = { _bucket.get_chunk_lat() + y * frac, _bucket.get_chunk_lat() + y * frac + frac};
float lon[] = { _bucket.get_chunk_lon() + x * frac, _bucket.get_chunk_lon() + x * frac + frac};
SGGeodesy::SGGeodToCart(SGGeod::fromDeg(_bucket.get_chunk_lon() + x * frac + 0.5 * frac, _bucket.get_chunk_lat() + y * frac + 0.5 * frac), center);
SGGeodesy::SGGeodToCart(SGGeod::fromDeg(lon[0], lat[0]), bottom_left);
SGGeodesy::SGGeodToCart(SGGeod::fromDeg(lon[1], lat[0]), bottom_right);
SGGeodesy::SGGeodToCart(SGGeod::fromDeg(lon[0], lat[1]), top_left);
SGGeodesy::SGGeodToCart(SGGeod::fromDeg(lon[1], lat[1]), top_right);
SGVec3d s = bottom_right - bottom_left;
SGVec3d t = top_left - bottom_left;
SGVec3d u = top_right - top_left;
SGVec3d v = top_right - bottom_right;
auto width = 0.5 * (length(s) + length(u));
auto height = 0.5 * (length(t) + length(v));
osgTerrain::TileID tileID = osgTerrain::TileID(6, x, y);
osgTerrain::Locator* locator = new osgTerrain::Locator();
locator->setCoordinateSystemType(osgTerrain::Locator::PROJECTED);
// Do some matrix math.
// We need (0,0,0) to map to bottom_left
// (1,0,0) to map to bottom_right
// (0,1,0) to map to top_left
// (1,1,0) to map to top_right
SGVec3d o = bottom_left;
osg::Matrixd matrix = osg::Matrixd(s.x(), s.y(), s.z(), 0.0,
t.x(), t.y(), t.z(), 0.0,
0.0, 0.0, 1.0, 0.0,
o.x(), o.y(), o.z(), 1.0);
locator->setTransform(matrix);
tile->setTileID(tileID);
tile->setLocator(locator);
osg::Texture2D* texture;
VPBRasterRenderer* renderer = new VPBRasterRenderer(0, tile, toOsg(center), width, height);
texture = renderer->generateCoastTexture();
CPPUNIT_ASSERT(texture != renderer->getDefaultCoastlineTexture());
// Uncomment these next lines to output the raster as a png file.
// auto image = renderer->generateCoastImage();
// osgDB::Registry* registry = osgDB::Registry::instance();
// osgDB::Options* nopt = registry->getOptions();
//osgDB::ReaderWriter::WriteResult res = registry->writeImage(*image, "/tmp/raster.png", nopt);
// Generate a raster at a higher LOD. which should generate the default raster.
tileID = osgTerrain::TileID(1, x, y);
tile->setTileID(tileID);
renderer = new VPBRasterRenderer(0, tile, toOsg(center), width, height);
texture = renderer->generateCoastTexture();
CPPUNIT_ASSERT(texture == renderer->getDefaultCoastlineTexture());
// Generate a raster where we know there is no coastline, which should generate the default raster
tileID = osgTerrain::TileID(1, 0, 0);
tile->setTileID(tileID);
renderer = new VPBRasterRenderer(0, tile, toOsg(center), width, height);
texture = renderer->generateCoastTexture();
CPPUNIT_ASSERT(texture == renderer->getDefaultCoastlineTexture());
}