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; } } }