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() );
			}
		}
	}
}
Exemplo n.º 2
0
void Scene::Update()
{
    if (!_isAllLoad) // если не загружены текстуры, то обновлять тоже ничего не нужно. (хотя можно было бы)
    {
        return;
    }

    float dt = GetDt();

    _fw.Update(dt);
    _cloud.Update(dt);

    updateGL(); // отрисовка

    UpdateStatistic(dt);
}