| Index: cc/quads/draw_polygon_unittest.cc
|
| diff --git a/cc/quads/draw_polygon_unittest.cc b/cc/quads/draw_polygon_unittest.cc
|
| index 884777fc2244e8cc3a1df4e308347100d90f4c08..40090ec765910296f43d9834e955e8c31f2302aa 100644
|
| --- a/cc/quads/draw_polygon_unittest.cc
|
| +++ b/cc/quads/draw_polygon_unittest.cc
|
| @@ -12,6 +12,7 @@
|
| #include <limits>
|
| #include <vector>
|
|
|
| +#include "base/memory/ptr_util.h"
|
| #include "cc/output/bsp_compare_result.h"
|
| #include "cc/quads/draw_polygon.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
| @@ -30,6 +31,10 @@ namespace {
|
| #define CREATE_NEW_DRAW_POLYGON(name, points_vector, normal, polygon_id) \
|
| DrawPolygon name(NULL, points_vector, normal, polygon_id)
|
|
|
| +#define CREATE_NEW_DRAW_POLYGON_PTR(name, points_vector, normal, polygon_id) \
|
| + std::unique_ptr<DrawPolygon> name(base::MakeUnique<DrawPolygon>( \
|
| + nullptr, points_vector, normal, polygon_id))
|
| +
|
| #define CREATE_TEST_DRAW_FORWARD_POLYGON(name, points_vector, id) \
|
| DrawPolygon name(NULL, points_vector, gfx::Vector3dF(0, 0, 1.0f), id); \
|
| name.RecomputeNormalForTesting()
|
| @@ -38,7 +43,8 @@ namespace {
|
| DrawPolygon name(NULL, points_vector, gfx::Vector3dF(0, 0, -1.0f), id); \
|
| name.RecomputeNormalForTesting()
|
|
|
| -#define EXPECT_FLOAT_WITHIN_EPSILON_OF(a, b) \
|
| +#define EXPECT_FLOAT_WITHIN_EPSILON_OF(a, b) \
|
| + LOG(WARNING) << "a=" << a << " b= " << b << " diff=" << std::abs(a - b); \
|
| EXPECT_TRUE(std::abs(a - b) < std::numeric_limits<float>::epsilon());
|
|
|
| #define EXPECT_POINT_EQ(point_a, point_b) \
|
| @@ -59,6 +65,36 @@ static void ValidatePoints(const DrawPolygon& polygon,
|
| }
|
| }
|
|
|
| +static void ValidatePointsWithinDeltaOf(const DrawPolygon& polygon,
|
| + const std::vector<gfx::Point3F>& points,
|
| + float delta) {
|
| + EXPECT_EQ(polygon.points().size(), points.size());
|
| + for (size_t i = 0; i < points.size(); i++) {
|
| + EXPECT_LE((polygon.points()[i] - points[i]).Length(), delta);
|
| + }
|
| +}
|
| +
|
| +std::unique_ptr<DrawPolygon> ClonePolygon(const DrawPolygon& polygon) {
|
| + return base::MakeUnique<DrawPolygon>(polygon.original_ref(), polygon.points(),
|
| + polygon.normal(), polygon.order_index());
|
| +}
|
| +
|
| +// Classifies polygon a with respect to b
|
| +BspCompareResult SideCompare(const DrawPolygon& a, const DrawPolygon& b) {
|
| + std::unique_ptr<DrawPolygon> front;
|
| + std::unique_ptr<DrawPolygon> back;
|
| + bool is_coplanar;
|
| + b.SplitPolygon(ClonePolygon(a), &front, &back, &is_coplanar);
|
| + if (is_coplanar) {
|
| + return (front != nullptr) ? BSP_COPLANAR_FRONT : BSP_COPLANAR_BACK;
|
| + }
|
| + if (front == nullptr)
|
| + return BSP_BACK;
|
| + if (back == nullptr)
|
| + return BSP_FRONT;
|
| + return BSP_SPLIT;
|
| +}
|
| +
|
| // A simple square in a plane.
|
| TEST(DrawPolygonConstructionTest, NormalNormal) {
|
| gfx::Transform Identity;
|
| @@ -208,7 +244,7 @@ TEST(DrawPolygonSplitTest, NearlyTouchingOrder) {
|
| CREATE_NEW_DRAW_POLYGON(polygon_a, vertices_a, normal, 0);
|
| CREATE_NEW_DRAW_POLYGON(polygon_b, vertices_b, normal, 1);
|
|
|
| - EXPECT_EQ(BSP_BACK, DrawPolygon::SideCompare(polygon_b, polygon_a));
|
| + EXPECT_EQ(BSP_BACK, SideCompare(polygon_b, polygon_a));
|
| }
|
|
|
| // Two quads are definitely not touching and so no split should occur.
|
| @@ -234,7 +270,7 @@ TEST(DrawPolygonSplitTest, NotClearlyInFront) {
|
| CREATE_NEW_DRAW_POLYGON(polygon_a, vertices_a, normal_a, 0);
|
| CREATE_NEW_DRAW_POLYGON(polygon_b, vertices_b, normal_b, 1);
|
|
|
| - EXPECT_EQ(BSP_FRONT, DrawPolygon::SideCompare(polygon_b, polygon_a));
|
| + EXPECT_EQ(BSP_FRONT, SideCompare(polygon_b, polygon_a));
|
| }
|
|
|
| // Two quads are definitely not touching and so no split should occur.
|
| @@ -250,15 +286,16 @@ TEST(DrawPolygonSplitTest, NotTouchingNoSplit) {
|
| vertices_b.push_back(gfx::Point3F(5.0f, 0.0f, 15.0f));
|
| vertices_b.push_back(gfx::Point3F(5.0f, 0.0f, 5.0f));
|
|
|
| - CREATE_NEW_DRAW_POLYGON(
|
| - polygon_a, vertices_a, gfx::Vector3dF(0.0f, 0.0f, 1.0f), 0);
|
| - CREATE_NEW_DRAW_POLYGON(
|
| - polygon_b, vertices_b, gfx::Vector3dF(-1.0f, 0.0f, 0.0f), 1);
|
| + CREATE_NEW_DRAW_POLYGON(polygon_a, vertices_a,
|
| + gfx::Vector3dF(0.0f, 0.0f, 1.0f), 0);
|
| + CREATE_NEW_DRAW_POLYGON(polygon_b, vertices_b,
|
| + gfx::Vector3dF(-1.0f, 0.0f, 0.0f), 1);
|
|
|
| - EXPECT_EQ(BSP_FRONT, DrawPolygon::SideCompare(polygon_b, polygon_a));
|
| + EXPECT_EQ(BSP_FRONT, SideCompare(polygon_b, polygon_a));
|
| }
|
|
|
| -// One quad is resting against another, but doesn't cross its plane so no split
|
| +// One quad is resting against another, but doesn't cross its plane so no
|
| +// split
|
| // should occur.
|
| TEST(DrawPolygonSplitTest, BarelyTouchingNoSplit) {
|
| std::vector<gfx::Point3F> vertices_a;
|
| @@ -272,12 +309,12 @@ TEST(DrawPolygonSplitTest, BarelyTouchingNoSplit) {
|
| vertices_b.push_back(gfx::Point3F(5.0f, 0.0f, -10.0f));
|
| vertices_b.push_back(gfx::Point3F(5.0f, 0.0f, 0.0f));
|
|
|
| - CREATE_NEW_DRAW_POLYGON(
|
| - polygon_a, vertices_a, gfx::Vector3dF(0.0f, 0.0f, 1.0f), 0);
|
| - CREATE_NEW_DRAW_POLYGON(
|
| - polygon_b, vertices_b, gfx::Vector3dF(-1.0f, 0.0f, 0.0f), 1);
|
| + CREATE_NEW_DRAW_POLYGON(polygon_a, vertices_a,
|
| + gfx::Vector3dF(0.0f, 0.0f, 1.0f), 0);
|
| + CREATE_NEW_DRAW_POLYGON(polygon_b, vertices_b,
|
| + gfx::Vector3dF(-1.0f, 0.0f, 0.0f), 1);
|
|
|
| - EXPECT_EQ(BSP_BACK, DrawPolygon::SideCompare(polygon_b, polygon_a));
|
| + EXPECT_EQ(BSP_BACK, SideCompare(polygon_b, polygon_a));
|
| }
|
|
|
| // One quad intersects another and becomes two pieces.
|
| @@ -293,18 +330,20 @@ TEST(DrawPolygonSplitTest, BasicSplit) {
|
| vertices_b.push_back(gfx::Point3F(5.0f, 0.0f, 5.0f));
|
| vertices_b.push_back(gfx::Point3F(5.0f, 10.0f, 5.0f));
|
|
|
| - CREATE_NEW_DRAW_POLYGON(
|
| - polygon_a, vertices_a, gfx::Vector3dF(0.0f, 0.0f, 1.0f), 0);
|
| - CREATE_NEW_DRAW_POLYGON(
|
| - polygon_b, vertices_b, gfx::Vector3dF(-1.0f, 0.0f, 0.0f), 1);
|
| -
|
| - EXPECT_EQ(BSP_SPLIT, DrawPolygon::SideCompare(polygon_b, polygon_a));
|
| + CREATE_NEW_DRAW_POLYGON_PTR(polygon_a, vertices_a,
|
| + gfx::Vector3dF(0.0f, 0.0f, 1.0f), 0);
|
| + CREATE_NEW_DRAW_POLYGON_PTR(polygon_b, vertices_b,
|
| + gfx::Vector3dF(-1.0f, 0.0f, 0.0f), 1);
|
|
|
| std::unique_ptr<DrawPolygon> front_polygon;
|
| std::unique_ptr<DrawPolygon> back_polygon;
|
| - polygon_b.Split(polygon_a, &front_polygon, &back_polygon);
|
| - EXPECT_EQ(BSP_FRONT, DrawPolygon::SideCompare(*front_polygon, polygon_a));
|
| - EXPECT_EQ(BSP_BACK, DrawPolygon::SideCompare(*back_polygon, polygon_a));
|
| + bool is_coplanar;
|
| +
|
| + polygon_a->SplitPolygon(std::move(polygon_b), &front_polygon, &back_polygon,
|
| + &is_coplanar);
|
| + EXPECT_FALSE(is_coplanar);
|
| + EXPECT_TRUE(front_polygon != nullptr);
|
| + EXPECT_TRUE(back_polygon != nullptr);
|
|
|
| std::vector<gfx::Point3F> test_points_a;
|
| test_points_a.push_back(gfx::Point3F(5.0f, 0.0f, 0.0f));
|
| @@ -337,21 +376,20 @@ TEST(DrawPolygonSplitTest, AngledSplit) {
|
| vertices_b.push_back(gfx::Point3F(-1.0f, -5.0f, -2.0f));
|
| vertices_b.push_back(gfx::Point3F(-1.0f, 5.0f, -2.0f));
|
|
|
| - CREATE_NEW_DRAW_POLYGON(
|
| - polygon_a, vertices_a, gfx::Vector3dF(0.0f, 1.0f, 0.0f), 0);
|
| - CREATE_NEW_DRAW_POLYGON(
|
| - polygon_b, vertices_b, gfx::Vector3dF(0.707107f, 0.0f, -0.707107f), 1);
|
| -
|
| - EXPECT_EQ(BSP_SPLIT, DrawPolygon::SideCompare(polygon_a, polygon_b));
|
| + CREATE_NEW_DRAW_POLYGON_PTR(polygon_a, vertices_a,
|
| + gfx::Vector3dF(0.0f, 1.0f, 0.0f), 0);
|
| + CREATE_NEW_DRAW_POLYGON_PTR(polygon_b, vertices_b,
|
| + gfx::Vector3dF(0.707107f, 0.0f, -0.707107f), 1);
|
|
|
| std::unique_ptr<DrawPolygon> front_polygon;
|
| std::unique_ptr<DrawPolygon> back_polygon;
|
| - polygon_a.Split(polygon_b, &front_polygon, &back_polygon);
|
| - EXPECT_EQ(BSP_FRONT, DrawPolygon::SideCompare(*front_polygon, polygon_b));
|
| - EXPECT_EQ(BSP_BACK, DrawPolygon::SideCompare(*back_polygon, polygon_b));
|
| + bool is_coplanar;
|
|
|
| - EXPECT_EQ(3u, front_polygon->points().size());
|
| - EXPECT_EQ(5u, back_polygon->points().size());
|
| + polygon_b->SplitPolygon(std::move(polygon_a), &front_polygon, &back_polygon,
|
| + &is_coplanar);
|
| + EXPECT_FALSE(is_coplanar);
|
| + EXPECT_TRUE(front_polygon != nullptr);
|
| + EXPECT_TRUE(back_polygon != nullptr);
|
|
|
| std::vector<gfx::Point3F> test_points_a;
|
| test_points_a.push_back(gfx::Point3F(10.0f, 0.0f, 9.0f));
|
| @@ -364,8 +402,8 @@ TEST(DrawPolygonSplitTest, AngledSplit) {
|
| test_points_b.push_back(gfx::Point3F(10.0f, 0.0f, 10.0f));
|
| test_points_b.push_back(gfx::Point3F(10.0f, 0.0f, 9.0f));
|
|
|
| - ValidatePoints(*(front_polygon.get()), test_points_a);
|
| - ValidatePoints(*(back_polygon.get()), test_points_b);
|
| + ValidatePointsWithinDeltaOf(*(front_polygon.get()), test_points_a, 1e-6f);
|
| + ValidatePointsWithinDeltaOf(*(back_polygon.get()), test_points_b, 1e-6f);
|
| }
|
|
|
| TEST(DrawPolygonTransformTest, TransformNormal) {
|
|
|