[Bf-blender-cvs] [9ac3964be19] master: OpenVDB: mesh/level set conversion, filters and CSG operations

Pablo Dobarro noreply at git.blender.org
Wed Aug 14 18:17:43 CEST 2019


Commit: 9ac3964be198a9bcbbcf2cda2ecd99047eae560f
Author: Pablo Dobarro
Date:   Wed Aug 14 17:46:20 2019 +0200
Branches: master
https://developer.blender.org/rB9ac3964be198a9bcbbcf2cda2ecd99047eae560f

OpenVDB: mesh/level set conversion, filters and CSG operations

This code is needed to implement the Voxel Remesher as well as other features like a better remesh modifier with filters and CSG operations.

Done by Martin Felke and Pablo Dobarro

Reviewed By: brecht

Differential Revision: https://developer.blender.org/D5364

===================================================================

M	intern/openvdb/CMakeLists.txt
A	intern/openvdb/intern/openvdb_level_set.cc
A	intern/openvdb/intern/openvdb_level_set.h
A	intern/openvdb/intern/openvdb_transform.cc
A	intern/openvdb/intern/openvdb_transform.h
M	intern/openvdb/openvdb_capi.cc
M	intern/openvdb/openvdb_capi.h

===================================================================

diff --git a/intern/openvdb/CMakeLists.txt b/intern/openvdb/CMakeLists.txt
index bcb1d545c94..412dade0f1a 100644
--- a/intern/openvdb/CMakeLists.txt
+++ b/intern/openvdb/CMakeLists.txt
@@ -21,6 +21,7 @@
 set(INC
   .
   intern
+  ../guardedalloc
 )
 
 set(INC_SYS
@@ -56,12 +57,16 @@ if(WITH_OPENVDB)
     intern/openvdb_dense_convert.cc
     intern/openvdb_reader.cc
     intern/openvdb_writer.cc
+    intern/openvdb_level_set.cc
+    intern/openvdb_transform.cc
     openvdb_capi.cc
     openvdb_util.cc
 
     intern/openvdb_dense_convert.h
     intern/openvdb_reader.h
     intern/openvdb_writer.h
+    intern/openvdb_level_set.h
+    intern/openvdb_transform.h
     openvdb_util.h
   )
 
