示例#1
0
Patch * TerrainPager::GetPatch(const PatchID &patchID)
{
	if (patchID.GetI() < 0 || patchID.GetJ() < 0)	// reject call
		return NULL;

	// Check the working set to see if it is loaded
	Patch *pPatch = findPatch(patchID);
	if (NULL != pPatch)
	{
		pPatch->IncrementReferenceCount();
		return pPatch;
	}

	// not within the working set.
	// go get it.

	// get a free slot.
	assert(!readyPatchQueue.empty());	// uptil now we just assume that we have a patch pool that is sufficient to our needs.
	unsigned int index = readyPatchQueue.front();
	readyPatchQueue.pop();				// mark this patch as occupied.

	// load the patch into this slot
	pPatch = pPatches[index];
	pPatch->Reset();					// reset internal values of nbLoadedVertices, currentLoadedLevel.
	pPatch->SetID(patchID);

	jobManager->RequestFillPatch(*pPatch, utilizeTextures);

	// push it onto the list
	workingSet.push_back(pPatch);
	pPatch->IncrementReferenceCount();			// this one is used.
	pPatch->SetIterator(--workingSet.end());	// the iterator of the latest added item.
	
	return pPatch;
}
void Landscape::Reset()
{
    Patch *patch;

    SetNextTriNode(0);

    for ( int Y=0; Y < NUM_PATCHES_PER_SIDE; Y++ ) {
        for ( int X=0; X < NUM_PATCHES_PER_SIDE; X++) {
            patch = &(m_Patches[Y][X]);
            patch->Reset();

            if ( X > 0 )
                patch->GetBaseLeft()->LeftNeighbor = m_Patches[Y][X-1].GetBaseRight();
            else
                patch->GetBaseLeft()->LeftNeighbor = NULL;
            if ( X < (NUM_PATCHES_PER_SIDE-1) )
                patch->GetBaseRight()->LeftNeighbor = m_Patches[Y][X+1].GetBaseLeft();
            else
                patch->GetBaseRight()->LeftNeighbor = NULL;

            if ( Y > 0 )
                patch->GetBaseLeft()->RightNeighbor = m_Patches[Y-1][X].GetBaseRight();
            else
                patch->GetBaseLeft()->RightNeighbor = NULL;

            if ( Y < (NUM_PATCHES_PER_SIDE-1) )
                patch->GetBaseRight()->RightNeighbor = m_Patches[Y+1][X].GetBaseLeft();
            else
                patch->GetBaseRight()->RightNeighbor = NULL;
        }
    }
}