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 QuadPatchJob::OnRun() // RUNS IN ANOTHER THREAD!! MUST BE THREAD SAFE! { BasePatchJob::OnRun(); const SQuadSplitRequest &srd = *mData; GenerateBorderedData(mData.get()); const vector3d v01 = (srd.v0+srd.v1).Normalized(); const vector3d v12 = (srd.v1+srd.v2).Normalized(); const vector3d v23 = (srd.v2+srd.v3).Normalized(); const vector3d v30 = (srd.v3+srd.v0).Normalized(); const vector3d cn = (srd.centroid).Normalized(); const vector3d vecs[4][4] = { {srd.v0, v01, cn, v30}, {v01, srd.v1, v12, cn}, {cn, v12, srd.v2, v23}, {v30, cn, v23, srd.v3} }; const int borderedEdgeLen = (srd.edgeLen*2)+(BORDER_SIZE*2)-1; const int offxy[4][2] = { {0,0}, {srd.edgeLen-1,0}, {srd.edgeLen-1,srd.edgeLen-1}, {0,srd.edgeLen-1} }; SQuadSplitResult *sr = new SQuadSplitResult(srd.patchID.GetPatchFaceIdx(), srd.depth); for (int i=0; i<4; i++) { // fill out the data GenerateSubPatchData(srd.heights[i], srd.normals[i], srd.colors[i], srd.borderHeights.get(), srd.borderVertexs.get(), vecs[i][0], vecs[i][1], vecs[i][2], vecs[i][3], srd.edgeLen, offxy[i][0], offxy[i][1], borderedEdgeLen, srd.fracStep, srd.pTerrain.Get()); // add this patches data sr->addResult(i, srd.heights[i], srd.normals[i], srd.colors[i], vecs[i][0], vecs[i][1], vecs[i][2], vecs[i][3], srd.patchID.NextPatchID(srd.depth+1, i)); } mpResults = sr; }
void QuadPatchJob::OnRun() // RUNS IN ANOTHER THREAD!! MUST BE THREAD SAFE! { BasePatchJob::OnRun(); if(s_abort) return; const SQuadSplitRequest &srd = *mData; const vector3d v01 = (srd.v0+srd.v1).Normalized(); const vector3d v12 = (srd.v1+srd.v2).Normalized(); const vector3d v23 = (srd.v2+srd.v3).Normalized(); const vector3d v30 = (srd.v3+srd.v0).Normalized(); const vector3d cn = (srd.centroid).Normalized(); // const vector3d vecs[4][4] = { {srd.v0, v01, cn, v30}, {v01, srd.v1, v12, cn}, {cn, v12, srd.v2, v23}, {v30, cn, v23, srd.v3} }; SQuadSplitResult *sr = new SQuadSplitResult(srd.patchID.GetPatchFaceIdx(), srd.depth); for (int i=0; i<4; i++) { if(s_abort) { delete sr; return; } // fill out the data GenerateMesh(srd.heights[i], srd.normals[i], srd.colors[i], srd.borderHeights[i].get(), srd.borderVertexs[i].get(), vecs[i][0], vecs[i][1], vecs[i][2], vecs[i][3], srd.edgeLen, srd.fracStep, srd.pTerrain.Get()); // add this patches data sr->addResult(i, srd.heights[i], srd.normals[i], srd.colors[i], vecs[i][0], vecs[i][1], vecs[i][2], vecs[i][3], srd.patchID.NextPatchID(srd.depth+1, i)); } mpResults = sr; }