12# include <openvdb/math/Transform.h>
16VoxelFieldContext::VoxelFieldContext(
const openvdb::math::Transform &
transform,
17 const Span<openvdb::Coord> voxels)
22GVArray VoxelFieldContext::get_varray_for_input(
const fn::FieldInput &field_input,
26 if (
const auto *attribute_field =
dynamic_cast<const bke::AttributeFieldInput *
>(&field_input)) {
27 if (attribute_field->attribute_name() ==
"position") {
30 threading::parallel_for(positions.index_range(), 1024, [&](
const IndexRange range) {
31 for (const int64_t i : range) {
32 const openvdb::Coord &voxel = voxels_[i];
33 const openvdb::Vec3d position = transform_.indexToWorld(voxel);
34 positions[i] = float3(position.x(), position.y(), position.z());
40 if (
dynamic_cast<const fn::IndexFieldInput *
>(&field_input)) {
43 return field_input.get_varray_for_context(*
this,
mask, scope);
46TilesFieldContext::TilesFieldContext(
const openvdb::math::Transform &
transform,
52GVArray TilesFieldContext::get_varray_for_input(
const fn::FieldInput &field_input,
56 if (
const auto *attribute_field =
dynamic_cast<const bke::AttributeFieldInput *
>(&field_input)) {
57 if (attribute_field->attribute_name() ==
"position") {
60 threading::parallel_for(positions.index_range(), 1024, [&](
const IndexRange range) {
61 for (const int64_t i : range) {
62 const openvdb::CoordBBox &tile = tiles_[i];
63 const openvdb::Vec3d position = transform_.indexToWorld(tile.getCenter());
64 positions[i] = float3(position.x(), position.y(), position.z());
70 if (
dynamic_cast<const fn::IndexFieldInput *
>(&field_input)) {
73 return field_input.get_varray_for_context(*
this,
mask, scope);
76VoxelCoordinateFieldInput::VoxelCoordinateFieldInput(
const math::Axis axis)
77 : fn::FieldInput(
CPPType::
get<int>(),
TIP_(
"Voxel Coordinate")), axis_(axis)
81GVArray VoxelCoordinateFieldInput::get_varray_for_context(
const fn::FieldContext &context,
85 if (
const auto *voxel_context =
dynamic_cast<const VoxelFieldContext *
>(&context)) {
88 mask.foreach_index_optimized<
int>([&](
const int i) {
result[
i] = voxels[
i][axis_.as_int()]; });
91 if (
const auto *tiles_context =
dynamic_cast<const TilesFieldContext *
>(&context)) {
94 mask.foreach_index_optimized<
int>(
101VoxelExtentFieldInput::VoxelExtentFieldInput(
const math::Axis axis)
102 : fn::FieldInput(
CPPType::
get<int>(),
TIP_(
"Voxel Extent")), axis_(axis)
106GVArray VoxelExtentFieldInput::get_varray_for_context(
const fn::FieldContext &context,
110 if (
dynamic_cast<const VoxelFieldContext *
>(&context)) {
113 if (
const auto *tiles_context =
dynamic_cast<const TilesFieldContext *
>(&context)) {
116 mask.foreach_index_optimized<
int>(
117 [&](
const int i) {
result[
i] =
tiles[
i].dim()[axis_.as_int()]; });
123IsTileFieldInput::IsTileFieldInput() : fn::FieldInput(
CPPType::
get<bool>(),
TIP_(
"Is Tile")) {}
125GVArray IsTileFieldInput::get_varray_for_context(
const fn::FieldContext &context,
129 if (
dynamic_cast<const VoxelFieldContext *
>(&context)) {
132 if (
dynamic_cast<const TilesFieldContext *
>(&context)) {
SIMD_FORCE_INLINE btVector3 transform(const btVector3 &point) const
static VArray from_single(T value, const int64_t size)
static VArray from_container(ContainerT container)
ccl_gpu_kernel_postfix ccl_global KernelWorkTile * tiles
ccl_device_inline float2 mask(const MaskType mask, const float2 a)
std::shared_ptr< const T > get(const GenericKey &key, FunctionRef< std::unique_ptr< T >()> compute_fn)