[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