14#include <lagrange/MeshTrait.h>
15#include <lagrange/bvh/BVHNanoflann.h>
16#include <lagrange/common.h>
18#include <tbb/parallel_for.h>
43template <
typename SourceMeshType,
typename TargetMeshType>
44void project_attributes_closest_vertex(
45 const SourceMeshType &source,
46 TargetMeshType &target,
47 const std::vector<std::string> &names,
48 std::function<
bool(IndexOf<TargetMeshType>)> skip_vertex =
nullptr)
50 static_assert(MeshTrait<SourceMeshType>::is_mesh(),
"Input type is not Mesh");
51 static_assert(MeshTrait<TargetMeshType>::is_mesh(),
"Output type is not Mesh");
53 using VertexArray =
typename SourceMeshType::VertexArray;
54 using BVH_t = BVHNanoflann<VertexArray>;
55 using Index =
typename TargetMeshType::Index;
56 using SourceArray =
typename SourceMeshType::AttributeArray;
57 using TargetArray =
typename SourceMeshType::AttributeArray;
59 auto engine = std::make_unique<BVH_t>();
60 engine->build(source.get_vertices());
63 std::vector<const SourceArray *> source_attrs(names.size());
64 std::vector<TargetArray> target_attrs(names.size());
65 for (
size_t k = 0; k < names.size(); ++k) {
66 const auto &name = names[k];
68 source_attrs[k] = &source.get_vertex_attribute(name);
69 if (target.has_vertex_attribute(name)) {
70 target.export_vertex_attribute(name, target_attrs[k]);
72 target_attrs[k].resize(target.get_num_vertices(), source_attrs[k]->cols());
76 tbb::parallel_for(Index(0), target.get_num_vertices(), [&](Index i) {
77 if (skip_vertex && skip_vertex(i)) {
78 logger().trace(
"skipping vertex: {}", i);
81 auto res = engine->query_closest_point(target.get_vertices().row(i));
82 for (
size_t k = 0; k < source_attrs.size(); ++k) {
83 target_attrs[k].row(i) = source_attrs[k]->row(res.closest_vertex_idx);
89 for (
size_t k = 0; k < names.size(); ++k) {
90 const auto &name = names[k];
91 target.add_vertex_attribute(name);
92 target.import_vertex_attribute(name, target_attrs[k]);
#define la_runtime_assert(...)
Runtime assertion check.
Definition: assert.h:169
Main namespace for Lagrange.
Definition: AABBIGL.h:30