我有一个 openvdb 网格,我想使用仿函数和 openvdb::tools::foreach 对其进行迭代。
//the grid I am iterating on
Grid G;
//the operator used to update each single voxel of G
struct Functor{
inline void operator()(const Grid::ValueOnCIter& iter) const {
}
};
如果只涉及 GI 的操作可以简单地调用
Functor op;
openvdb::tools::foreach(visibleGrid->cbeginValueOn(), op, true, true);
尽管我需要根据迭代步骤的计算值访问和修改其他网格,但在每个体素(迭代)处。
我的初始解决方案涉及向函子提供附加网格的访问器:
struct Functor{
Grid2::Accessor grid2_accessor;
Functor( Grid2::Accessor& a) : grid2_accessor(a){}
inline void operator()(const Grid::ValueOnCIter& iter) const {
//use grid2_accessor based on iter.getCoord()
}
};
访问器在构造时提供给 Functor,此外并行的每个线程都提供了 functor 的副本:
Functor op(G2->getAccessor() );
openvdb::tools::foreach(G1->cbeginValueOn(), op, true, **false**);
不幸的是,这个解决方案不起作用,因为:
- 访问器不能是 const 才能被访问
- 但是 Functor::operator() 必须是一个 const 方法才能被 tools::foreach 使用
第二个肮脏的解决方案是将 Functor 访问器副本声明为可变的。由于 openvdb 断言失败(很可能是内存泄漏),此解决方案在 Debug 中不起作用。
有解决问题的方法吗?例如不需要 operator() 为 const 的 tools::foreach。