GCC Code Coverage Report


ernie/
Coverage:
low: ≥ 0%
medium: ≥ 75.0%
high: ≥ 90.0%
Lines:
39 / 45
86.7%
Branches:
77 / 140
55.0%
Functions:
12 / 13
92.3%

scene/schema/mesh.cpp
Line Branch Exec Source
1 // SPDX-License-Identifier: BSD-3-Clause
2 /// @file mesh.cpp
3 /// @brief Point-based geometry's registry entries and extents, as UsdGeom computes them.
4 #include "ernie/scene/schema/mesh.h"
5
6 #include <algorithm>
7 #include <optional>
8 #include <vector>
9
10 namespace ernie {
11 namespace {
12
13 /// @return The box of a CPU tensor's points, each grown by half its width when there is one per
14 /// point, else by half the widest (as UsdGeomCurves does); none for an empty tensor or one on a
15 /// device.
16 9 std::optional<Box> BoundPoints(const Tensor& points, const Tensor& widths) {
17
4/6
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 6 times.
9 if (points.Empty() || !points.OnHost() || !widths.OnHost()) {
18 3 return std::nullopt;
19 }
20 6 const Tensor xyz = points.Contiguous();
21
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
6 const std::vector<float> diameters = CopyFloats(widths, "widths");
22
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
6 const auto count = static_cast<std::size_t>(xyz.Elements() / 3);
23
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
6 const double widest = diameters.empty() ? 0.0 : *std::ranges::max_element(diameters);
24 22 const auto half = [&](std::size_t i) {
25
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 14 times.
16 return 0.5 * (diameters.size() == count ? diameters[i] : widest);
26 6 };
27 6 Box box;
28 6 const auto extend = [&]<typename T>(const T* data) {
29
2/4
auto ernie::(anonymous namespace)::BoundPoints(ernie::Tensor const&, ernie::Tensor const&)::{lambda<typename $T0>($T0 const*)#1}::operator()<double>(double const*) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
auto ernie::(anonymous namespace)::BoundPoints(ernie::Tensor const&, ernie::Tensor const&)::{lambda<typename $T0>($T0 const*)#1}::operator()<float>(float const*) const:
✓ Branch 0 taken 16 times.
✓ Branch 1 taken 6 times.
22 for (std::size_t i = 0; i < count; ++i) {
30 16 const glm::dvec3 point(data[3 * i], data[3 * i + 1], data[3 * i + 2]);
31 16 box.Extend(Box::Around(point, glm::dvec3(half(i))));
32 }
33 6 };
34
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
6 if (xyz.Type() == DType::Float64) {
35
0/2
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ extend(xyz.As<double>());
36 } else {
37
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
6 extend(xyz.As<float>());
38 }
39 6 return box;
40 6 }
41
42 /// Meshes from their points; point clouds and curves grown by their widths. Curves are bounded by
43 /// their control points, which hold every basis but catmullRom and Hermite closely, as in USD.
44 template <bool kWidths>
45 9 void PointBasedExtent(const ExtentRows& rows, RowRange range, std::span<Box> out) {
46 9 const auto points = rows.Column<Tensor>(PointBased::kPoints);
47 9 const auto widths = kWidths ? rows.Column<Tensor>(Points::kWidths) : std::span<const Tensor>();
48 9 const auto authored = rows.Column<std::vector<float>>(Boundable::kExtent);
49 9 ComputeRows(range, out, [&](std::uint32_t row) {
50 const std::optional<Box> box = BoundPoints(points[row], kWidths ? widths[row] : Tensor());
51 return box ? *box : AuthoredExtent(authored[row]);
52 });
53 9 }
54
55 } // namespace
56
57
7/12
✓ Branch 0 taken 146 times.
✓ Branch 1 taken 438 times.
✓ Branch 3 taken 146 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 146 times.
✗ Branch 7 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 146 times.
✓ Branch 17 taken 584 times.
✓ Branch 18 taken 146 times.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
1752 ERNIE_DEFINE_SCHEMA(PointBased, Abstract, kInheritExtent, ERNIE_POINT_BASED_ATTRIBUTES)
58
15/30
✓ Branch 0 taken 146 times.
✓ Branch 1 taken 126 times.
✓ Branch 3 taken 146 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 146 times.
✗ Branch 7 not taken.
✓ Branch 11 taken 146 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 146 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 146 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 146 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 146 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 146 times.
✗ Branch 27 not taken.
✓ Branch 29 taken 146 times.
✗ Branch 30 not taken.
✓ Branch 32 taken 146 times.
✗ Branch 33 not taken.
✗ Branch 42 not taken.
✓ Branch 43 taken 146 times.
✓ Branch 46 taken 1898 times.
✓ Branch 47 taken 146 times.
✗ Branch 70 not taken.
✗ Branch 71 not taken.
✗ Branch 94 not taken.
✗ Branch 95 not taken.
4068 ERNIE_DEFINE_SCHEMA(Mesh, Concrete, ComputedExtent(PointBasedExtent<false>), ERNIE_MESH_ATTRIBUTES)
59
7/12
✓ Branch 0 taken 146 times.
✓ Branch 1 taken 6 times.
✓ Branch 3 taken 146 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 146 times.
✗ Branch 7 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 146 times.
✓ Branch 17 taken 292 times.
✓ Branch 18 taken 146 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
736 ERNIE_DEFINE_SCHEMA(Points, Concrete, ComputedExtent(PointBasedExtent<true>),
60 ERNIE_POINTS_ATTRIBUTES)
61
7/12
✓ Branch 0 taken 146 times.
✓ Branch 1 taken 438 times.
✓ Branch 3 taken 146 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 146 times.
✗ Branch 7 not taken.
✗ Branch 11 not taken.
✓ Branch 12 taken 146 times.
✓ Branch 15 taken 292 times.
✓ Branch 16 taken 146 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
1168 ERNIE_DEFINE_SCHEMA(Curves, Abstract, ComputedExtent(PointBasedExtent<true>),
62 ERNIE_CURVES_ATTRIBUTES)
63
13/26
✓ Branch 0 taken 146 times.
✓ Branch 1 taken 3 times.
✓ Branch 3 taken 146 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 146 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 146 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 146 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 146 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 146 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 146 times.
✗ Branch 22 not taken.
✓ Branch 24 taken 146 times.
✗ Branch 25 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 146 times.
✓ Branch 31 taken 438 times.
✓ Branch 32 taken 146 times.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
1025 ERNIE_DEFINE_SCHEMA(BasisCurves, Concrete, kInheritExtent, ERNIE_BASIS_CURVES_ATTRIBUTES)
64
7/12
✓ Branch 0 taken 146 times.
✓ Branch 1 taken 2 times.
✓ Branch 3 taken 146 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 146 times.
✗ Branch 7 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 146 times.
✓ Branch 17 taken 584 times.
✓ Branch 18 taken 146 times.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
1316 ERNIE_DEFINE_SCHEMA(NurbsCurves, Concrete, kInheritExtent, ERNIE_NURBS_CURVES_ATTRIBUTES)
65
7/12
✓ Branch 0 taken 146 times.
✓ Branch 1 taken 2 times.
✓ Branch 3 taken 146 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 146 times.
✗ Branch 7 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 146 times.
✓ Branch 14 taken 146 times.
✓ Branch 15 taken 146 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
440 ERNIE_DEFINE_SCHEMA(HermiteCurves, Concrete, kInheritExtent, ERNIE_HERMITE_CURVES_ATTRIBUTES)
66
67 } // namespace ernie
68