Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(649)

Unified Diff: cc/quads/draw_polygon_unittest.cc

Issue 2408203005: Add tests where we split near an edge. (Closed)
Patch Set: rebased Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/quads/draw_polygon.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/quads/draw_polygon_unittest.cc
diff --git a/cc/quads/draw_polygon_unittest.cc b/cc/quads/draw_polygon_unittest.cc
index 40090ec765910296f43d9834e955e8c31f2302aa..976032ad29020a5bcd88a5e21345e41ac63dbafb 100644
--- a/cc/quads/draw_polygon_unittest.cc
+++ b/cc/quads/draw_polygon_unittest.cc
@@ -26,6 +26,45 @@ void DrawPolygon::RecomputeNormalForTesting() {
}
#endif
+static int sign(float v) {
+ static const float epsilon = 0.00001f;
+
+ if (v > epsilon)
+ return 1;
+ if (v < -epsilon)
+ return -1;
+ return 0;
+}
+
+bool IsPlanarForTesting(const DrawPolygon& p) {
+ static const float epsilon = 0.00001f;
+ for (size_t i = 1; i < p.points_.size(); i++) {
+ if (gfx::DotProduct(p.points_[i] - p.points_[0], p.normal_) > epsilon)
+ return false;
+ }
+ return true;
+}
+
+bool IsConvexForTesting(const DrawPolygon& p) {
+ if (p.points_.size() < 3)
+ return true;
+
+ gfx::Vector3dF prev =
+ p.points_[p.points_.size() - 1] - p.points_[p.points_.size() - 2];
+ gfx::Vector3dF next = p.points_[0] - p.points_[p.points_.size() - 1];
+ int ccw = sign(gfx::DotProduct(CrossProduct(prev, next), p.normal_));
+ for (size_t i = 1; i < p.points_.size(); i++) {
+ prev = next;
+ next = p.points_[i] - p.points_[i - 1];
+ int next_sign = sign(gfx::DotProduct(CrossProduct(prev, next), p.normal_));
+ if (ccw == 0)
+ ccw = next_sign;
+ if (next_sign != 0 && next_sign != ccw)
+ return false;
+ }
+ return true;
+}
+
namespace {
#define CREATE_NEW_DRAW_POLYGON(name, points_vector, normal, polygon_id) \
@@ -317,6 +356,44 @@ TEST(DrawPolygonSplitTest, BarelyTouchingNoSplit) {
EXPECT_EQ(BSP_BACK, SideCompare(polygon_b, polygon_a));
}
+// One quad intersects a pent with an occluded side.
+TEST(DrawPolygonSplitTest, SlimClip) {
+ std::vector<gfx::Point3F> vertices_a;
+ vertices_a.push_back(gfx::Point3F(0.0f, 10.0f, 0.0f));
+ vertices_a.push_back(gfx::Point3F(0.0f, 0.0f, 0.0f));
+ vertices_a.push_back(gfx::Point3F(10.0f, 0.0f, 0.0f));
+ vertices_a.push_back(gfx::Point3F(10.0f, 10.0f, 0.0f));
+ std::vector<gfx::Point3F> vertices_b;
+ vertices_b.push_back(gfx::Point3F(9.0f, 9.0f, 5.000f));
+ vertices_b.push_back(gfx::Point3F(1.0f, 1.0f, 0.001f));
+ vertices_b.push_back(gfx::Point3F(1.0f, 1.0f, 0.000f));
+ vertices_b.push_back(gfx::Point3F(1.002f, 1.002f, -0.005f));
+ vertices_b.push_back(gfx::Point3F(9.0f, 9.0f, -4.000f));
+
+ 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(sqrt(2) / 2, -sqrt(2) / 2, 0.000000), 1);
+
+ // These are well formed, convex polygons.
+ EXPECT_TRUE(IsPlanarForTesting(*(polygon_a.get())));
+ EXPECT_TRUE(IsConvexForTesting(*(polygon_a.get())));
+ EXPECT_TRUE(IsPlanarForTesting(*(polygon_b.get())));
+ EXPECT_TRUE(IsConvexForTesting(*(polygon_b.get())));
+
+ std::unique_ptr<DrawPolygon> front_polygon;
+ std::unique_ptr<DrawPolygon> back_polygon;
+ 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);
+}
+
// One quad intersects another and becomes two pieces.
TEST(DrawPolygonSplitTest, BasicSplit) {
std::vector<gfx::Point3F> vertices_a;
@@ -406,6 +483,60 @@ TEST(DrawPolygonSplitTest, AngledSplit) {
ValidatePointsWithinDeltaOf(*(back_polygon.get()), test_points_b, 1e-6f);
}
+// In this test we cut the corner of a quad so that it creates a triangle and
+// a pentagon as a result, and then cut the pentagon.
+TEST(DrawPolygonSplitTest, DoubleSplit) {
+ std::vector<gfx::Point3F> vertices_a;
+ vertices_a.push_back(gfx::Point3F(0.0f, 0.0f, 0.0f));
+ vertices_a.push_back(gfx::Point3F(0.0f, 0.0f, 10.0f));
+ vertices_a.push_back(gfx::Point3F(10.0f, 0.0f, 10.0f));
+ vertices_a.push_back(gfx::Point3F(10.0f, 0.0f, 0.0f));
+ std::vector<gfx::Point3F> vertices_b;
+ vertices_b.push_back(gfx::Point3F(2.0f, 5.0f, 1.0f));
+ vertices_b.push_back(gfx::Point3F(2.0f, -5.0f, 1.0f));
+ 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_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(sqrt(2) / 2, 0.0f, -sqrt(2) / 2),
+ 1);
+
+ std::unique_ptr<DrawPolygon> front_polygon;
+ std::unique_ptr<DrawPolygon> back_polygon;
+ bool is_coplanar;
+
+ 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);
+
+ EXPECT_EQ(3u, front_polygon->points().size());
+ EXPECT_EQ(5u, back_polygon->points().size());
+
+ std::vector<gfx::Point3F> vertices_c;
+ vertices_c.push_back(gfx::Point3F(0.0f, 0.0f, 10.0f));
+ vertices_c.push_back(gfx::Point3F(1.0f, -0.05f, 0.0f));
+ vertices_c.push_back(gfx::Point3F(10.0f, 0.05f, 9.0f));
+
+ CREATE_NEW_DRAW_POLYGON_PTR(polygon_c, vertices_c,
+ gfx::Vector3dF(0.0055f, -0.999f, 0.0055f), 0);
+
+ std::unique_ptr<DrawPolygon> second_front_polygon;
+ std::unique_ptr<DrawPolygon> second_back_polygon;
+
+ polygon_c->SplitPolygon(std::move(back_polygon), &second_front_polygon,
+ &second_back_polygon, &is_coplanar);
+ EXPECT_FALSE(is_coplanar);
+ EXPECT_TRUE(second_front_polygon != nullptr);
+ EXPECT_TRUE(second_back_polygon != nullptr);
+
+ EXPECT_EQ(3u, second_front_polygon->points().size());
+ EXPECT_EQ(3u, second_back_polygon->points().size());
+}
+
TEST(DrawPolygonTransformTest, TransformNormal) {
std::vector<gfx::Point3F> vertices_a;
vertices_a.push_back(gfx::Point3F(1.0f, 0.0f, 1.0f));
« no previous file with comments | « cc/quads/draw_polygon.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698