Skip to content

Commit

Permalink
heightfield: Add a test for processAllTriangles up-axis filtering
Browse files Browse the repository at this point in the history
  • Loading branch information
glebm committed Mar 3, 2021
1 parent 8f5a00d commit 40a9584
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 0 deletions.
3 changes: 3 additions & 0 deletions test/collision/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,13 @@ ENDIF()
../../src/BulletCollision/CollisionShapes/btSphereShape.cpp
../../src/BulletCollision/CollisionShapes/btMultiSphereShape.cpp
../../src/BulletCollision/CollisionShapes/btPolyhedralConvexShape.cpp
../../src/BulletCollision/CollisionShapes/btConcaveShape.cpp
../../src/BulletCollision/CollisionShapes/btConvexShape.cpp
../../src/BulletCollision/CollisionShapes/btConvexInternalShape.cpp
../../src/BulletCollision/CollisionShapes/btCollisionShape.cpp
../../src/BulletCollision/CollisionShapes/btConvexPolyhedron.cpp
../../src/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.cpp
../../src/BulletCollision/CollisionShapes/btTriangleCallback.cpp
)

ADD_TEST(Test_Collision_PASS Test_Collision)
Expand Down
47 changes: 47 additions & 0 deletions test/collision/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,16 +20,21 @@ subject to the following restrictions:
///Todo: the test needs proper coverage and using a convex hull point cloud
///Also the GJK, EPA and MPR should be improved, both quality and performance

#include <vector>

#include <gtest/gtest.h>

#include "SphereSphereCollision.h"
#include "BulletCollision/CollisionShapes/btHeightfieldTerrainShape.h"
#include "BulletCollision/CollisionShapes/btSphereShape.h"
#include "BulletCollision/CollisionShapes/btMultiSphereShape.h"

#include "BulletCollision/NarrowPhaseCollision/btComputeGjkEpaPenetration.h"
#include "BulletCollision/NarrowPhaseCollision/btGjkEpa3.h"
#include "BulletCollision/NarrowPhaseCollision/btMprPenetration.h"

namespace {

btVector3 MyBulletShapeSupportFunc(const void* shapeAptr, const btVector3& dir, bool includeMargin)
{
btConvexShape* shape = (btConvexShape*)shapeAptr;
Expand Down Expand Up @@ -249,6 +254,48 @@ TEST(BulletCollisionTest, AnalyticSphereSphereDistance)
testSphereSphereDistance(SSTM_ANALYTIC, 0.00001);
}

class TriangleCollector : public btTriangleCallback
{
public:
std::vector<btVector3> *triangles;

explicit TriangleCollector(std::vector<btVector3>* triangles) : triangles(triangles) {}
virtual ~TriangleCollector() {}

virtual void processTriangle(btVector3* triangle, int partId, int triangleIndex)
{
triangles->push_back(*triangle);
}
};

TEST(BulletCollisionTest, Heightfield_ProcessAllTriangles_FiltersByUpAxis)
{
// A flat 2x2 heightfield.
const btScalar heightFieldData[] = {
10.0, 10.0,
10.0, 10.0,
};
btHeightfieldTerrainShape shape(
/*heightStickWidth=*/2, /*heightStickLength=*/2,
&heightFieldData[0], /*heightScale=*/1,
/*minHeight=*/-10.0, /*maxHeight=*/10.0,
/*upAxis=*/2, PHY_FLOAT, /*flipQuadEdges=*/false);

std::vector<btVector3> triangles;
TriangleCollector collector(&triangles);

// AABB overlaps with the heightfield on upAxis.
shape.processAllTriangles(&collector, btVector3(0, 0, 0), btVector3(20, 20, 20));
EXPECT_EQ(triangles.size(), 2);

// AABB does not overlap with the heightfield on upAxis.
triangles.clear();
shape.processAllTriangles(&collector, btVector3(0, 0, 0), btVector3(20, 20, 5));
EXPECT_EQ(triangles.size(), 0);
}

} // namespace

int main(int argc, char** argv)
{
#if _MSC_VER
Expand Down

0 comments on commit 40a9584

Please sign in to comment.