test: add tests for voxel raycasting for block targeting
This commit is contained in:
1 parent
a37f5fa902
commit
5e81d6b1af
1 file changed
+57
@@ -0,0 +1,57 @@
|
|||||||
|
#include "testHarness.h"
|
||||||
|
#include "vf/Raycast.h"
|
||||||
|
|
||||||
|
using namespace vf;
|
||||||
|
|
||||||
|
VF_TEST(raycastHitsBlockAlongNegativeZ) {
|
||||||
|
World world;
|
||||||
|
world.setBlock(0, 0, 0, Block::Stone);
|
||||||
|
RaycastHit hit = raycastVoxels(world, {0.5f, 0.5f, 5.5f}, {0, 0, -1}, 20.0f);
|
||||||
|
CHECK(hit.hit);
|
||||||
|
CHECK(hit.block == Vec3i(0, 0, 0));
|
||||||
|
CHECK(hit.normal == Vec3i(0, 0, 1)); // entered the +z face
|
||||||
|
CHECK_NEAR(hit.distance, 4.5f, 1e-3f); // origin z=5.5 to the face at z=1
|
||||||
|
}
|
||||||
|
|
||||||
|
VF_TEST(raycastMissReturnsNoHit) {
|
||||||
|
World world;
|
||||||
|
world.setBlock(0, 0, 0, Block::Stone);
|
||||||
|
RaycastHit hit = raycastVoxels(world, {0.5f, 2.5f, 0.5f}, {0, 1, 0}, 20.0f);
|
||||||
|
CHECK(!hit.hit);
|
||||||
|
}
|
||||||
|
|
||||||
|
VF_TEST(raycastNormalGivesPlacementCell) {
|
||||||
|
World world;
|
||||||
|
world.setBlock(5, 0, 5, Block::Stone);
|
||||||
|
RaycastHit hit = raycastVoxels(world, {5.5f, 0.5f, 10.0f}, {0, 0, -1}, 20.0f);
|
||||||
|
CHECK(hit.hit);
|
||||||
|
CHECK(hit.block == Vec3i(5, 0, 5));
|
||||||
|
Vec3i placement = hit.block + hit.normal;
|
||||||
|
CHECK(placement == Vec3i(5, 0, 6));
|
||||||
|
CHECK(!world.solidAt(placement.x, placement.y, placement.z));
|
||||||
|
}
|
||||||
|
|
||||||
|
VF_TEST(raycastFromInsideSolidHitsImmediately) {
|
||||||
|
World world;
|
||||||
|
world.setBlock(3, 3, 3, Block::Stone);
|
||||||
|
RaycastHit hit = raycastVoxels(world, {3.5f, 3.5f, 3.5f}, {1, 0, 0}, 20.0f);
|
||||||
|
CHECK(hit.hit);
|
||||||
|
CHECK(hit.block == Vec3i(3, 3, 3));
|
||||||
|
CHECK_NEAR(hit.distance, 0.0f, 1e-6f);
|
||||||
|
}
|
||||||
|
|
||||||
|
VF_TEST(raycastRespectsMaxDistance) {
|
||||||
|
World world;
|
||||||
|
world.setBlock(0, 0, 0, Block::Stone);
|
||||||
|
RaycastHit hit = raycastVoxels(world, {0.5f, 0.5f, 20.0f}, {0, 0, -1}, 5.0f);
|
||||||
|
CHECK(!hit.hit);
|
||||||
|
}
|
||||||
|
|
||||||
|
VF_TEST(raycastDiagonalHitsExpectedFace) {
|
||||||
|
World world;
|
||||||
|
world.setBlock(4, 0, 0, Block::Stone);
|
||||||
|
RaycastHit hit = raycastVoxels(world, {0.5f, 0.5f, 0.5f}, {1, 0, 0}, 20.0f);
|
||||||
|
CHECK(hit.hit);
|
||||||
|
CHECK(hit.block == Vec3i(4, 0, 0));
|
||||||
|
CHECK(hit.normal == Vec3i(-1, 0, 0));
|
||||||
|
}
|
||||||
Reference in new issue
Block a user