Skip to content

Commit 2115c34

Browse files
committed
perf(Global): several performance improvements
1 parent 04a4a91 commit 2115c34

File tree

14 files changed

+280
-237
lines changed

14 files changed

+280
-237
lines changed

include/geode/model/helpers/component_mesh_vertices.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,4 +42,9 @@ namespace geode
4242
ComponentMeshVertexPairs opengeode_model_api component_mesh_vertex_pairs(
4343
absl::Span< const ComponentMeshVertex > unique_vertices0,
4444
absl::Span< const ComponentMeshVertex > unique_vertices1 );
45+
46+
ComponentMeshVertexPairs opengeode_model_api component_mesh_vertex_pairs(
47+
absl::Span< const ComponentMeshVertex > unique_vertices0,
48+
absl::Span< const ComponentMeshVertex > unique_vertices1,
49+
const geode::ComponentType& type );
4550
} // namespace geode

src/geode/geometry/barycentric_coordinates.cpp

Lines changed: 27 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -33,18 +33,15 @@ namespace geode
3333
std::array< double, 4 > tetrahedron_barycentric_coordinates(
3434
const Point3D& point, const Tetrahedron& tetra )
3535
{
36-
const auto volume0 =
37-
tetrahedron_signed_volume( Tetrahedron{ tetra.vertices()[1],
38-
tetra.vertices()[3], tetra.vertices()[2], point } );
39-
const auto volume1 =
40-
tetrahedron_signed_volume( Tetrahedron{ tetra.vertices()[0],
41-
tetra.vertices()[2], tetra.vertices()[3], point } );
42-
const auto volume2 =
43-
tetrahedron_signed_volume( Tetrahedron{ tetra.vertices()[0],
44-
tetra.vertices()[3], tetra.vertices()[1], point } );
45-
const auto volume3 =
46-
tetrahedron_signed_volume( Tetrahedron{ tetra.vertices()[0],
47-
tetra.vertices()[1], tetra.vertices()[2], point } );
36+
const auto& vertices = tetra.vertices();
37+
const auto volume0 = tetrahedron_signed_volume(
38+
Tetrahedron{ vertices[1], vertices[3], vertices[2], point } );
39+
const auto volume1 = tetrahedron_signed_volume(
40+
Tetrahedron{ vertices[0], vertices[2], vertices[3], point } );
41+
const auto volume2 = tetrahedron_signed_volume(
42+
Tetrahedron{ vertices[0], vertices[3], vertices[1], point } );
43+
const auto volume3 = tetrahedron_signed_volume(
44+
Tetrahedron{ vertices[0], vertices[1], vertices[2], point } );
4845
const auto total_volume = volume0 + volume1 + volume2 + volume3;
4946
OPENGEODE_EXCEPTION( std::fabs( total_volume ) > global_epsilon,
5047
"[tetrahedron_barycentric_coordinates] Volume of input tetrahedron "
@@ -69,15 +66,14 @@ namespace geode
6966
result.fill( 1. / 3. );
7067
return result;
7168
}
72-
const auto area0 = triangle_signed_area(
73-
{ triangle.vertices()[1], triangle.vertices()[2], point },
74-
triangle_normal.value() );
75-
const auto area1 = triangle_signed_area(
76-
{ triangle.vertices()[2], triangle.vertices()[0], point },
77-
triangle_normal.value() );
78-
const auto area2 = triangle_signed_area(
79-
{ triangle.vertices()[0], triangle.vertices()[1], point },
80-
triangle_normal.value() );
69+
const auto& vertices = triangle.vertices();
70+
const auto& normal = triangle_normal.value();
71+
const auto area0 =
72+
triangle_signed_area( { vertices[1], vertices[2], point }, normal );
73+
const auto area1 =
74+
triangle_signed_area( { vertices[2], vertices[0], point }, normal );
75+
const auto area2 =
76+
triangle_signed_area( { vertices[0], vertices[1], point }, normal );
8177

8278
const auto total_area = area0 + area1 + area2;
8379
OPENGEODE_EXCEPTION( std::fabs( total_area ) > global_epsilon,
@@ -93,12 +89,13 @@ namespace geode
9389
std::array< double, 3 > triangle_barycentric_coordinates(
9490
const Point2D& point, const Triangle2D& triangle )
9591
{
96-
const auto area0 = triangle_signed_area(
97-
{ triangle.vertices()[1], triangle.vertices()[2], point } );
98-
const auto area1 = triangle_signed_area(
99-
{ triangle.vertices()[2], triangle.vertices()[0], point } );
100-
const auto area2 = triangle_signed_area(
101-
{ triangle.vertices()[0], triangle.vertices()[1], point } );
92+
const auto& vertices = triangle.vertices();
93+
const auto area0 =
94+
triangle_signed_area( { vertices[1], vertices[2], point } );
95+
const auto area1 =
96+
triangle_signed_area( { vertices[2], vertices[0], point } );
97+
const auto area2 =
98+
triangle_signed_area( { vertices[0], vertices[1], point } );
10299

103100
const auto total_area = area0 + area1 + area2;
104101
OPENGEODE_EXCEPTION( std::fabs( total_area ) > global_epsilon,
@@ -116,9 +113,10 @@ namespace geode
116113
{
117114
const auto dir = segment.direction();
118115
const auto length = dir.length();
119-
const Vector< dimension > v0p{ segment.vertices()[0], point };
116+
const auto& vertices = segment.vertices();
117+
const Vector< dimension > v0p{ vertices[0], point };
120118
const auto dot0 = v0p.dot( dir ) / length;
121-
const Vector< dimension > v1p{ segment.vertices()[1], point };
119+
const Vector< dimension > v1p{ vertices[1], point };
122120
const auto dot1 = -v1p.dot( dir ) / length;
123121
const auto sum = dot0 + dot1;
124122
OPENGEODE_EXCEPTION( std::fabs( sum ) > global_epsilon,

src/geode/geometry/basic_objects/triangle.cpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,16 +34,17 @@ namespace
3434
{
3535
try
3636
{
37+
const auto& vertices = triangle.vertices();
3738
for( const auto pivot : geode::LRange{ 3 } )
3839
{
3940
const auto next = pivot + 1 == 3 ? 0 : pivot + 1;
40-
const auto edge0 = geode::Vector3D{ triangle.vertices()[pivot],
41-
triangle.vertices()[next] }
42-
.normalize();
41+
const auto edge0 =
42+
geode::Vector3D{ vertices[pivot], vertices[next] }
43+
.normalize();
4344
const auto prev = pivot == 0 ? 2 : pivot - 1;
44-
const auto edge1 = geode::Vector3D{ triangle.vertices()[pivot],
45-
triangle.vertices()[prev] }
46-
.normalize();
45+
const auto edge1 =
46+
geode::Vector3D{ vertices[pivot], vertices[prev] }
47+
.normalize();
4748

4849
const auto normal = edge0.cross( edge1 );
4950
const auto length = normal.length();

src/geode/geometry/distance.cpp

Lines changed: 43 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -47,15 +47,13 @@ namespace
4747
bool may_point_be_in_triangle(
4848
const geode::Point2D& point, const geode::Triangle2D& triangle )
4949
{
50-
const auto signed_area_1 =
51-
geode::triangle_signed_area( geode::Triangle2D{
52-
triangle.vertices()[0], triangle.vertices()[1], point } );
53-
const auto signed_area_2 =
54-
geode::triangle_signed_area( geode::Triangle2D{
55-
triangle.vertices()[1], triangle.vertices()[2], point } );
56-
const auto signed_area_3 =
57-
geode::triangle_signed_area( geode::Triangle2D{
58-
triangle.vertices()[2], triangle.vertices()[0], point } );
50+
const auto& vertices = triangle.vertices();
51+
const auto signed_area_1 = geode::triangle_signed_area(
52+
geode::Triangle2D{ vertices[0], vertices[1], point } );
53+
const auto signed_area_2 = geode::triangle_signed_area(
54+
geode::Triangle2D{ vertices[1], vertices[2], point } );
55+
const auto signed_area_3 = geode::triangle_signed_area(
56+
geode::Triangle2D{ vertices[2], vertices[0], point } );
5957

6058
return ( signed_area_1 <= 0. && signed_area_2 <= 0.
6159
&& signed_area_3 <= 0 )
@@ -96,12 +94,11 @@ namespace geode
9694
/* Algorithm and code found on
9795
* http://geomalgorithms.com/a07-_distance.html
9896
*/
99-
const Vector< dimension > u{ segment0.vertices()[0],
100-
segment0.vertices()[1] };
101-
const Vector< dimension > v{ segment1.vertices()[0],
102-
segment1.vertices()[1] };
103-
const Vector< dimension > w{ segment1.vertices()[0],
104-
segment0.vertices()[0] };
97+
const auto& vertices0 = segment0.vertices();
98+
const auto& vertices1 = segment1.vertices();
99+
const Vector< dimension > u{ vertices0[0], vertices0[1] };
100+
const Vector< dimension > v{ vertices1[0], vertices1[1] };
101+
const Vector< dimension > w{ vertices1[0], vertices0[0] };
105102
const auto a = u.dot( u ); // always >= 0
106103
const auto b = u.dot( v );
107104
const auto c = v.dot( v ); // always >= 0
@@ -174,10 +171,8 @@ namespace geode
174171
tc = ( std::fabs( tN ) <= 0.0 ? 0.0 : tN / tD );
175172

176173
// get the difference of the two closest points
177-
const Point< dimension > closest0 =
178-
segment0.vertices()[0].get() + u * sc;
179-
const Point< dimension > closest1 =
180-
segment1.vertices()[0].get() + v * tc;
174+
const Point< dimension > closest0 = vertices0[0].get() + u * sc;
175+
const Point< dimension > closest1 = vertices1[0].get() + v * tc;
181176
const Vector< dimension > dP{ closest0,
182177
closest1 }; // = segment0(sc) - segment1(tc)
183178

@@ -192,13 +187,14 @@ namespace geode
192187
auto min_distance = std::numeric_limits< double >::max();
193188
local_index_t min_p0{ 0 };
194189
local_index_t min_p1{ 0 };
190+
const auto& vertices0 = segment0.vertices();
191+
const auto& vertices1 = segment1.vertices();
195192
for( const auto p0 : LRange{ 2 } )
196193
{
197194
for( const auto p1 : LRange{ 2 } )
198195
{
199-
const auto cur_dist =
200-
point_point_distance( segment0.vertices()[p0].get(),
201-
segment1.vertices()[p1].get() );
196+
const auto cur_dist = point_point_distance(
197+
vertices0[p0].get(), vertices1[p1].get() );
202198
if( cur_dist < min_distance )
203199
{
204200
min_distance = cur_dist;
@@ -212,16 +208,16 @@ namespace geode
212208
if( min_p1 == 1 )
213209
{
214210
return compute_segment_segment_distance< dimension >(
215-
{ segment0.vertices()[1], segment0.vertices()[0] },
216-
{ segment1.vertices()[1], segment1.vertices()[0] } );
211+
{ vertices0[1], vertices0[0] },
212+
{ vertices1[1], vertices1[0] } );
217213
}
218214
return compute_segment_segment_distance(
219-
{ segment0.vertices()[1], segment0.vertices()[0] }, segment1 );
215+
{ vertices0[1], vertices0[0] }, segment1 );
220216
}
221217
if( min_p1 == 1 )
222218
{
223219
return compute_segment_segment_distance(
224-
segment0, { segment1.vertices()[1], segment1.vertices()[0] } );
220+
segment0, { vertices1[1], vertices1[0] } );
225221
}
226222
return compute_segment_segment_distance( segment0, segment1 );
227223
}
@@ -254,15 +250,14 @@ namespace geode
254250
{
255251
const auto v1 = v0 == 2 ? 0 : v0 + 1;
256252
const auto v2 = v1 == 2 ? 0 : v1 + 1;
257-
const Vector3D edge0{ triangle.vertices()[v0],
258-
triangle.vertices()[v1] };
259-
const Vector3D edge1{ triangle.vertices()[v0],
260-
triangle.vertices()[v2] };
253+
const auto& vertices = triangle.vertices();
254+
const Vector3D edge0{ vertices[v0], vertices[v1] };
255+
const Vector3D edge1{ vertices[v0], vertices[v2] };
261256
const auto a00 = edge0.length2();
262257
const auto a01 = edge0.dot( edge1 );
263258
const auto a11 = edge1.length2();
264259
const auto det = std::fabs( a00 * a11 - a01 * a01 );
265-
const Vector3D diff{ point, triangle.vertices()[v0] };
260+
const Vector3D diff{ point, vertices[v0] };
266261
const auto b0 = diff.dot( edge0 );
267262
const auto b1 = diff.dot( edge1 );
268263
auto s = a01 * b1 - a11 * b0;
@@ -443,8 +438,7 @@ namespace geode
443438
}
444439
}
445440

446-
Point3D closest_point{ triangle.vertices()[v0].get() + edge0 * s
447-
+ edge1 * t };
441+
Point3D closest_point{ vertices[v0].get() + edge0 * s + edge1 * t };
448442
const auto distance = point_point_distance( point, closest_point );
449443
return std::make_tuple( distance, std::move( closest_point ) );
450444
}
@@ -460,11 +454,12 @@ namespace geode
460454
std::array< std::tuple< double, Point3D >, 3 > edge_distances;
461455
auto min_distance = std::numeric_limits< double >::max();
462456
local_index_t selected_edge{ NO_LID };
457+
const auto& vertices = triangle.vertices();
463458
for( const auto e : LRange{ 3 } )
464459
{
465460
const auto next = e == 2 ? 0 : e + 1;
466461
edge_distances[e] = point_segment_distance(
467-
point, { triangle.vertices()[e], triangle.vertices()[next] } );
462+
point, { vertices[e], vertices[next] } );
468463
const auto& cur_distance = std::get< 0 >( edge_distances[e] );
469464
if( cur_distance < min_distance )
470465
{
@@ -483,14 +478,15 @@ namespace geode
483478
{
484479
return std::make_tuple( 0.0, point );
485480
}
481+
const auto& vertices = triangle.vertices();
486482
std::array< Point2D, 3 > closest;
487483
std::array< double, 3 > distance;
488-
std::tie( distance[0], closest[0] ) = point_segment_distance( point,
489-
Segment2D{ triangle.vertices()[0], triangle.vertices()[1] } );
490-
std::tie( distance[1], closest[1] ) = point_segment_distance( point,
491-
Segment2D{ triangle.vertices()[1], triangle.vertices()[2] } );
492-
std::tie( distance[2], closest[2] ) = point_segment_distance( point,
493-
Segment2D{ triangle.vertices()[2], triangle.vertices()[0] } );
484+
std::tie( distance[0], closest[0] ) = point_segment_distance(
485+
point, Segment2D{ vertices[0], vertices[1] } );
486+
std::tie( distance[1], closest[1] ) = point_segment_distance(
487+
point, Segment2D{ vertices[1], vertices[2] } );
488+
std::tie( distance[2], closest[2] ) = point_segment_distance(
489+
point, Segment2D{ vertices[2], vertices[0] } );
494490
double result;
495491
Point2D closest_point;
496492
if( distance[0] < distance[1] )
@@ -528,18 +524,17 @@ namespace geode
528524
auto max_distance = MAX_DOUBLE;
529525
Point3D nearest_p;
530526
bool inside{ true };
527+
const auto& vertices = tetra.vertices();
531528
for( const auto f : Range{ 4 } )
532529
{
530+
const auto& facet_vertices =
531+
Tetrahedron::tetrahedron_facet_vertex[f];
533532
double distance;
534533
Point3D cur_p;
535-
std::tie( distance, cur_p ) = point_triangle_signed_distance( point,
536-
Triangle3D{
537-
tetra.vertices()[Tetrahedron::tetrahedron_facet_vertex[f]
538-
[0]],
539-
tetra.vertices()[Tetrahedron::tetrahedron_facet_vertex[f]
540-
[1]],
541-
tetra.vertices()
542-
[Tetrahedron::tetrahedron_facet_vertex[f][2]] } );
534+
std::tie( distance, cur_p ) = point_triangle_signed_distance(
535+
point, Triangle3D{ vertices[facet_vertices[0]],
536+
vertices[facet_vertices[1]],
537+
vertices[facet_vertices[2]] } );
543538
if( distance > 0 )
544539
{
545540
inside = false;

src/geode/geometry/intersection.cpp

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -202,8 +202,9 @@ namespace geode
202202
// http://www.geometrictools.com/LibMathematics/Intersection/Intersection.html
203203
// Compute the offset origin, edges, and normal.
204204
const auto seg_center = segment.barycenter();
205-
const Vector3D edge1{ triangle.vertices()[0], triangle.vertices()[1] };
206-
const Vector3D edge2{ triangle.vertices()[0], triangle.vertices()[2] };
205+
const auto& vertices = triangle.vertices();
206+
const Vector3D edge1{ vertices[0], vertices[1] };
207+
const Vector3D edge2{ vertices[0], vertices[2] };
207208
const auto normal = edge1.cross( edge2 );
208209

209210
// Solve Q + t*D = b1*E1 + b2*E2 (Q = diff, D = segment direction,
@@ -228,7 +229,7 @@ namespace geode
228229
return { IntersectionType::PARALLEL };
229230
}
230231

231-
const Vector3D diff{ triangle.vertices()[0], seg_center };
232+
const Vector3D diff{ vertices[0], seg_center };
232233
const auto DdQxE2 =
233234
sign * segment.normalized_direction().dot( diff.cross( edge2 ) );
234235
if( DdQxE2 >= 0 )
@@ -280,9 +281,9 @@ namespace geode
280281
tri_lambdas.fill( 1. / 3. );
281282
}
282283
correctness.second.second =
283-
triangle.vertices()[0].get() * tri_lambdas[0]
284-
+ triangle.vertices()[1].get() * tri_lambdas[1]
285-
+ triangle.vertices()[2].get() * tri_lambdas[2];
284+
vertices[0].get() * tri_lambdas[0]
285+
+ vertices[1].get() * tri_lambdas[1]
286+
+ vertices[2].get() * tri_lambdas[2];
286287
correctness.second.first =
287288
std::get< 0 >( point_triangle_distance(
288289
correctness.second.second, triangle ) )
@@ -303,8 +304,9 @@ namespace geode
303304
{
304305
// http://www.geometrictools.com/LibMathematics/Intersection/Intersection.html
305306
// Compute the offset origin, edges, and normal.
306-
const Vector3D edge1{ triangle.vertices()[0], triangle.vertices()[1] };
307-
const Vector3D edge2{ triangle.vertices()[0], triangle.vertices()[2] };
307+
const auto& vertices = triangle.vertices();
308+
const Vector3D edge1{ vertices[0], vertices[1] };
309+
const Vector3D edge2{ vertices[0], vertices[2] };
308310
const auto normal = edge1.cross( edge2 );
309311

310312
// Solve Q + t*D = b1*E1 + b2*E2 (Q = diff, D = segment direction,
@@ -329,7 +331,7 @@ namespace geode
329331
return { IntersectionType::PARALLEL };
330332
}
331333

332-
const Vector3D diff{ triangle.vertices()[0], line.origin() };
334+
const Vector3D diff{ vertices[0], line.origin() };
333335
const auto DdQxE2 = sign * line.direction().dot( diff.cross( edge2 ) );
334336
if( DdQxE2 >= 0 )
335337
{
@@ -360,9 +362,9 @@ namespace geode
360362
tri_lambdas.fill( 1. / 3. );
361363
}
362364
correctness.second.second =
363-
triangle.vertices()[0].get() * tri_lambdas[0]
364-
+ triangle.vertices()[1].get() * tri_lambdas[1]
365-
+ triangle.vertices()[2].get() * tri_lambdas[2];
365+
vertices[0].get() * tri_lambdas[0]
366+
+ vertices[1].get() * tri_lambdas[1]
367+
+ vertices[2].get() * tri_lambdas[2];
366368
correctness.second.first =
367369
point_point_distance( result, correctness.second.second )
368370
< global_epsilon;

src/geode/geometry/mensuration.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,17 +60,18 @@ namespace geode
6060

6161
double triangle_signed_area( const Triangle2D& triangle )
6262
{
63+
const auto& vertices = triangle.vertices();
6364
return dot_perpendicular(
64-
{ triangle.vertices()[0], triangle.vertices()[1] },
65-
{ triangle.vertices()[0], triangle.vertices()[2] } )
65+
{ vertices[0], vertices[1] }, { vertices[0], vertices[2] } )
6666
/ 2.;
6767
}
6868

6969
double tetrahedron_signed_volume( const Tetrahedron& tetra )
7070
{
71-
return Vector3D{ tetra.vertices()[0], tetra.vertices()[1] }.dot(
72-
Vector3D{ tetra.vertices()[0], tetra.vertices()[2] }.cross(
73-
{ tetra.vertices()[0], tetra.vertices()[3] } ) )
71+
const auto& vertices = tetra.vertices();
72+
return Vector3D{ vertices[0], vertices[1] }.dot(
73+
Vector3D{ vertices[0], vertices[2] }.cross(
74+
{ vertices[0], vertices[3] } ) )
7475
/ 6.;
7576
}
7677

0 commit comments

Comments
 (0)