//-----------------------------------------------------------------------
void DefaultExtRaySceneQuery::execute( ExtRaySceneQueryListener* _listener )
{
    mOgreQuery->setQueryMask( getQueryMask() );
    mOgreQuery->setQueryTypeMask( getQueryTypeMask() );
    mOgreQuery->setWorldFragmentType( getWorldFragmentType() );
    mOgreQuery->setRay( getRay() );

    BridgeQueryListener bql( _listener );
    mOgreQuery->execute( &bql );
}
    const ActorVector& OgreRaySceneQuery::execute()
    {
        // Clear last results
        mResult.clear();

		Ray ray(getRayStart(), (getRayEnd() - getRayStart()).normalisedCopy());

		Ogre::RaySceneQuery* query = CoreSubsystem::getSingleton().getWorld()->getSceneManager()
			->createRayQuery(ray, getQueryMask());

		query->execute(this);

        return mResult;
    }
Example #3
0
 void Actor::removeQueryFlag( unsigned long flag )
 {
     setQueryMask(  getQueryMask() &~ flag );
 }
Example #4
0
 void Actor::addQueryFlag( unsigned long flag  )
 {
     setQueryMask(  getQueryMask() | flag );
 }
//----------------------------------------------------------------------------
// This function return the vertex interpolated height.
// Supplied by Praetor. Thanks a lot. ]:)
void PagingLandScapeRaySceneQuery::execute(RaySceneQueryListener* listener) 
{ 
    ulong mask = getQueryMask();  
   
    
    static WorldFragment worldFrag;
    worldFrag.fragmentType = SceneQuery::WFT_SINGLE_INTERSECTION;

    const Vector3& dir = mRay.getDirection();
    const Vector3& origin = mRay.getOrigin();

    bool noSpecializedQueries = true;
    bool noTerrainQuery = true;

    // Exclusive Specialized Queries
    // Straight up / down?
    if ((mask & RSQ_Height) || (mask & RSQ_Height_no_interpolation) ||
        dir == Vector3::UNIT_Y || 
        dir == Vector3::NEGATIVE_UNIT_Y)
    {
        noTerrainQuery = false;
        if (mask & RSQ_Height || mask & RSQ_Height_no_interpolation)
            noSpecializedQueries = false;

        Real height;
        if (mask & RSQ_Height_no_interpolation)
            height = PagingLandScapeData2DManager::getSingleton().getWorldHeight(origin.x, origin.z);
        else
            height = PagingLandScapeData2DManager::getSingleton().getRealWorldHeight(origin.x, origin.z);

        worldFrag.singleIntersection.x = origin.x;
        worldFrag.singleIntersection.z = origin.z;
        worldFrag.singleIntersection.y = height;

        //if (!listener->queryResult(&worldFrag,  (worldFrag.singleIntersection - origin).length()))					
        //if (!listener->queryResult(&worldFrag,  0))
		//			return;
        listener->queryResult(&worldFrag,  0);
    } 
    else if (mask & RSQ_FirstTerrain)
    {
        noTerrainQuery = false;
        noSpecializedQueries = false;

        Real resFactor = 1.0f;
		// Only bother if the non-default mask has been set
		if((mask & RSQ_1xRes) == 0)
		{
			if(mask & RSQ_2xRes)
            {
				resFactor = 0.5f;
			} 
            else if(mask & RSQ_4xRes) 
            {
				resFactor = 0.25f;
			} 
            else if(mask & RSQ_8xRes) 
            {
				resFactor = 0.125f;
			}
		}
        if (static_cast<PagingLandScapeSceneManager*>(mParentSceneMgr)->intersectSegmentTerrain(
                        origin, dir*resFactor, 
                        &worldFrag.singleIntersection))
        {
            //if (!listener->queryResult(&worldFrag,  (worldFrag.singleIntersection - origin).length()))					
            //if (!listener->queryResult(&worldFrag,  0))
			//		    return;
            listener->queryResult(&worldFrag,  0);
            return;
        }
    }  
    else if((mask & RSQ_AllTerrain))
	{
        noTerrainQuery = false;
        noSpecializedQueries = false;

       	Real resFactor = 1.0f;
		// Only bother if the non-default mask has been set
		if((mask & RSQ_1xRes) == 0)
		{
			if(mask & RSQ_2xRes)
            {
				resFactor = 0.5f;
			} 
            else if(mask & RSQ_4xRes) 
            {
				resFactor = 0.25f;
			} 
            else if(mask & RSQ_8xRes) 
            {
				resFactor = 0.125f;
			}
		}


        const Vector3 raydir (mRay.getDirection());
        const Vector3 raymove (raydir * resFactor);
        const Real distmove = 1 * resFactor;
        const Real maxHeight = PagingLandScapeData2DManager::getSingleton().getMaxHeight ();
        const Real MaxTerrainX = PagingLandScapeOptions::getSingleton().maxScaledX;
        const Real MaxTerrainZ = PagingLandScapeOptions::getSingleton().maxScaledZ;

        Vector3 ray (mRay.getOrigin());
	    Real dist = 0.0f;

        // while ray is inside or ray is outside but raydir going inside
        while ( (ray.y < 0 && raydir.y > 0) || 
                (ray.y > maxHeight    && raydir.y < 0) || 
                (ray.x < -MaxTerrainX && raydir.x > 0) || 
                (ray.x > MaxTerrainX  && raydir.x < 0) || 
                (ray.z < -MaxTerrainZ && raydir.z > 0) || 
                (ray.z > MaxTerrainZ  && raydir.z < 0)) 
		{
			ray += raymove;
			dist += distmove;
            if (ray.y < maxHeight)// no need to do complex tests
            {
                const Vector3 land (getHeightAt(ray));
                if (ray.y < land.y)
                {
                    WorldFragment* frag = new WorldFragment();
                    //fragmentList.push_back(frag);

                    frag->fragmentType = SceneQuery::WFT_SINGLE_INTERSECTION; 
                    frag->singleIntersection = land;
                    			
                    if (!listener->queryResult(frag,  dist))
					            return;
                }
            }
        } 
    }

    // Could want entities and terrain or or just entities, or didn't say nothing...
    if(mask & RSQ_Entities)
    {
        noSpecializedQueries = false;
        // Check for entity contacts
        PagingLandScapeOctreeRaySceneQuery::execute(listener);
    }

    if (noSpecializedQueries)
    {
        if (noTerrainQuery)
        {
            mask |= RSQ_AllTerrain;
            // Check for terrain contacts
            PagingLandScapeRaySceneQuery::execute(listener);
            mask = 0;
        }
        // Check for entity contacts
        PagingLandScapeOctreeRaySceneQuery::execute(listener);
    }
}