void GeoSphere::ProcessSplitResults() { // now handle the single split results that define the base level of the quad tree { std::deque<SSingleSplitResult*>::iterator iter = mSingleSplitResults.begin(); while(iter!=mSingleSplitResults.end()) { // finally pass SplitResults SSingleSplitResult *psr = (*iter); const int32_t faceIdx = psr->face(); if( m_patches[faceIdx] ) { m_patches[faceIdx]->ReceiveHeightmap(psr); } else { psr->OnCancel(); } // tidyup delete psr; // Next! ++iter; } mSingleSplitResults.clear(); } // now handle the quad split results { std::deque<SQuadSplitResult*>::iterator iter = mQuadSplitResults.begin(); while(iter!=mQuadSplitResults.end()) { // finally pass SplitResults SQuadSplitResult *psr = (*iter); const int32_t faceIdx = psr->face(); if( m_patches[faceIdx] ) { m_patches[faceIdx]->ReceiveHeightmaps(psr); } else { psr->OnCancel(); } // tidyup delete psr; // Next! ++iter; } mQuadSplitResults.clear(); } }
void GeoSphere::Reset() { { std::deque<SSingleSplitResult*>::iterator iter = mSingleSplitResults.begin(); while(iter!=mSingleSplitResults.end()) { // finally pass SplitResults SSingleSplitResult *psr = (*iter); psr->OnCancel(); // tidyup delete psr; // Next! ++iter; } mSingleSplitResults.clear(); } { std::deque<SQuadSplitResult*>::iterator iter = mQuadSplitResults.begin(); while(iter!=mQuadSplitResults.end()) { // finally pass SplitResults SQuadSplitResult *psr = (*iter); psr->OnCancel(); // tidyup delete psr; // Next! ++iter; } mQuadSplitResults.clear(); } for (int p=0; p<NUM_PATCHES; p++) { // delete patches if (m_patches[p].Valid()) { m_patches[p].Reset(); } } m_initStage = eBuildFirstPatches; }
void SinglePatchJob::OnRun() // RUNS IN ANOTHER THREAD!! MUST BE THREAD SAFE! { BasePatchJob::OnRun(); const SSingleSplitRequest &srd = *mData; // fill out the data GenerateMesh(mData.get()); // add this patches data SSingleSplitResult *sr = new SSingleSplitResult(srd.patchID.GetPatchFaceIdx(), srd.depth); sr->addResult(srd.heights, srd.normals, srd.colors, srd.v0, srd.v1, srd.v2, srd.v3, srd.patchID.NextPatchID(srd.depth+1, 0)); // store the result mpResults = sr; }
void SinglePatchJob::OnRun() // RUNS IN ANOTHER THREAD!! MUST BE THREAD SAFE! { BasePatchJob::OnRun(); if(s_abort) return; const SSingleSplitRequest &srd = *mData; // fill out the data GenerateMesh(srd.heights, srd.normals, srd.colors, srd.borderHeights.get(), srd.borderVertexs.get(), srd.v0, srd.v1, srd.v2, srd.v3, srd.edgeLen, srd.fracStep, srd.pTerrain.Get()); // add this patches data SSingleSplitResult *sr = new SSingleSplitResult(srd.patchID.GetPatchFaceIdx(), srd.depth); sr->addResult(srd.heights, srd.normals, srd.colors, srd.v0, srd.v1, srd.v2, srd.v3, srd.patchID.NextPatchID(srd.depth+1, 0)); // store the result mpResults = sr; }