// --------------------------------------------------------------------- // Create an approximate mesh of the landscape. // void CRoamMeshDrawer::Tessellate(const float3& campos, int viewradius) { // Perform Tessellation #ifdef _OPENMP // hint: just helps a little with huge cpu usage in retessellation, still better than nothing // _____ // |0|_|_|.. // |_|_|_|.. // |_|_|8|.. // ..... // split the patches in 3x3 sized blocks. The tessellation itself can // extend into the neighbor patches (check Patch::Split). So we could // not multi-thread the whole loop w/o mutexes (in ::Split). // But instead we take a safety distance between the thread's working // area (which is 2 patches), so they don't conflict with each other. for (int idx = 0; idx < 9; ++idx) { #pragma omp parallel for for (int i = m_Patches.size() - 1; i >= 0; --i) { Patch* it = &m_Patches[i]; const int X = it->m_WorldX; const int Z = it->m_WorldY; const int subindex = (X % 3) + (Z % 3) * 3; if ((subindex == idx) && it->IsVisible()) { it->Tessellate(campos, viewradius); } } } #else for (std::vector<Patch>::iterator it = m_Patches.begin(); it != m_Patches.end(); ++it) { if (it->IsVisible()) it->Tessellate(campos, viewradius); } #endif }
// --------------------------------------------------------------------- // Create an approximate mesh of the landscape. // bool CRoamMeshDrawer::Tessellate(const float3& campos, int viewradius) { // Perform Tessellation // hint: threading just helps a little with huge cpu usage in retessellation, still better than nothing // _____ // |0|_|_|.. // |_|_|_|.. // |_|_|8|.. // ..... // split the patches in 3x3 sized blocks. The tessellation itself can // extend into the neighbor patches (check Patch::Split). So we could // not multi-thread the whole loop w/o mutexes (in ::Split). // But instead we take a safety distance between the thread's working // area (which is 2 patches), so they don't conflict with each other. bool forceTess = false; for (int idx = 0; idx < 9; ++idx) { for_mt(0, roamPatches.size(), [&](const int i){ Patch* it = &roamPatches[i]; const int X = it->m_WorldX; const int Z = it->m_WorldY; const int subindex = (X % 3) + (Z % 3) * 3; if ((subindex == idx) && it->IsVisible()) { if (!it->Tessellate(campos, viewradius)) forceTess = true; } }); if (forceTess) return true; } return false; }