55 # include <openvdb/openvdb.h>
56 # include <openvdb/tools/MeshToVolume.h>
62 class OpenVDBMeshAdapter {
64 Span<MVert> vertices_;
66 Span<MLoopTri> looptris_;
71 : vertices_(
mesh.mvert,
mesh.totvert),
77 looptris_ = Span(looptries, looptries_len);
80 size_t polygonCount()
const
82 return static_cast<size_t>(looptris_.size());
85 size_t pointCount()
const
87 return static_cast<size_t>(vertices_.size());
90 size_t vertexCount(
size_t UNUSED(polygon_index))
const
96 void getIndexSpacePoint(
size_t polygon_index,
size_t vertex_index,
openvdb::Vec3d &
pos)
const
98 const MLoopTri &looptri = looptris_[polygon_index];
99 const MVert &vertex = vertices_[loops_[looptri.
tri[vertex_index]].v];
101 pos = &transformed_co.
x;
147 uiItemR(layout,
ptr,
"object", 0,
nullptr, ICON_NONE);
148 uiItemR(layout,
ptr,
"density", 0,
nullptr, ICON_NONE);
153 uiItemR(
col,
ptr,
"exterior_band_width", 0,
nullptr, ICON_NONE);
157 uiItemR(subcol,
ptr,
"interior_band_width", 0,
nullptr, ICON_NONE);
186 if (volume_simplify == 0.0f) {
202 const float voxel_size = approximate_volume_side_length / mvmd->
voxel_amount / volume_simplify;
215 if (object_to_convert ==
nullptr) {
219 if (
mesh ==
nullptr) {
226 const float voxel_size = compute_voxel_size(ctx, mvmd, mesh_to_own_object_space_transform);
227 if (voxel_size == 0.0f) {
231 float4x4 mesh_to_index_space_transform;
237 OpenVDBMeshAdapter mesh_adapter{*
mesh, mesh_to_index_space_transform};
243 openvdb::FloatGrid::Ptr new_grid;
246 new_grid = openvdb::tools::meshToVolume<openvdb::FloatGrid>(
247 mesh_adapter, {}, exterior_band_width, FLT_MAX);
250 new_grid = openvdb::tools::meshToVolume<openvdb::FloatGrid>(
251 mesh_adapter, {}, exterior_band_width, interior_band_width);
257 openvdb::FloatGrid::Ptr density_grid = openvdb::gridPtrCast<openvdb::FloatGrid>(
258 BKE_volume_grid_openvdb_for_write(volume, c_density_grid,
false));
262 density_grid->merge(*new_grid);
265 density_grid->transform().postScale(voxel_size);
269 density_grid->beginValueOn(),
270 [&](
const openvdb::FloatGrid::ValueOnIter &iter) { iter.setValue(mvmd->density); });
283 "MeshToVolumeModifierData",
const struct MLoopTri * BKE_mesh_runtime_looptri_ensure(struct Mesh *mesh)
int BKE_mesh_runtime_looptri_len(const struct Mesh *mesh)
void BKE_mesh_wrapper_ensure_mdata(struct Mesh *me)
void(* IDWalkFunc)(void *userData, struct Object *ob, struct ID **idpoin, int cb_flag)
void BKE_modifier_copydata_generic(const struct ModifierData *md, struct ModifierData *md_dst, const int flag)
@ eModifierTypeType_Constructive
void BKE_modifier_set_error(const struct Object *ob, struct ModifierData *md, const char *format,...) ATTR_PRINTF_FORMAT(3
struct Mesh * BKE_modifier_get_evaluated_mesh_from_evaluated_object(struct Object *ob_eval, const bool get_cage_mesh)
General operations, lookup, etc. for blender objects.
struct BoundBox * BKE_object_boundbox_get(struct Object *ob)
struct VolumeGrid * BKE_volume_grid_add(struct Volume *volume, const char *name, VolumeGridType type)
struct Volume * BKE_volume_new_for_eval(const struct Volume *volume_src)
float BKE_volume_simplify_factor(const struct Depsgraph *depsgraph)
void scale_m4_fl(float R[4][4], float scale)
void mul_m4_m4_post(float R[4][4], const float B[4][4])
MINLINE void add_v3_fl(float r[3], float f)
void DEG_add_object_relation(struct DepsNodeHandle *node_handle, struct Object *object, eDepsObjectComponentType component, const char *description)
void DEG_add_modifier_to_transform_relation(struct DepsNodeHandle *node_handle, const char *description)
struct MeshToVolumeModifierData MeshToVolumeModifierData
@ eModifierType_MeshToVolume
@ MESH_TO_VOLUME_RESOLUTION_MODE_VOXEL_SIZE
@ MESH_TO_VOLUME_RESOLUTION_MODE_VOXEL_AMOUNT
Object is a sort of wrapper for general info.
Read Guarded memory(de)allocation.
static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
ModifierTypeInfo modifierType_MeshToVolume
static void foreachIDLink(ModifierData *md, Object *ob, IDWalkFunc walk, void *userData)
static Volume * modifyVolume(ModifierData *md, const ModifierEvalContext *ctx, Volume *input_volume)
static void panel_draw(const bContext *UNUSED(C), Panel *panel)
static void initData(ModifierData *md)
static void panelRegister(ARegionType *region_type)
PointerRNA * modifier_panel_get_property_pointers(Panel *panel, PointerRNA *r_ob_ptr)
void modifier_panel_end(uiLayout *layout, PointerRNA *ptr)
PanelType * modifier_panel_register(ARegionType *region_type, ModifierType type, PanelDrawFn draw)
StructRNA RNA_MeshToVolumeModifier
void uiLayoutSetActive(uiLayout *layout, bool active)
uiLayout * uiLayoutColumn(uiLayout *layout, bool align)
void uiLayoutSetPropSep(uiLayout *layout, bool is_sep)
void uiItemR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int flag, const char *name, int icon)
SIMD_FORCE_INLINE btVector3 transform(const btVector3 &point) const
VecMat::Vec3< double > Vec3d
float exterior_band_width
float interior_band_width
struct Depsgraph * depsgraph
struct DepsNodeHandle * node
static float distance(const float3 &a, const float3 &b)