mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-03-28 08:37:12 +00:00
Use callback to iterate over chunks
This commit is contained in:
parent
db5638bf6d
commit
b477775e16
@ -50,8 +50,8 @@ namespace DetourNavigator
|
|||||||
ChunkyTriMesh& operator=(const ChunkyTriMesh&) = delete;
|
ChunkyTriMesh& operator=(const ChunkyTriMesh&) = delete;
|
||||||
|
|
||||||
/// Returns the chunk indices which overlap the input rectable.
|
/// Returns the chunk indices which overlap the input rectable.
|
||||||
template <class OutputIterator>
|
template <class Function>
|
||||||
void getChunksOverlappingRect(const Rect& rect, OutputIterator out) const
|
void forEachChunksOverlappingRect(const Rect& rect, Function&& function) const
|
||||||
{
|
{
|
||||||
// Traverse tree
|
// Traverse tree
|
||||||
for (std::size_t i = 0; i < mNodes.size(); )
|
for (std::size_t i = 0; i < mNodes.size(); )
|
||||||
@ -61,7 +61,7 @@ namespace DetourNavigator
|
|||||||
const bool isLeafNode = node->mOffset >= 0;
|
const bool isLeafNode = node->mOffset >= 0;
|
||||||
|
|
||||||
if (isLeafNode && overlap)
|
if (isLeafNode && overlap)
|
||||||
*out++ = i;
|
function(i);
|
||||||
|
|
||||||
if (overlap || isLeafNode)
|
if (overlap || isLeafNode)
|
||||||
i++;
|
i++;
|
||||||
|
@ -149,13 +149,10 @@ namespace
|
|||||||
std::vector<unsigned char> areas(chunkyMesh.getMaxTrisPerChunk(), AreaType_null);
|
std::vector<unsigned char> areas(chunkyMesh.getMaxTrisPerChunk(), AreaType_null);
|
||||||
const osg::Vec2f tileBoundsMin(config.bmin[0], config.bmin[2]);
|
const osg::Vec2f tileBoundsMin(config.bmin[0], config.bmin[2]);
|
||||||
const osg::Vec2f tileBoundsMax(config.bmax[0], config.bmax[2]);
|
const osg::Vec2f tileBoundsMax(config.bmax[0], config.bmax[2]);
|
||||||
std::vector<std::size_t> cids;
|
bool result = false;
|
||||||
chunkyMesh.getChunksOverlappingRect(Rect {tileBoundsMin, tileBoundsMax}, std::back_inserter(cids));
|
|
||||||
|
|
||||||
if (cids.empty())
|
chunkyMesh.forEachChunksOverlappingRect(Rect {tileBoundsMin, tileBoundsMax},
|
||||||
return false;
|
[&] (const std::size_t cid)
|
||||||
|
|
||||||
for (const auto cid : cids)
|
|
||||||
{
|
{
|
||||||
const auto chunk = chunkyMesh.getChunk(cid);
|
const auto chunk = chunkyMesh.getChunk(cid);
|
||||||
|
|
||||||
@ -202,9 +199,11 @@ namespace
|
|||||||
|
|
||||||
if (!trianglesRasterized)
|
if (!trianglesRasterized)
|
||||||
throw NavigatorException("Failed to create rasterize triangles from recast mesh for navmesh");
|
throw NavigatorException("Failed to create rasterize triangles from recast mesh for navmesh");
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
result = true;
|
||||||
|
});
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void rasterizeWaterTriangles(rcContext& context, const osg::Vec3f& agentHalfExtents, const RecastMesh& recastMesh,
|
void rasterizeWaterTriangles(rcContext& context, const osg::Vec3f& agentHalfExtents, const RecastMesh& recastMesh,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user