summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGleb Mazovetskiy <glex.spb@gmail.com>2021-02-28 15:39:36 +0000
committerGleb Mazovetskiy <glex.spb@gmail.com>2021-02-28 21:33:27 +0000
commite7e28bebf8eb639702ea4315b3aeb730a7356e9f (patch)
treea98465d398ecb338fa7f987781615e5833bd1bc7 /src
parent782f14caa15bcdd803655ff743647075ff7ef231 (diff)
downloadbullet3-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.cpp29
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);
}
}
}