| Line |
Branch |
Exec |
Source |
| 1 |
|
|
// SPDX-License-Identifier: BSD-3-Clause |
| 2 |
|
|
/// @file inherit.cpp |
| 3 |
|
|
/// @brief Resolving inherited attributes from the nearest authoring ancestor into their resolved |
| 4 |
|
|
/// columns, for only the subtrees whose authored values or prims changed. |
| 5 |
|
|
#include "ernie/scene/convert.h" |
| 6 |
|
|
#include "ernie/scene/scene.h" |
| 7 |
|
|
#include "ernie/util/profiler.h" |
| 8 |
|
|
|
| 9 |
|
|
#include <algorithm> |
| 10 |
|
|
#include <concepts> |
| 11 |
|
|
|
| 12 |
|
|
namespace ernie { |
| 13 |
|
|
namespace { |
| 14 |
|
|
|
| 15 |
|
|
/// @brief One inherited attribute resolving over the store. |
| 16 |
|
✗ |
template <typename T> struct Resolver { |
| 17 |
|
|
PrimStore& store; |
| 18 |
|
|
AttributeId attribute; |
| 19 |
|
|
AttributeId resolved; |
| 20 |
|
|
T fallback; |
| 21 |
|
|
/// The "inherited" token, which authors nothing. |
| 22 |
|
|
Token inherited; |
| 23 |
|
|
|
| 24 |
|
|
/// @return What the prim's own value resolves to: null when it doesn't author one. |
| 25 |
|
28368 |
const T* Own(PrimId prim) const { |
| 26 |
|
18448 |
const T* own = store.Get<T>(prim, attribute); |
| 27 |
|
|
if constexpr (std::same_as<T, Token>) { |
| 28 |
4/4
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 18442 times.
✓ Branch 2 taken 1 time.
✓ Branch 3 taken 5 times.
|
18448 |
return own != nullptr && *own == inherited ? nullptr : own; |
| 29 |
|
|
} |
| 30 |
|
|
return own; |
| 31 |
|
|
} |
| 32 |
|
|
|
| 33 |
|
|
/// @return The value `path` inherits from its ancestors. |
| 34 |
|
27594 |
T Above(PathId path) const { |
| 35 |
|
27594 |
const PathTable& paths = store.Paths(); |
| 36 |
6/26
ernie::(anonymous namespace)::Resolver<double>::Above(unsigned int) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<ernie::Target>::Above(unsigned int) const:
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 556 times.
ernie::(anonymous namespace)::Resolver<glm::mat<4, 4, double, (glm::qualifier)0> >::Above(unsigned int) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<glm::qua<double, (glm::qualifier)0> >::Above(unsigned int) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<2, double, (glm::qualifier)0> >::Above(unsigned int) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<3, double, (glm::qualifier)0> >::Above(unsigned int) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<4, double, (glm::qualifier)0> >::Above(unsigned int) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<int>::Above(unsigned int) const:
✓ Branch 0 taken 67 times.
✓ Branch 1 taken 8945 times.
ernie::(anonymous namespace)::Resolver<std::vector<ernie::Target, std::allocator<ernie::Target> > >::Above(unsigned int) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<float, std::allocator<float> > >::Above(unsigned int) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<unsigned int, std::allocator<unsigned int> > >::Above(unsigned int) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<unsigned char>::Above(unsigned int) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<unsigned int>::Above(unsigned int) const:
✓ Branch 0 taken 134 times.
✓ Branch 1 taken 18026 times.
|
27731 |
for (PathId above = paths.Parent(path); above != kRootPath; above = paths.Parent(above)) { |
| 37 |
|
204 |
const std::optional<PrimId> prim = store.Find(above); |
| 38 |
6/52
ernie::(anonymous namespace)::Resolver<double>::Above(unsigned int) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
ernie::(anonymous namespace)::Resolver<ernie::Target>::Above(unsigned int) const:
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
ernie::(anonymous namespace)::Resolver<glm::mat<4, 4, double, (glm::qualifier)0> >::Above(unsigned int) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
ernie::(anonymous namespace)::Resolver<glm::qua<double, (glm::qualifier)0> >::Above(unsigned int) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<2, double, (glm::qualifier)0> >::Above(unsigned int) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<3, double, (glm::qualifier)0> >::Above(unsigned int) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<4, double, (glm::qualifier)0> >::Above(unsigned int) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
ernie::(anonymous namespace)::Resolver<int>::Above(unsigned int) const:
✓ Branch 0 taken 67 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 67 times.
✗ Branch 4 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<ernie::Target, std::allocator<ernie::Target> > >::Above(unsigned int) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<float, std::allocator<float> > >::Above(unsigned int) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<unsigned int, std::allocator<unsigned int> > >::Above(unsigned int) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
ernie::(anonymous namespace)::Resolver<unsigned char>::Above(unsigned int) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
ernie::(anonymous namespace)::Resolver<unsigned int>::Above(unsigned int) const:
✓ Branch 0 taken 134 times.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 134 times.
|
204 |
if (const T* own = prim ? Own(*prim) : nullptr) { |
| 39 |
|
67 |
return *own; |
| 40 |
|
|
} |
| 41 |
|
|
} |
| 42 |
|
27527 |
return fallback; |
| 43 |
|
|
} |
| 44 |
|
|
|
| 45 |
|
|
/// Resolves the subtree at `root`, descending past a prim only while its value changes or it |
| 46 |
|
|
/// is one of `roots`, which it clears as it reaches them. |
| 47 |
|
27594 |
void Subtree(PathId root, BitSet& roots) { |
| 48 |
0/12
ernie::(anonymous namespace)::Resolver<std::vector<ernie::Target, std::allocator<ernie::Target> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<float, std::allocator<float> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<unsigned int, std::allocator<unsigned int> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
|
27594 |
std::vector<std::pair<PathId, T>> pending{{root, Above(root)}}; |
| 49 |
6/26
ernie::(anonymous namespace)::Resolver<double>::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<ernie::Target>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 0 taken 697 times.
✓ Branch 1 taken 556 times.
ernie::(anonymous namespace)::Resolver<glm::mat<4, 4, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<glm::qua<double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<2, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<3, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<4, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<int>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 0 taken 9153 times.
✓ Branch 1 taken 9012 times.
ernie::(anonymous namespace)::Resolver<std::vector<ernie::Target, std::allocator<ernie::Target> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 2 not taken.
✗ Branch 3 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<float, std::allocator<float> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 2 not taken.
✗ Branch 3 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<unsigned int, std::allocator<unsigned int> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 2 not taken.
✗ Branch 3 not taken.
ernie::(anonymous namespace)::Resolver<unsigned char>::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<unsigned int>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 0 taken 18314 times.
✓ Branch 1 taken 18026 times.
|
55758 |
while (!pending.empty()) { |
| 50 |
|
28164 |
const auto [path, above] = std::move(pending.back()); |
| 51 |
|
28164 |
pending.pop_back(); |
| 52 |
3/26
ernie::(anonymous namespace)::Resolver<double>::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<ernie::Target>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 1 taken 697 times.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<glm::mat<4, 4, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<glm::qua<double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<2, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<3, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<4, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<int>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 1 taken 9153 times.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<ernie::Target, std::allocator<ernie::Target> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<float, std::allocator<float> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<unsigned int, std::allocator<unsigned int> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<unsigned char>::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<unsigned int>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 1 taken 18314 times.
✗ Branch 2 not taken.
|
28164 |
const std::optional<PrimId> prim = store.Find(path); |
| 53 |
3/26
ernie::(anonymous namespace)::Resolver<double>::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<ernie::Target>::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✓ Branch 1 taken 697 times.
ernie::(anonymous namespace)::Resolver<glm::mat<4, 4, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<glm::qua<double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<2, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<3, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<4, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<int>::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✓ Branch 1 taken 9153 times.
ernie::(anonymous namespace)::Resolver<std::vector<ernie::Target, std::allocator<ernie::Target> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<float, std::allocator<float> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<unsigned int, std::allocator<unsigned int> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<unsigned char>::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<unsigned int>::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✓ Branch 1 taken 18314 times.
|
28164 |
if (!prim) { |
| 54 |
|
✗ |
continue; |
| 55 |
|
|
} |
| 56 |
|
28164 |
const bool isRoot = roots.Test(path); |
| 57 |
3/26
ernie::(anonymous namespace)::Resolver<double>::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 2 not taken.
✗ Branch 3 not taken.
ernie::(anonymous namespace)::Resolver<ernie::Target>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 2 taken 697 times.
✗ Branch 3 not taken.
ernie::(anonymous namespace)::Resolver<glm::mat<4, 4, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 2 not taken.
✗ Branch 3 not taken.
ernie::(anonymous namespace)::Resolver<glm::qua<double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 2 not taken.
✗ Branch 3 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<2, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 2 not taken.
✗ Branch 3 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<3, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 2 not taken.
✗ Branch 3 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<4, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 2 not taken.
✗ Branch 3 not taken.
ernie::(anonymous namespace)::Resolver<int>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 2 taken 9153 times.
✗ Branch 3 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<ernie::Target, std::allocator<ernie::Target> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 2 not taken.
✗ Branch 3 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<float, std::allocator<float> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 2 not taken.
✗ Branch 3 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<unsigned int, std::allocator<unsigned int> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 2 not taken.
✗ Branch 3 not taken.
ernie::(anonymous namespace)::Resolver<unsigned char>::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 2 not taken.
✗ Branch 3 not taken.
ernie::(anonymous namespace)::Resolver<unsigned int>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 2 taken 18314 times.
✗ Branch 3 not taken.
|
28164 |
roots.Set(path, false); |
| 58 |
3/26
ernie::(anonymous namespace)::Resolver<double>::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<ernie::Target>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 1 taken 697 times.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<glm::mat<4, 4, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<glm::qua<double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<2, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<3, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<4, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<int>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 1 taken 9153 times.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<ernie::Target, std::allocator<ernie::Target> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<float, std::allocator<float> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<unsigned int, std::allocator<unsigned int> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<unsigned char>::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<unsigned int>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 1 taken 18314 times.
✗ Branch 2 not taken.
|
28164 |
const T* own = Own(*prim); |
| 59 |
6/32
ernie::(anonymous namespace)::Resolver<double>::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<ernie::Target>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 0 taken 695 times.
✓ Branch 1 taken 2 times.
ernie::(anonymous namespace)::Resolver<glm::mat<4, 4, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<glm::qua<double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<2, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<3, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<4, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<int>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 9149 times.
ernie::(anonymous namespace)::Resolver<std::vector<ernie::Target, std::allocator<ernie::Target> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<float, std::allocator<float> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<unsigned int, std::allocator<unsigned int> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
ernie::(anonymous namespace)::Resolver<unsigned char>::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<unsigned int>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 18309 times.
|
28164 |
const T value = own != nullptr ? *own : above; |
| 60 |
|
|
// Prims without the column (typeless ones, materials) pass the value through. |
| 61 |
3/26
ernie::(anonymous namespace)::Resolver<double>::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<ernie::Target>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 1 taken 697 times.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<glm::mat<4, 4, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<glm::qua<double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<2, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<3, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<4, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<int>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 1 taken 9153 times.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<ernie::Target, std::allocator<ernie::Target> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<float, std::allocator<float> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<unsigned int, std::allocator<unsigned int> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<unsigned char>::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<unsigned int>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 1 taken 18314 times.
✗ Branch 2 not taken.
|
28164 |
const bool stored = store.GetBucket(store.PrimBucket(*prim)).Find(resolved) != nullptr; |
| 62 |
|
|
// An unchanged prim's descendants are unchanged too, unless they are roots themselves. |
| 63 |
14/78
ernie::(anonymous namespace)::Resolver<double>::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
ernie::(anonymous namespace)::Resolver<ernie::Target>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 1 taken 697 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 690 times.
✓ Branch 4 taken 7 times.
✓ Branch 5 taken 690 times.
✗ Branch 6 not taken.
ernie::(anonymous namespace)::Resolver<glm::mat<4, 4, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
ernie::(anonymous namespace)::Resolver<glm::qua<double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<2, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<3, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<4, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
ernie::(anonymous namespace)::Resolver<int>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 1 taken 9153 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 9043 times.
✓ Branch 4 taken 110 times.
✓ Branch 5 taken 9041 times.
✓ Branch 6 taken 2 times.
ernie::(anonymous namespace)::Resolver<std::vector<ernie::Target, std::allocator<ernie::Target> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<float, std::allocator<float> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<unsigned int, std::allocator<unsigned int> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
ernie::(anonymous namespace)::Resolver<unsigned char>::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
ernie::(anonymous namespace)::Resolver<unsigned int>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 1 taken 18314 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 18304 times.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 18298 times.
✓ Branch 6 taken 6 times.
|
28164 |
if (store.Derive(*prim, resolved, value) || isRoot || !stored) { |
| 64 |
3/26
ernie::(anonymous namespace)::Resolver<double>::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<ernie::Target>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 1 taken 697 times.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<glm::mat<4, 4, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<glm::qua<double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<2, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<3, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<4, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<int>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 1 taken 9151 times.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<ernie::Target, std::allocator<ernie::Target> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<float, std::allocator<float> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<unsigned int, std::allocator<unsigned int> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<unsigned char>::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<unsigned int>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 1 taken 18308 times.
✗ Branch 2 not taken.
|
28156 |
store.Paths().ForEachChild( |
| 65 |
3/26
ernie::(anonymous namespace)::Resolver<double>::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<ernie::Target>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 1 taken 697 times.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<glm::mat<4, 4, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<glm::qua<double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<2, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<3, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<4, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<int>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 1 taken 9151 times.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<ernie::Target, std::allocator<ernie::Target> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<float, std::allocator<float> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<unsigned int, std::allocator<unsigned int> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<unsigned char>::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<unsigned int>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 1 taken 18308 times.
✗ Branch 2 not taken.
|
28156 |
path, [&](PathId child) { pending.emplace_back(child, value); }); |
| 66 |
|
|
} |
| 67 |
|
|
} |
| 68 |
0/6
ernie::(anonymous namespace)::Resolver<std::vector<ernie::Target, std::allocator<ernie::Target> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 2 not taken.
✗ Branch 3 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<float, std::allocator<float> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 2 not taken.
✗ Branch 3 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<unsigned int, std::allocator<unsigned int> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
27594 |
} |
| 69 |
|
|
}; |
| 70 |
|
|
|
| 71 |
|
|
/// @return The paths of the prims whose subtrees resolve `attribute` again: those added or with |
| 72 |
|
|
/// it changed. |
| 73 |
|
248 |
BitSet Roots(const PrimStore& store, const ChangeSet& changes, AttributeId attribute) { |
| 74 |
|
248 |
BitSet roots; |
| 75 |
1/2
✓ Branch 1 taken 248 times.
✗ Branch 2 not taken.
|
248 |
roots.Resize(store.Paths().Size()); |
| 76 |
|
3894 |
const auto add = [&](BucketId bucket, std::uint32_t begin, std::uint32_t end) { |
| 77 |
|
3646 |
const Bucket& rows = store.GetBucket(bucket); |
| 78 |
4/4
✓ Branch 0 taken 356 times.
✓ Branch 1 taken 32476 times.
✓ Branch 2 taken 29186 times.
✓ Branch 3 taken 3646 times.
|
33188 |
for (std::uint32_t row = begin; row < std::min(end, rows.Rows()); ++row) { |
| 79 |
|
29186 |
roots.Set(store.PrimPath(rows.prims[row])); |
| 80 |
|
|
} |
| 81 |
|
3894 |
}; |
| 82 |
2/2
✓ Branch 0 taken 5376 times.
✓ Branch 1 taken 248 times.
|
5624 |
for (const ChangeSet::Rows& rows : changes.rows) { |
| 83 |
2/2
✓ Branch 0 taken 3452 times.
✓ Branch 1 taken 1924 times.
|
5376 |
if (rows.change.kind == StructuralChange::Kind::Added || |
| 84 |
|
|
rows.change.kind == StructuralChange::Kind::Reset) { |
| 85 |
1/2
✓ Branch 1 taken 3452 times.
✗ Branch 2 not taken.
|
3452 |
add(rows.bucket, rows.change.row, rows.change.row + rows.change.count); |
| 86 |
|
|
} |
| 87 |
|
|
} |
| 88 |
2/2
✓ Branch 0 taken 2444 times.
✓ Branch 1 taken 248 times.
|
2692 |
for (const ChangeSet::Values& values : changes.values) { |
| 89 |
2/2
✓ Branch 0 taken 134 times.
✓ Branch 1 taken 2310 times.
|
2444 |
if (values.attribute == attribute) { |
| 90 |
2/2
✓ Branch 0 taken 194 times.
✓ Branch 1 taken 134 times.
|
328 |
for (const RowRange range : values.rows) { |
| 91 |
1/2
✓ Branch 1 taken 194 times.
✗ Branch 2 not taken.
|
194 |
add(values.bucket, range.begin, range.end); |
| 92 |
|
|
} |
| 93 |
|
|
} |
| 94 |
|
|
} |
| 95 |
|
248 |
return roots; |
| 96 |
|
✗ |
} |
| 97 |
|
|
|
| 98 |
|
|
} // namespace |
| 99 |
|
|
|
| 100 |
|
62 |
void Scene::Resolve() { |
| 101 |
|
62 |
ERNIE_ZONE("Resolve inherited attributes"); |
| 102 |
1/2
✓ Branch 1 taken 62 times.
✗ Branch 2 not taken.
|
62 |
const ChangeSet changes = store_.ChangesSince(resolved_); |
| 103 |
3/4
✓ Branch 1 taken 62 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 248 times.
✓ Branch 4 taken 62 times.
|
310 |
for (const AttributeDef* def : InheritedAttributes()) { |
| 104 |
1/2
✓ Branch 1 taken 248 times.
✗ Branch 2 not taken.
|
248 |
const AttributeId attribute = store_.Tokens().Intern(def->name); |
| 105 |
|
248 |
WithColumnType(def->type, [&]<typename T>(std::type_identity<T>) { |
| 106 |
|
|
if constexpr (std::equality_comparable<T> && !std::same_as<T, Tensor>) { |
| 107 |
|
744 |
Resolver<T> resolver{ |
| 108 |
3/26
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<double>(std::type_identity<double>) const:
✗ Branch 2 not taken.
✗ Branch 3 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<ernie::Target>(std::type_identity<ernie::Target>) const:
✓ Branch 2 taken 62 times.
✗ Branch 3 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<glm::mat<4, 4, double, (glm::qualifier)0> >(std::type_identity<glm::mat<4, 4, double, (glm::qualifier)0> >) const:
✗ Branch 2 not taken.
✗ Branch 3 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<glm::qua<double, (glm::qualifier)0> >(std::type_identity<glm::qua<double, (glm::qualifier)0> >) const:
✗ Branch 2 not taken.
✗ Branch 3 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<glm::vec<2, double, (glm::qualifier)0> >(std::type_identity<glm::vec<2, double, (glm::qualifier)0> >) const:
✗ Branch 2 not taken.
✗ Branch 3 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<glm::vec<3, double, (glm::qualifier)0> >(std::type_identity<glm::vec<3, double, (glm::qualifier)0> >) const:
✗ Branch 2 not taken.
✗ Branch 3 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<glm::vec<4, double, (glm::qualifier)0> >(std::type_identity<glm::vec<4, double, (glm::qualifier)0> >) const:
✗ Branch 2 not taken.
✗ Branch 3 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<int>(std::type_identity<int>) const:
✓ Branch 2 taken 62 times.
✗ Branch 3 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<std::vector<ernie::Target, std::allocator<ernie::Target> > >(std::type_identity<std::vector<ernie::Target, std::allocator<ernie::Target> > >) const:
✗ Branch 2 not taken.
✗ Branch 3 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<std::vector<float, std::allocator<float> > >(std::type_identity<std::vector<float, std::allocator<float> > >) const:
✗ Branch 2 not taken.
✗ Branch 3 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<std::vector<unsigned int, std::allocator<unsigned int> > >(std::type_identity<std::vector<unsigned int, std::allocator<unsigned int> > >) const:
✗ Branch 2 not taken.
✗ Branch 3 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<unsigned char>(std::type_identity<unsigned char>) const:
✗ Branch 2 not taken.
✗ Branch 3 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<unsigned int>(std::type_identity<unsigned int>) const:
✓ Branch 2 taken 124 times.
✗ Branch 3 not taken.
|
248 |
store_, attribute, store_.Tokens().Intern(ResolvedName(def->name)), |
| 109 |
5/30
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<double>(std::type_identity<double>) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<ernie::Target>(std::type_identity<ernie::Target>) const:
✓ Branch 1 taken 62 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 62 times.
✗ Branch 4 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<glm::mat<4, 4, double, (glm::qualifier)0> >(std::type_identity<glm::mat<4, 4, double, (glm::qualifier)0> >) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<glm::qua<double, (glm::qualifier)0> >(std::type_identity<glm::qua<double, (glm::qualifier)0> >) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<glm::vec<2, double, (glm::qualifier)0> >(std::type_identity<glm::vec<2, double, (glm::qualifier)0> >) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<glm::vec<3, double, (glm::qualifier)0> >(std::type_identity<glm::vec<3, double, (glm::qualifier)0> >) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<glm::vec<4, double, (glm::qualifier)0> >(std::type_identity<glm::vec<4, double, (glm::qualifier)0> >) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<int>(std::type_identity<int>) const:
✓ Branch 0 taken 62 times.
✗ Branch 1 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<std::vector<ernie::Target, std::allocator<ernie::Target> > >(std::type_identity<std::vector<ernie::Target, std::allocator<ernie::Target> > >) const:
✗ Branch 1 not taken.
✗ Branch 2 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<std::vector<float, std::allocator<float> > >(std::type_identity<std::vector<float, std::allocator<float> > >) const:
✗ Branch 1 not taken.
✗ Branch 2 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<std::vector<unsigned int, std::allocator<unsigned int> > >(std::type_identity<std::vector<unsigned int, std::allocator<unsigned int> > >) const:
✗ Branch 1 not taken.
✗ Branch 2 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<unsigned char>(std::type_identity<unsigned char>) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<unsigned int>(std::type_identity<unsigned int>) const:
✓ Branch 1 taken 124 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 124 times.
✗ Branch 4 not taken.
|
496 |
ToElement<T>(store_.Paths(), def->fallback).value_or(T{}), inherited_}; |
| 110 |
0/6
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<std::vector<ernie::Target, std::allocator<ernie::Target> > >(std::type_identity<std::vector<ernie::Target, std::allocator<ernie::Target> > >) const:
✗ Branch 1 not taken.
✗ Branch 2 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<std::vector<float, std::allocator<float> > >(std::type_identity<std::vector<float, std::allocator<float> > >) const:
✗ Branch 1 not taken.
✗ Branch 2 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<std::vector<unsigned int, std::allocator<unsigned int> > >(std::type_identity<std::vector<unsigned int, std::allocator<unsigned int> > >) const:
✗ Branch 1 not taken.
✗ Branch 2 not taken.
|
248 |
BitSet roots = Roots(store_, changes, attribute); |
| 111 |
|
|
// Ancestors intern first, so most roots are reached from one above them. |
| 112 |
|
248 |
const BitSet start = roots; |
| 113 |
3/26
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<double>(std::type_identity<double>) const:
✗ Branch 1 not taken.
✗ Branch 2 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<ernie::Target>(std::type_identity<ernie::Target>) const:
✓ Branch 1 taken 62 times.
✗ Branch 2 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<glm::mat<4, 4, double, (glm::qualifier)0> >(std::type_identity<glm::mat<4, 4, double, (glm::qualifier)0> >) const:
✗ Branch 1 not taken.
✗ Branch 2 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<glm::qua<double, (glm::qualifier)0> >(std::type_identity<glm::qua<double, (glm::qualifier)0> >) const:
✗ Branch 1 not taken.
✗ Branch 2 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<glm::vec<2, double, (glm::qualifier)0> >(std::type_identity<glm::vec<2, double, (glm::qualifier)0> >) const:
✗ Branch 1 not taken.
✗ Branch 2 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<glm::vec<3, double, (glm::qualifier)0> >(std::type_identity<glm::vec<3, double, (glm::qualifier)0> >) const:
✗ Branch 1 not taken.
✗ Branch 2 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<glm::vec<4, double, (glm::qualifier)0> >(std::type_identity<glm::vec<4, double, (glm::qualifier)0> >) const:
✗ Branch 1 not taken.
✗ Branch 2 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<int>(std::type_identity<int>) const:
✓ Branch 1 taken 62 times.
✗ Branch 2 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<std::vector<ernie::Target, std::allocator<ernie::Target> > >(std::type_identity<std::vector<ernie::Target, std::allocator<ernie::Target> > >) const:
✗ Branch 1 not taken.
✗ Branch 2 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<std::vector<float, std::allocator<float> > >(std::type_identity<std::vector<float, std::allocator<float> > >) const:
✗ Branch 1 not taken.
✗ Branch 2 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<std::vector<unsigned int, std::allocator<unsigned int> > >(std::type_identity<std::vector<unsigned int, std::allocator<unsigned int> > >) const:
✗ Branch 1 not taken.
✗ Branch 2 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<unsigned char>(std::type_identity<unsigned char>) const:
✗ Branch 1 not taken.
✗ Branch 2 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<unsigned int>(std::type_identity<unsigned int>) const:
✓ Branch 1 taken 124 times.
✗ Branch 2 not taken.
|
248 |
start.ForEachRun([&](std::size_t begin, std::size_t end) { |
| 114 |
|
|
for (std::size_t path = begin; path < end; ++path) { |
| 115 |
|
|
if (roots.Test(path)) { |
| 116 |
|
|
resolver.Subtree(static_cast<PathId>(path), roots); |
| 117 |
|
|
} |
| 118 |
|
|
} |
| 119 |
|
|
}); |
| 120 |
|
248 |
} |
| 121 |
|
248 |
}); |
| 122 |
|
|
} |
| 123 |
|
|
// Its own writes are to resolved columns, which no resolve reads. |
| 124 |
|
62 |
resolved_ = store_.Version(); |
| 125 |
|
62 |
} |
| 126 |
|
|
|
| 127 |
|
|
} // namespace ernie |
| 128 |
|
|
|