diff --git a/modules/globebrowsing/chunk/chunkrenderer.cpp b/modules/globebrowsing/chunk/chunkrenderer.cpp index 4b9b5f8c67..800e0cd9aa 100644 --- a/modules/globebrowsing/chunk/chunkrenderer.cpp +++ b/modules/globebrowsing/chunk/chunkrenderer.cpp @@ -75,10 +75,8 @@ namespace globebrowsing { "${MODULE_GLOBEBROWSING}/shaders/localchunkedlodpatch_vs.glsl", "${MODULE_GLOBEBROWSING}/shaders/localchunkedlodpatch_fs.glsl"); - _globalProgramUniformHandler = - std::make_shared(); - _localProgramUniformHandler = - std::make_shared(); + _globalGpuLayerManager = std::make_shared(); + _localGpuLayerManager = std::make_shared(); } @@ -98,7 +96,7 @@ namespace globebrowsing { ProgramObject* ChunkRenderer::getActivatedProgramWithTileData( LayeredTextureShaderProvider* layeredTextureShaderProvider, - std::shared_ptr programUniformHandler, + GPULayerManager * gpuLayerManager, const Chunk& chunk) { const TileIndex& tileIndex = chunk.tileIndex(); @@ -121,7 +119,7 @@ namespace globebrowsing { const auto& debugProps = chunk.owner().debugProperties(); auto& pairs = layeredTexturePreprocessingData.keyValuePairs; - pairs.push_back(std::make_pair("useAtmosphere",std::to_string(generalProps.atmosphereEnabled))); + pairs.push_back(std::make_pair("useAtmosphere", std::to_string(generalProps.atmosphereEnabled))); pairs.push_back(std::make_pair("performShading", std::to_string(generalProps.performShading))); pairs.push_back(std::make_pair("showChunkEdges", std::to_string(debugProps.showChunkEdges))); pairs.push_back(std::make_pair("showHeightResolution", std::to_string(debugProps.showHeightResolution))); @@ -134,24 +132,14 @@ namespace globebrowsing { layeredTexturePreprocessingData); if (layeredTextureShaderProvider->updatedOnLastCall()) { - // Need to update uniforms - programUniformHandler->updateIdsIfNecessary(layeredTextureShaderProvider, _layerManager.get()); - + gpuLayerManager->updateUniformLocations(programObject, *_layerManager); } // Activate the shader program programObject->activate(); - - - // Go through all the categories - for (size_t category = 0; category < LayeredTextures::NUM_TEXTURE_CATEGORIES; category++) { - LayerGroup& layerGroup = _layerManager->layerGroup(category); - GPULayerGroup* gpuLayerGroup = programUniformHandler->gpuLayerGroup(category); - - int pileSize = layerGroup.levelBlendingEnabled ? 3 : 1; - gpuLayerGroup->setValue(programObject, layerGroup, tileIndex); - } + + gpuLayerManager->setValue(programObject, *_layerManager, tileIndex); // The length of the skirts is proportional to its size programObject->setUniform("skirtLength", min(static_cast(chunk.surfacePatch().halfSize().lat * 1000000), 8700.0f)); @@ -168,7 +156,7 @@ namespace globebrowsing { ProgramObject* programObject = getActivatedProgramWithTileData( _globalRenderingShaderProvider.get(), - _globalProgramUniformHandler, + _globalGpuLayerManager.get(), chunk); if (programObject == nullptr) { return; @@ -237,14 +225,11 @@ namespace globebrowsing { // render _grid->geometry().drawUsingActiveProgram(); - for (int i = 0; i < LayeredTextures::NUM_TEXTURE_CATEGORIES; ++i) { - _globalProgramUniformHandler->gpuLayerGroup(i)->deactivate(); - } - + _globalGpuLayerManager->deactivate(); + // disable shader programObject->deactivate(); - } @@ -253,7 +238,7 @@ namespace globebrowsing { ProgramObject* programObject = getActivatedProgramWithTileData( _localRenderingShaderProvider.get(), - _localProgramUniformHandler, + _localGpuLayerManager.get(), chunk); if (programObject == nullptr) { return; @@ -324,9 +309,7 @@ namespace globebrowsing { // render _grid->geometry().drawUsingActiveProgram(); - for (int i = 0; i < LayeredTextures::NUM_TEXTURE_CATEGORIES; ++i) { - _localProgramUniformHandler->gpuLayerGroup(i)->deactivate(); - } + _localGpuLayerManager->deactivate(); // disable shader programObject->deactivate(); diff --git a/modules/globebrowsing/chunk/chunkrenderer.h b/modules/globebrowsing/chunk/chunkrenderer.h index a1871e0bf9..d184fe3a49 100644 --- a/modules/globebrowsing/chunk/chunkrenderer.h +++ b/modules/globebrowsing/chunk/chunkrenderer.h @@ -92,7 +92,7 @@ namespace globebrowsing { ProgramObject* getActivatedProgramWithTileData( LayeredTextureShaderProvider* layeredTextureShaderProvider, - std::shared_ptr programUniformHandler, + GPULayerManager * gpuLayerManager, const Chunk& chunk); // shared pointer to a grid which can be the same for all rendered chunks. @@ -104,8 +104,8 @@ namespace globebrowsing { std::shared_ptr _localRenderingShaderProvider; // Layered texture uniforms are chached in the uniform ID handles. - std::shared_ptr _globalProgramUniformHandler; - std::shared_ptr _localProgramUniformHandler; + std::shared_ptr _globalGpuLayerManager; + std::shared_ptr _localGpuLayerManager; }; } // namespace globebrowsing diff --git a/modules/globebrowsing/layered_rendering/layeredtextureshaderprovider.cpp b/modules/globebrowsing/layered_rendering/layeredtextureshaderprovider.cpp index 9d7ff71b24..9c0327949b 100644 --- a/modules/globebrowsing/layered_rendering/layeredtextureshaderprovider.cpp +++ b/modules/globebrowsing/layered_rendering/layeredtextureshaderprovider.cpp @@ -39,14 +39,8 @@ namespace { namespace openspace { namespace globebrowsing { - LayeredTexturePreprocessingData::LayeredTexturePreprocessingData(LayerManager* tpm){ - - } - - bool LayeredTextureInfo::operator==(const LayeredTextureInfo& other) const - { - return - lastLayerIdx == other.lastLayerIdx && + bool LayeredTextureInfo::operator==(const LayeredTextureInfo& other) const { + return lastLayerIdx == other.lastLayerIdx && layerBlendingEnabled == other.layerBlendingEnabled; } @@ -154,37 +148,5 @@ namespace globebrowsing { return _updatedOnLastCall; } - LayeredTextureShaderUniformIdHandler::LayeredTextureShaderUniformIdHandler(){ - for (size_t i = 0; i < LayeredTextures::NUM_TEXTURE_CATEGORIES; i++) { - _gpuLayerGroups[i] = std::make_unique(); - } - } - - LayeredTextureShaderUniformIdHandler::~LayeredTextureShaderUniformIdHandler() - {} - - GPULayerGroup* LayeredTextureShaderUniformIdHandler::gpuLayerGroup(int i) const{ - return _gpuLayerGroups[i].get(); - } - - - void LayeredTextureShaderUniformIdHandler::updateIdsIfNecessary( - LayeredTextureShaderProvider* shaderProvider, LayerManager* layerManager) { - - if (shaderProvider->updatedOnLastCall()) { - ProgramObject* programObject = shaderProvider->_programObject.get(); - - for (size_t i = 0; i < LayeredTextures::NUM_TEXTURE_CATEGORIES; i++) { - LayerGroup& layerGroup = layerManager->layerGroup(i); - std::string nameBase = LayeredTextures::TEXTURE_CATEGORY_NAMES[i]; - _gpuLayerGroups[i]->updateUniformLocations(programObject, layerGroup, nameBase, i); - } - - // Reset ignore errors - programObject->setIgnoreUniformLocationError( - ProgramObject::IgnoreError::No); - } - } - } // namespace globebrowsing } // namespace openspace diff --git a/modules/globebrowsing/layered_rendering/layeredtextureshaderprovider.h b/modules/globebrowsing/layered_rendering/layeredtextureshaderprovider.h index c0af15eddf..1185cff8b4 100644 --- a/modules/globebrowsing/layered_rendering/layeredtextureshaderprovider.h +++ b/modules/globebrowsing/layered_rendering/layeredtextureshaderprovider.h @@ -43,8 +43,6 @@ namespace globebrowsing { class LayerManager; - class LayeredTextureShaderUniformIdHandler; - /** * Settings per texture category that contains shader preprocessing information. */ @@ -67,7 +65,6 @@ namespace globebrowsing { * levels. */ struct LayeredTexturePreprocessingData { - LayeredTexturePreprocessingData(LayerManager* tpm = nullptr); std::array layeredTextureInfo; @@ -101,8 +98,6 @@ namespace globebrowsing { private: - - friend class LayeredTextureShaderUniformIdHandler; void recompileShaderProgram(LayeredTexturePreprocessingData preprocessingData); std::unique_ptr _programObject; @@ -115,24 +110,6 @@ namespace globebrowsing { bool _updatedOnLastCall; }; - /** - * This class caches OpenGL uniform IDs for LayeredTextureShaderProviders. - */ - class LayeredTextureShaderUniformIdHandler - { - public: - - LayeredTextureShaderUniformIdHandler(); - ~LayeredTextureShaderUniformIdHandler(); - void updateIdsIfNecessary(LayeredTextureShaderProvider* shaderProvider, LayerManager* layerManager); - - ProgramObject& programObject(); - - GPULayerGroup* gpuLayerGroup(int i) const; - - private: - std::array, LayeredTextures::NUM_TEXTURE_CATEGORIES> _gpuLayerGroups; - }; } // namespace globebrowsing } // namespace openspace diff --git a/modules/globebrowsing/tile/gpustructs.cpp b/modules/globebrowsing/tile/gpustructs.cpp index 16dfc9b118..75abf041b4 100644 --- a/modules/globebrowsing/tile/gpustructs.cpp +++ b/modules/globebrowsing/tile/gpustructs.cpp @@ -192,5 +192,39 @@ namespace globebrowsing { } + // LayerManager + + void GPULayerManager::setValue(ProgramObject* programObject, const LayerManager& layerManager, const TileIndex& tileIndex){ + auto layerGroups = layerManager.layerGroups(); + for (size_t i = 0; i < layerGroups.size(); ++i){ + std::string nameBase = LayeredTextures::TEXTURE_CATEGORY_NAMES[i]; + gpuLayerGroups[i]->setValue(programObject, *layerGroups[i], tileIndex); + } + } + + void GPULayerManager::updateUniformLocations(ProgramObject* programObject, const LayerManager& layerManager){ + auto layerGroups = layerManager.layerGroups(); + if(gpuLayerGroups.size() != layerGroups.size()){ + gpuLayerGroups.resize(layerGroups.size()); + for(auto& gpuLayerGroup : gpuLayerGroups){ + gpuLayerGroup = std::make_unique(); + } + } + + for (size_t i = 0; i < layerGroups.size(); ++i){ + std::string nameBase = LayeredTextures::TEXTURE_CATEGORY_NAMES[i]; + gpuLayerGroups[i]->updateUniformLocations(programObject, *layerGroups[i], nameBase, i); + } + } + + void GPULayerManager::deactivate(){ + for (size_t i = 0; i < gpuLayerGroups.size(); ++i){ + gpuLayerGroups[i]->deactivate(); + } + } + + + + } // namespace globebrowsing } // namespace openspace diff --git a/modules/globebrowsing/tile/gpustructs.h b/modules/globebrowsing/tile/gpustructs.h index 0fe31ecb64..9f39c455aa 100644 --- a/modules/globebrowsing/tile/gpustructs.h +++ b/modules/globebrowsing/tile/gpustructs.h @@ -147,6 +147,17 @@ private: }; +class LayerManager; +class GPULayerManager{ +public: + + virtual void setValue(ProgramObject* programObject, const LayerManager& layerManager, const TileIndex& tileIndex); + virtual void updateUniformLocations(ProgramObject* programObject, const LayerManager& layerManager); + virtual void deactivate(); +private: + std::vector> gpuLayerGroups; +}; + } // namespace globebrowsing } // namespace openspace diff --git a/modules/globebrowsing/tile/layermanager.cpp b/modules/globebrowsing/tile/layermanager.cpp index 86f546877c..2f50a30fac 100644 --- a/modules/globebrowsing/tile/layermanager.cpp +++ b/modules/globebrowsing/tile/layermanager.cpp @@ -158,10 +158,10 @@ namespace globebrowsing { initData.preprocessTiles = i == LayeredTextures::HeightMaps; std::string groupName = LayeredTextures::TEXTURE_CATEGORY_NAMES[i]; - layerGroups.push_back(std::make_shared(groupName, texturesDict)); + _layerGroups.push_back(std::make_shared(groupName, texturesDict)); } - for(auto layerGroup : layerGroups){ + for(auto layerGroup : _layerGroups){ addPropertySubOwner(layerGroup.get()); } } @@ -171,21 +171,26 @@ namespace globebrowsing { } LayerGroup& LayerManager::layerGroup(size_t groupId) { - return *layerGroups[groupId]; + return *_layerGroups[groupId]; } LayerGroup& LayerManager::layerGroup(LayeredTextures::TextureCategory category) { - return *layerGroups[category]; + return *_layerGroups[category]; } + const std::vector>& LayerManager::layerGroups() const { + return _layerGroups; + } + + void LayerManager::update() { - for (auto& layerGroup : layerGroups) { + for (auto& layerGroup : _layerGroups) { layerGroup->update(); } } void LayerManager::reset(bool includeDisabled) { - for (auto& layerGroup : layerGroups) { + for (auto& layerGroup : _layerGroups) { for (auto layer : layerGroup->layers) { if (layer->enabled() || includeDisabled) { layer->tileProvider()->reset(); diff --git a/modules/globebrowsing/tile/layermanager.h b/modules/globebrowsing/tile/layermanager.h index ae76f9856a..45d3c36735 100644 --- a/modules/globebrowsing/tile/layermanager.h +++ b/modules/globebrowsing/tile/layermanager.h @@ -111,12 +111,14 @@ namespace globebrowsing { LayerGroup& layerGroup(size_t groupId); LayerGroup& layerGroup(LayeredTextures::TextureCategory); + const std::vector>& layerGroups() const; + void update(); void reset(bool includingInactive = false); private: - std::vector> layerGroups; + std::vector> _layerGroups; };