diff options
author | Gleb Mazovetskiy <glex.spb@gmail.com> | 2021-02-28 15:39:36 +0000 |
---|---|---|
committer | Gleb Mazovetskiy <glex.spb@gmail.com> | 2021-02-28 21:33:27 +0000 |
commit | e7e28bebf8eb639702ea4315b3aeb730a7356e9f (patch) | |
tree | a98465d398ecb338fa7f987781615e5833bd1bc7 /src | |
parent | 782f14caa15bcdd803655ff743647075ff7ef231 (diff) | |
download | bullet3-e7e28bebf8eb639702ea4315b3aeb730a7356e9f.tar.gz |
heightfield processAllTriangles: Skip triangle processing if the triangle is out-of-AABB
Skips triangle processing if the triangle is out-of-AABB on the up axis.
This massively improves OpenMW performance on my test machine.
Co-authored-by: Andrew Shulaev <ash.drone@gmail.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.cpp | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/src/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.cpp b/src/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.cpp index 8aafc0505..3acfa79b7 100644 --- a/src/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.cpp +++ b/src/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.cpp @@ -352,7 +352,13 @@ void btHeightfieldTerrainShape::processAllTriangles(btTriangleCallback* callback getVertex(x, j, vertices[indices[0]]); getVertex(x, j + 1, vertices[indices[1]]); getVertex(x + 1, j + 1, vertices[indices[2]]); - callback->processTriangle(vertices, 2 * x, j); + + // Skip triangle processing if the triangle is out-of-AABB. + btScalar minUp = btMin(vertices[0][m_upAxis], btMin(vertices[1][m_upAxis], vertices[2][m_upAxis])); + btScalar maxUp = btMax(vertices[0][m_upAxis], btMax(vertices[1][m_upAxis], vertices[2][m_upAxis])); + + if (!(minUp > aabbMax[m_upAxis] || maxUp < aabbMin[m_upAxis])) + callback->processTriangle(vertices, 2 * x, j); // already set: getVertex(x, j, vertices[indices[0]]) @@ -360,15 +366,24 @@ void btHeightfieldTerrainShape::processAllTriangles(btTriangleCallback* callback vertices[indices[1]] = vertices[indices[2]]; getVertex(x + 1, j, vertices[indices[2]]); - - callback->processTriangle(vertices, 2 * x+1, j); + minUp = btMin(minUp, vertices[indices[2]][m_upAxis]); + maxUp = btMax(maxUp, vertices[indices[2]][m_upAxis]); + + if (!(minUp > aabbMax[m_upAxis] || maxUp < aabbMin[m_upAxis])) + callback->processTriangle(vertices, 2 * x+1, j); } else { getVertex(x, j, vertices[indices[0]]); getVertex(x, j + 1, vertices[indices[1]]); getVertex(x + 1, j, vertices[indices[2]]); - callback->processTriangle(vertices, 2 * x, j); + + // Skip triangle processing if the triangle is out-of-AABB. + btScalar minUp = btMin(vertices[0][m_upAxis], btMin(vertices[1][m_upAxis], vertices[2][m_upAxis])); + btScalar maxUp = btMax(vertices[0][m_upAxis], btMax(vertices[1][m_upAxis], vertices[2][m_upAxis])); + + if (!(minUp > aabbMax[m_upAxis] || maxUp < aabbMin[m_upAxis])) + callback->processTriangle(vertices, 2 * x, j); // already set: getVertex(x, j + 1, vertices[indices[1]]); @@ -376,7 +391,11 @@ void btHeightfieldTerrainShape::processAllTriangles(btTriangleCallback* callback vertices[indices[0]] = vertices[indices[2]]; getVertex(x + 1, j + 1, vertices[indices[2]]); - callback->processTriangle(vertices, 2 * x+1, j); + minUp = btMin(minUp, vertices[indices[2]][m_upAxis]); + maxUp = btMax(maxUp, vertices[indices[2]][m_upAxis]); + + if (!(minUp > aabbMax[m_upAxis] || maxUp < aabbMin[m_upAxis])) + callback->processTriangle(vertices, 2 * x+1, j); } } } |