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);
}
示例#3
0
TEST(Vector3, getNormal5) {
    EXPECT_VECTOR3_COORDS(VECTOR_ZERO.getNormal5(VECTOR_SOUTH, VECTOR_NORTH, VECTOR_EAST, VECTOR_WEST), 0.0, 1.0, 0.0);
}
示例#4
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);
}
示例#5
0
TEST(Vector3, getNormal3) {
    EXPECT_VECTOR3_COORDS(VECTOR_ZERO.getNormal3(VECTOR_SOUTH, VECTOR_EAST), 0.0, 1.0, 0.0);
}