示例#1
0
    //-----------------------------------------------------------------------
    void RenderQueue::addRenderable(Renderable* pRend, uint8 groupID, ushort priority)
    {
        // Find group
        RenderQueueGroup* pGroup = getQueueGroup(groupID);


		Technique* pTech;

		// tell material it's been used
		if (!pRend->getMaterial().isNull())
			pRend->getMaterial()->touch();

		// Check material & technique supplied (the former since the default implementation
        // of getTechnique is based on it for backwards compatibility
        if(pRend->getMaterial().isNull() || !(pTech = pRend->getTechnique()))
        {
            // Use default base white
			MaterialPtr baseWhite = MaterialManager::getSingleton().getByName("BaseWhite");
            pTech = baseWhite->getTechnique(0);
        }

		if (mRenderableListener)
		{
			// Allow listener to override technique and to abort
			if (!mRenderableListener->renderableQueued(pRend, groupID, priority, 
				&pTech, this))
				return; // rejected

			// tell material it's been used (incase changed)
			pTech->getParent()->touch();
		}
		
        pGroup->addRenderable(pRend, pTech, priority);

    }
示例#2
0
	//-----------------------------------------------------------------------
	void RenderQueue::merge( const RenderQueue* rhs )
	{
		ConstQueueGroupIterator it = rhs->_getQueueGroupIterator( );

		while( it.hasMoreElements() )
		{
			uint8 groupID = it.peekNextKey();
			RenderQueueGroup* pSrcGroup = it.getNext();
			RenderQueueGroup* pDstGroup = getQueueGroup( groupID );

			pDstGroup->merge( pSrcGroup );
		}
	}
示例#3
0
//-----------------------------------------------------------------------
void RenderQueue::addRenderable(Renderable* pRend, RenderQueueGroupID groupID, ushort priority) {
  // Find group
  RenderQueueGroupMap::iterator groupIt;
  RenderQueueGroup* pGroup;

  groupIt = mGroups.find(groupID);
  if (groupIt == mGroups.end()) {
    // Insert new
    pGroup = new RenderQueueGroup();
    mGroups.insert(RenderQueueGroupMap::value_type(groupID, pGroup));
  } else {
    pGroup = groupIt->second;
  }

  pGroup->addRenderable(pRend, priority);

}
示例#4
0
    //-----------------------------------------------------------------------
    void RenderQueue::addRenderable(Renderable* pRend, uint8 groupID, ushort priority)
    {
        // Find group
        RenderQueueGroup* pGroup = getQueueGroup(groupID);

        Technique* pTech;

        // tell material it's been used
        if (pRend->getMaterial())
            pRend->getMaterial()->touch();

        // Check material & technique supplied (the former since the default implementation
        // of getTechnique is based on it for backwards compatibility
        if(!pRend->getMaterial() || !pRend->getTechnique())
        {
            // Use default base white, with lighting only if vertices has normals
            RenderOperation op;
            pRend->getRenderOperation(op);
            bool useLighting = (NULL != op.vertexData->vertexDeclaration->findElementBySemantic(VES_NORMAL));
            MaterialPtr defaultMat = MaterialManager::getSingleton().getDefaultMaterial(useLighting);
            defaultMat->load();
            pTech = defaultMat->getBestTechnique();
        }
        else
            pTech = pRend->getTechnique();

        if (mRenderableListener)
        {
            // Allow listener to override technique and to abort
            if (!mRenderableListener->renderableQueued(pRend, groupID, priority, 
                &pTech, this))
                return; // rejected

            // tell material it's been used (incase changed)
            pTech->getParent()->touch();
        }
        
        pGroup->addRenderable(pRend, pTech, priority);

    }