Limit camera to not go below the ground in globebrowsing interaction mode.

This commit is contained in:
Kalle Bladin
2016-06-21 22:57:12 -04:00
parent 69aef205af
commit 5e8018b715
8 changed files with 210 additions and 24 deletions
+122 -1
View File
@@ -51,6 +51,128 @@ namespace openspace {
const Tile Tile::TileUnavailable = {nullptr, nullptr, Tile::Status::Unavailable };
double Tile::sampleValueAsDouble(glm::vec2 uv, int band) {
if (texture == nullptr || status != Status::OK) {
return 0;
}
glm::uvec3 dimensions = texture->dimensions();
if (band >= dimensions.z || band < 0) {
throw ghoul::RuntimeError("Cannot sample from band " + std::to_string(band) + "in texture tile.");
}
glm::vec2 samplePos = uv * glm::vec2(dimensions.xy());
glm::uvec2 samplePos00 = samplePos;
samplePos00 = glm::clamp(samplePos00, glm::uvec2(0, 0), dimensions.xy());
glm::vec2 samplePosFract = samplePos - glm::vec2(samplePos00);
glm::uvec2 samplePos10 = glm::min(samplePos00 + glm::uvec2(1, 0), dimensions.xy());
glm::uvec2 samplePos01 = glm::min(samplePos00 + glm::uvec2(0, 1), dimensions.xy());
glm::uvec2 samplePos11 = glm::min(samplePos00 + glm::uvec2(1, 1), dimensions.xy());
unsigned int linearSamplePos00 = (dimensions.x * dimensions.z) * samplePos00.y + (samplePos00.x * dimensions.z) + band;
unsigned int linearSamplePos10 = (dimensions.x * dimensions.z) * samplePos10.y + (samplePos10.x * dimensions.z) + band;
unsigned int linearSamplePos01 = (dimensions.x * dimensions.z) * samplePos01.y + (samplePos01.x * dimensions.z) + band;
unsigned int linearSamplePos11 = (dimensions.x * dimensions.z) * samplePos11.y + (samplePos11.x * dimensions.z) + band;
GLuint dataType = texture->dataType();
switch (dataType)
{
case GL_UNSIGNED_BYTE: {
const GLubyte* pixelData = reinterpret_cast<const GLubyte*>(texture->pixelData());
double sample00 = static_cast<double>(pixelData[linearSamplePos00]);
double sample10 = static_cast<double>(pixelData[linearSamplePos10]);
double sample01 = static_cast<double>(pixelData[linearSamplePos01]);
double sample11 = static_cast<double>(pixelData[linearSamplePos11]);
double sample0 = sample00 * (1.0 - samplePosFract.x) + sample10 * samplePosFract.x;
double sample1 = sample01 * (1.0 - samplePosFract.x) + sample11 * samplePosFract.x;
double sample = sample0 * (1.0 - samplePosFract.y) + sample1 * samplePosFract.y;
return sample;
}
case GL_UNSIGNED_SHORT: {
const GLushort* pixelData = reinterpret_cast<const GLushort*>(texture->pixelData());
double sample00 = static_cast<double>(pixelData[linearSamplePos00]);
double sample10 = static_cast<double>(pixelData[linearSamplePos10]);
double sample01 = static_cast<double>(pixelData[linearSamplePos01]);
double sample11 = static_cast<double>(pixelData[linearSamplePos11]);
double sample0 = sample00 * (1.0 - samplePosFract.x) + sample10 * samplePosFract.x;
double sample1 = sample01 * (1.0 - samplePosFract.x) + sample11 * samplePosFract.x;
double sample = sample0 * (1.0 - samplePosFract.y) + sample1 * samplePosFract.y;
return sample; }
case GL_SHORT: {
const GLshort* pixelData = reinterpret_cast<const GLshort*>(texture->pixelData());
double sample00 = static_cast<double>(pixelData[linearSamplePos00]);
double sample10 = static_cast<double>(pixelData[linearSamplePos10]);
double sample01 = static_cast<double>(pixelData[linearSamplePos01]);
double sample11 = static_cast<double>(pixelData[linearSamplePos11]);
double sample0 = sample00 * (1.0 - samplePosFract.x) + sample10 * samplePosFract.x;
double sample1 = sample01 * (1.0 - samplePosFract.x) + sample11 * samplePosFract.x;
double sample = sample0 * (1.0 - samplePosFract.y) + sample1 * samplePosFract.y;
return sample; }
case GL_UNSIGNED_INT: {
const GLuint* pixelData = reinterpret_cast<const GLuint*>(texture->pixelData());
double sample00 = static_cast<double>(pixelData[linearSamplePos00]);
double sample10 = static_cast<double>(pixelData[linearSamplePos10]);
double sample01 = static_cast<double>(pixelData[linearSamplePos01]);
double sample11 = static_cast<double>(pixelData[linearSamplePos11]);
double sample0 = sample00 * (1.0 - samplePosFract.x) + sample10 * samplePosFract.x;
double sample1 = sample01 * (1.0 - samplePosFract.x) + sample11 * samplePosFract.x;
double sample = sample0 * (1.0 - samplePosFract.y) + sample1 * samplePosFract.y;
return sample; }
case GL_INT: {
const GLint* pixelData = reinterpret_cast<const GLint*>(texture->pixelData());
double sample00 = static_cast<double>(pixelData[linearSamplePos00]);
double sample10 = static_cast<double>(pixelData[linearSamplePos10]);
double sample01 = static_cast<double>(pixelData[linearSamplePos01]);
double sample11 = static_cast<double>(pixelData[linearSamplePos11]);
double sample0 = sample00 * (1.0 - samplePosFract.x) + sample10 * samplePosFract.x;
double sample1 = sample01 * (1.0 - samplePosFract.x) + sample11 * samplePosFract.x;
double sample = sample0 * (1.0 - samplePosFract.y) + sample1 * samplePosFract.y;
return sample; }
case GL_FLOAT: {
const GLfloat* pixelData = reinterpret_cast<const GLfloat*>(texture->pixelData());
double sample00 = static_cast<double>(pixelData[linearSamplePos00]);
double sample10 = static_cast<double>(pixelData[linearSamplePos10]);
double sample01 = static_cast<double>(pixelData[linearSamplePos01]);
double sample11 = static_cast<double>(pixelData[linearSamplePos11]);
double sample0 = sample00 * (1.0 - samplePosFract.x) + sample10 * samplePosFract.x;
double sample1 = sample01 * (1.0 - samplePosFract.x) + sample11 * samplePosFract.x;
double sample = sample0 * (1.0 - samplePosFract.y) + sample1 * samplePosFract.y;
return sample; }
case GL_DOUBLE: {
const GLdouble* pixelData = reinterpret_cast<const GLdouble*>(texture->pixelData());
double sample00 = static_cast<double>(pixelData[linearSamplePos00]);
double sample10 = static_cast<double>(pixelData[linearSamplePos10]);
double sample01 = static_cast<double>(pixelData[linearSamplePos01]);
double sample11 = static_cast<double>(pixelData[linearSamplePos11]);
double sample0 = sample00 * (1.0 - samplePosFract.x) + sample10 * samplePosFract.x;
double sample1 = sample01 * (1.0 - samplePosFract.x) + sample11 * samplePosFract.x;
double sample = sample0 * (1.0 - samplePosFract.y) + sample1 * samplePosFract.y;
return sample; }
default:
LWARNING("Unknown GL type in texture. Returning 0.");
return 0;
}
}
CachingTileProvider::CachingTileProvider(std::shared_ptr<AsyncTileDataProvider> tileReader,
@@ -102,7 +224,6 @@ namespace openspace {
return tile;
}
void CachingTileProvider::initTexturesFromLoadedData() {
while (_asyncTextureDataProvider->hasLoadedTextureData()) {
std::shared_ptr<TileIOResult> tileIOResult = _asyncTextureDataProvider->nextTileIOResult();