void RexTerrainEngineNode::addTileLayer(Layer* tileLayer) { if ( tileLayer && tileLayer->getEnabled() ) { // Install the image layer stateset on this layer. // Later we will refactor this into an ImageLayerRenderer or something similar. //osg::StateSet* stateSet = tileLayer->getOrCreateStateSet(); //stateSet->merge(*getSurfaceStateSet()); ImageLayer* imageLayer = dynamic_cast<ImageLayer*>(tileLayer); if (imageLayer) { // for a shared layer, allocate a shared image unit if necessary. if ( imageLayer->isShared() ) { optional<int>& unit = imageLayer->shareImageUnit(); if ( !unit.isSet() ) { int temp; if ( getResources()->reserveTextureImageUnit(temp) ) { imageLayer->shareImageUnit() = temp; OE_INFO << LC << "Image unit " << temp << " assigned to shared layer " << imageLayer->getName() << std::endl; } else { OE_WARN << LC << "Insufficient GPU image units to share layer " << imageLayer->getName() << std::endl; } } // Build a sampler binding for the shared layer. if ( unit.isSet() ) { // Find the next empty SHARED slot: unsigned newIndex = SamplerBinding::SHARED; while (_renderBindings[newIndex].isActive()) ++newIndex; // Put the new binding there: SamplerBinding& newBinding = _renderBindings[newIndex]; newBinding.usage() = SamplerBinding::SHARED; newBinding.sourceUID() = imageLayer->getUID(); newBinding.unit() = unit.get(); newBinding.samplerName() = imageLayer->shareTexUniformName().get(); newBinding.matrixName() = imageLayer->shareTexMatUniformName().get(); OE_INFO << LC << " .. Sampler=\"" << newBinding.samplerName() << "\", " << "Matrix=\"" << newBinding.matrixName() << ", " << "unit=" << newBinding.unit() << "\n"; } } } else { // non-image tile layer. Keep track of these.. } refresh(); } }
void RexTerrainEngineNode::addTileLayer(Layer* tileLayer) { if ( tileLayer && tileLayer->getEnabled() ) { ImageLayer* imageLayer = dynamic_cast<ImageLayer*>(tileLayer); if (imageLayer) { // for a shared layer, allocate a shared image unit if necessary. if ( imageLayer->isShared() ) { if (!imageLayer->shareImageUnit().isSet()) { int temp; if ( getResources()->reserveTextureImageUnit(temp, imageLayer->getName().c_str()) ) { imageLayer->shareImageUnit() = temp; //OE_INFO << LC << "Image unit " << temp << " assigned to shared layer " << imageLayer->getName() << std::endl; } else { OE_WARN << LC << "Insufficient GPU image units to share layer " << imageLayer->getName() << std::endl; } } // Build a sampler binding for the shared layer. if ( imageLayer->shareImageUnit().isSet() ) { // Find the next empty SHARED slot: unsigned newIndex = SamplerBinding::SHARED; while (_renderBindings[newIndex].isActive()) ++newIndex; // Put the new binding there: SamplerBinding& newBinding = _renderBindings[newIndex]; newBinding.usage() = SamplerBinding::SHARED; newBinding.sourceUID() = imageLayer->getUID(); newBinding.unit() = imageLayer->shareImageUnit().get(); newBinding.samplerName() = imageLayer->shareTexUniformName().get(); newBinding.matrixName() = imageLayer->shareTexMatUniformName().get(); OE_INFO << LC << "Shared Layer \"" << imageLayer->getName() << "\" : sampler=\"" << newBinding.samplerName() << "\", " << "matrix=\"" << newBinding.matrixName() << "\", " << "unit=" << newBinding.unit() << "\n"; } } } else { // non-image tile layer. Keep track of these.. } if (_terrain) { // Update the existing render models, and trigger a data reload. // Later we can limit the reload to an update of only the new data. UpdateRenderModels updateModels(_mapFrame); #if 0 // This uses the loaddata filter approach which will only request // data for one layer. It mostly works but not 100%; see hires-insets // as an example. Removing the world layer and re-adding it while // zoomed in doesn't result in all tiles reloading. Possibly a // synchronization issue. ImageLayerVector imageLayers; _mapFrame.getLayers(imageLayers); if (imageLayers.size() == 1) updateModels.setReloadData(true); else updateModels.layersToLoad().insert(tileLayer->getUID()); #else updateModels.setReloadData(true); #endif _terrain->accept(updateModels); } } }