[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