mirror of
https://github.com/OpenSpace/OpenSpace.git
synced 2026-04-29 07:19:28 -05:00
Fix y axis flip issue.
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user