TEST(CappedCylinder, findRayIntersection) { CappedCylinder cylinder(VECTOR_DOWN, VECTOR_UP, 1.0, 2.0); int intersect_count; Vector3 p1, p2; intersect_count = cylinder.findRayIntersection(InfiniteRay(Vector3(1.5, 0.0, 0.0), Vector3(0.0, 0.0, 1.0)), &p1, &p2); EXPECT_EQ(0, intersect_count); intersect_count = cylinder.findRayIntersection(InfiniteRay(Vector3(1.0, 0.0, 0.0), Vector3(0.0, 0.0, 1.0)), &p1, &p2); EXPECT_EQ(1, intersect_count); EXPECT_VECTOR3_COORDS(p1, 1.0, 0.0, 0.0); intersect_count = cylinder.findRayIntersection(InfiniteRay(Vector3(0.5, 0.0, 0.0), Vector3(0.0, 0.0, 1.0)), &p1, &p2); EXPECT_EQ(2, intersect_count); EXPECT_VECTOR3_COORDS(p1, 0.5, 0.0, -cos(asin(0.5))); EXPECT_VECTOR3_COORDS(p2, 0.5, 0.0, cos(asin(0.5))); intersect_count = cylinder.findRayIntersection(InfiniteRay(Vector3(0.5, -2.1, 0.0), Vector3(0.0, 0.0, 1.0)), &p1, &p2); EXPECT_EQ(0, intersect_count); intersect_count = cylinder.findRayIntersection(InfiniteRay(Vector3(0.5, 2.1, 0.0), Vector3(0.0, 0.0, 1.0)), &p1, &p2); EXPECT_EQ(0, intersect_count); // diagonal cases (through a cap) intersect_count = cylinder.findRayIntersection(InfiniteRay(Vector3(-2.0, -1.0, 0.0), Vector3(1.0, 1.0, 0.0)), &p1, &p2); EXPECT_EQ(1, intersect_count); EXPECT_VECTOR3_COORDS(p1, -1.0, 0.0, 0.0); intersect_count = cylinder.findRayIntersection(InfiniteRay(Vector3(-2.0, 3.0, 0.0), Vector3(1.0, -1.0, 0.0)), &p1, &p2); EXPECT_EQ(1, intersect_count); EXPECT_VECTOR3_COORDS(p1, 1.0, 0.0, 0.0); }
TEST_F(FluidMediumManager_Test, getTraversedMedia) { FluidMediumManager manager(renderer); int traversed; FluidMediumSegment segments[10]; class FakeMedium : public FluidMediumInterface { public: void setCut(double ymin, double ymax) { this->ymin = ymin; this->ymax = ymax; } virtual bool checkInfluence(SpaceSegment &segment) const override { return segment.intersectYInterval(this->ymin, this->ymax); } private: double ymin = -2.0; double ymax = -1.0; }; SpaceSegment ray(Vector3(0.0, 0.0, 0.0), Vector3(8.0, 10.0, -4.0)); // Empty manager traversed = manager.getTraversedMedia(segments, ray, 10); ASSERT_EQ(0, traversed); // Testing with 1 medium outside the range FakeMedium m1; manager.registerMedium(&m1); traversed = manager.getTraversedMedia(segments, ray, 10); ASSERT_EQ(0, traversed); // Setting the medium in range m1.setCut(1.0, 2.0); traversed = manager.getTraversedMedia(segments, ray, 10); ASSERT_EQ(1, traversed); EXPECT_EQ((FluidMediumInterface *)&m1, segments[0].medium); EXPECT_VECTOR3_COORDS(segments[0].segment.getStart(), 0.8, 1.0, -0.4); EXPECT_VECTOR3_COORDS(segments[0].segment.getEnd(), 1.6, 2.0, -0.8); // Testing with 2 media FakeMedium m2; m2.setCut(4.0, 12.0); manager.registerMedium(&m2); traversed = manager.getTraversedMedia(segments, ray, 10); ASSERT_EQ(2, traversed); EXPECT_EQ((FluidMediumInterface *)&m1, segments[0].medium); EXPECT_VECTOR3_COORDS(segments[0].segment.getStart(), 0.8, 1.0, -0.4); EXPECT_VECTOR3_COORDS(segments[0].segment.getEnd(), 1.6, 2.0, -0.8); EXPECT_EQ((FluidMediumInterface *)&m2, segments[1].medium); EXPECT_VECTOR3_COORDS(segments[1].segment.getStart(), 3.2, 4.0, -1.6); EXPECT_VECTOR3_COORDS(segments[1].segment.getEnd(), 8.0, 10.0, -4.0); // Testing with overlapping media FakeMedium m3; m3.setCut(3.0, 4.5); manager.registerMedium(&m3); traversed = manager.getTraversedMedia(segments, ray, 10); ASSERT_EQ(3, traversed); EXPECT_EQ((FluidMediumInterface *)&m1, segments[0].medium); EXPECT_VECTOR3_COORDS(segments[0].segment.getStart(), 0.8, 1.0, -0.4); EXPECT_VECTOR3_COORDS(segments[0].segment.getEnd(), 1.6, 2.0, -0.8); EXPECT_EQ((FluidMediumInterface *)&m2, segments[1].medium); EXPECT_VECTOR3_COORDS(segments[1].segment.getStart(), 3.2, 4.0, -1.6); EXPECT_VECTOR3_COORDS(segments[1].segment.getEnd(), 8.0, 10.0, -4.0); EXPECT_EQ((FluidMediumInterface *)&m3, segments[2].medium); EXPECT_VECTOR3_COORDS(segments[2].segment.getStart(), 2.4, 3.0, -1.2); EXPECT_VECTOR3_COORDS(segments[2].segment.getEnd(), 3.6, 4.5, -1.8); // Testing the segment count limit traversed = manager.getTraversedMedia(segments, ray, 2); ASSERT_EQ(2, traversed); EXPECT_EQ((FluidMediumInterface *)&m1, segments[0].medium); EXPECT_EQ((FluidMediumInterface *)&m2, segments[1].medium); // Testing after clear manager.clearMedia(); traversed = manager.getTraversedMedia(segments, ray, 10); ASSERT_EQ(0, traversed); }
TEST(Vector3, getNormal5) { EXPECT_VECTOR3_COORDS(VECTOR_ZERO.getNormal5(VECTOR_SOUTH, VECTOR_NORTH, VECTOR_EAST, VECTOR_WEST), 0.0, 1.0, 0.0); }
TEST(Vector3, midPointTo) { Vector3 v1(1.0, 2.0, 8.0); Vector3 v2(4.0, 2.5, -1.0); Vector3 vm = v1.midPointTo(v2); EXPECT_VECTOR3_COORDS(vm, 2.5, 2.25, 3.5); }
TEST(Vector3, getNormal3) { EXPECT_VECTOR3_COORDS(VECTOR_ZERO.getNormal3(VECTOR_SOUTH, VECTOR_EAST), 0.0, 1.0, 0.0); }