[Bf-blender-cvs] [6e8cb545b32] temp-attribute-transfer-node: extract mesh surface sampling to separate file

Jacques Lucke noreply at git.blender.org
Tue Apr 20 13:22:48 CEST 2021


Commit: 6e8cb545b32fc8463226ac7d5fb287a996f1a821
Author: Jacques Lucke
Date:   Tue Apr 20 10:43:55 2021 +0200
Branches: temp-attribute-transfer-node
https://developer.blender.org/rB6e8cb545b32fc8463226ac7d5fb287a996f1a821

extract mesh surface sampling to separate file

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

M	source/blender/blenkernel/BKE_attribute_math.hh
A	source/blender/blenkernel/BKE_mesh_sample.hh
M	source/blender/blenkernel/CMakeLists.txt
A	source/blender/blenkernel/intern/mesh_sample.cc
M	source/blender/functions/FN_generic_span.hh
M	source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc

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

diff --git a/source/blender/blenkernel/BKE_attribute_math.hh b/source/blender/blenkernel/BKE_attribute_math.hh
index 16fc0db60fb..5f3a8a3556a 100644
--- a/source/blender/blenkernel/BKE_attribute_math.hh
+++ b/source/blender/blenkernel/BKE_attribute_math.hh
@@ -21,8 +21,12 @@
 
 #include "DNA_customdata_types.h"
 
+#include "FN_cpp_type.hh"
+
 namespace blender::attribute_math {
 
+using fn::CPPType;
+
 /**
  * Utility function that simplifies calling a templated function based on a custom data type.
  */
@@ -54,6 +58,31 @@ void convert_to_static_type(const CustomDataType data_type, const Func &func)
   }
 }
 
