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