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) { |