Fix y axis flip issue.

This commit is contained in:
Kalle Bladin
2017-07-14 10:58:50 +02:00
parent f2d7c9c754
commit 0a0942307c
4 changed files with 35 additions and 17 deletions
@@ -119,6 +119,8 @@ std::shared_ptr<RawTile> RawTileDataReader::readTileData(TileIndex tileIndex,
void RawTileDataReader::readImageData(
IODescription& io, RawTile::ReadError& worstError, char* imageDataDest) const {
io = adjustIODescription(io);
// Only read the minimum number of rasters
int nRastersToRead = std::min(dataSourceNumRasters(),
static_cast<int>(_initData.nRasters()));
@@ -238,6 +240,10 @@ void RawTileDataReader::readImageData(
}
}
IODescription RawTileDataReader::adjustIODescription(const IODescription& io) const {
return io;
}
IODescription RawTileDataReader::getIODescription(const TileIndex& tileIndex) const {
IODescription io;
io.read.region = highestResPixelRegion(tileIndex);
@@ -112,6 +112,12 @@ protected:
void readImageData(
IODescription& io, RawTile::ReadError& worstError, char* dataDestination) const;
/**
* The default does not affect the IODescription but this function can be used for
* example to flip the y axis.
*/
virtual IODescription adjustIODescription(const IODescription& io) const;
virtual RawTile::ReadError rasterRead(
int rasterBand, const IODescription& io, char* dst) const = 0;
@@ -108,33 +108,26 @@ RawTile::ReadError SimpleRawTileDataReader::rasterRead(
io.read.fullRegion.numPixels.y) == _dataTexture->dimensions().y,
"IODescription does not match data texture.");
// Modify to match OpenGL texture layout:
IODescription modifiedIO = io;
modifiedIO.read.region.start.y =
modifiedIO.read.fullRegion.numPixels.y -
modifiedIO.read.region.numPixels.y -
modifiedIO.read.region.start.y;
char* writeDataStart =
dataDestination +
_initData.bytesPerLine() * modifiedIO.write.region.start.y +
_initData.bytesPerPixel() * modifiedIO.write.region.start.x;
_initData.bytesPerLine() * io.write.region.start.y +
_initData.bytesPerPixel() * io.write.region.start.x;
for (int y = 0; y < modifiedIO.write.region.numPixels.y; ++y) {
for (int x = 0; x < modifiedIO.write.region.numPixels.x; ++x) {
for (int y = 0; y < io.write.region.numPixels.y; ++y) {
for (int x = 0; x < io.write.region.numPixels.x; ++x) {
char* pixelWriteDestination =
writeDataStart +
y * _initData.bytesPerLine() +
x * _initData.bytesPerPixel();
int xInSource =
modifiedIO.read.region.start.x +
static_cast<float>(x) / modifiedIO.write.region.numPixels.x *
modifiedIO.read.region.numPixels.x;
io.read.region.start.x +
static_cast<float>(x) / io.write.region.numPixels.x *
io.read.region.numPixels.x;
int yInSource =
modifiedIO.read.region.start.y +
static_cast<float>(y) / modifiedIO.write.region.numPixels.y *
modifiedIO.read.region.numPixels.y;
io.read.region.start.y +
static_cast<float>(y) / io.write.region.numPixels.y *
io.read.region.numPixels.y;
glm::vec4 sourceTexel = _dataTexture->texelAsFloat(xInSource, yInSource);
@@ -199,6 +192,16 @@ RawTile::ReadError SimpleRawTileDataReader::rasterRead(
return RawTile::ReadError::None;
}
IODescription SimpleRawTileDataReader::adjustIODescription(const IODescription& io) const {
// Modify to match OpenGL texture layout
IODescription modifiedIO = io;
modifiedIO.read.region.start.y =
modifiedIO.read.fullRegion.numPixels.y -
modifiedIO.read.region.numPixels.y -
modifiedIO.read.region.start.y;
return modifiedIO;
}
} // namespace globebrowsing
} // namespace openspace
@@ -62,6 +62,9 @@ public:
virtual float depthOffset() const override;
virtual float depthScale() const override;
protected:
virtual IODescription adjustIODescription(const IODescription& io) const;
private:
// Private virtual function overloading
virtual void initialize() override;