120 const int3 resolution =
int3(
params.extract_input<
int>(
"Resolution X"),
121 params.extract_input<
int>(
"Resolution Y"),
122 params.extract_input<
int>(
"Resolution Z"));
124 if (resolution.x < 2 || resolution.y < 2 || resolution.z < 2) {
125 params.error_message_add(NodeWarningType::Error,
TIP_(
"Resolution must be greater than 1"));
126 params.set_default_remaining_outputs();
130 if (bounds_min.x == bounds_max.x || bounds_min.y == bounds_max.y || bounds_min.z == bounds_max.z)
132 params.error_message_add(NodeWarningType::Error,
133 TIP_(
"Bounding box volume must be greater than 0"));
134 params.set_default_remaining_outputs();
140 params.error_message_add(NodeWarningType::Warning,
141 TIP_(
"Volume scale is lower than permitted by OpenVDB"));
142 params.set_default_remaining_outputs();
156 const float background =
params.extract_input<
float>(
"Background");
157 openvdb::FloatGrid::Ptr grid = openvdb::FloatGrid::create(background);
158 grid->setGridClass(openvdb::GRID_FOG_VOLUME);
160 openvdb::tools::Dense<float, openvdb::tools::LayoutZYX> dense_grid{
161 openvdb::math::CoordBBox({0, 0, 0}, {resolution.x - 1, resolution.y - 1, resolution.z - 1}),
163 openvdb::tools::copyFromDense(dense_grid, *grid, 0.0f);
165 grid->transform().preTranslate(openvdb::math::Vec3<float>(-0.5f));
166 grid->transform().postScale(openvdb::math::Vec3<double>(scale_fac.x, scale_fac.y, scale_fac.z));
167 grid->transform().postTranslate(
168 openvdb::math::Vec3<float>(bounds_min.x, bounds_min.y, bounds_min.z));
171 BKE_volume_grid_add_vdb(*volume,
"density", std::move(grid));
175 params.set_output(
"Volume", r_geometry_set);