Remove redundant information from RawTileData

This commit is contained in:
Erik Broberg
2016-06-07 20:48:48 -04:00
parent 887b26e441
commit 607356f10b
3 changed files with 46 additions and 45 deletions
+17 -10
View File
@@ -60,6 +60,7 @@ namespace openspace {
_depthTransform = calculateTileDepthTransform();
_tileLevelDifference = calculateTileLevelDifference(_dataset, minimumPixelSize);
}
@@ -109,7 +110,7 @@ namespace openspace {
// Read the data (each rasterband is a separate channel)
for (size_t i = 0; i < _dataLayout.numRasters; i++) {
GDALRasterBand* rasterBand = _dataset->GetRasterBand(i + 1)->GetOverview(region.overview);
char* dataDestination = imageData + (i * _dataLayout.bytesPerDatum);
CPLErr err = rasterBand->RasterIO(
@@ -167,17 +168,18 @@ namespace openspace {
delete[] imageData;
glm::uvec3 dims(region.numPixels.x, region.numPixels.y, 1);
RawTileData::TextureFormat textureFormat = getTextureFormat(dataLayout.numRasters, dataLayout.gdalType);
glm::uvec3 dims(region.numPixels, 1);
GLuint glType = getOpenGLDataType(dataLayout.gdalType);
RawTileData* textureDataPtr = new RawTileData(imageDataYflipped, dims,
textureFormat, glType, region.chunkIndex);
RawTileData* textureDataPtr = new RawTileData(imageDataYflipped, dims, region.chunkIndex);
std::shared_ptr<RawTileData> textureData =
std::shared_ptr<RawTileData>(textureDataPtr);
return textureData;
}
const TileDataset::DataLayout& TileDataset::getDataLayout() const {
return _dataLayout;
}
std::shared_ptr<TilePreprocessData> TileDataset::preprocess(std::shared_ptr<RawTileData> tileData,
@@ -229,6 +231,7 @@ namespace openspace {
case GDT_Float64: return [](const char* src) { return static_cast<float>(*reinterpret_cast<const GLdouble*>(src)); };
default:
LERROR("Unknown data type");
ghoul_assert(false, "Unknown data type");
return nullptr;
}
}
@@ -245,7 +248,8 @@ namespace openspace {
case GDT_Float32: return sizeof(GLfloat);
case GDT_Float64: return sizeof(GLdouble);
default:
LERROR("Unknown data type");
LERROR("Unknown data type");
ghoul_assert(false, "Unknown data type");
return -1;
}
}
@@ -303,10 +307,10 @@ namespace openspace {
}
RawTileData::TextureFormat TileDataset::getTextureFormat(
TextureFormat TileDataset::getTextureFormat(
int rasterCount, GDALDataType gdalType)
{
RawTileData::TextureFormat format;
TextureFormat format;
switch (rasterCount) {
case 1: // Red
@@ -446,14 +450,17 @@ namespace openspace {
}
TileDataset::DataLayout::DataLayout() {
}
TileDataset::DataLayout::DataLayout(GDALDataset* dataSet, GLuint glType) {
TileDataset::DataLayout::DataLayout(GDALDataset* dataSet, GLuint _glType) {
// Assume all raster bands have the same data type
gdalType = glType != 0 ? getGdalDataType(glType) : dataSet->GetRasterBand(1)->GetRasterDataType();
gdalType = _glType != 0 ? getGdalDataType(glType) : dataSet->GetRasterBand(1)->GetRasterDataType();
glType = getOpenGLDataType(gdalType);
numRasters = dataSet->GetRasterCount();
bytesPerDatum = numberOfBytes(gdalType);
bytesPerPixel = bytesPerDatum * numRasters;
textureFormat = getTextureFormat(numRasters, gdalType);
}
} // namespace openspace
+25 -32
View File
@@ -49,20 +49,16 @@ namespace openspace {
std::vector<float> minValues;
};
struct TextureFormat {
Texture::Format ghoulFormat;
GLuint glFormat;
};
struct RawTileData {
struct TextureFormat {
Texture::Format ghoulFormat;
GLuint glFormat;
};
RawTileData(void* data, glm::uvec3 dims, TextureFormat format,
GLuint glType, const ChunkIndex& chunkIndex)
RawTileData(void* data, glm::uvec3 dims, const ChunkIndex& chunkIndex)
: imageData(data)
, dimensions(dims)
, texFormat(format)
, glType(glType)
, chunkIndex(chunkIndex)
{
@@ -71,14 +67,13 @@ namespace openspace {
void* imageData;
std::shared_ptr<TilePreprocessData> preprocessData;
glm::uvec3 dimensions;
TextureFormat texFormat;
GLuint glType;
ChunkIndex chunkIndex;
};
struct TileIOResult {
CPLErr error;
std::shared_ptr<RawTileData> rawTileData;
};
@@ -108,25 +103,34 @@ namespace openspace {
~TileDataset();
struct DataLayout {
DataLayout();
DataLayout(GDALDataset* dataSet, GLuint glType);
GDALDataType gdalType;
GLuint glType;
size_t bytesPerDatum;
size_t numRasters;
size_t bytesPerPixel;
TextureFormat textureFormat;
};
std::shared_ptr<TileIOResult> readTileData(ChunkIndex chunkIndex, bool doPreprocessing = false);
int getMaximumLevel() const;
TileDepthTransform getDepthTransform() const;
const DataLayout& getDataLayout() const;
private:
//////////////////////////////////////////////////////////////////////////////////
// HELPER STRUCTS //
//////////////////////////////////////////////////////////////////////////////////
struct GdalDataRegion {
GdalDataRegion(GDALDataset* dataSet, const ChunkIndex& chunkIndex,
@@ -142,17 +146,6 @@ namespace openspace {
};
struct DataLayout {
DataLayout();
DataLayout(GDALDataset* dataSet, GLuint glType);
GDALDataType gdalType;
size_t bytesPerDatum;
size_t numRasters;
size_t bytesPerPixel;
};
@@ -172,7 +165,7 @@ namespace openspace {
static GDALDataType getGdalDataType(GLuint glType);
static RawTileData::TextureFormat getTextureFormat(int rasterCount, GDALDataType gdalType);
static TextureFormat getTextureFormat(int rasterCount, GDALDataType gdalType);
static size_t numberOfBytes(GDALDataType gdalType);
+4 -3
View File
@@ -165,12 +165,13 @@ namespace openspace {
std::shared_ptr<RawTileData> tileData = tileIOResult->rawTileData;
HashKey key = tileData->chunkIndex.hashKey();
TileDataset::DataLayout dataLayout = _asyncTextureDataProvider->getTextureDataProvider()->getDataLayout();
Texture* texturePtr = new Texture(
tileData->imageData,
tileData->dimensions,
tileData->texFormat.ghoulFormat,
tileData->texFormat.glFormat,
tileData->glType,
dataLayout.textureFormat.ghoulFormat,
dataLayout.textureFormat.glFormat,
dataLayout.glType,
Texture::FilterMode::Linear,
Texture::WrappingMode::ClampToEdge);