Ejemplo n.º 1
0
void SceneManager::UpdateRenderables( tRendererType *renderer )
{	
	MathLib::Rectanglef rcViewport;
	rcViewport.min_vert = m_rcViewport.min_vert / m_fScale;
	rcViewport.max_vert = m_rcViewport.max_vert / m_fScale;
	unsigned int priority = 0;
	RenderDeviceCapability &cap = RenderDeviceCapability::GetInstance();
	
	for( SceneLayerPtrVector::iterator it = m_vLayers.begin() ; it != m_vLayers.end() ; ++it )
	{
		SceneLayer *pLayer = *it;
		assert( pLayer );
		if( pLayer->isStatic && !pLayer->lstRenderables.empty() )
			continue;

		SpriteRenderGroupContainer &container = pLayer->lstRenderables;
		SpritePtrListType &lstSprites = pLayer->lstSprites;
		const MathLib::Vector2f& distance = pLayer->distance;
		
		for( SpritePtrListType::iterator it0 = lstSprites.begin() ; it0 != lstSprites.end() ; ++it0 )
		{
			Sprite *obj = *it0;
			assert( obj );
			if( obj->GetCurTexture() == NULL )
				continue;
			MathLib::Vector2f offset( (1.0f - distance.x())*rcViewport.left() , (1.0f - distance.y())*rcViewport.top() );
			MathLib::Rectanglef rc = obj->GetWorldBounds();
			rc.move( offset.x() , offset.y() );
			
			if( obj->IsVisible() && MathLib::intersect<float>( rc , rcViewport ) )
			{
				SpriteRenderGroup *group = NULL;
				RenderGroupKeyType key = RenderGroupKeyType( obj->GetCurTexture() , obj->GetBlendMode() );
				SpriteRenderGroupContainer::iterator itRenderable = container.find( key );
				if( itRenderable == container.end() )
				{
					// init new renderable
					group = new SpriteRenderGroup;
					group->Create( obj->GetCurTexture() , obj->GetBlendMode() , cap.IsSupportVAO() );
					renderer->SetupVAO( group );
					group->SwapVAO();
					renderer->SetupVAO( group );
					group->SetPriority( priority );
					
					container.insert( SpriteRenderGroupContainer::value_type( key , group ) );
				}
				else
					group = itRenderable->second;
				if( group )
					group->PushSprite( obj , offset.x() , offset.y() );
				else
					assert(0);
			}
			//			else
			//				I3DKIT2_LOG(@"obj invisible--");
		}
		
		for( SpriteRenderGroupContainer::iterator it0 = container.begin() ; it0 != container.end() ; ++it0 )
		{
			SpriteRenderGroup *obj = it0->second;
			assert(obj);
			
			//			I3DKIT2_LOG(@"objects count in layer %d = %d",priority,obj->GetSpritesCount());
			obj->ComplileRenderable();
		}
		
		++priority;
	}
}