void GeometryUpdateTask::executeTaskInBackgroundThread(Tasks::TaskExecutionContext& context) { std::vector<Mercator::Segment*> segments; //first populate the geometry for all pages, and then regenerate the shaders for (BridgeBoundGeometryPtrVector::const_iterator I = mGeometry.begin(); I != mGeometry.end(); ++I) { TerrainPageGeometryPtr geometry = I->first; geometry->repopulate(); const SegmentVector& segmentVector = geometry->getValidSegments(); for (SegmentVector::const_iterator I = segmentVector.begin(); I != segmentVector.end(); ++I) { segments.push_back(I->segment); } GeometryPtrVector geometries; geometries.push_back(geometry); for (ShaderStore::const_iterator J = mShaders.begin(); J != mShaders.end(); ++J) { context.executeTask(new TerrainShaderUpdateTask(geometries, J->second, mAreas, mHandler.EventLayerUpdated)); } } context.executeTask(new HeightMapUpdateTask(mHeightMapBufferProvider, mHeightMap, segments)); for (BridgeBoundGeometryPtrVector::const_iterator I = mGeometry.begin(); I != mGeometry.end(); ++I) { const TerrainPageGeometryPtr& geometry = I->first; const ITerrainPageBridgePtr& bridge = I->second; if (bridge.get()) { bridge->updateTerrain(*geometry); } } for (BridgeBoundGeometryPtrVector::const_iterator I = mGeometry.begin(); I != mGeometry.end(); ++I) { TerrainPage* page = &(I->first)->getPage(); mPages.insert(page); } //Release Segment references as soon as we can mGeometry.clear(); }
void GeometryUpdateTask::executeTaskInBackgroundThread(Tasks::TaskExecutionContext& context) { std::vector<Mercator::Segment*> segments; // build a vector of shaders so we can more efficiently update them std::vector<const Terrain::TerrainShader*> shaderList; for (auto& entry : mShaders) { shaderList.push_back(entry.second); } //first populate the geometry for all pages, and then regenerate the shaders for (BridgeBoundGeometryPtrVector::const_iterator I = mGeometry.begin(); I != mGeometry.end(); ++I) { TerrainPageGeometryPtr geometry = I->first; geometry->repopulate(); const SegmentVector& segmentVector = geometry->getValidSegments(); for (SegmentVector::const_iterator I = segmentVector.begin(); I != segmentVector.end(); ++I) { segments.push_back(I->segment); } GeometryPtrVector geometries; geometries.push_back(geometry); context.executeTask(new TerrainShaderUpdateTask(geometries, shaderList, mAreas, mHandler.EventLayerUpdated, mHandler.EventTerrainMaterialRecompiled, mLightDirection)); } context.executeTask(new HeightMapUpdateTask(mHeightMapBufferProvider, mHeightMap, segments)); for (BridgeBoundGeometryPtrVector::const_iterator I = mGeometry.begin(); I != mGeometry.end(); ++I) { const TerrainPageGeometryPtr& geometry = I->first; const ITerrainPageBridgePtr& bridge = I->second; if (bridge.get()) { bridge->updateTerrain(*geometry); mBridgesToNotify.insert(bridge); } } for (BridgeBoundGeometryPtrVector::const_iterator I = mGeometry.begin(); I != mGeometry.end(); ++I) { TerrainPage* page = &(I->first)->getPage(); mPages.insert(page); } //Release Segment references as soon as we can mGeometry.clear(); }