/* SPDX-FileCopyrightText: 2023 Blender Authors * * SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #ifdef WITH_OPENVDB # include # include # include # include "BLI_bounds_types.hh" # include "BLI_math_matrix_types.hh" # include "BLI_math_vector_types.hh" # include "BLI_string_ref.hh" # include "BKE_volume_enums.hh" struct Volume; blender::bke::VolumeGridData *BKE_volume_grid_add_vdb(Volume &volume, blender::StringRef name, openvdb::GridBase::Ptr vdb_grid); std::optional> BKE_volume_grid_bounds( openvdb::GridBase::ConstPtr grid); /** * Return a new grid pointer with only the metadata and transform changed. * This is useful for instances, where there is a separate transform on top of the original * grid transform that must be applied for some operations that only take a grid argument. */ openvdb::GridBase::ConstPtr BKE_volume_grid_shallow_transform(openvdb::GridBase::ConstPtr grid, const blender::float4x4 &transform); template auto BKE_volume_grid_type_operation(const VolumeGridType grid_type, OpType &&op) { switch (grid_type) { case VOLUME_GRID_FLOAT: return op.template operator()(); case VOLUME_GRID_VECTOR_FLOAT: return op.template operator()(); case VOLUME_GRID_BOOLEAN: return op.template operator()(); case VOLUME_GRID_DOUBLE: return op.template operator()(); case VOLUME_GRID_INT: return op.template operator()(); case VOLUME_GRID_INT64: return op.template operator()(); case VOLUME_GRID_VECTOR_INT: return op.template operator()(); case VOLUME_GRID_VECTOR_DOUBLE: return op.template operator()(); case VOLUME_GRID_MASK: return op.template operator()(); case VOLUME_GRID_POINTS: return op.template operator()(); case VOLUME_GRID_UNKNOWN: break; } /* Should never be called. */ BLI_assert_msg(0, "should never be reached"); return op.template operator()(); } openvdb::GridBase::Ptr BKE_volume_grid_create_with_changed_resolution( const VolumeGridType grid_type, const openvdb::GridBase &old_grid, float resolution_factor); #endif