void DynamicGroupUpdateCallback::operator()( osg::Node* node, osg::NodeVisitor* nv ) { //сформировать массив данных о видимых патчах m_VisiblePatchArray.Update(); //обновить коэффициенты из файла // UpdateKof(); //обновить статистику UpdateStatistic(); osg::ref_ptr< osg::Group > group = dynamic_cast< osg::Group* >( node ); if ( group ) { //вернуть ссылку на массив видимых патчей const std::vector< dataPatch > &data_vis = m_VisiblePatchArray.GetVisibleArray(); if ( !data_vis.empty() ) { //FindMax(); //std::cout << data_vis.size() << "-" << FindMax() << " "; //очистить всех детей group->removeChildren( 0 , group->getNumChildren() ); //перебрать все видимые узлы for( int i = 0 ; i < data_vis.size() ; ++i ) { //сформировать геометрию //GeometryPatch patch( data_vis[ i ].m_iX , // data_vis[ i ].m_iY , 65 , // data_vis[ i ].m_iSize ); osg::ref_ptr< osg::Geode > geode = new osg::Geode; if ( data_vis[ i ].m_iSize == 1024 ) { GeometryTexturePatch1 patch( data_vis[ i ].m_iX , data_vis[ i ].m_iY , 66 , data_vis[ i ].m_iSize , m_ImageIndex.get() , 2 , -64 ); //1 -32 geode->addDrawable( patch.GetGeometry().get() ); } else if ( data_vis[ i ].m_iSize == 512 ) { GeometryTexturePatch patch( data_vis[ i ].m_iX , data_vis[ i ].m_iY , 65 , data_vis[ i ].m_iSize , m_ImageIndex.get() , 1 , 30 ); geode->addDrawable( patch.GetGeometry().get() ); } else if ( data_vis[ i ].m_iSize == 2048 ) { GeometryTexturePatch2 patch( data_vis[ i ].m_iX , data_vis[ i ].m_iY , 68 , data_vis[ i ].m_iSize , m_ImageIndex.get() , 2 , -64 ); geode->addDrawable( patch.GetGeometry().get() ); } else if ( data_vis[ i ].m_iSize == 4096 ) { GeometryTexturePatch4 patch( data_vis[ i ].m_iX , data_vis[ i ].m_iY , 64 + 8, data_vis[ i ].m_iSize , m_ImageIndex.get() , 2 , -128 ); geode->addDrawable( patch.GetGeometry().get() ); } else if ( data_vis[ i ].m_iSize == 8192 ) { GeometryTexturePatch8 patch( data_vis[ i ].m_iX , data_vis[ i ].m_iY , 64 + 16, data_vis[ i ].m_iSize , m_ImageIndex.get() , 2 , -128 ); geode->addDrawable( patch.GetGeometry().get() ); } else if ( data_vis[ i ].m_iSize == 16384 ) { GeometryTexturePatch16 patch( data_vis[ i ].m_iX , data_vis[ i ].m_iY , 64 + 32, data_vis[ i ].m_iSize , m_ImageIndex.get() , 2 , -128 ); geode->addDrawable( patch.GetGeometry().get() ); } else if ( data_vis[ i ].m_iSize == 32768 ) { GeometryTexturePatch32 patch( data_vis[ i ].m_iX , data_vis[ i ].m_iY , 64 + 64, data_vis[ i ].m_iSize , m_ImageIndex.get() , 2 , -128 ); geode->addDrawable( patch.GetGeometry().get() ); } //else //{ // std::cout << "65536 "; //} //добавить геометрию в сцену group->addChild( geode.get() ); } } } }
void Scene::Update() { if (!_isAllLoad) // если не загружены текстуры, то обновлять тоже ничего не нужно. (хотя можно было бы) { return; } float dt = GetDt(); _fw.Update(dt); _cloud.Update(dt); updateGL(); // отрисовка UpdateStatistic(dt); }