Esempio n. 1
0
	//---------------------------------------------------------------------
	void RenderQueue::processVisibleObject(MovableObject* mo, 
		Camera* cam, 
		bool onlyShadowCasters, 
		VisibleObjectsBoundsInfo* visibleBounds)
	{
		mo->_notifyCurrentCamera(cam);
		if (mo->isVisible())
		{
			bool receiveShadows = getQueueGroup(mo->getRenderQueueGroup())->getShadowsEnabled()
				&& mo->getReceivesShadows();

			if (!onlyShadowCasters || mo->getCastShadows())
			{
				mo -> _updateRenderQueue( this );
				if (visibleBounds)
				{
					visibleBounds->merge(mo->getWorldBoundingBox(true), 
						mo->getWorldBoundingSphere(true), cam, 
						receiveShadows);
				}
			}
			// not shadow caster, receiver only?
			else if (onlyShadowCasters && !mo->getCastShadows() && 
				receiveShadows)
			{
				visibleBounds->mergeNonRenderedButInFrustum(mo->getWorldBoundingBox(true), 
					mo->getWorldBoundingSphere(true), cam);
			}
		}

	}
Esempio n. 2
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);

    }
Esempio n. 3
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 );
		}
	}
Esempio n. 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);

    }