[Bf-blender-cvs] [25b462de8e3] geometry-nodes-level-set-nodes: WIP changes to sample volume node

Hans Goudey noreply at git.blender.org
Mon Nov 1 04:34:04 CET 2021


Commit: 25b462de8e3c1c51ba1925d9f075f90552e9cef4
Author: Hans Goudey
Date:   Sun Oct 31 22:33:29 2021 -0500
Branches: geometry-nodes-level-set-nodes
https://developer.blender.org/rB25b462de8e3c1c51ba1925d9f075f90552e9cef4

WIP changes to sample volume node

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

M	source/blender/blenkernel/BKE_node.h
M	source/blender/blenkernel/intern/node.cc
M	source/blender/makesdna/DNA_node_types.h
M	source/blender/nodes/CMakeLists.txt
M	source/blender/nodes/NOD_geometry.h
M	source/blender/nodes/NOD_static_types.h
M	source/blender/nodes/NOD_type_conversions.hh
A	source/blender/nodes/geometry/nodes/node_geo_sample_volume.cc
D	source/blender/nodes/geometry/nodes/node_geo_volume_sample.cc
M	source/blender/nodes/intern/type_conversions.cc

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

diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index cf16f1cec54..5b0d288fd3b 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -1558,7 +1558,7 @@ int ntreeTexExecTree(struct bNodeTree *ntree,
 #define GEO_NODE_LEVEL_SET_PRIMITIVE_SPHERE 1140
 #define GEO_NODE_LEVEL_SET_PRIMITIVE_PLATONIC 1141
 #define GEO_NODE_LEVEL_SET_MORPH 1142
-#define GEO_NODE_VOLUME_SAMPLE 1143
+#define GEO_NODE_SAMPLE_VOLUME 1143
 #define GEO_NODE_LEVEL_SET_TO_MASK 1144
 
 /** \} */
diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc
index f7fe5ee9dc7..fa8923c6e22 100644
--- a/source/blender/blenkernel/intern/node.cc
+++ b/source/blender/blenkernel/intern/node.cc
@@ -5884,7 +5884,7 @@ static void registerGeometryNodes()
   register_node_type_geo_translate_instances();
   register_node_type_geo_triangulate();
   register_node_type_geo_viewer();
-  register_node_type_geo_volume_sample();
+  register_node_type_geo_sample_volume();
   register_node_type_geo_volume_to_mesh();
 }
 
diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h
index 4a2639f8567..4c951f0565c 100644
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@ -1384,6 +1384,13 @@ typedef struct NodeGeometryVolumeToMesh {
   uint8_t resolution_mode;
 } NodeGeometryVolumeToMesh;
 