diff --git a/intern/openvdb/intern/openvdb_level_set.cc b/intern/openvdb/intern/openvdb_level_set.cc
new file mode 100644
index 00000000000..a850aae2be5
--- /dev/null
+++ b/intern/openvdb/intern/openvdb_level_set.cc
@@ -0,0 +1,176 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2015 Blender Foundation.
+ * All rights reserved.
+ */
+
+#include "openvdb_level_set.h"
+#include "openvdb_util.h"
+#include "openvdb_capi.h"
+#include "MEM_guardedalloc.h"
+#include "openvdb/tools/Composite.h"
+
+OpenVDBLevelSet::OpenVDBLevelSet()
+{
+  openvdb::initialize();
+}
+
+OpenVDBLevelSet::~OpenVDBLevelSet()
+{
+}
+
+void OpenVDBLevelSet::mesh_to_level_set(const float *vertices,
+                                        const unsigned int *faces,
+                                        const unsigned int totvertices,
+                                        const unsigned int totfaces,
+                                        const openvdb::math::Transform::Ptr &xform)
+{
+  std::vector<openvdb::Vec3s> points(totvertices);
+  std::vector<openvdb::Vec3I> triangles(totfaces);
+  std::vector<openvdb::Vec4I> quads;
+
+  for (unsigned int i = 0; i < totvertices; i++) {
+    points[i] = openvdb::Vec3s(vertices[i * 3], vertices[i * 3 + 1], vertices[i * 3 + 2]);
+  }
+
+  for (unsigned int i = 0; i < totfaces; i++) {
+    triangles[i] = openvdb::Vec3I(faces[i * 3], faces[i * 3 + 1], faces[i * 3 + 2]);
+  }
+
+  this->grid = openvdb::tools::meshToLevelSet<openvdb::FloatGrid>(
+      *xform, points, triangles, quads, 1);
+}
+
+void OpenVDBLevelSet::volume_to_mesh(OpenVDBVolumeToMeshData *mesh,
+                                     const double isovalue,
+                                     const double adaptivity,
+                                     const bool relax_disoriented_triangles)
+{
+  std::vector<openvdb::Vec3s> out_points;
+  std::vector<openvdb::Vec4I> out_quads;
+  std::vector<openvdb::Vec3I> out_tris;
+  openvdb::tools::volumeToMesh<openvdb::FloatGrid>(*this->grid,
+                                                   out_points,
+                                                   out_tris,
+                                                   out_quads,
+                                                   isovalue,
+                                                   adaptivity,
+                                                   relax_disoriented_triangles);
+  mesh->vertices = (float *)MEM_malloc_arrayN(
+      out_points.size(), 3 * sizeof(float), "openvdb remesher out verts");
+  mesh->quads = (unsigned int *)MEM_malloc_arrayN(
+      out_quads.size(), 4 * sizeof(unsigned int), "openvdb remesh out quads");
+  mesh->triangles = NULL;
+  if (out_tris.size() > 0) {
+    mesh->triangles = (unsigned int *)MEM_malloc_arrayN(
+        out_tris.size(), 3 * sizeof(unsigned int), "openvdb remesh out tris");
+  }
+
+  mesh->totvertices = out_points.size();
+  mesh->tottriangles = out_tris.size();
+  mesh->totquads = out_quads.size();
+
+  for (size_t i = 0; i < out_points.size(); i++) {
+    mesh->vertices[i * 3] = out_points[i].x();
+    mesh->vertices[i * 3 + 1] = out_points[i].y();
+    mesh->vertices[i * 3 + 2] = out_points[i].z();
+  }
+
+  for (size_t i = 0; i < out_quads.size(); i++) {
+    mesh->quads[i * 4] = out_quads[i].x();
+    mesh->quads[i * 4 + 1] = out_quads[i].y();
+    mesh->quads[i * 4 + 2] = out_quads[i].z();
+    mesh->quads[i * 4 + 3] = out_quads[i].w();
+  }
+
+  for (size_t i = 0; i < out_tris.size(); i++) {
+    mesh->triangles[i * 3] = out_tris[i].x();
+    mesh->triangles[i * 3 + 1] = out_tris[i].y();
+    mesh->triangles[i * 3 + 2] = out_tris[i].z();
+  }
+}
+
+void OpenVDBLevelSet::filter(OpenVDBLevelSet_FilterType filter_type,
+                             int width,
+                             float distance,
+                             OpenVDBLevelSet_FilterBias filter_bias)
+{
+
+  if (!this->grid) {
+    return;
+  }
+
+  if (this->grid->getGridClass() != openvdb::GRID_LEVEL_SET) {
+    return;
+  }
+
+  openvdb::tools::LevelSetFilter<openvdb::FloatGrid> filter(*this->grid);
+  filter.setSpatialScheme((openvdb::math::BiasedGradientScheme)filter_bias);
+  switch (filter_type) {
+    case OPENVDB_LEVELSET_FILTER_GAUSSIAN:
+      filter.gaussian(width);
+      break;
+    case OPENVDB_LEVELSET_FILTER_MEDIAN:
+      filter.median(width);
+      break;
+    case OPENVDB_LEVELSET_FILTER_MEAN:
+      filter.mean(width);
+      break;
+    case OPENVDB_LEVELSET_FILTER_MEAN_CURVATURE:
+      filter.meanCurvature();
+      break;
+    case OPENVDB_LEVELSET_FILTER_LAPLACIAN:
+      filter.laplacian();
+      break;
+    case OPENVDB_LEVELSET_FILTER_DILATE:
+      filter.offset(distance);
+      break;
+    case OPENVDB_LEVELSET_FILTER_ERODE:
+      filter.offset(distance);
+      break;
+    case OPENVDB_LEVELSET_FILTER_NONE:
+      break;
+  }
+}
+openvdb::FloatGrid::Ptr OpenVDBLevelSet::CSG_operation_apply(
+    const openvdb::FloatGrid::Ptr &gridA,
+    const openvdb::FloatGrid::Ptr &gridB,
+    OpenVDBLevelSet_CSGOperation operation)
+{
+  switch (operation) {
+    case OPENVDB_LEVELSET_CSG_UNION:
+      openvdb::tools::csgUnion(*gridA, *gridB);
+      break;
+    case OPENVDB_LEVELSET_CSG_DIFFERENCE:
+      openvdb::tools::csgDifference(*gridA, *gridB);
+      break;
+    case OPENVDB_LEVELSET_CSG_INTERSECTION:
+      openvdb::tools::csgIntersection(*gridA, *gridB);
+      break;
+  }
+
+  return gridA;
+}
+
+const openvdb::FloatGrid::Ptr &OpenVDBLevelSet::get_grid()
+{
+  return this->grid;
+}
+
+void OpenVDBLevelSet::set_grid(const openvdb::FloatGrid::Ptr &grid)
+{
+  this->grid = grid;
+}
diff --git a/intern/openvdb/intern/openvdb_level_set.h b/intern/openvdb/intern/openvdb_level_set.h
new file mode 100644
index 00000000000..c2e1e582fff
--- /dev/null
+++ b/intern/openvdb/intern/openvdb_level_set.h
@@ -0,0 +1,60 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2015 Blender Foundation.
+ * All rights reserved.
+ */
+
+#ifndef __OPENVDB_LEVEL_SET_H__
+#define __OPENVDB_LEVEL_SET_H__
+
+#include <openvdb/openvdb.h>
+#include <openvdb/math/FiniteDifference.h>
+#include <openvdb/tools/MeshToVolume.h>
+#include <openvdb/tools/VolumeToMesh.h>
+#include <openvdb/tools/LevelSetFilter.h>
+#include <openvdb/tools/GridTransformer.h>
+#include "openvdb_capi.h"
+
+struct OpenVDBLevelSet {
+ private:
+  openvdb::FloatGrid::Ptr grid;
+
+ public:
+  OpenVDBLevelSet();
+  ~OpenVDBLevelSet();
+  const openvdb::FloatGrid::Ptr &get_grid();
+  void set_grid(const openvdb::FloatGrid::Ptr &grid);
+
+  void mesh_to_level_set(const float *vertices,
+                         const unsigned int *faces,
+                         const unsigned int totvertices,
+                         const unsigned int totfaces,
+                         const openvdb::math::Transform::Ptr &transform);
+
+  void volume_to_mesh(struct OpenVDBVolumeToMeshData *mesh,
+                      const double isovalue,
+                      const double adaptivity,
+                      const bool relax_disoriented_triangles);
+  void filter(OpenVDBLevelSet_FilterType filter_type,
+              int width,
+              float distance,
+              OpenVDBLevelSet_FilterBias filter_bias);
+  openvdb::FloatGrid::Ptr CSG_operation_apply(const openvdb::FloatGrid::Ptr &gridA,
+                                              const openvdb::FloatGrid::Ptr &gridB,
+                                              OpenVDBLevelSet_CSGOperation operation);
+};
+
+#endif /* __OPENVDB_LEVEL_SET_H__ */
diff --git a/intern/openvdb/intern/openvdb_transform.cc b/intern/openvdb/intern/openvdb_transform.cc
new file mode 100644
index 00000000000..4bfcf43f81a
--- /dev/null
+++ b/intern/openvdb/intern/openvdb_transform.cc
@@ -0,0 +1,43 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARR

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list