+template<typename Func> void convert_to_static_type(const fn::CPPType &cpp_type, const Func &func)
+{
+  if (cpp_type.is<float>()) {
+    func(float());
+  }
+  else if (cpp_type.is<float2>()) {
+    func(float2());
+  }
+  else if (cpp_type.is<float3>()) {
+    func(float3());
+  }
+  else if (cpp_type.is<int>()) {
+    func(int());
+  }
+  else if (cpp_type.is<bool>()) {
+    func(bool());
+  }
+  else if (cpp_type.is<Color4f>()) {
+    func(Color4f());
+  }
+  else {
+    BLI_assert_unreachable();
+  }
+}
+
 /* -------------------------------------------------------------------- */
 /** \name Mix three values of the same type.
  *
diff --git a/source/blender/blenkernel/BKE_mesh_sample.hh b/source/blender/blenkernel/BKE_mesh_sample.hh
new file mode 100644
index 00000000000..f504650e349
--- /dev/null
+++ b/source/blender/blenkernel/BKE_mesh_sample.hh
@@ -0,0 +1,55 @@
+/*
+ * 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.
+ */
+
+#pragma once
+
+/** \file
+ * \ingroup bke
+ */
+
+#include "FN_generic_virtual_array.hh"
+
+#include "BLI_float3.hh"
+
+#include "BKE_attribute.h"
+
+struct Mesh;
+
+namespace blender::bke::mesh_surface_sample {
+
+using fn::CPPType;
+using fn::GMutableSpan;
+using fn::GSpan;
+using fn::GVArray;
+
+void sample_point_attribute(const Mesh &mesh,
+                            Span<int> looptri_indices,
+                            Span<float3> bary_coords,
+                            const GVArray &data_in,
+                            GMutableSpan data_out);
+
+void sample_corner_attribute(const Mesh &mesh,
+                             Span<int> looptri_indices,
+                             Span<float3> bary_coords,
+                             const GVArray &data_in,
+                             GMutableSpan data_out);
+
+void sample_face_attribute(const Mesh &mesh,
+                           Span<int> looptri_indices,
+                           const GVArray &data_in,
+                           GMutableSpan data_out);
+
+}  // namespace blender::bke::mesh_surface_sample
diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt
index 59e2c74ead1..adf321da8f0 100644
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@ -190,6 +190,7 @@ set(SRC
   intern/mesh_remap.c
   intern/mesh_remesh_voxel.c
   intern/mesh_runtime.c
+  intern/mesh_sample.cc
   intern/mesh_tangent.c
   intern/mesh_validate.c
   intern/mesh_validate.cc
@@ -379,6 +380,7 @@ set(SRC
   BKE_mesh_remap.h
   BKE_mesh_remesh_voxel.h
   BKE_mesh_runtime.h
+  BKE_mesh_sample.hh
   BKE_mesh_tangent.h
   BKE_mesh_types.h
   BKE_mesh_wrapper.h
diff --git a/source/blender/blenkernel/intern/mesh_sample.cc b/source/blender/blenkernel/intern/mesh_sample.cc
new file mode 100644
index 00000000000..91c9951ae89
--- /dev/null
+++ b/source/blender/blenkernel/intern/mesh_sample.cc
@@ -0,0 +1,158 @@
+/*
+ * 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.
+ */
+
+#include "BKE_attribute_math.hh"
+#include "BKE_mesh_runtime.h"
+#include "BKE_mesh_sample.hh"
+
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+
+namespace blender::bke::mesh_surface_sample {
+
+static Span<MLoopTri> get_mesh_looptris(const Mesh &mesh)
+{
+  /* This only updates a cache and can be considered to be logically const. */
+  const MLoopTri *looptris = BKE_mesh_runtime_looptri_ensure(const_cast<Mesh *>(&mesh));
+  const int looptris_len = BKE_mesh_runtime_looptri_len(&mesh);
+  return {looptris, looptris_len};
+}
+
+template<typename T>
+BLI_NOINLINE static void sample_point_attribute(const Mesh &mesh,
+                                                const Span<int> looptri_indices,
+                                                const Span<float3> bary_coords,
+                                                const VArray<T> &data_in,
+                                                const MutableSpan<T> data_out)
+{
+  const Span<MLoopTri> looptris = get_mesh_looptris(mesh);
+
+  for (const int i : bary_coords.index_range()) {
+    const int looptri_index = looptri_indices[i];
+    const MLoopTri &looptri = looptris[looptri_index];
+    const float3 &bary_coord = bary_coords[i];
+
+    const int v0_index = mesh.mloop[looptri.tri[0]].v;
+    const int v1_index = mesh.mloop[looptri.tri[1]].v;
+    const int v2_index = mesh.mloop[looptri.tri[2]].v;
+
+    const T v0 = data_in[v0_index];
+    const T v1 = data_in[v1_index];
+    const T v2 = data_in[v2_index];
+
+    const T interpolated_value = attribute_math::mix3(bary_coord, v0, v1, v2);
+    data_out[i] = interpolated_value;
+  }
+}
+
+void sample_point_attribute(const Mesh &mesh,
+                            const Span<int> looptri_indices,
+                            const Span<float3> bary_coords,
+                            const GVArray &data_in,
+                            const GMutableSpan data_out)
+{
+  BLI_assert(data_out.size() == looptri_indices.size());
+  BLI_assert(data_out.size() == bary_coords.size());
+  BLI_assert(data_in.size() == mesh.totvert);
+  BLI_assert(data_in.type() == data_out.type());
+
+  const CPPType &type = data_in.type();
+  attribute_math::convert_to_static_type(type, [&](auto dummy) {
+    using T = decltype(dummy);
+    sample_point_attribute<T>(
+        mesh, looptri_indices, bary_coords, data_in.typed<T>(), data_out.typed<T>());
+  });
+}
+
+template<typename T>
+BLI_NOINLINE static void sample_corner_attribute(const Mesh &mesh,
+                                                 const Span<int> looptri_indices,
+                                                 const Span<float3> bary_coords,
+                                                 const VArray<T> &data_in,
+                                                 const MutableSpan<T> data_out)
+{
+  Span<MLoopTri> looptris = get_mesh_looptris(mesh);
+
+  for (const int i : bary_coords.index_range()) {
+    const int looptri_index = looptri_indices[i];
+    const MLoopTri &looptri = looptris[looptri_index];
+    const float3 &bary_coord = bary_coords[i];
+
+    const int loop_index_0 = looptri.tri[0];
+    const int loop_index_1 = looptri.tri[1];
+    const int loop_index_2 = looptri.tri[2];
+
+    const T v0 = data_in[loop_index_0];
+    const T v1 = data_in[loop_index_1];
+    const T v2 = data_in[loop_index_2];
+
+    const T interpolated_value = attribute_math::mix3(bary_coord, v0, v1, v2);
+    data_out[i] = interpolated_value;
+  }
+}
+
+void sample_corner_attribute(const Mesh &mesh,
+                             const Span<int> looptri_indices,
+                             const Span<float3> bary_coords,
+                             const GVArray &data_in,
+                             const GMutableSpan data_out)
+{
+  BLI_assert(data_out.size() == looptri_indices.size());
+  BLI_assert(data_out.size() == bary_coords.size());
+  BLI_assert(data_in.size() == mesh.totloop);
+  BLI_assert(data_in.type() == data_out.type());
+
+  const CPPType &type = data_in.type();
+  attribute_math::convert_to_static_type(type, [&](auto dummy) {
+    using T = decltype(dummy);
+    sample_corner_attribute<T>(
+        mesh, looptri_indices, bary_coords, data_in.typed<T>(), data_out.typed<T>());
+  });
+}
+
+template<typename T>
+void sample_face_attribute(const Mesh &mesh,
+                           const Span<int> looptri_indices,
+                           const VArray<T> &data_in,
+                           const MutableSpan<T> data_out)
+{
+  Span<MLoopTri> looptris = get_mesh_looptris(mesh);
+
+  for (const int i : data_out.index_range()) {
+    const int looptri_index = looptri_indices[i];
+    const MLoopTri &looptri = looptris[looptri_index];
+    const int poly_index = looptri.poly;
+    data_out[i] = data_in[poly_index];
+  }
+}
+
+void sample_face_attribute(const Mesh &mesh,
+                           const Span<int> looptri_indices,
+                           const GVArray &data_in,
+                           const GMutableSpan data_out)
+{
+  BLI_assert(data_out.size() == looptri_indices.size());
+  BLI_assert(data_in.size() == mesh.totpoly);
+  BLI_assert(data_in.type() == data_out.type());
+
+  const CPPType &type = data_in.type();
+  attribute_math::convert_to_static_type(type, [&](auto dummy) {
+    using

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list