+typedef struct NodeGeometrySampleVolume {
+  /* CustomDataType. */
+  int8_t data_type;
+  /* GeometryNodeSampleVolumeInterpolation. */
+  int8_t interpolation;
+} NodeGeometrySampleVolume;
+
 typedef struct NodeGeometryLevelSetBoolean {
   /* GeometryNodeBooleanOperation */
   uint8_t operation;
@@ -2251,6 +2258,12 @@ typedef enum GeometryNodeLevelSetTemporalScheme {
   GEO_NODE_LEVEL_SET_MORPH_SPATIAL_3RD = 2,
 } GeometryNodeLevelSetTemporalScheme;
 
+typedef enum GeometryNodeSampleVolumeInterpolation {
+  GEO_NODE_VOLUME_SAMPLE_NEAREST = 0,
+  GEO_NODE_VOLUME_SAMPLE_LINEAR = 1,
+  GEO_NODE_VOLUME_SAMPLE_QUADRATIC = 2,
+} GeometryNodeSampleVolumeInterpolation;
+
 typedef enum GeometryNodeAttributeTransferMapMode {
   GEO_NODE_LEGACY_ATTRIBUTE_TRANSFER_NEAREST_FACE_INTERPOLATED = 0,
   GEO_NODE_LEGACY_ATTRIBUTE_TRANSFER_NEAREST = 1,
diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt
index 3f48af65b24..0a614d20d34 100644
--- a/source/blender/nodes/CMakeLists.txt
+++ b/source/blender/nodes/CMakeLists.txt
@@ -298,7 +298,7 @@ set(SRC
   geometry/nodes/node_geo_translate_instances.cc
   geometry/nodes/node_geo_triangulate.cc
   geometry/nodes/node_geo_viewer.cc
-  geometry/nodes/node_geo_volume_sample.cc
+  geometry/nodes/node_geo_sample_volume.cc
   geometry/nodes/node_geo_volume_to_mesh.cc
 
   geometry/node_geometry_exec.cc
diff --git a/source/blender/nodes/NOD_geometry.h b/source/blender/nodes/NOD_geometry.h
index 3d74903168e..4d2a8f3f7d4 100644
--- a/source/blender/nodes/NOD_geometry.h
+++ b/source/blender/nodes/NOD_geometry.h
@@ -174,7 +174,7 @@ void register_node_type_geo_translate_instances(void);
 void register_node_type_geo_triangulate(void);
 void register_node_type_geo_viewer(void);
 void register_node_type_geo_volume_to_mesh(void);
-void register_node_type_geo_volume_sample(void);
+void register_node_type_geo_sample_volume(void);
 
 #ifdef __cplusplus
 }
diff --git a/source/blender/nodes/NOD_static_types.h b/source/blender/nodes/NOD_static_types.h
index 19f833d138b..4f60acc1c60 100644
--- a/source/blender/nodes/NOD_static_types.h
+++ b/source/blender/nodes/NOD_static_types.h
@@ -399,6 +399,7 @@ DefNode(GeometryNode, GEO_NODE_RESAMPLE_CURVE, def_geo_curve_resample, "RESAMPLE
 DefNode(GeometryNode, GEO_NODE_REVERSE_CURVE, 0, "REVERSE_CURVE", ReverseCurve, "Reverse Curve", "")
 DefNode(GeometryNode, GEO_NODE_ROTATE_INSTANCES, 0, "ROTATE_INSTANCES", RotateInstances, "Rotate Instances", "")
 DefNode(GeometryNode, GEO_NODE_SAMPLE_CURVE, def_geo_curve_sample, "SAMPLE_CURVE", SampleCurve, "Sample Curve", "")
+DefNode(GeometryNode, GEO_NODE_SAMPLE_VOLUME, 0, "SAMPLE_VOLUME", SampleVolume, "Sample Volume", "")
 DefNode(GeometryNode, GEO_NODE_SCALE_INSTANCES, 0, "SCALE_INSTANCES", ScaleInstances, "Scale Instances", "")
 DefNode(GeometryNode, GEO_NODE_SEPARATE_COMPONENTS, 0, "SEPARATE_COMPONENTS", SeparateComponents, "Separate Components", "")
 DefNode(GeometryNode, GEO_NODE_SEPARATE_GEOMETRY, def_geo_separate_geometry, "SEPARATE_GEOMETRY", SeparateGeometry, "Separate Geometry", "")
@@ -426,7 +427,6 @@ DefNode(GeometryNode, GEO_NODE_TRANSLATE_INSTANCES, 0, "TRANSLATE_INSTANCES", Tr
 DefNode(GeometryNode, GEO_NODE_TRIANGULATE, def_geo_triangulate, "TRIANGULATE", Triangulate, "Triangulate", "")
 DefNode(GeometryNode, GEO_NODE_TRIM_CURVE, def_geo_curve_trim, "TRIM_CURVE", TrimCurve, "Trim Curve", "")
 DefNode(GeometryNode, GEO_NODE_VIEWER, def_geo_viewer, "VIEWER", Viewer, "Viewer", "")
-DefNode(GeometryNode, GEO_NODE_VOLUME_SAMPLE, 0, "VOLUME_SAMPLE", VolumeSample, "Sample Volume", "")
 DefNode(GeometryNode, GEO_NODE_VOLUME_TO_MESH, def_geo_volume_to_mesh, "VOLUME_TO_MESH", VolumeToMesh, "Volume to Mesh", "")
 
 /* undefine macros */
diff --git a/source/blender/nodes/NOD_type_conversions.hh b/source/blender/nodes/NOD_type_conversions.hh
index ec4859f0657..f7379492c03 100644
--- a/source/blender/nodes/NOD_type_conversions.hh
+++ b/source/blender/nodes/NOD_type_conversions.hh
@@ -16,6 +16,8 @@
 
 #pragma once
 
+#include "BLI_index_mask.hh"
+
 #include "FN_multi_function.hh"
 
 namespace blender::nodes {
@@ -76,6 +78,8 @@ class DataTypeConversions {
   fn::GVArrayPtr try_convert(fn::GVArrayPtr varray, const CPPType &to_type) const;
 
   fn::GVMutableArrayPtr try_convert(fn::GVMutableArrayPtr varray, const CPPType &to_type) const;
+
+  void try_convert(fn::GSpan src, fn::GMutableSpan dst, IndexMask mask) const;
 };
 
 const DataTypeConversions &get_implicit_type_conversions();
diff --git a/source/blender/nodes/geometry/nodes/node_geo_sample_volume.cc b/source/blender/nodes/geometry/nodes/node_geo_sample_volume.cc
new file mode 100644
index 00000000000..df5e70d8d6c
--- /dev/null
+++ b/source/blender/nodes/geometry/nodes/node_geo_sample_volume.cc
@@ -0,0 +1,294 @@
+/*
+ * 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 "DEG_depsgraph_query.h"
+
+#ifdef WITH_OPENVDB
+#  include <openvdb/tools/GridTransformer.h>
+#  include <openvdb/tools/VolumeToMesh.h>
+#endif
+
+#include "BKE_lib_id.h"
+#include "BKE_volume.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "FN_generic_array.hh"
+
+#include "NOD_type_conversions.hh"
+
+#include "node_geometry_util.hh"
+
+namespace blender::nodes {
+
+static void geo_node_sample_volume_declare(NodeDeclarationBuilder &b)
+{
+  b.add_input<decl::Geometry>(N_("Volume"))
+      .only_realized_data()
+      .supported_type(GEO_COMPONENT_TYPE_VOLUME);
+
+  b.add_input<decl::Vector>(N_("Position")).implicit_field();
+
+  b.add_output<decl::Vector>(N_("Value")).dependent_field({1, 2, 3, 4, 5, 6});
+  b.add_output<decl::Float>(N_("Value"), "Value_001").dependent_field({1, 2, 3, 4, 5, 6});
+  b.add_output<decl::Bool>(N_("Value"), "Value_002").dependent_field({1, 2, 3, 4, 5, 6});
+  b.add_output<decl::Int>(N_("Value"), "Value_003").dependent_field({1, 2, 3, 4, 5, 6});
+}
+
+static void geo_node_sample_volume_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
+{
+  uiItemR(layout, ptr, "data_type", 0, "", ICON_NONE);
+  uiItemR(layout, ptr, "mapping", 0, "", ICON_NONE);
+}
+
+static void geo_node_sample_volume_init(bNodeTree *UNUSED(tree), bNode *node)
+{
+  NodeGeometrySampleVolume *data = (NodeGeometrySampleVolume *)MEM_callocN(
+      sizeof(NodeGeometrySampleVolume), __func__);
+  data->interpolation = GEO_NODE_VOLUME_SAMPLE_LINEAR;
+  data->data_type = CD_PROP_FLOAT;
+  node->storage = data;
+}
+
+static void geo_node_sample_volume_update(bNodeTree *UNUSED(ntree), bNode *node)
+{
+  const NodeGeometrySampleVolume &data = *(const NodeGeometrySampleVolume *)node->storage;
+  const CustomDataType data_type = static_cast<CustomDataType>(data.data_type);
+
+  bNodeSocket *out_socket_vector = (bNodeSocket *)BLI_findlink(&node->outputs, 4);
+  bNodeSocket *out_socket_float = out_socket_vector->next;
+  bNodeSocket *out_socket_color4f = out_socket_float->next;
+  bNodeSocket *out_socket_boolean = out_socket_color4f->next;
+  bNodeSocket *out_socket_int32 = out_socket_boolean->next;
+
+  nodeSetSocketAvailability(out_socket_vector, data_type == CD_PROP_FLOAT3);
+  nodeSetSocketAvailability(out_socket_float, data_type == CD_PROP_FLOAT);
+  nodeSetSocketAvailability(out_socket_color4f, data_type == CD_PROP_COLOR);
+  nodeSetSocketAvailability(out_socket_boolean, data_type == CD_PROP_BOOL);
+  nodeSetSocketAvailability(out_socket_int32, data_type == CD_PROP_INT32);
+}
+
+#ifdef WITH_OPENVDB
+
+using openvdb::GridBase;
+
+static const CPPType *grid_type_to_sample_type(GridBase::ConstPtr grid)
+{
+  switch (BKE_volume_grid_type_openvdb(*grid)) {
+    case VOLUME_GRID_MASK:
+    case VOLUME_GRID_BOOLEAN:
+      return &CPPType::get<bool>();
+    case VOLUME_GRID_FLOAT:
+      return &CPPType::get<float>();
+    case VOLUME_GRID_INT:
+      return &CPPType::get<int>();
+    case VOLUME_GRID_VECTOR_FLOAT:
+      return &CPPType::get<float3>();
+    case VOLUME_GRID_UNKNOWN:
+    case VOLUME_GRID_INT64:
+    case VOLUME_GRID_STRING:
+    case VOLUME_GRID_VECTOR_DOUBLE:
+    case VOLUME_GRID_DOUBLE:
+    case VOLUME_GRID_VECTOR_INT:
+    case VOLUME_GRID_POINTS:
+      retu

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list