[Bf-blender-cvs] [95e34d2ebf4] mesh-to-volume-modifier: Volume: use meshToVolume for conversion
Jacques Lucke
noreply at git.blender.org
Thu Sep 24 14:03:54 CEST 2020
Commit: 95e34d2ebf48af3650989fc9f11f703115bae0f7
Author: Jacques Lucke
Date: Thu Sep 24 13:35:22 2020 +0200
Branches: mesh-to-volume-modifier
https://developer.blender.org/rB95e34d2ebf48af3650989fc9f11f703115bae0f7
Volume: use meshToVolume for conversion
===================================================================
M source/blender/makesrna/intern/rna_modifier.c
M source/blender/modifiers/intern/MOD_mesh_to_volume.cc
===================================================================
diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
index 367401addf6..a552d90cfd3 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -7118,7 +7118,7 @@ static void rna_def_modifier_mesh_to_volume(BlenderRNA *brna)
prop = RNA_def_property(srna, "voxel_size", PROP_FLOAT, PROP_NONE);
RNA_def_property_ui_text(
prop, "Voxel Size", "The smaller this number the higher the resolution of the output");
- RNA_def_property_range(prop, 0.001, FLT_MAX);
+ RNA_def_property_range(prop, 0.1, FLT_MAX);
RNA_def_property_update(prop, 0, "rna_Modifier_update");
RNA_define_lib_overridable(false);
diff --git a/source/blender/modifiers/intern/MOD_mesh_to_volume.cc b/source/blender/modifiers/intern/MOD_mesh_to_volume.cc
index 55fd4d8fbe5..30336472105 100644
--- a/source/blender/modifiers/intern/MOD_mesh_to_volume.cc
+++ b/source/blender/modifiers/intern/MOD_mesh_to_volume.cc
@@ -45,12 +45,60 @@
#include "BLI_float4x4.hh"
#include "BLI_index_range.hh"
+#include "BLI_span.hh"
#ifdef WITH_OPENVDB
# include <openvdb/openvdb.h>
# include <openvdb/tools/MeshToVolume.h>
#endif
+#ifdef WITH_OPENVDB
+namespace blender {
+class OpenVDBMeshAdapter {
+ private:
+ Span<MVert> vertices_;
+ Span<MLoop> loops_;
+ Span<MLoopTri> looptris_;
+ float4x4 transform_;
+
+ public:
+ OpenVDBMeshAdapter(Mesh &mesh, float4x4 transform)
+ : vertices_(mesh.mvert, mesh.totvert),
+ loops_(mesh.mloop, mesh.totloop),
+ transform_(transform)
+ {
+ const MLoopTri *looptries = BKE_mesh_runtime_looptri_ensure(&mesh);
+ const int looptries_len = BKE_mesh_runtime_looptri_len(&mesh);
+ looptris_ = Span(looptries, looptries_len);
+ }
+
+ size_t polygonCount() const
+ {
+ return static_cast<size_t>(looptris_.size());
+ }
+
+ size_t pointCount() const
+ {
+ return static_cast<size_t>(vertices_.size());
+ }
+
+ size_t vertexCount(size_t UNUSED(polygon_index)) const
+ {
+ /* All polygons are triangles. */
+ return 3;
+ }
+
+ void getIndexSpacePoint(size_t polygon_index, size_t vertex_index, openvdb::Vec3d &pos) const
+ {
+ const MLoopTri &looptri = looptris_[polygon_index];
+ const MVert &vertex = vertices_[loops_[looptri.tri[vertex_index]].v];
+ const float3 transformed_co = transform_ * float3(vertex.co);
+ pos = &transformed_co.x;
+ }
+};
+} // namespace blender
+#endif
+
static void initData(ModifierData *md)
{
MeshToVolumeModifierData *mvmd = reinterpret_cast<MeshToVolumeModifierData *>(md);
@@ -112,34 +160,20 @@ static Volume *modifyVolume(ModifierData *md, const ModifierEvalContext *ctx, Vo
return input_volume;
}
- Mesh *mesh = static_cast<Mesh *>(mvmd->object->data);
- const MLoopTri *looptris = BKE_mesh_runtime_looptri_ensure(mesh);
- const int looptris_len = BKE_mesh_runtime_looptri_len(mesh);
-
- float4x4 obmat = mvmd->object->obmat;
- mul_m4_m4_pre(obmat.values, ctx->object->imat);
- mul_m4_fl(obmat.values, 1.0f / mvmd->voxel_size);
- obmat.values[3][3] = 1.0f;
+ Object *object_to_convert = mvmd->object;
+ Mesh *mesh = static_cast<Mesh *>(object_to_convert->data);
+ const float voxel_size = mvmd->voxel_size;
+ UNUSED_VARS(voxel_size);
- std::vector<openvdb::Vec3s> vertices(mesh->totvert);
- for (const int i : IndexRange(mesh->totvert)) {
- float3 position = obmat * float3(mesh->mvert[i].co);
- vertices[i] = &position.x;
- }
+ float4x4 transform;
+ scale_m4_fl(transform.values, 1.0f / voxel_size);
+ mul_m4_m4_post(transform.values, ctx->object->imat);
+ mul_m4_m4_post(transform.values, object_to_convert->obmat);
- std::vector<openvdb::Vec3I> triangle_indices(looptris_len);
- for (const int i : IndexRange(looptris_len)) {
- const MLoopTri &tri = looptris[i];
- triangle_indices[i] = {
- mesh->mloop[tri.tri[0]].v,
- mesh->mloop[tri.tri[1]].v,
- mesh->mloop[tri.tri[2]].v,
- };
- }
+ OpenVDBMeshAdapter mesh_adapter{*mesh, transform};
- const openvdb::math::Transform xform;
- openvdb::FloatGrid::Ptr new_grid = openvdb::tools::meshToLevelSet<openvdb::FloatGrid>(
- xform, vertices, triangle_indices);
+ openvdb::FloatGrid::Ptr new_grid = openvdb::tools::meshToVolume<openvdb::FloatGrid>(
+ mesh_adapter, {}, 1.0f, 1.0f);
Volume *volume = BKE_volume_new_for_eval(input_volume);
VolumeGrid *c_density_grid = BKE_volume_grid_add(volume, "density", VOLUME_GRID_FLOAT);
More information about the Bf-blender-cvs
mailing list