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

Side by Side Diff: cc/base/math_util.cc

Issue 2627213002: Tighten bounds on 3d clipping. (Closed)
Patch Set: rebased Created 3 years, 11 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 unified diff | Download patch
« no previous file with comments | « cc/base/math_util.h ('k') | cc/quads/draw_polygon.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/base/math_util.h" 5 #include "cc/base/math_util.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <cmath> 8 #include <cmath>
9 #include <limits> 9 #include <limits>
10 #ifdef __SSE__ 10 #ifdef __SSE__
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
171 return IsNearlyTheSame(lhs.x(), rhs.x()) && IsNearlyTheSame(lhs.y(), rhs.y()); 171 return IsNearlyTheSame(lhs.x(), rhs.x()) && IsNearlyTheSame(lhs.y(), rhs.y());
172 } 172 }
173 173
174 static inline bool IsNearlyTheSame(const gfx::Point3F& lhs, 174 static inline bool IsNearlyTheSame(const gfx::Point3F& lhs,
175 const gfx::Point3F& rhs) { 175 const gfx::Point3F& rhs) {
176 return IsNearlyTheSame(lhs.x(), rhs.x()) && 176 return IsNearlyTheSame(lhs.x(), rhs.x()) &&
177 IsNearlyTheSame(lhs.y(), rhs.y()) && IsNearlyTheSame(lhs.z(), rhs.z()); 177 IsNearlyTheSame(lhs.y(), rhs.y()) && IsNearlyTheSame(lhs.z(), rhs.z());
178 } 178 }
179 179
180 static inline void AddVertexToClippedQuad3d(const gfx::Point3F& new_vertex, 180 static inline void AddVertexToClippedQuad3d(const gfx::Point3F& new_vertex,
181 gfx::Point3F clipped_quad[8], 181 gfx::Point3F clipped_quad[6],
182 int* num_vertices_in_clipped_quad) { 182 int* num_vertices_in_clipped_quad) {
183 if (*num_vertices_in_clipped_quad > 0 && 183 if (*num_vertices_in_clipped_quad > 0 &&
184 IsNearlyTheSame(clipped_quad[*num_vertices_in_clipped_quad - 1], 184 IsNearlyTheSame(clipped_quad[*num_vertices_in_clipped_quad - 1],
185 new_vertex)) 185 new_vertex))
186 return; 186 return;
187 187
188 clipped_quad[*num_vertices_in_clipped_quad] = new_vertex; 188 clipped_quad[*num_vertices_in_clipped_quad] = new_vertex;
189 (*num_vertices_in_clipped_quad)++; 189 (*num_vertices_in_clipped_quad)++;
190 } 190 }
191 191
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
302 DCHECK(!hc0.ShouldBeClipped()); 302 DCHECK(!hc0.ShouldBeClipped());
303 DCHECK(!hc1.ShouldBeClipped()); 303 DCHECK(!hc1.ShouldBeClipped());
304 304
305 gfx::PointF top_left(hc0.CartesianPoint2d()); 305 gfx::PointF top_left(hc0.CartesianPoint2d());
306 gfx::PointF bottom_right(hc1.CartesianPoint2d()); 306 gfx::PointF bottom_right(hc1.CartesianPoint2d());
307 return gfx::ToEnclosedRect(gfx::BoundingRect(top_left, bottom_right)); 307 return gfx::ToEnclosedRect(gfx::BoundingRect(top_left, bottom_right));
308 } 308 }
309 309
310 bool MathUtil::MapClippedQuad3d(const gfx::Transform& transform, 310 bool MathUtil::MapClippedQuad3d(const gfx::Transform& transform,
311 const gfx::QuadF& src_quad, 311 const gfx::QuadF& src_quad,
312 gfx::Point3F clipped_quad[8], 312 gfx::Point3F clipped_quad[6],
313 int* num_vertices_in_clipped_quad) { 313 int* num_vertices_in_clipped_quad) {
314 HomogeneousCoordinate h1 = 314 HomogeneousCoordinate h1 =
315 MapHomogeneousPoint(transform, gfx::Point3F(src_quad.p1())); 315 MapHomogeneousPoint(transform, gfx::Point3F(src_quad.p1()));
316 HomogeneousCoordinate h2 = 316 HomogeneousCoordinate h2 =
317 MapHomogeneousPoint(transform, gfx::Point3F(src_quad.p2())); 317 MapHomogeneousPoint(transform, gfx::Point3F(src_quad.p2()));
318 HomogeneousCoordinate h3 = 318 HomogeneousCoordinate h3 =
319 MapHomogeneousPoint(transform, gfx::Point3F(src_quad.p3())); 319 MapHomogeneousPoint(transform, gfx::Point3F(src_quad.p3()));
320 HomogeneousCoordinate h4 = 320 HomogeneousCoordinate h4 =
321 MapHomogeneousPoint(transform, gfx::Point3F(src_quad.p4())); 321 MapHomogeneousPoint(transform, gfx::Point3F(src_quad.p4()));
322 322
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
363 if (h4.ShouldBeClipped() ^ h1.ShouldBeClipped()) { 363 if (h4.ShouldBeClipped() ^ h1.ShouldBeClipped()) {
364 AddVertexToClippedQuad3d(ComputeClippedCartesianPoint3dForEdge(h4, h1), 364 AddVertexToClippedQuad3d(ComputeClippedCartesianPoint3dForEdge(h4, h1),
365 clipped_quad, num_vertices_in_clipped_quad); 365 clipped_quad, num_vertices_in_clipped_quad);
366 } 366 }
367 367
368 if (*num_vertices_in_clipped_quad > 2 && 368 if (*num_vertices_in_clipped_quad > 2 &&
369 IsNearlyTheSame(clipped_quad[0], 369 IsNearlyTheSame(clipped_quad[0],
370 clipped_quad[*num_vertices_in_clipped_quad - 1])) 370 clipped_quad[*num_vertices_in_clipped_quad - 1]))
371 *num_vertices_in_clipped_quad -= 1; 371 *num_vertices_in_clipped_quad -= 1;
372 372
373 DCHECK_LE(*num_vertices_in_clipped_quad, 8); 373 DCHECK_LE(*num_vertices_in_clipped_quad, 6);
flackr 2017/01/12 16:59:11 I'm concerned with the DCHECK that if we got this
danakj 2017/01/12 17:01:19 Can we not just find a provably correct number?
374 return (*num_vertices_in_clipped_quad >= 4); 374 return (*num_vertices_in_clipped_quad >= 4);
375 } 375 }
376 376
377 gfx::RectF MathUtil::ComputeEnclosingRectOfVertices( 377 gfx::RectF MathUtil::ComputeEnclosingRectOfVertices(
378 const gfx::PointF vertices[], 378 const gfx::PointF vertices[],
379 int num_vertices) { 379 int num_vertices) {
380 if (num_vertices < 2) 380 if (num_vertices < 2)
381 return gfx::RectF(); 381 return gfx::RectF();
382 382
383 float xmin = std::numeric_limits<float>::max(); 383 float xmin = std::numeric_limits<float>::max();
(...skipping 523 matching lines...) Expand 10 before | Expand all | Expand 10 after
907 const gfx::PointF& right) { 907 const gfx::PointF& right) {
908 return IsNearlyTheSame(left, right); 908 return IsNearlyTheSame(left, right);
909 } 909 }
910 910
911 bool MathUtil::IsNearlyTheSameForTesting(const gfx::Point3F& left, 911 bool MathUtil::IsNearlyTheSameForTesting(const gfx::Point3F& left,
912 const gfx::Point3F& right) { 912 const gfx::Point3F& right) {
913 return IsNearlyTheSame(left, right); 913 return IsNearlyTheSame(left, right);
914 } 914 }
915 915
916 } // namespace cc 916 } // namespace cc
OLDNEW
« no previous file with comments | « cc/base/math_util.h ('k') | cc/quads/draw_polygon.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698