10# include <openvdb/math/Transform.h>
14VoxelFieldContext::VoxelFieldContext(
const openvdb::math::Transform &
transform,
15 const Span<openvdb::Coord> voxels)
20GVArray VoxelFieldContext::get_varray_for_input(
const fn::FieldInput &field_input,
22 ResourceScope & )
const
24 const bke::AttributeFieldInput *attribute_field_input =
25 dynamic_cast<const bke::AttributeFieldInput *
>(&field_input);
26 if (!attribute_field_input) {
29 if (attribute_field_input->attribute_name() !=
"position") {
34 Array<float3> positions(voxels_.size());
35 threading::parallel_for(positions.index_range(), 1024, [&](
const IndexRange
range) {
36 for (const int64_t i : range) {
37 const openvdb::Coord &voxel = voxels_[i];
38 const openvdb::Vec3d position = transform_.indexToWorld(voxel);
39 positions[i] = float3(position.x(), position.y(), position.z());
42 return VArray<float3>::ForContainer(std::move(positions));
45TilesFieldContext::TilesFieldContext(
const openvdb::math::Transform &
transform,
46 const Span<openvdb::CoordBBox>
tiles)
51GVArray TilesFieldContext::get_varray_for_input(
const fn::FieldInput &field_input,
53 ResourceScope & )
const
55 const bke::AttributeFieldInput *attribute_field_input =
56 dynamic_cast<const bke::AttributeFieldInput *
>(&field_input);
57 if (attribute_field_input ==
nullptr) {
60 if (attribute_field_input->attribute_name() !=
"position") {
65 Array<float3> positions(tiles_.size());
66 threading::parallel_for(positions.index_range(), 1024, [&](
const IndexRange
range) {
67 for (const int64_t i : range) {
68 const openvdb::CoordBBox &tile = tiles_[i];
69 const openvdb::Vec3d position = transform_.indexToWorld(tile.getCenter());
70 positions[i] = float3(position.x(), position.y(), position.z());
73 return VArray<float3>::ForContainer(std::move(positions));
SIMD_FORCE_INLINE btVector3 transform(const btVector3 &point) const
ccl_gpu_kernel_postfix ccl_global KernelWorkTile * tiles